Bug-5536: When using clustering with replication, linkstate topology of non-leaders...
[bgpcep.git] / data-change-counter / src / test / java / org / opendaylight / controller / config / yang / bgpcep / data / change / counter / DataChangeCounterImplModuleTest.java
1 /*
2  * Copyright (c) 2014 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
9 package org.opendaylight.controller.config.yang.bgpcep.data.change.counter;
10
11 import java.util.Collections;
12 import java.util.Set;
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;
41
42 public class DataChangeCounterImplModuleTest extends AbstractConfigTest {
43
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";
47
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";
52
53     @Mock
54     private CloseableDataBroker dataBroker;
55     @Mock
56     private BindingTransactionChain chain;
57     @Mock
58     private WriteTransaction wTx;
59     @Mock
60     private ListenerRegistration<DataTreeChangeListener<?>> registration;
61
62     @Before
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()));
75     }
76
77     @Test
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);
82     }
83
84     @Test
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);
92     }
93
94     @Test
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);
105
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());
111     }
112
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();
122     }
123
124     private final class MockDataBrokerModuleFct implements org.opendaylight.controller.config.spi.ModuleFactory {
125
126         private static final String INSTANCE_NAME = "data-broker-fct";
127
128         @Override
129         public String getImplementationName() {
130             return INSTANCE_NAME;
131         }
132
133         @Override
134         public Module createModule(final String instanceName, final DependencyResolver dependencyResolver,
135                 final BundleContext bundleContext) {
136             return new MockDataBrokerModule();
137         }
138
139         @Override
140         public Module createModule(final String instanceName, final DependencyResolver dependencyResolver,
141                 final DynamicMBeanWithInstance old, final BundleContext bundleContext) throws Exception {
142             return new MockDataBrokerModule();
143         }
144
145         @Override
146         public boolean isModuleImplementingServiceInterface(final Class<? extends AbstractServiceInterface> serviceInterface) {
147             return true;
148         }
149
150         @Override
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);
154         }
155
156         @Override
157         public Set<? extends Module> getDefaultModules(final DependencyResolverFactory dependencyResolverFactory,
158                 final BundleContext bundleContext) {
159             return Collections.emptySet();
160         }
161
162     }
163
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 {
165
166         @Override
167         public ModuleIdentifier getIdentifier() {
168             return new ModuleIdentifier(MockDataBrokerModuleFct.INSTANCE_NAME, DATA_BROKER_INSTANCE_NAME);
169         }
170
171         @Override
172         public ObjectName getBindingMappingService() {
173             return null;
174         }
175
176         @Override
177         public void setBindingMappingService(final ObjectName bindingMappingService) {
178             return;
179         }
180
181         @Override
182         public ObjectName getDomAsyncBroker() {
183             return null;
184         }
185
186         @Override
187         public void setDomAsyncBroker(final ObjectName domAsyncBroker) {
188             return;
189         }
190
191         @Override
192         public void validate() {
193             return;
194         }
195
196         @Override
197         public AutoCloseable getInstance() {
198             return DataChangeCounterImplModuleTest.this.dataBroker;
199         }
200
201         @Override
202         public ObjectName getSchemaService() {
203             return null;
204         }
205
206         @Override
207         public void setSchemaService(final ObjectName schemaService) {
208             return;
209         }
210
211         @Override
212         public boolean canReuse(final Module arg0) {
213             return true;
214         }
215
216     }
217
218     private interface CloseableDataBroker extends DataBroker, AutoCloseable {
219     }
220
221 }