Add support for identity-ref config attributes to config/netconf subsystem
[controller.git] / opendaylight / config / yang-test / src / test / java / org / opendaylight / controller / config / yang / test / impl / NetconfTestImplModuleTest.java
1 package org.opendaylight.controller.config.yang.test.impl;
2
3 import com.google.common.collect.Lists;
4
5 import junit.framework.Assert;
6
7 import org.junit.Before;
8 import org.junit.Test;
9 import org.opendaylight.controller.config.api.IdentityAttributeRef;
10 import org.opendaylight.controller.config.api.jmx.CommitStatus;
11 import org.opendaylight.controller.config.api.jmx.ObjectNameUtil;
12 import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
13 import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
14 import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.test.impl.rev130403.TestIdentity1;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.test.impl.rev130403.TestIdentity2;
17 import org.opendaylight.yangtools.yang.data.impl.codec.CodecRegistry;
18 import org.opendaylight.yangtools.yang.data.impl.codec.IdentityCodec;
19
20 import javax.management.InstanceAlreadyExistsException;
21 import javax.management.ObjectName;
22
23 import java.util.ArrayList;
24 import java.util.Collections;
25 import java.util.List;
26
27 import static org.junit.Assert.assertEquals;
28 import static org.junit.Assert.assertNotNull;
29 import static org.junit.Assert.assertTrue;
30 import static org.junit.Assert.fail;
31 import static org.mockito.Mockito.doReturn;
32 import static org.mockito.Mockito.mock;
33
34 public class NetconfTestImplModuleTest  extends AbstractConfigTest {
35
36     public static final String TESTING_DEP_PREFIX = "testing-dep";
37     private NetconfTestImplModuleFactory factory;
38     private final String instanceName = "n1";
39
40     @Before
41     public void setUp() {
42
43         factory = new NetconfTestImplModuleFactory();
44         super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(factory,
45                 new DepTestImplModuleFactory(), new IdentityTestModuleFactory()));
46     }
47
48     @Override
49     protected CodecRegistry getCodecRegistry() {
50         final IdentityCodec<?> codec = mock(IdentityCodec.class);
51         doReturn(TestIdentity1.class).when(codec).deserialize(TestIdentity1.QNAME);
52         doReturn(TestIdentity2.class).when(codec).deserialize(TestIdentity2.QNAME);
53
54         final CodecRegistry ret = super.getCodecRegistry();
55         doReturn(codec).when(ret).getIdentityCodec();
56         return ret;
57     }
58
59     @Test
60     public void testIdentities() throws Exception {
61         ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
62
63         ObjectName nameCreated = transaction.createModule(IdentityTestModuleFactory.NAME, instanceName);
64         IdentityTestModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, IdentityTestModuleMXBean.class);
65
66         final IdentitiesContainer c = new IdentitiesContainer();
67         c.setAfi(new IdentityAttributeRef(TestIdentity2.QNAME.toString()));
68         mxBean.setIdentitiesContainer(c);
69         transaction.commit();
70     }
71
72     @Test
73     public void testDependencyList() throws Exception {
74         ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
75
76         ObjectName on = createInstance(transaction, instanceName, 4);
77         transaction.validateConfig();
78         CommitStatus status1 = transaction.commit();
79
80         assertBeanCount(1, factory.getImplementationName());
81         assertBeanCount(4 + 1, DepTestImplModuleFactory.NAME);
82         assertStatus(status1, 1 + 4 + 1, 0, 0);
83
84         transaction = configRegistryClient.createTransaction();
85
86         NetconfTestImplModuleMXBean proxy = transaction.newMXBeanProxy(ObjectNameUtil.withoutTransactionName(on),
87                 NetconfTestImplModuleMXBean.class);
88         proxy.getComplexList();
89         List<ObjectName> testingDeps = proxy.getTestingDeps();
90         ObjectName testingDep = proxy.getTestingDep();
91
92         Assert.assertEquals(TESTING_DEP_PREFIX, ObjectNameUtil.getInstanceName(testingDep));
93         assertTestingDeps(testingDeps, 4);
94
95         transaction.abortConfig();
96
97         // check that reuse logic works - equals on list of dependencies.
98         transaction = configRegistryClient.createTransaction();
99         CommitStatus status2 = transaction.commit();
100         assertStatus(status2, 0, 0, 6);
101
102         // replace single dependency
103         transaction = configRegistryClient.createTransaction();
104         String instanceName1 = TESTING_DEP_PREFIX + 1;
105         transaction.destroyModule(DepTestImplModuleFactory.NAME, instanceName1);
106         transaction.createModule(DepTestImplModuleFactory.NAME, instanceName1);
107         CommitStatus status3 = transaction.commit();
108         assertStatus(status3, 1, 1, 4);
109
110     }
111
112     @Test
113     public void testNullCheckInListOfDependencies() throws Exception {
114         ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
115
116         ObjectName on = createInstance(transaction, instanceName, 4);
117         NetconfTestImplModuleMXBean proxy = transaction.newMXBeanProxy(on, NetconfTestImplModuleMXBean.class);
118         try{
119             proxy.setTestingDeps(null);
120             fail();
121         }catch(RuntimeException e) {
122             Throwable cause = e.getCause();
123             assertNotNull(cause);
124             assertTrue("Invalid type " + cause, cause instanceof IllegalArgumentException);
125             assertEquals("Null not supported", cause.getMessage());
126         }
127         proxy.setTestingDeps(Collections.<ObjectName>emptyList());
128     }
129
130     private void assertTestingDeps(List<ObjectName> testingDeps, int i) {
131         Assert.assertEquals(i, testingDeps.size());
132
133         int c = 1;
134         for (ObjectName testingDep : testingDeps) {
135             Assert.assertEquals(TESTING_DEP_PREFIX + Integer.toString(c++), ObjectNameUtil.getInstanceName(testingDep));
136         }
137     }
138
139
140     private ObjectName createInstance(ConfigTransactionJMXClient transaction, String instanceName, int depsCount)
141             throws InstanceAlreadyExistsException {
142         ObjectName nameCreated = transaction.createModule(factory.getImplementationName(), instanceName);
143         NetconfTestImplModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, NetconfTestImplModuleMXBean.class);
144
145         ObjectName dep = transaction.createModule(DepTestImplModuleFactory.NAME, TESTING_DEP_PREFIX);
146         mxBean.setTestingDep(dep);
147
148         ArrayList<ObjectName> testingDeps = Lists.newArrayList();
149         for (int i = 0; i < depsCount; i++) {
150             dep = transaction.createModule(DepTestImplModuleFactory.NAME, TESTING_DEP_PREFIX + Integer.toString(i + 1));
151             testingDeps.add(dep);
152         }
153         mxBean.setTestingDeps(testingDeps);
154
155         return nameCreated;
156     }
157
158 }