Refactor DataBroker adapter wiring
[controller.git] / opendaylight / config / yang-test / src / test / java / org / opendaylight / controller / config / yang / test / impl / MultipleDependenciesModuleTest.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
9 package org.opendaylight.controller.config.yang.test.impl;
10
11 import static java.util.Arrays.asList;
12 import static org.junit.Assert.assertEquals;
13 import static org.junit.Assert.assertNull;
14 import static org.junit.Assert.assertThat;
15 import static org.junit.Assert.fail;
16 import static org.opendaylight.controller.config.api.jmx.ObjectNameUtil.getInstanceName;
17 import static org.opendaylight.controller.config.api.jmx.ObjectNameUtil.getTransactionName;
18
19 import java.util.List;
20 import javax.management.ObjectName;
21 import org.hamcrest.CoreMatchers;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.opendaylight.controller.config.api.ValidationException;
25 import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
26 import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
27 import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
28
29 public class MultipleDependenciesModuleTest extends AbstractConfigTest {
30     private static final MultipleDependenciesModuleFactory factory = new MultipleDependenciesModuleFactory();
31
32     @Before
33     public void setUp() throws Exception {
34         super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext, factory));
35     }
36
37     @Test
38     public void testMultipleDependencies() throws Exception {
39         ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
40         ObjectName d1 = transaction.createModule(factory.getImplementationName(), "d1");
41         ObjectName d2 = transaction.createModule(factory.getImplementationName(), "d2");
42
43         assertEquals(transaction.getTransactionName(), getTransactionName(d1));
44
45         ObjectName parent = transaction.createModule(factory.getImplementationName(), "parent");
46         MultipleDependenciesModuleMXBean multipleDependenciesModuleMXBean = transaction.newMXBeanProxy(parent, MultipleDependenciesModuleMXBean.class);
47         multipleDependenciesModuleMXBean.setTestingDeps(asList(d1, d2));
48         List<ObjectName> found = multipleDependenciesModuleMXBean.getTestingDeps();
49         ObjectName d1WithoutTxName = found.get(0);
50         assertEquals(getInstanceName(d1), getInstanceName(d1WithoutTxName));
51         // check that transaction name gets stripped automatically from attribute.
52         // d1,2 contained tx name, found doesn't
53         assertNull(getTransactionName(d1WithoutTxName));
54         transaction.commit();
55     }
56
57     @Test
58     public void testCloseOrdering() throws Exception {
59         // Tests whether close is called in correct order on the module instances on following graph
60         // Each module tests whether its dependencies were closed before it (to simulate resource clean up failure)
61         // R1
62         // | \
63         // M1 M2
64         // |
65         // L1
66         ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
67         ObjectName r1 = transaction.createModule(factory.getImplementationName(), "root1");
68         ObjectName m1 = transaction.createModule(factory.getImplementationName(), "middle1");
69         ObjectName m2 = transaction.createModule(factory.getImplementationName(), "middle2");
70         ObjectName l1 = transaction.createModule(factory.getImplementationName(), "leaf1");
71
72         MultipleDependenciesModuleMXBean r1Proxy = transaction.newMXBeanProxy(r1, MultipleDependenciesModuleMXBean.class);
73         MultipleDependenciesModuleMXBean i1Proxy = transaction.newMXBeanProxy(m1, MultipleDependenciesModuleMXBean.class);
74         r1Proxy.setSingle(m1);
75         i1Proxy.setSingle(l1);
76         r1Proxy.setTestingDeps(asList(m2));
77         transaction.commit();
78
79         configRegistryClient.createTransaction().commit();
80         transaction = configRegistryClient.createTransaction();
81         MultipleDependenciesModuleMXBean l1Proxy = transaction.newMXBeanProxy(l1, MultipleDependenciesModuleMXBean.class);
82         l1Proxy.setSimple(true);
83         transaction.commit();
84     }
85
86     @Test
87     public void testDestroyModuleDependency() throws Exception {
88         ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
89         ObjectName r1 = transaction.createModule(factory.getImplementationName(), "root1");
90         ObjectName m1 = transaction.createModule(factory.getImplementationName(), "middle1");
91
92         MultipleDependenciesModuleMXBean r1Proxy = transaction.newMXBeanProxy(r1, MultipleDependenciesModuleMXBean.class);
93         r1Proxy.setSingle(m1);
94         transaction.commit();
95
96         transaction = configRegistryClient.createTransaction();
97         transaction.destroyModule(factory.getImplementationName(), "middle1");
98         try {
99             transaction.commit();
100             fail("Validation exception expected");
101         } catch (ValidationException e) {
102             assertThat(e.getFailedValidations().keySet(), CoreMatchers.hasItem("multiple-dependencies"));
103         }
104     }
105 }