Merge "BUG 2854 : Do not add empty read write transactions to the replicable journal"
[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
16 import com.google.common.collect.Lists;
17 import java.util.ArrayList;
18 import java.util.Collections;
19 import java.util.List;
20 import javax.management.InstanceAlreadyExistsException;
21 import javax.management.ObjectName;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.opendaylight.controller.config.api.IdentityAttributeRef;
25 import org.opendaylight.controller.config.api.jmx.CommitStatus;
26 import org.opendaylight.controller.config.api.jmx.ObjectNameUtil;
27 import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
28 import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
29 import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.test.types.rev131127.TestIdentity1;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.test.types.rev131127.TestIdentity2;
32 import org.opendaylight.yangtools.sal.binding.generator.util.BindingRuntimeContext;
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(mockedContext,factory,
45                 new DepTestImplModuleFactory(), new IdentityTestModuleFactory()));
46     }
47
48     @Override
49     protected BindingRuntimeContext getBindingRuntimeContext() {
50         final BindingRuntimeContext ret = super.getBindingRuntimeContext();
51         doReturn(TestIdentity1.class).when(ret).getIdentityClass(TestIdentity1.QNAME);
52         doReturn(TestIdentity2.class).when(ret).getIdentityClass(TestIdentity2.QNAME);
53         return ret;
54     }
55
56     @Test
57     public void testIdentities() throws Exception {
58         ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
59
60         ObjectName nameCreated = transaction.createModule(IdentityTestModuleFactory.NAME, instanceName);
61         IdentityTestModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, IdentityTestModuleMXBean.class);
62
63         final IdentitiesContainer c = new IdentitiesContainer();
64         c.setAfi(new IdentityAttributeRef(TestIdentity2.QNAME.toString()));
65         mxBean.setIdentitiesContainer(c);
66         transaction.commit();
67     }
68
69     @Test
70     public void testDependencyList() throws Exception {
71         ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
72
73         ObjectName on = createInstance(transaction, instanceName, 4);
74         transaction.validateConfig();
75         CommitStatus status1 = transaction.commit();
76
77         assertBeanCount(1, factory.getImplementationName());
78         assertBeanCount(4 + 1, DepTestImplModuleFactory.NAME);
79         assertStatus(status1, 1 + 4 + 1, 0, 0);
80
81         transaction = configRegistryClient.createTransaction();
82
83         NetconfTestImplModuleMXBean proxy = transaction.newMXBeanProxy(ObjectNameUtil.withoutTransactionName(on),
84                 NetconfTestImplModuleMXBean.class);
85         proxy.getComplexList();
86         List<ObjectName> testingDeps = proxy.getTestingDeps();
87         ObjectName testingDep = proxy.getTestingDep();
88
89         assertEquals(TESTING_DEP_PREFIX, ObjectNameUtil.getInstanceName(testingDep));
90         assertTestingDeps(testingDeps, 4);
91
92         transaction.abortConfig();
93
94         // check that reuse logic works - equals on list of dependencies.
95         transaction = configRegistryClient.createTransaction();
96         CommitStatus status2 = transaction.commit();
97         assertStatus(status2, 0, 0, 6);
98
99         // replace single dependency
100         transaction = configRegistryClient.createTransaction();
101         String instanceName1 = TESTING_DEP_PREFIX + 1;
102         transaction.destroyModule(DepTestImplModuleFactory.NAME, instanceName1);
103         transaction.createModule(DepTestImplModuleFactory.NAME, instanceName1);
104         CommitStatus status3 = transaction.commit();
105         assertStatus(status3, 1, 1, 4);
106
107     }
108
109     @Test
110     public void testNullCheckInListOfDependencies() throws Exception {
111         ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
112
113         ObjectName on = createInstance(transaction, instanceName, 4);
114         NetconfTestImplModuleMXBean proxy = transaction.newMXBeanProxy(on, NetconfTestImplModuleMXBean.class);
115         try{
116             proxy.setTestingDeps(null);
117             fail();
118         }catch(RuntimeException e) {
119             Throwable cause = e.getCause();
120             assertNotNull(cause);
121             assertTrue("Invalid type " + cause, cause instanceof IllegalArgumentException);
122             assertEquals("Null not supported", cause.getMessage());
123         }
124         proxy.setTestingDeps(Collections.<ObjectName>emptyList());
125     }
126
127     private void assertTestingDeps(List<ObjectName> testingDeps, int i) {
128         assertEquals(i, testingDeps.size());
129
130         int c = 1;
131         for (ObjectName testingDep : testingDeps) {
132             assertEquals(TESTING_DEP_PREFIX + Integer.toString(c++), ObjectNameUtil.getInstanceName(testingDep));
133         }
134     }
135
136
137     private ObjectName createInstance(ConfigTransactionJMXClient transaction, String instanceName, int depsCount)
138             throws InstanceAlreadyExistsException {
139         ObjectName nameCreated = transaction.createModule(factory.getImplementationName(), instanceName);
140         NetconfTestImplModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, NetconfTestImplModuleMXBean.class);
141
142         ObjectName dep = transaction.createModule(DepTestImplModuleFactory.NAME, TESTING_DEP_PREFIX);
143         mxBean.setTestingDep(dep);
144
145         ArrayList<ObjectName> testingDeps = Lists.newArrayList();
146         for (int i = 0; i < depsCount; i++) {
147             dep = transaction.createModule(DepTestImplModuleFactory.NAME, TESTING_DEP_PREFIX + Integer.toString(i + 1));
148             testingDeps.add(dep);
149         }
150         mxBean.setTestingDeps(testingDeps);
151
152         return nameCreated;
153     }
154
155 }