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;
54 protected BundleContext mockedContext;
55 protected ServiceRegistration<?> mockedServiceRegistration;
57 // this method should be called in @Before
58 protected void initConfigTransactionManagerImpl(
59 ModuleFactoriesResolver resolver) {
60 final MBeanServer platformMBeanServer = ManagementFactory
61 .getPlatformMBeanServer();
63 configRegistryJMXRegistrator = new ConfigRegistryJMXRegistrator(
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);
74 configRegistry = new ConfigRegistryImpl(resolver, mockedContext,
75 platformMBeanServer, baseJmxRegistrator);
77 configRegistryJMXRegistrator.registerToJMX(configRegistry);
78 } catch (InstanceAlreadyExistsException e) {
79 throw new RuntimeException(e);
81 configRegistryClient = new ConfigRegistryJMXClient(platformMBeanServer);
85 public final void cleanUpConfigTransactionManagerImpl() {
86 configRegistryJMXRegistrator.close();
87 configRegistry.close();
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
94 protected void destroyAllConfigBeans() throws Exception {
95 ConfigTransactionJMXClient transaction = configRegistryClient
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();
103 transaction.commit();
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"));
113 protected void assertStatus(CommitStatus status, int expectedNewInstances,
114 int expectedRecreatedInstances, int expectedReusedInstances) {
115 assertEquals(expectedNewInstances, status.getNewInstances().size());
116 assertEquals(expectedRecreatedInstances, status.getRecreatedInstances()
118 assertEquals(expectedReusedInstances, status.getReusedInstances()
122 protected ObjectName createTestConfigBean(
123 ConfigTransactionJMXClient transaction, String implementationName,
124 String name) throws InstanceAlreadyExistsException {
125 ObjectName nameCreated = transaction.createModule(implementationName,
130 protected void assertBeanCount(int i, String configMXBeanName) {
131 assertEquals(i, configRegistry.lookupConfigBeans(configMXBeanName)
135 protected void assertBeanExists(int count, String moduleName,
136 String instanceName) {
138 configRegistry.lookupConfigBeans(moduleName, instanceName)
144 * @param configBeanClass
145 * Empty constructor class of config bean to be instantiated
147 * @param implementationName
150 protected ClassBasedModuleFactory createClassBasedCBF(
151 Class<? extends Module> configBeanClass, String implementationName) {
152 return new ClassBasedModuleFactory(implementationName, configBeanClass);