/* * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.controller.config.yang.test.impl; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.doReturn; import com.google.common.collect.Lists; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.management.InstanceAlreadyExistsException; import javax.management.ObjectName; import org.junit.Before; import org.junit.Test; import org.opendaylight.controller.config.api.IdentityAttributeRef; import org.opendaylight.controller.config.api.jmx.CommitStatus; import org.opendaylight.controller.config.api.jmx.ObjectNameUtil; import org.opendaylight.controller.config.manager.impl.AbstractConfigTest; import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver; import org.opendaylight.controller.config.util.ConfigTransactionJMXClient; import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.test.types.rev131127.TestIdentity1; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.test.types.rev131127.TestIdentity2; public class NetconfTestImplModuleTest extends AbstractConfigTest { public static final String TESTING_DEP_PREFIX = "testing-dep"; private NetconfTestImplModuleFactory factory; private final String instanceName = "n1"; @Before public void setUp() { this.factory = new NetconfTestImplModuleFactory(); super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(this.mockedContext,this.factory, new DepTestImplModuleFactory(), new IdentityTestModuleFactory())); } @Override protected BindingRuntimeContext getBindingRuntimeContext() { final BindingRuntimeContext ret = super.getBindingRuntimeContext(); doReturn(TestIdentity1.class).when(ret).getIdentityClass(TestIdentity1.QNAME); doReturn(TestIdentity2.class).when(ret).getIdentityClass(TestIdentity2.QNAME); return ret; } @Test public void testIdentities() throws Exception { final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction(); final ObjectName nameCreated = transaction.createModule(IdentityTestModuleFactory.NAME, this.instanceName); final IdentityTestModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, IdentityTestModuleMXBean.class); final IdentitiesContainer c = new IdentitiesContainer(); c.setAfi(new IdentityAttributeRef(TestIdentity2.QNAME.toString())); mxBean.setIdentitiesContainer(c); transaction.commit(); } @Test public void testDependencyList() throws Exception { ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction(); final ObjectName on = createInstance(transaction, this.instanceName, 4); transaction.validateConfig(); final CommitStatus status1 = transaction.commit(); assertBeanCount(1, this.factory.getImplementationName()); assertBeanCount(4 + 1, DepTestImplModuleFactory.NAME); assertStatus(status1, 1 + 4 + 1, 0, 0); transaction = this.configRegistryClient.createTransaction(); final NetconfTestImplModuleMXBean proxy = transaction.newMXBeanProxy(ObjectNameUtil.withoutTransactionName(on), NetconfTestImplModuleMXBean.class); proxy.getComplexList(); final List testingDeps = proxy.getTestingDeps(); final ObjectName testingDep = proxy.getTestingDep(); assertEquals(TESTING_DEP_PREFIX, ObjectNameUtil.getInstanceName(testingDep)); assertTestingDeps(testingDeps, 4); transaction.abortConfig(); // check that reuse logic works - equals on list of dependencies. transaction = this.configRegistryClient.createTransaction(); final CommitStatus status2 = transaction.commit(); assertStatus(status2, 0, 0, 6); // replace single dependency transaction = this.configRegistryClient.createTransaction(); final String instanceName1 = TESTING_DEP_PREFIX + 1; transaction.destroyModule(DepTestImplModuleFactory.NAME, instanceName1); transaction.createModule(DepTestImplModuleFactory.NAME, instanceName1); final CommitStatus status3 = transaction.commit(); assertStatus(status3, 1, 1, 4); } @Test public void testNullCheckInListOfDependencies() throws Exception { final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction(); final ObjectName on = createInstance(transaction, this.instanceName, 4); final NetconfTestImplModuleMXBean proxy = transaction.newMXBeanProxy(on, NetconfTestImplModuleMXBean.class); proxy.setTestingDeps(null); assertTrue(proxy.getTestingDeps().isEmpty()); proxy.setTestingDeps(Collections.emptyList()); } private void assertTestingDeps(final List testingDeps, final int i) { assertEquals(i, testingDeps.size()); int c = 1; for (final ObjectName testingDep : testingDeps) { assertEquals(TESTING_DEP_PREFIX + Integer.toString(c++), ObjectNameUtil.getInstanceName(testingDep)); } } private ObjectName createInstance(final ConfigTransactionJMXClient transaction, final String instanceName, final int depsCount) throws InstanceAlreadyExistsException { final ObjectName nameCreated = transaction.createModule(this.factory.getImplementationName(), instanceName); final NetconfTestImplModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, NetconfTestImplModuleMXBean.class); ObjectName dep = transaction.createModule(DepTestImplModuleFactory.NAME, TESTING_DEP_PREFIX); mxBean.setTestingDep(dep); final ArrayList testingDeps = Lists.newArrayList(); for (int i = 0; i < depsCount; i++) { dep = transaction.createModule(DepTestImplModuleFactory.NAME, TESTING_DEP_PREFIX + Integer.toString(i + 1)); testingDeps.add(dep); } mxBean.setTestingDeps(testingDeps); return nameCreated; } }