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
9 package org.opendaylight.controller.config.yang.bgpcep.data.change.counter;
11 import java.util.Collections;
13 import javax.management.ObjectName;
14 import org.junit.Assert;
15 import org.junit.Before;
16 import org.junit.Test;
17 import org.mockito.Mock;
18 import org.mockito.Mockito;
19 import org.opendaylight.controller.config.api.DependencyResolver;
20 import org.opendaylight.controller.config.api.DependencyResolverFactory;
21 import org.opendaylight.controller.config.api.DynamicMBeanWithInstance;
22 import org.opendaylight.controller.config.api.ModuleIdentifier;
23 import org.opendaylight.controller.config.api.annotations.AbstractServiceInterface;
24 import org.opendaylight.controller.config.api.jmx.CommitStatus;
25 import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
26 import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
27 import org.opendaylight.controller.config.spi.Module;
28 import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
29 import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
30 import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
31 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
32 import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
33 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
34 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
35 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
36 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.data.change.counter.rev160315.DataChangeCounter;
38 import org.opendaylight.yangtools.concepts.ListenerRegistration;
39 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
40 import org.osgi.framework.BundleContext;
42 public class DataChangeCounterImplModuleTest extends AbstractConfigTest {
44 private static final String FACTORY_NAME = DataChangeCounterImplModuleFactory.NAME;
45 private static final String INSTANCE_NAME = "data-change-counter";
46 private static final String DATA_BROKER_INSTANCE_NAME = "data-broker-instance";
48 private static final String COUNTER_ID = "counter";
49 private static final String NEW_COUNTER_ID = "new-counter";
50 private static final String TOPOLOGY_NAME = "test";
51 private static final String NEW_TOPOLOGY_NAME = "new-test";
54 private CloseableDataBroker dataBroker;
56 private BindingTransactionChain chain;
58 private WriteTransaction wTx;
60 private ListenerRegistration<DataTreeChangeListener<?>> registration;
63 public void setUp() throws Exception {
64 Mockito.doNothing().when(this.registration).close();
65 Mockito.doReturn(null).when(this.wTx).submit();
66 Mockito.doNothing().when(this.wTx).put(Mockito.any(LogicalDatastoreType.class), Mockito.<InstanceIdentifier<DataChangeCounter>>any(), Mockito.any(DataChangeCounter.class));
67 Mockito.doReturn(this.registration).when(this.dataBroker).registerDataTreeChangeListener(Mockito.any(DataTreeIdentifier.class), Mockito.any(ClusteredDataTreeChangeListener.class));
68 Mockito.doNothing().when(this.wTx).delete(Mockito.any(LogicalDatastoreType.class), Mockito.<InstanceIdentifier<?>>any());
69 Mockito.doReturn(this.chain).when(this.dataBroker).createTransactionChain(Mockito.any(TransactionChainListener.class));
70 Mockito.doReturn(this.wTx).when(this.chain).newWriteOnlyTransaction();
71 Mockito.doReturn(this.wTx).when(this.dataBroker).newWriteOnlyTransaction();
72 Mockito.doNothing().when(this.chain).close();
73 Mockito.doNothing().when(this.dataBroker).close();
74 super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(this.mockedContext, new DataChangeCounterImplModuleFactory(), new MockDataBrokerModuleFct()));
78 public void testCreateBean() throws Exception {
79 final CommitStatus status = createInstance(COUNTER_ID, TOPOLOGY_NAME);
80 assertBeanCount(1, FACTORY_NAME);
81 assertStatus(status, 2, 0, 0);
85 public void testReusingOldInstance() throws Exception {
86 createInstance(COUNTER_ID, TOPOLOGY_NAME);
87 final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
88 assertBeanCount(1, FACTORY_NAME);
89 final CommitStatus status = transaction.commit();
90 assertBeanCount(1, FACTORY_NAME);
91 assertStatus(status, 0, 0, 2);
95 public void testReconfigureBean() throws Exception {
96 createInstance(COUNTER_ID, TOPOLOGY_NAME);
97 final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
98 final DataChangeCounterImplModuleMXBean mxBean = transaction.newMXBeanProxy(transaction.lookupConfigBean(FACTORY_NAME, INSTANCE_NAME),
99 DataChangeCounterImplModuleMXBean.class);
100 mxBean.setCounterId(NEW_COUNTER_ID);
101 mxBean.setTopologyName(NEW_TOPOLOGY_NAME);
102 final CommitStatus status = transaction.commit();
103 assertBeanCount(1, FACTORY_NAME);
104 assertStatus(status, 0, 1, 1);
106 final ConfigTransactionJMXClient transaction2 = this.configRegistryClient.createTransaction();
107 final DataChangeCounterImplModuleMXBean mxBean2 = transaction2.newMXBeanProxy(transaction2.lookupConfigBean(FACTORY_NAME, INSTANCE_NAME),
108 DataChangeCounterImplModuleMXBean.class);
109 Assert.assertEquals(NEW_COUNTER_ID, mxBean2.getCounterId());
110 Assert.assertEquals(NEW_TOPOLOGY_NAME, mxBean2.getTopologyName());
113 private CommitStatus createInstance(final String counterId, final String topologyName) throws Exception {
114 final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
115 final ObjectName on = transaction.createModule(FACTORY_NAME, INSTANCE_NAME);
116 final ObjectName dbOn = transaction.createModule(MockDataBrokerModuleFct.INSTANCE_NAME, DATA_BROKER_INSTANCE_NAME);
117 final DataChangeCounterImplModuleMXBean mxBean = transaction.newMXBeanProxy(on, DataChangeCounterImplModuleMXBean.class);
118 mxBean.setCounterId(counterId);
119 mxBean.setTopologyName(topologyName);
120 mxBean.setDataProvider(dbOn);
121 return transaction.commit();
124 private final class MockDataBrokerModuleFct implements org.opendaylight.controller.config.spi.ModuleFactory {
126 private static final String INSTANCE_NAME = "data-broker-fct";
129 public String getImplementationName() {
130 return INSTANCE_NAME;
134 public Module createModule(final String instanceName, final DependencyResolver dependencyResolver,
135 final BundleContext bundleContext) {
136 return new MockDataBrokerModule();
140 public Module createModule(final String instanceName, final DependencyResolver dependencyResolver,
141 final DynamicMBeanWithInstance old, final BundleContext bundleContext) throws Exception {
142 return new MockDataBrokerModule();
146 public boolean isModuleImplementingServiceInterface(final Class<? extends AbstractServiceInterface> serviceInterface) {
151 public Set<Class<? extends AbstractServiceInterface>> getImplementedServiceIntefaces() {
152 final java.util.Set<Class<? extends org.opendaylight.controller.config.api.annotations.AbstractServiceInterface>> serviceIfcs2 = new java.util.HashSet<Class<? extends org.opendaylight.controller.config.api.annotations.AbstractServiceInterface>>();
153 return java.util.Collections.unmodifiableSet(serviceIfcs2);
157 public Set<? extends Module> getDefaultModules(final DependencyResolverFactory dependencyResolverFactory,
158 final BundleContext bundleContext) {
159 return Collections.emptySet();
164 private final class MockDataBrokerModule implements org.opendaylight.controller.config.spi.Module,org.opendaylight.controller.config.yang.md.sal.binding.impl.BindingAsyncDataBrokerImplModuleMXBean,org.opendaylight.controller.config.yang.md.sal.binding.DataBrokerServiceInterface {
167 public ModuleIdentifier getIdentifier() {
168 return new ModuleIdentifier(MockDataBrokerModuleFct.INSTANCE_NAME, DATA_BROKER_INSTANCE_NAME);
172 public ObjectName getBindingMappingService() {
177 public void setBindingMappingService(final ObjectName bindingMappingService) {
182 public ObjectName getDomAsyncBroker() {
187 public void setDomAsyncBroker(final ObjectName domAsyncBroker) {
192 public void validate() {
197 public AutoCloseable getInstance() {
198 return DataChangeCounterImplModuleTest.this.dataBroker;
202 public ObjectName getSchemaService() {
207 public void setSchemaService(final ObjectName schemaService) {
212 public boolean canReuse(final Module arg0) {
218 private interface CloseableDataBroker extends DataBroker, AutoCloseable {