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