2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.controller.config.manager.impl;
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;
16 import java.io.Closeable;
17 import java.lang.management.ManagementFactory;
18 import java.util.Dictionary;
21 import javax.management.InstanceAlreadyExistsException;
22 import javax.management.MBeanServer;
23 import javax.management.ObjectName;
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;
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.
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;
55 // this method should be called in @Before
56 protected void initConfigTransactionManagerImpl(
57 ModuleFactoriesResolver resolver) {
58 final MBeanServer platformMBeanServer = ManagementFactory
59 .getPlatformMBeanServer();
61 configRegistryJMXRegistrator = new ConfigRegistryJMXRegistrator(
63 BundleContext context = mock(BundleContext.class);
64 ServiceRegistration<?> mockedServiceRegistration = mock(ServiceRegistration.class);
65 doNothing().when(mockedServiceRegistration).unregister();
66 doReturn(mockedServiceRegistration).when(context).registerService(
67 Matchers.any(String[].class), any(Closeable.class),
68 any(Dictionary.class));
69 internalJmxRegistrator = new InternalJMXRegistrator(platformMBeanServer);
70 baseJmxRegistrator = new BaseJMXRegistrator(internalJmxRegistrator);
72 configRegistry = new ConfigRegistryImpl(resolver, context,
73 platformMBeanServer, baseJmxRegistrator);
75 configRegistryJMXRegistrator.registerToJMX(configRegistry);
76 } catch (InstanceAlreadyExistsException e) {
77 throw new RuntimeException(e);
79 configRegistryClient = new ConfigRegistryJMXClient(platformMBeanServer);
83 public final void cleanUpConfigTransactionManagerImpl() {
84 configRegistryJMXRegistrator.close();
85 configRegistry.close();
89 * Can be called in @After of tests if some other cleanup is needed that
90 * would be discarded by closing config beans in this method
92 protected void destroyAllConfigBeans() throws Exception {
93 ConfigTransactionJMXClient transaction = configRegistryClient
95 Set<ObjectName> all = transaction.lookupConfigBeans();
96 // workaround for getting same Module more times
97 while (all.size() > 0) {
98 transaction.destroyModule(all.iterator().next());
99 all = transaction.lookupConfigBeans();
101 transaction.commit();
104 protected void assertSame(ObjectName oN1, ObjectName oN2) {
105 assertEquals(oN1.getKeyProperty("instanceName"),
106 oN2.getKeyProperty("instanceName"));
107 assertEquals(oN1.getKeyProperty("interfaceName"),
108 oN2.getKeyProperty("interfaceName"));
111 protected void assertStatus(CommitStatus status, int expectedNewInstances,
112 int expectedRecreatedInstances, int expectedReusedInstances) {
113 assertEquals(expectedNewInstances, status.getNewInstances().size());
114 assertEquals(expectedRecreatedInstances, status.getRecreatedInstances()
116 assertEquals(expectedReusedInstances, status.getReusedInstances()
120 protected ObjectName createTestConfigBean(
121 ConfigTransactionJMXClient transaction, String implementationName,
122 String name) throws InstanceAlreadyExistsException {
123 ObjectName nameCreated = transaction.createModule(implementationName,
128 protected void assertBeanCount(int i, String configMXBeanName) {
129 assertEquals(i, configRegistry.lookupConfigBeans(configMXBeanName)
133 protected void assertBeanExists(int count, String moduleName,
134 String instanceName) {
136 configRegistry.lookupConfigBeans(moduleName, instanceName)
142 * @param configBeanClass
143 * Empty constructor class of config bean to be instantiated
145 * @param implementationName
148 protected ClassBasedModuleFactory createClassBasedCBF(
149 Class<? extends Module> configBeanClass, String implementationName) {
150 return new ClassBasedModuleFactory(implementationName, configBeanClass);