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 com.google.common.base.Preconditions;
11 import com.google.common.collect.Maps;
12 import junit.framework.Assert;
13 import org.junit.After;
14 import org.mockito.Matchers;
15 import org.mockito.invocation.InvocationOnMock;
16 import org.mockito.stubbing.Answer;
17 import org.opendaylight.controller.config.api.jmx.CommitStatus;
18 import org.opendaylight.controller.config.manager.impl.factoriesresolver.ModuleFactoriesResolver;
19 import org.opendaylight.controller.config.manager.impl.jmx.BaseJMXRegistrator;
20 import org.opendaylight.controller.config.manager.impl.jmx.ConfigRegistryJMXRegistrator;
21 import org.opendaylight.controller.config.manager.impl.jmx.InternalJMXRegistrator;
22 import org.opendaylight.controller.config.manager.testingservices.scheduledthreadpool.TestingScheduledThreadPoolImpl;
23 import org.opendaylight.controller.config.manager.testingservices.threadpool.TestingFixedThreadPool;
24 import org.opendaylight.controller.config.spi.Module;
25 import org.opendaylight.controller.config.util.ConfigRegistryJMXClient;
26 import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
27 import org.osgi.framework.BundleContext;
28 import org.osgi.framework.ServiceRegistration;
30 import javax.management.InstanceAlreadyExistsException;
31 import javax.management.MBeanServer;
32 import javax.management.ObjectName;
33 import java.io.Closeable;
34 import java.io.InputStream;
35 import java.lang.management.ManagementFactory;
36 import java.util.ArrayList;
37 import java.util.Collection;
38 import java.util.Collections;
39 import java.util.Dictionary;
40 import java.util.List;
44 import static org.junit.Assert.assertEquals;
45 import static org.mockito.Matchers.any;
46 import static org.mockito.Mockito.doAnswer;
47 import static org.mockito.Mockito.doNothing;
48 import static org.mockito.Mockito.mock;
51 * Each test that relies on
52 * {@link org.opendaylight.controller.config.manager.impl.ConfigRegistryImpl}
53 * needs to subclass this test.
54 * {@link org.opendaylight.controller.config.manager.impl.ConfigRegistryImpl} is
55 * registered to platform MBean Server using
56 * {@link #initConfigTransactionManagerImpl(org.opendaylight.controller.config.manager.impl.factoriesresolver.ModuleFactoriesResolver)}
57 * typically during setting up the each test.
59 public abstract class AbstractConfigTest extends
60 AbstractLockedPlatformMBeanServerTest {
61 protected ConfigRegistryJMXRegistrator configRegistryJMXRegistrator;
62 protected ConfigRegistryImpl configRegistry;
63 protected ConfigRegistryJMXClient configRegistryClient;
64 protected BaseJMXRegistrator baseJmxRegistrator;
65 protected InternalJMXRegistrator internalJmxRegistrator;
66 protected BundleContext mockedContext = mock(BundleContext.class);
67 protected ServiceRegistration<?> mockedServiceRegistration;
69 protected Map<Class, BundleContextServiceRegistrationHandler> getBundleContextServiceRegistrationHandlers() {
70 return Maps.newHashMap();
73 // this method should be called in @Before
74 protected void initConfigTransactionManagerImpl(
75 ModuleFactoriesResolver resolver) {
76 final MBeanServer platformMBeanServer = ManagementFactory
77 .getPlatformMBeanServer();
79 configRegistryJMXRegistrator = new ConfigRegistryJMXRegistrator(
83 internalJmxRegistrator = new InternalJMXRegistrator(platformMBeanServer);
84 baseJmxRegistrator = new BaseJMXRegistrator(internalJmxRegistrator);
86 configRegistry = new ConfigRegistryImpl(resolver,
87 platformMBeanServer, baseJmxRegistrator);
90 configRegistryJMXRegistrator.registerToJMX(configRegistry);
91 } catch (InstanceAlreadyExistsException e) {
92 throw new RuntimeException(e);
94 configRegistryClient = new ConfigRegistryJMXClient(platformMBeanServer);
97 private void initBundleContext() {
98 this.mockedServiceRegistration = mock(ServiceRegistration.class);
99 doNothing().when(mockedServiceRegistration).unregister();
101 RegisterServiceAnswer answer = new RegisterServiceAnswer();
103 doAnswer(answer).when(mockedContext).registerService(Matchers.any(String[].class),
104 any(Closeable.class), Matchers.<Dictionary<String, ?>>any());
105 doAnswer(answer).when(mockedContext).registerService(Matchers.<Class<Closeable>>any(), any(Closeable.class),
106 Matchers.<Dictionary<String, ?>>any());
110 public Collection<InputStream> getFilesAsInputStreams(List<String> paths) {
111 final Collection<InputStream> resources = new ArrayList<>();
112 List<String> failedToFind = new ArrayList<>();
113 for (String path : paths) {
114 InputStream resourceAsStream = getClass().getResourceAsStream(path);
115 if (resourceAsStream == null) {
116 failedToFind.add(path);
118 resources.add(resourceAsStream);
121 Assert.assertEquals("Some files were not found", Collections.<String>emptyList(), failedToFind);
127 public final void cleanUpConfigTransactionManagerImpl() {
128 configRegistryJMXRegistrator.close();
129 configRegistry.close();
130 TestingFixedThreadPool.cleanUp();
131 TestingScheduledThreadPoolImpl.cleanUp();
135 * Can be called in @After of tests if some other cleanup is needed that
136 * would be discarded by closing config beans in this method
138 protected void destroyAllConfigBeans() throws Exception {
139 ConfigTransactionJMXClient transaction = configRegistryClient
140 .createTransaction();
141 Set<ObjectName> all = transaction.lookupConfigBeans();
142 // workaround for getting same Module more times
143 while (all.size() > 0) {
144 transaction.destroyModule(all.iterator().next());
145 all = transaction.lookupConfigBeans();
147 transaction.commit();
150 protected void assertSame(ObjectName oN1, ObjectName oN2) {
151 assertEquals(oN1.getKeyProperty("instanceName"),
152 oN2.getKeyProperty("instanceName"));
153 assertEquals(oN1.getKeyProperty("interfaceName"),
154 oN2.getKeyProperty("interfaceName"));
157 protected void assertStatus(CommitStatus status, int expectedNewInstances,
158 int expectedRecreatedInstances, int expectedReusedInstances) {
159 assertEquals("New instances mismatch in " + status, expectedNewInstances, status.getNewInstances().size());
160 assertEquals("Recreated instances mismatch in " + status, expectedRecreatedInstances, status.getRecreatedInstances()
162 assertEquals("Reused instances mismatch in " + status, expectedReusedInstances, status.getReusedInstances()
166 protected ObjectName createTestConfigBean(
167 ConfigTransactionJMXClient transaction, String implementationName,
168 String name) throws InstanceAlreadyExistsException {
169 ObjectName nameCreated = transaction.createModule(implementationName,
174 protected void assertBeanCount(int i, String configMXBeanName) {
175 assertEquals(i, configRegistry.lookupConfigBeans(configMXBeanName)
179 protected void assertBeanExists(int count, String moduleName,
180 String instanceName) {
182 configRegistry.lookupConfigBeans(moduleName, instanceName)
188 * @param configBeanClass
189 * Empty constructor class of config bean to be instantiated
191 * @param implementationName
194 protected ClassBasedModuleFactory createClassBasedCBF(
195 Class<? extends Module> configBeanClass, String implementationName) {
196 return new ClassBasedModuleFactory(implementationName, configBeanClass);
200 public static interface BundleContextServiceRegistrationHandler {
202 void handleServiceRegistration(Object serviceInstance);
206 private class RegisterServiceAnswer implements Answer {
208 public Object answer(InvocationOnMock invocation) throws Throwable {
209 Object[] args = invocation.getArguments();
211 Preconditions.checkArgument(args.length == 3);
213 Preconditions.checkArgument(args[0] instanceof Class);
214 Class<?> serviceType = (Class<?>) args[0];
215 Object serviceInstance = args[1];
217 BundleContextServiceRegistrationHandler serviceRegistrationHandler = getBundleContextServiceRegistrationHandlers()
220 Preconditions.checkArgument(serviceType.isAssignableFrom(serviceInstance.getClass()));
222 if (serviceRegistrationHandler != null) {
223 serviceRegistrationHandler.handleServiceRegistration(serviceType.cast(serviceInstance));
226 return mockedServiceRegistration;