2 * Copyright (c) 2014 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.programming.impl;
10 import static org.mockito.Matchers.any;
11 import static org.mockito.Mockito.mock;
13 import com.google.common.collect.Lists;
14 import com.google.common.collect.Sets;
16 import java.io.InputStream;
17 import java.util.ArrayList;
18 import java.util.Collection;
19 import java.util.Collections;
20 import java.util.Dictionary;
21 import java.util.List;
23 import java.util.concurrent.Future;
25 import javax.management.InstanceAlreadyExistsException;
26 import javax.management.InstanceNotFoundException;
27 import javax.management.ObjectName;
29 import org.junit.Assert;
30 import org.junit.Before;
31 import org.mockito.Matchers;
32 import org.mockito.Mock;
33 import org.mockito.Mockito;
34 import org.mockito.MockitoAnnotations;
35 import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
36 import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
37 import org.opendaylight.controller.config.spi.ModuleFactory;
38 import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
39 import org.opendaylight.controller.config.yang.md.sal.binding.impl.BindingBrokerImplModuleFactory;
40 import org.opendaylight.controller.config.yang.md.sal.binding.impl.BindingBrokerImplModuleMXBean;
41 import org.opendaylight.controller.config.yang.md.sal.binding.impl.DataBrokerImplModuleFactory;
42 import org.opendaylight.controller.config.yang.md.sal.binding.impl.DataBrokerImplModuleMXBean;
43 import org.opendaylight.controller.config.yang.md.sal.binding.impl.NotificationBrokerImplModuleFactory;
44 import org.opendaylight.controller.config.yang.md.sal.binding.impl.RpcBrokerImplModuleFactory;
45 import org.opendaylight.controller.config.yang.md.sal.binding.impl.RuntimeMappingModuleFactory;
46 import org.opendaylight.controller.config.yang.md.sal.dom.impl.DomBrokerImplModuleFactory;
47 import org.opendaylight.controller.config.yang.md.sal.dom.impl.DomBrokerImplModuleMXBean;
48 import org.opendaylight.controller.config.yang.md.sal.dom.impl.HashMapDataStoreModuleFactory;
49 import org.opendaylight.controller.config.yang.md.sal.dom.impl.HashMapDataStoreModuleMXBean;
50 import org.opendaylight.controller.config.yang.netty.timer.HashedWheelTimerModuleFactory;
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.RpcProvisionRegistry;
54 import org.opendaylight.controller.sal.core.api.data.DataModificationTransaction;
55 import org.opendaylight.controller.sal.core.api.data.DataProviderService;
56 import org.opendaylight.controller.sal.core.api.mount.MountProvisionService;
57 import org.opendaylight.controller.sal.core.api.mount.MountProvisionService.MountProvisionListener;
58 import org.opendaylight.controller.sal.core.api.notify.NotificationPublishService;
59 import org.opendaylight.yangtools.concepts.Registration;
60 import org.opendaylight.yangtools.yang.common.RpcResult;
61 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
62 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
63 import org.opendaylight.yangtools.yang.model.api.Module;
64 import org.opendaylight.yangtools.yang.model.api.SchemaServiceListener;
65 import org.opendaylight.yangtools.yang.model.parser.api.YangModelParser;
66 import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
67 import org.osgi.framework.Bundle;
68 import org.osgi.framework.BundleListener;
69 import org.osgi.framework.Filter;
70 import org.osgi.framework.ServiceListener;
71 import org.osgi.framework.ServiceReference;
73 public abstract class AbstractInstructionSchedulerTest extends AbstractConfigTest {
75 private static final String FACTORY_NAME = InstructionSchedulerImplModuleFactory.NAME;
76 private static final String INSTANCE_NAME = "instruction-scheduler-impl";
78 private static final String TRANSACTION_NAME = "testTransaction";
80 private static final String BINDING_BROKER_INSTANCE_NAME = "binding-broker-impl";
81 private static final String NOTIFICATION_BROKER_INSTANCE_NAME = "notification-broker-impl";
82 private static final String DATA_BROKER_INSTANCE_NAME = "data-broker-impl";
83 private static final String DOM_BROKER_INSTANCE_NAME = "dom-broker-impl";
84 private static final String DATA_STORE_INSTANCE_NAME = "data-store-impl";
85 private static final String TIMER_INSTANCE_NAME = "timer-impl";
88 private DataModificationTransaction mockedTransaction;
91 private DataProviderService mockedDataProvider;
94 private RpcProvisionRegistry mockedRpcProvision;
97 private NotificationPublishService mockedNotificationPublish;
100 private MountProvisionService mockedMountProvision;
103 private Future<RpcResult<TransactionStatus>> mockedFuture;
106 private RpcResult<TransactionStatus> mockedResult;
108 @SuppressWarnings("unchecked")
110 public void setUp() throws Exception {
111 MockitoAnnotations.initMocks(this);
113 List<ModuleFactory> moduleFactories = getModuleFactories();
114 super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext, moduleFactories.toArray(new ModuleFactory[moduleFactories.size()])));
116 Filter mockedFilter = mock(Filter.class);
117 Mockito.doReturn(mockedFilter).when(mockedContext).createFilter(Mockito.anyString());
119 Mockito.doNothing().when(mockedContext).addServiceListener(any(ServiceListener.class), Mockito.anyString());
121 Mockito.doNothing().when(mockedContext).addBundleListener(any(BundleListener.class));
123 Mockito.doReturn(new Bundle[] {}).when(mockedContext).getBundles();
125 Mockito.doReturn(new ServiceReference[] {}).when(mockedContext).getServiceReferences(Matchers.anyString(), Matchers.anyString());
127 ServiceReference<?> emptyServiceReference = mock(ServiceReference.class, "Empty");
129 ServiceReference<?> dataProviderServiceReference = mock(ServiceReference.class, "Data Provider");
130 ServiceReference<?> rpcProvisionServiceReference = mock(ServiceReference.class, "Rpc Provision");
131 ServiceReference<?> mountProvisionServiceReference = mock(ServiceReference.class, "Mount Provision");
132 ServiceReference<?> notificationPublishServiceReference = mock(ServiceReference.class, "Notification Publish");
134 Mockito.doReturn(mockedFilter).when(mockedContext).createFilter(Mockito.anyString());
136 Mockito.doNothing().when(mockedContext).addServiceListener(any(ServiceListener.class), Mockito.anyString());
138 Mockito.doNothing().when(mockedContext).addBundleListener(any(BundleListener.class));
140 Mockito.doReturn(new Bundle[] {}).when(mockedContext).getBundles();
142 Mockito.doReturn(new ServiceReference[] {}).when(mockedContext).getServiceReferences(Matchers.anyString(), Matchers.anyString());
144 Mockito.doReturn("Empty reference").when(emptyServiceReference).toString();
145 Mockito.doReturn("Data Provider Service Reference").when(dataProviderServiceReference).toString();
146 Mockito.doReturn("Rpc Provision Service Reference").when(rpcProvisionServiceReference).toString();
147 Mockito.doReturn("Mount Provision Service Reference").when(mountProvisionServiceReference).toString();
148 Mockito.doReturn("Notification Publish Service Reference").when(notificationPublishServiceReference).toString();
150 Mockito.doReturn(emptyServiceReference).when(mockedContext).getServiceReference(any(Class.class));
151 Mockito.doReturn(dataProviderServiceReference).when(mockedContext).getServiceReference(DataProviderService.class);
152 Mockito.doReturn(rpcProvisionServiceReference).when(mockedContext).getServiceReference(RpcProvisionRegistry.class);
153 Mockito.doReturn(notificationPublishServiceReference).when(mockedContext).getServiceReference(NotificationPublishService.class);
154 Mockito.doReturn(mountProvisionServiceReference).when(mockedContext).getServiceReference(MountProvisionService.class);
156 Mockito.doReturn(mockedDataProvider).when(mockedContext).getService(dataProviderServiceReference);
157 Mockito.doReturn(mockedRpcProvision).when(mockedContext).getService(rpcProvisionServiceReference);
158 Mockito.doReturn(mockedMountProvision).when(mockedContext).getService(mountProvisionServiceReference);
159 Mockito.doReturn(mockedNotificationPublish).when(mockedContext).getService(notificationPublishServiceReference);
161 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(mockedMountProvision).registerProvisionListener(any(MountProvisionListener.class));
171 Mockito.doReturn(null).when(mockedDataProvider).readOperationalData(any(InstanceIdentifier.class));
172 Mockito.doReturn(mockedTransaction).when(mockedDataProvider).beginTransaction();
174 Mockito.doNothing().when(mockedTransaction).putOperationalData(any(InstanceIdentifier.class), any(CompositeNode.class));
175 Mockito.doNothing().when(mockedTransaction).removeOperationalData(any(InstanceIdentifier.class));
177 Mockito.doReturn(mockedFuture).when(mockedTransaction).commit();
178 Mockito.doReturn(TRANSACTION_NAME).when(mockedTransaction).getIdentifier();
180 Mockito.doReturn(mockedResult).when(mockedFuture).get();
181 Mockito.doReturn(true).when(mockedResult).isSuccessful();
182 Mockito.doReturn(Collections.emptySet()).when(mockedResult).getErrors();
184 Mockito.doReturn(null).when(mockedDataProvider).readConfigurationData(any(InstanceIdentifier.class));
187 public ObjectName createInstructionSchedulerModuleInstance(final ConfigTransactionJMXClient transaction, final ObjectName dataBrokerON,
188 final ObjectName rpcRegistyON, final ObjectName notificationBrokerON) throws Exception {
189 final ObjectName objectName = transaction.createModule(FACTORY_NAME, INSTANCE_NAME);
190 final InstructionSchedulerImplModuleMXBean mxBean = transaction.newMBeanProxy(objectName,
191 InstructionSchedulerImplModuleMXBean.class);
192 mxBean.setDataProvider(dataBrokerON);
193 mxBean.setRpcRegistry(rpcRegistyON);
194 mxBean.setNotificationService(notificationBrokerON);
195 mxBean.setTimer(createTimerInstance(transaction));
199 private ObjectName createTimerInstance(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException {
200 ObjectName nameCreated = transaction.createModule(HashedWheelTimerModuleFactory.NAME, TIMER_INSTANCE_NAME);
205 public ObjectName createBindingBrokerImpl(final ConfigTransactionJMXClient transaction, final ObjectName dataBrokerON,
206 final ObjectName notificationBrokerON) throws Exception {
207 final ObjectName objectName = transaction.createModule(BindingBrokerImplModuleFactory.NAME, BINDING_BROKER_INSTANCE_NAME);
208 final BindingBrokerImplModuleMXBean mxBean = transaction.newMBeanProxy(objectName, BindingBrokerImplModuleMXBean.class);
209 mxBean.setDataBroker(dataBrokerON);
210 mxBean.setNotificationService(notificationBrokerON);
214 public ObjectName createNotificationBrokerInstance(final ConfigTransactionJMXClient transaction) throws Exception {
215 final ObjectName objectName = transaction.createModule(NotificationBrokerImplModuleFactory.NAME, NOTIFICATION_BROKER_INSTANCE_NAME);
219 public ObjectName createDataBrokerInstance(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException,
220 InstanceNotFoundException {
221 ObjectName nameCreated = transaction.createModule(DataBrokerImplModuleFactory.NAME, DATA_BROKER_INSTANCE_NAME);
222 DataBrokerImplModuleMXBean mxBean = transaction.newMBeanProxy(nameCreated, DataBrokerImplModuleMXBean.class);
223 mxBean.setDomBroker(createDomBrokerInstance(transaction));
224 mxBean.setMappingService(lookupMappingServiceInstance(transaction));
228 private ObjectName createDomBrokerInstance(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException {
229 ObjectName nameCreated = transaction.createModule(DomBrokerImplModuleFactory.NAME, DOM_BROKER_INSTANCE_NAME);
230 DomBrokerImplModuleMXBean mxBean = transaction.newMBeanProxy(nameCreated, DomBrokerImplModuleMXBean.class);
231 mxBean.setDataStore(createDataStoreInstance(transaction));
235 private ObjectName createDataStoreInstance(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException {
236 ObjectName nameCreated = transaction.createModule(HashMapDataStoreModuleFactory.NAME, DATA_STORE_INSTANCE_NAME);
237 transaction.newMBeanProxy(nameCreated, HashMapDataStoreModuleMXBean.class);
241 private static ObjectName lookupMappingServiceInstance(final ConfigTransactionJMXClient transaction) {
244 return transaction.lookupConfigBean(RuntimeMappingModuleFactory.NAME, RuntimeMappingModuleFactory.SINGLETON_NAME);
245 } catch (InstanceNotFoundException e) {
247 return transaction.createModule(RuntimeMappingModuleFactory.NAME, RuntimeMappingModuleFactory.SINGLETON_NAME);
248 } catch (InstanceAlreadyExistsException e1) {
249 throw new IllegalStateException(e1);
255 protected BundleContextServiceRegistrationHandler getBundleContextServiceRegistrationHandler(final Class<?> serviceType) {
256 if (serviceType.equals(SchemaServiceListener.class)) {
257 return new BundleContextServiceRegistrationHandler() {
259 public void handleServiceRegistration(Class<?> clazz, Object serviceInstance, Dictionary<String, ?> props) {
260 SchemaServiceListener listener = (SchemaServiceListener) serviceInstance;
261 YangModelParser parser = new YangParserImpl();
262 Map<InputStream, Module> inputStreamModuleMap = parser.parseYangModelsFromStreamsMapped(new ArrayList<>(getFilesAsInputStreams(getYangModelsPaths())));
263 listener.onGlobalContextUpdated(parser.resolveSchemaContext(Sets.newHashSet(inputStreamModuleMap.values())));
268 return super.getBundleContextServiceRegistrationHandler(serviceType);
271 public List<String> getYangModelsPaths() {
272 List<String> paths = Lists.newArrayList("/META-INF/yang/ietf-inet-types.yang", "/META-INF/yang/programming.yang");
276 public List<ModuleFactory> getModuleFactories() {
277 return Lists.newArrayList(new InstructionSchedulerImplModuleFactory(), new HashedWheelTimerModuleFactory(),
278 new NotificationBrokerImplModuleFactory(), new RpcBrokerImplModuleFactory(), new DataBrokerImplModuleFactory(),
279 new DomBrokerImplModuleFactory(), new HashMapDataStoreModuleFactory(), new RuntimeMappingModuleFactory(),
280 new BindingBrokerImplModuleFactory());
283 // TODO move back to AbstractConfigTest
284 private static Collection<InputStream> getFilesAsInputStreams(List<String> paths) {
285 final Collection<InputStream> resources = new ArrayList<>();
286 List<String> failedToFind = new ArrayList<>();
287 for (String path : paths) {
288 InputStream resourceAsStream = AbstractInstructionSchedulerTest.class.getResourceAsStream(path);
289 if (resourceAsStream == null) {
290 failedToFind.add(path);
292 resources.add(resourceAsStream);
295 Assert.assertEquals("Some files were not found", Collections.<String> emptyList(), failedToFind);