Merge "AbstractConfigTest - exposed BundleContext and ServiceRegistration mock."
[controller.git] / opendaylight / config / config-manager / src / test / java / org / opendaylight / controller / config / manager / impl / AbstractConfigTest.java
1 /*
2  * Copyright (c) 2013 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.manager.impl;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.mockito.Matchers.any;
12 import static org.mockito.Mockito.doNothing;
13 import static org.mockito.Mockito.doReturn;
14 import static org.mockito.Mockito.mock;
15
16 import java.io.Closeable;
17 import java.lang.management.ManagementFactory;
18 import java.util.Dictionary;
19 import java.util.Set;
20
21 import javax.management.InstanceAlreadyExistsException;
22 import javax.management.MBeanServer;
23 import javax.management.ObjectName;
24
25 import org.junit.After;
26 import org.mockito.Matchers;
27 import org.opendaylight.controller.config.api.jmx.CommitStatus;
28 import org.opendaylight.controller.config.manager.impl.factoriesresolver.ModuleFactoriesResolver;
29 import org.opendaylight.controller.config.manager.impl.jmx.BaseJMXRegistrator;
30 import org.opendaylight.controller.config.manager.impl.jmx.ConfigRegistryJMXRegistrator;
31 import org.opendaylight.controller.config.manager.impl.jmx.InternalJMXRegistrator;
32 import org.opendaylight.controller.config.spi.Module;
33 import org.opendaylight.controller.config.util.ConfigRegistryJMXClient;
34 import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
35 import org.osgi.framework.BundleContext;
36 import org.osgi.framework.ServiceRegistration;
37
38 /**
39  * Each test that relies on
40  * {@link org.opendaylight.controller.config.manager.impl.ConfigRegistryImpl}
41  * needs to subclass this test.
42  * {@link org.opendaylight.controller.config.manager.impl.ConfigRegistryImpl} is
43  * registered to platform MBean Server using
44  * {@link #initConfigTransactionManagerImpl(org.opendaylight.controller.config.manager.impl.factoriesresolver.ModuleFactoriesResolver)}
45  * typically during setting up the each test.
46  */
47 public abstract class AbstractConfigTest extends
48         AbstractLockedPlatformMBeanServerTest {
49     protected ConfigRegistryJMXRegistrator configRegistryJMXRegistrator;
50     protected ConfigRegistryImpl configRegistry;
51     protected ConfigRegistryJMXClient configRegistryClient;
52     protected BaseJMXRegistrator baseJmxRegistrator;
53     protected InternalJMXRegistrator internalJmxRegistrator;
54     protected BundleContext mockedContext;
55     protected ServiceRegistration<?> mockedServiceRegistration;
56
57     // this method should be called in @Before
58     protected void initConfigTransactionManagerImpl(
59             ModuleFactoriesResolver resolver) {
60         final MBeanServer platformMBeanServer = ManagementFactory
61                 .getPlatformMBeanServer();
62
63         configRegistryJMXRegistrator = new ConfigRegistryJMXRegistrator(
64                 platformMBeanServer);
65         this.mockedContext = mock(BundleContext.class);
66         this.mockedServiceRegistration = mock(ServiceRegistration.class);
67         doNothing().when(mockedServiceRegistration).unregister();
68         doReturn(mockedServiceRegistration).when(mockedContext).registerService(
69                 Matchers.any(String[].class), any(Closeable.class),
70                 any(Dictionary.class));
71         internalJmxRegistrator = new InternalJMXRegistrator(platformMBeanServer);
72         baseJmxRegistrator = new BaseJMXRegistrator(internalJmxRegistrator);
73
74         configRegistry = new ConfigRegistryImpl(resolver, mockedContext,
75                 platformMBeanServer, baseJmxRegistrator);
76         try {
77             configRegistryJMXRegistrator.registerToJMX(configRegistry);
78         } catch (InstanceAlreadyExistsException e) {
79             throw new RuntimeException(e);
80         }
81         configRegistryClient = new ConfigRegistryJMXClient(platformMBeanServer);
82     }
83
84     @After
85     public final void cleanUpConfigTransactionManagerImpl() {
86         configRegistryJMXRegistrator.close();
87         configRegistry.close();
88     }
89
90     /**
91      * Can be called in @After of tests if some other cleanup is needed that
92      * would be discarded by closing config beans in this method
93      */
94     protected void destroyAllConfigBeans() throws Exception {
95         ConfigTransactionJMXClient transaction = configRegistryClient
96                 .createTransaction();
97         Set<ObjectName> all = transaction.lookupConfigBeans();
98         // workaround for getting same Module more times
99         while (all.size() > 0) {
100             transaction.destroyModule(all.iterator().next());
101             all = transaction.lookupConfigBeans();
102         }
103         transaction.commit();
104     }
105
106     protected void assertSame(ObjectName oN1, ObjectName oN2) {
107         assertEquals(oN1.getKeyProperty("instanceName"),
108                 oN2.getKeyProperty("instanceName"));
109         assertEquals(oN1.getKeyProperty("interfaceName"),
110                 oN2.getKeyProperty("interfaceName"));
111     }
112
113     protected void assertStatus(CommitStatus status, int expectedNewInstances,
114             int expectedRecreatedInstances, int expectedReusedInstances) {
115         assertEquals(expectedNewInstances, status.getNewInstances().size());
116         assertEquals(expectedRecreatedInstances, status.getRecreatedInstances()
117                 .size());
118         assertEquals(expectedReusedInstances, status.getReusedInstances()
119                 .size());
120     }
121
122     protected ObjectName createTestConfigBean(
123             ConfigTransactionJMXClient transaction, String implementationName,
124             String name) throws InstanceAlreadyExistsException {
125         ObjectName nameCreated = transaction.createModule(implementationName,
126                 name);
127         return nameCreated;
128     }
129
130     protected void assertBeanCount(int i, String configMXBeanName) {
131         assertEquals(i, configRegistry.lookupConfigBeans(configMXBeanName)
132                 .size());
133     }
134
135     protected void assertBeanExists(int count, String moduleName,
136             String instanceName) {
137         assertEquals(1,
138                 configRegistry.lookupConfigBeans(moduleName, instanceName)
139                         .size());
140     }
141
142     /**
143      *
144      * @param configBeanClass
145      *            Empty constructor class of config bean to be instantiated
146      *            whenever create
147      * @param implementationName
148      * @return
149      */
150     protected ClassBasedModuleFactory createClassBasedCBF(
151             Class<? extends Module> configBeanClass, String implementationName) {
152         return new ClassBasedModuleFactory(implementationName, configBeanClass);
153     }
154 }