Merge "Refactor Subnet.isSubnetOf - reduce number of 'if' statements. Added unitests."
[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 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;
29
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;
41 import java.util.Map;
42 import java.util.Set;
43
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;
49
50 /**
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.
58  */
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;
68
69     protected  Map<Class, BundleContextServiceRegistrationHandler> getBundleContextServiceRegistrationHandlers() {
70         return Maps.newHashMap();
71     }
72
73     // this method should be called in @Before
74     protected void initConfigTransactionManagerImpl(
75             ModuleFactoriesResolver resolver) {
76         final MBeanServer platformMBeanServer = ManagementFactory
77                 .getPlatformMBeanServer();
78
79         configRegistryJMXRegistrator = new ConfigRegistryJMXRegistrator(
80                 platformMBeanServer);
81         initBundleContext();
82
83         internalJmxRegistrator = new InternalJMXRegistrator(platformMBeanServer);
84         baseJmxRegistrator = new BaseJMXRegistrator(internalJmxRegistrator);
85
86         configRegistry = new ConfigRegistryImpl(resolver,
87                 platformMBeanServer, baseJmxRegistrator);
88
89         try {
90             configRegistryJMXRegistrator.registerToJMX(configRegistry);
91         } catch (InstanceAlreadyExistsException e) {
92             throw new RuntimeException(e);
93         }
94         configRegistryClient = new ConfigRegistryJMXClient(platformMBeanServer);
95     }
96
97     private void initBundleContext() {
98         this.mockedServiceRegistration = mock(ServiceRegistration.class);
99         doNothing().when(mockedServiceRegistration).unregister();
100
101         RegisterServiceAnswer answer = new RegisterServiceAnswer();
102
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());
107     }
108
109
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);
117             } else {
118                 resources.add(resourceAsStream);
119             }
120         }
121         Assert.assertEquals("Some files were not found", Collections.<String>emptyList(), failedToFind);
122
123         return resources;
124     }
125
126     @After
127     public final void cleanUpConfigTransactionManagerImpl() {
128         configRegistryJMXRegistrator.close();
129         configRegistry.close();
130         TestingFixedThreadPool.cleanUp();
131         TestingScheduledThreadPoolImpl.cleanUp();
132     }
133
134     /**
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
137      */
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();
146         }
147         transaction.commit();
148     }
149
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"));
155     }
156
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()
161                 .size());
162         assertEquals("Reused instances mismatch in " + status, expectedReusedInstances, status.getReusedInstances()
163                 .size());
164     }
165
166     protected ObjectName createTestConfigBean(
167             ConfigTransactionJMXClient transaction, String implementationName,
168             String name) throws InstanceAlreadyExistsException {
169         ObjectName nameCreated = transaction.createModule(implementationName,
170                 name);
171         return nameCreated;
172     }
173
174     protected void assertBeanCount(int i, String configMXBeanName) {
175         assertEquals(i, configRegistry.lookupConfigBeans(configMXBeanName)
176                 .size());
177     }
178
179     protected void assertBeanExists(int count, String moduleName,
180             String instanceName) {
181         assertEquals(1,
182                 configRegistry.lookupConfigBeans(moduleName, instanceName)
183                         .size());
184     }
185
186     /**
187      *
188      * @param configBeanClass
189      *            Empty constructor class of config bean to be instantiated
190      *            whenever create
191      * @param implementationName
192      * @return
193      */
194     protected ClassBasedModuleFactory createClassBasedCBF(
195             Class<? extends Module> configBeanClass, String implementationName) {
196         return new ClassBasedModuleFactory(implementationName, configBeanClass);
197     }
198
199
200     public static interface BundleContextServiceRegistrationHandler {
201
202        void handleServiceRegistration(Object serviceInstance);
203
204     }
205
206     private class RegisterServiceAnswer implements Answer {
207         @Override
208         public Object answer(InvocationOnMock invocation) throws Throwable {
209             Object[] args = invocation.getArguments();
210
211             Preconditions.checkArgument(args.length == 3);
212
213             Preconditions.checkArgument(args[0] instanceof Class);
214             Class<?> serviceType = (Class<?>) args[0];
215             Object serviceInstance = args[1];
216
217             BundleContextServiceRegistrationHandler serviceRegistrationHandler = getBundleContextServiceRegistrationHandlers()
218                     .get(serviceType);
219
220             Preconditions.checkArgument(serviceType.isAssignableFrom(serviceInstance.getClass()));
221
222             if (serviceRegistrationHandler != null) {
223                 serviceRegistrationHandler.handleServiceRegistration(serviceType.cast(serviceInstance));
224             }
225
226             return mockedServiceRegistration;
227         }
228     }
229 }