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.yang.bgp.rib.impl;
10 import static org.mockito.Matchers.any;
11 import static org.mockito.Mockito.mock;
13 import java.math.BigDecimal;
14 import java.util.Arrays;
15 import java.util.Collections;
16 import java.util.List;
17 import java.util.concurrent.Future;
19 import javax.management.InstanceAlreadyExistsException;
20 import javax.management.InstanceNotFoundException;
21 import javax.management.ObjectName;
23 import org.junit.After;
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.mockito.Matchers;
27 import org.mockito.Mock;
28 import org.mockito.Mockito;
29 import org.mockito.MockitoAnnotations;
30 import org.opendaylight.controller.config.api.jmx.CommitStatus;
31 import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
32 import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
33 import org.opendaylight.controller.config.spi.ModuleFactory;
34 import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
35 import org.opendaylight.controller.config.yang.bgp.parser.spi.SimpleBGPExtensionProviderContextModuleFactory;
36 import org.opendaylight.controller.config.yang.bgp.reconnectstrategy.TimedReconnectStrategyModuleTest;
37 import org.opendaylight.controller.config.yang.bgp.rib.spi.RIBExtensionsImplModuleFactory;
38 import org.opendaylight.controller.config.yang.bgp.rib.spi.RIBExtensionsImplModuleMXBean;
39 import org.opendaylight.controller.config.yang.md.sal.binding.impl.DataBrokerImplModuleFactory;
40 import org.opendaylight.controller.config.yang.md.sal.binding.impl.DataBrokerImplModuleMXBean;
41 import org.opendaylight.controller.config.yang.md.sal.binding.impl.RuntimeMappingModuleFactory;
42 import org.opendaylight.controller.config.yang.md.sal.dom.impl.DomBrokerImplModuleFactory;
43 import org.opendaylight.controller.config.yang.md.sal.dom.impl.DomBrokerImplModuleMXBean;
44 import org.opendaylight.controller.config.yang.md.sal.dom.impl.HashMapDataStoreModuleFactory;
45 import org.opendaylight.controller.config.yang.md.sal.dom.impl.HashMapDataStoreModuleMXBean;
46 import org.opendaylight.controller.config.yang.netty.eventexecutor.GlobalEventExecutorModuleFactory;
47 import org.opendaylight.controller.config.yang.netty.threadgroup.NettyThreadgroupModuleFactory;
48 import org.opendaylight.controller.config.yang.netty.timer.HashedWheelTimerModuleFactory;
49 import org.opendaylight.controller.config.yang.reconnectstrategy.TimedReconnectStrategyModuleFactory;
50 import org.opendaylight.controller.config.yang.store.impl.YangParserWrapper;
51 import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
52 import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler;
53 import org.opendaylight.controller.sal.core.api.data.DataModificationTransaction;
54 import org.opendaylight.controller.sal.core.api.data.DataProviderService;
55 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId;
57 import org.opendaylight.yangtools.concepts.Registration;
58 import org.opendaylight.yangtools.yang.common.RpcResult;
59 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
60 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
61 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
62 import org.opendaylight.yangtools.yang.model.api.SchemaServiceListener;
63 import org.osgi.framework.Bundle;
64 import org.osgi.framework.BundleListener;
65 import org.osgi.framework.Filter;
66 import org.osgi.framework.ServiceListener;
67 import org.osgi.framework.ServiceReference;
69 import com.google.common.collect.Lists;
71 public class RIBImplModuleTest extends AbstractConfigTest {
72 private static final String INSTANCE_NAME = GlobalEventExecutorModuleFactory.SINGLETON_NAME;
73 private static final String TRANSACTION_NAME = "testTransaction";
75 private RIBImplModuleFactory factory;
76 private DataBrokerImplModuleFactory dataBrokerFactory;
77 private TimedReconnectStrategyModuleFactory reconnectFactory;
78 private BGPDispatcherImplModuleFactory dispactherFactory;
79 private NettyThreadgroupModuleFactory threadgroupFactory;
80 private GlobalEventExecutorModuleFactory executorFactory;
81 private SimpleBGPExtensionProviderContextModuleFactory extensionFactory;
82 private RIBExtensionsImplModuleFactory ribExtensionsFactory;
83 private DomBrokerImplModuleFactory domBrokerFactory;
84 private RuntimeMappingModuleFactory runtimeMappingFactory;
85 private HashMapDataStoreModuleFactory dataStroreFactory;
86 private HashedWheelTimerModuleFactory hwtFactory;
89 private DataModificationTransaction mockedTransaction;
92 private DataProviderService mockedDataProvider;
95 private Future<RpcResult<TransactionStatus>> mockedFuture;
98 private RpcResult<TransactionStatus> mockedResult;
100 @SuppressWarnings("unchecked")
102 public void setUp() throws Exception {
103 MockitoAnnotations.initMocks(this);
105 this.factory = new RIBImplModuleFactory();
106 this.dataBrokerFactory = new DataBrokerImplModuleFactory();
107 this.executorFactory = new GlobalEventExecutorModuleFactory();
108 this.dispactherFactory = new BGPDispatcherImplModuleFactory();
109 this.threadgroupFactory = new NettyThreadgroupModuleFactory();
110 this.reconnectFactory = new TimedReconnectStrategyModuleFactory();
111 this.extensionFactory = new SimpleBGPExtensionProviderContextModuleFactory();
112 this.ribExtensionsFactory = new RIBExtensionsImplModuleFactory();
113 this.domBrokerFactory = new DomBrokerImplModuleFactory();
114 this.runtimeMappingFactory = new RuntimeMappingModuleFactory();
115 this.dataStroreFactory = new HashMapDataStoreModuleFactory();
116 this.hwtFactory = new HashedWheelTimerModuleFactory();
118 List<ModuleFactory> moduleFactories = getModuleFactories();
119 super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext, moduleFactories
120 .toArray(new ModuleFactory[moduleFactories.size()])));
122 Filter mockedFilter = mock(Filter.class);
123 Mockito.doReturn(mockedFilter).when(mockedContext).createFilter(Mockito.anyString());
125 Mockito.doNothing().when(mockedContext).addServiceListener(any(ServiceListener.class), Mockito.anyString());
127 Mockito.doNothing().when(mockedContext).addBundleListener(any(BundleListener.class));
129 Mockito.doReturn(new Bundle[]{}).when(mockedContext).getBundles();
131 Mockito.doReturn(new ServiceReference[]{}).when(mockedContext).getServiceReferences(Matchers.anyString(), Matchers.anyString());
133 ServiceReference<?> emptyServiceReference = mock(ServiceReference.class, "Empty");
135 ServiceReference<?> dataProviderServiceReference = mock(ServiceReference.class, "Data Provider");
138 Mockito.doReturn(mockedFilter).when(mockedContext).createFilter(Mockito.anyString());
140 Mockito.doNothing().when(mockedContext).addServiceListener(any(ServiceListener.class), Mockito.anyString());
142 Mockito.doNothing().when(mockedContext).addBundleListener(any(BundleListener.class));
144 Mockito.doReturn(new Bundle[]{}).when(mockedContext).getBundles();
146 Mockito.doReturn(new ServiceReference[]{}).when(mockedContext).getServiceReferences(Matchers.anyString(), Matchers.anyString());
148 //mockedDataProvider = mock(DataProviderService.class);
151 Mockito.doReturn("Empty reference").when(emptyServiceReference).toString();
152 Mockito.doReturn("Data Provider Service Reference").when(dataProviderServiceReference).toString();
154 Mockito.doReturn(emptyServiceReference).when(mockedContext).getServiceReference(any(Class.class));
155 Mockito.doReturn(dataProviderServiceReference).when(mockedContext).getServiceReference(DataProviderService.class);
157 Mockito.doReturn(mockedDataProvider).when(mockedContext).getService(dataProviderServiceReference);
159 //Mockito.doReturn(null).when(mockedContext).getService(dataProviderServiceReference);
160 Mockito.doReturn(null).when(mockedContext).getService(emptyServiceReference);
163 Registration<DataCommitHandler<InstanceIdentifier, CompositeNode>> registration = mock(Registration.class);
164 Mockito.doReturn(registration).when(mockedDataProvider).registerCommitHandler(any(InstanceIdentifier.class),
165 any(DataCommitHandler.class));
166 Mockito.doReturn(registration).when(mockedDataProvider).registerCommitHandler(any(InstanceIdentifier.class),
167 any(DataCommitHandler.class));
169 Mockito.doReturn(null).when(mockedDataProvider).readOperationalData(any(InstanceIdentifier.class));
170 Mockito.doReturn(mockedTransaction).when(mockedDataProvider).beginTransaction();
172 Mockito.doNothing().when(mockedTransaction).putOperationalData(any(InstanceIdentifier.class), any(CompositeNode.class));
173 Mockito.doNothing().when(mockedTransaction).removeOperationalData(any(InstanceIdentifier.class));
175 Mockito.doReturn(mockedFuture).when(mockedTransaction).commit();
176 Mockito.doReturn(TRANSACTION_NAME).when(mockedTransaction).getIdentifier();
178 Mockito.doReturn(mockedResult).when(mockedFuture).get();
179 Mockito.doReturn(true).when(mockedResult).isSuccessful();
180 Mockito.doReturn(Collections.emptySet()).when(mockedResult).getErrors();
183 protected List<ModuleFactory> getModuleFactories() {
184 return Lists.newArrayList(this.factory,
185 this.dispactherFactory, this.threadgroupFactory,
186 this.reconnectFactory, this.dataBrokerFactory, this.executorFactory, this.extensionFactory,
187 this.ribExtensionsFactory, this.domBrokerFactory, this.runtimeMappingFactory,
188 this.dataStroreFactory, this.hwtFactory);
192 protected BundleContextServiceRegistrationHandler getBundleContextServiceRegistrationHandler(final Class<?> serviceType) {
193 if (serviceType.equals(SchemaServiceListener.class)) {
194 return new BundleContextServiceRegistrationHandler() {
196 public void handleServiceRegistration(final Object o) {
197 SchemaServiceListener listener = (SchemaServiceListener) o;
198 listener.onGlobalContextUpdated(getMockedSchemaContext());
203 return super.getBundleContextServiceRegistrationHandler(serviceType);
207 public void testCreateBean() throws Exception {
208 ConfigTransactionJMXClient transaction = configRegistryClient
209 .createTransaction();
210 createInstance(transaction, this.factory.getImplementationName(), INSTANCE_NAME,
211 this.dataBrokerFactory.getImplementationName(), this.reconnectFactory.getImplementationName(),
212 this.executorFactory.getImplementationName(), this.dispactherFactory.getImplementationName(),
213 this.ribExtensionsFactory.getImplementationName(), this.domBrokerFactory.getImplementationName(),
214 this.dataStroreFactory.getImplementationName());
215 transaction.validateConfig();
216 CommitStatus status = transaction.commit();
218 assertBeanCount(1, factory.getImplementationName());
219 assertStatus(status, 14, 0, 0);
223 public void closeAllModules() throws Exception {
224 super.destroyAllConfigBeans();
227 public static ObjectName createInstance(final ConfigTransactionJMXClient transaction, final String moduleName,
228 final String instanceName, final String bindingDataModuleName, final String reconnectModueName,
229 final String executorModuleName, final String dispatcherModuleName, final String ribExtensionsModuleName,
230 final String domBrokerModuleName, final String dataStroreModuleName)
232 ObjectName nameCreated = transaction.createModule(
233 moduleName, instanceName);
234 RIBImplModuleMXBean mxBean = transaction.newMXBeanProxy(
235 nameCreated, RIBImplModuleMXBean.class);
236 ObjectName reconnectObjectName = TimedReconnectStrategyModuleTest.createInstance(transaction, reconnectModueName, "session-reconnect-strategy", 100, 1000L, new BigDecimal(1.0), 5000L, 2000L, null);
237 mxBean.setSessionReconnectStrategy(reconnectObjectName);
238 mxBean.setDataProvider(createDataBrokerInstance(transaction, bindingDataModuleName, "data-broker-impl", domBrokerModuleName, dataStroreModuleName));
239 ObjectName reconnectStrategyON = TimedReconnectStrategyModuleTest.createInstance(transaction, reconnectModueName, "tcp-reconnect-strategy", 100, 1000L, new BigDecimal(1.0), 5000L, 2000L, null);
240 mxBean.setTcpReconnectStrategy(reconnectStrategyON);
241 mxBean.setBgpDispatcher(BGPDispatcherImplModuleTest.createInstance(transaction, dispatcherModuleName, "bgp-dispatcher"));
242 mxBean.setExtensions(createRibExtensionsInstance(transaction, ribExtensionsModuleName, "rib-extensions-privider1"));
243 mxBean.setRibId(new RibId("test"));
244 mxBean.setLocalAs(5000L);
245 mxBean.setBgpId(new Ipv4Address("192.168.1.1"));
249 public static ObjectName createDataBrokerInstance(final ConfigTransactionJMXClient transaction, final String moduleName,
250 final String instanceName, final String domBrokerModuleName, final String dataStroreModuleName) throws
251 InstanceAlreadyExistsException, InstanceNotFoundException {
252 ObjectName nameCreated = transaction.createModule(
253 moduleName, instanceName);
254 DataBrokerImplModuleMXBean mxBean = transaction.newMBeanProxy(
255 nameCreated, DataBrokerImplModuleMXBean.class);
256 mxBean.setDomBroker(createDomBrokerInstance(transaction, domBrokerModuleName, "dom-broker1", dataStroreModuleName));
257 mxBean.setMappingService(lookupMappingServiceInstance(transaction));
261 public static ObjectName createDomBrokerInstance(final ConfigTransactionJMXClient transaction, final String moduleName,
262 final String instanceName, final String dataStroreModuleName) throws InstanceAlreadyExistsException {
263 ObjectName nameCreated = transaction.createModule(
264 moduleName, instanceName);
265 DomBrokerImplModuleMXBean mxBean = transaction.newMBeanProxy(
266 nameCreated, DomBrokerImplModuleMXBean.class);
267 mxBean.setDataStore(createDataStoreInstance(transaction, dataStroreModuleName, "has-map-data-strore-instance"));
271 public static ObjectName createDataStoreInstance(final ConfigTransactionJMXClient transaction, final String moduleName,
272 final String instanceName) throws InstanceAlreadyExistsException {
273 ObjectName nameCreated = transaction.createModule(
274 moduleName, instanceName);
275 transaction.newMBeanProxy(
276 nameCreated, HashMapDataStoreModuleMXBean.class);
280 public static ObjectName lookupMappingServiceInstance(final ConfigTransactionJMXClient transaction) {
283 return transaction.lookupConfigBean(RuntimeMappingModuleFactory.NAME, RuntimeMappingModuleFactory.SINGLETON_NAME);
284 } catch (InstanceNotFoundException e) {
286 return transaction.createModule(RuntimeMappingModuleFactory.NAME, RuntimeMappingModuleFactory.SINGLETON_NAME);
287 } catch (InstanceAlreadyExistsException e1) {
288 throw new IllegalStateException(e1);
293 public static ObjectName createRibExtensionsInstance(final ConfigTransactionJMXClient transaction, final String moduleName,
294 final String instanceName) throws InstanceAlreadyExistsException {
295 ObjectName nameCreated = transaction.createModule(
296 moduleName, instanceName);
297 transaction.newMBeanProxy(
298 nameCreated, RIBExtensionsImplModuleMXBean.class);
302 public SchemaContext getMockedSchemaContext() {
303 List<String> paths = Arrays.asList("/META-INF/yang/bgp-rib.yang", "/META-INF/yang/ietf-inet-types.yang",
304 "/META-INF/yang/bgp-message.yang", "/META-INF/yang/bgp-multiprotocol.yang", "/META-INF/yang/bgp-types.yang");
305 return YangParserWrapper.parseYangFiles(getFilesAsInputStreams(paths));