MDSAL DS acces - standalone bundle.
[lispflowmapping.git] / mappingservice / dsbackend / src / test / java / org / opendaylight / lispflowmapping / dsbackend / DataStoreBackEndTest.java
1 /*
2  * Copyright (c) 2016 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.lispflowmapping.dsbackend;
9
10 import static org.junit.Assert.assertEquals;
11
12 import com.google.common.base.Optional;
13 import com.google.common.collect.Lists;
14 import com.google.common.util.concurrent.CheckedFuture;
15 import com.google.common.util.concurrent.Futures;
16 import java.util.ArrayList;
17 import javax.xml.bind.DatatypeConverter;
18 import org.junit.Before;
19 import org.junit.Test;
20 import org.junit.runner.RunWith;
21 import org.mockito.ArgumentCaptor;
22 import org.mockito.Captor;
23 import org.mockito.Mock;
24 import org.mockito.Mockito;
25 import org.mockito.runners.MockitoJUnitRunner;
26 import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
27 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
28 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
29 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
30 import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction;
31 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
32 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
33 import org.opendaylight.controller.md.sal.common.api.data.TransactionChain;
34 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
35 import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.XtrId;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container
39         .MappingRecordBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.EidUri;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.MappingDatabase;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.MappingDatabaseBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.MappingOrigin;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.VniUri;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.XtrIdUri;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.db.instance.AuthenticationKey;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.db.instance.AuthenticationKeyBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.db.instance.AuthenticationKeyKey;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.db.instance.Mapping;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.db.instance.MappingBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.db.instance.MappingKey;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.db.instance.mapping.XtrIdMapping;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.db.instance.mapping
54         .XtrIdMappingBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.db.instance.mapping.XtrIdMappingKey;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.mapping.authkey.container
57         .MappingAuthkeyBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.mapping.database
59         .VirtualNetworkIdentifier;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.mapping.database
61         .VirtualNetworkIdentifierBuilder;
62 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
63 import org.powermock.api.mockito.PowerMockito;
64 import org.powermock.core.classloader.annotations.PrepareForTest;
65 import org.powermock.modules.junit4.PowerMockRunner;
66 import org.powermock.modules.junit4.PowerMockRunnerDelegate;
67 import org.slf4j.Logger;
68 import org.slf4j.LoggerFactory;
69
70 @RunWith(PowerMockRunner.class)
71 @PowerMockRunnerDelegate(MockitoJUnitRunner.class)
72 @PrepareForTest({LoggerFactory.class})
73 public class DataStoreBackEndTest {
74
75     @Captor private static ArgumentCaptor<InstanceIdentifier<AuthenticationKey>> iidCaptorAuthKey;
76     @Captor private static ArgumentCaptor<InstanceIdentifier<Mapping>> iidCaptorMapping;
77     @Captor private static ArgumentCaptor<InstanceIdentifier<XtrIdMapping>> iidCaptorXtrIdMapping;
78     @Mock private static BindingTransactionChain txChainMock;
79     @Mock private static WriteTransaction wTxMock;
80     private static DataStoreBackEnd dataStoreBackEnd;
81
82     private static final String IPV4_STRING_1 = "1.2.3.0";
83     private static final String IPV4_STRING_2 = "1.2.4.0";
84     private static final String IPV4_STRING_3 = "1.2.5.0";
85     private static final String IPV4_STRING_4 = "1.2.6.0";
86     private static final String DUMMY_URI = "dummy/uri";
87     private static final Eid EID_IPV4_1 = LispAddressUtil.asIpv4Eid(IPV4_STRING_1);
88     private static final Eid EID_IPV4_2 = LispAddressUtil.asIpv4Eid(IPV4_STRING_2);
89     private static final Eid EID_IPV4_3 = LispAddressUtil.asIpv4Eid(IPV4_STRING_3);
90     private static final Eid EID_IPV4_4 = LispAddressUtil.asIpv4Eid(IPV4_STRING_4);
91     private static final byte[] XTR_ID = new byte[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
92     private static final InstanceIdentifier<MappingDatabase> DATABASE_ROOT =
93             InstanceIdentifier.create(MappingDatabase.class);
94
95     @Before
96     public void init() {
97         DataBroker brokerMock = Mockito.mock(DataBroker.class);
98         Logger logMock = Mockito.mock(Logger.class, "LOG");
99
100         PowerMockito.mockStatic(LoggerFactory.class);
101         PowerMockito.when(LoggerFactory.getLogger(DataStoreBackEnd.class)).
102                 thenReturn(logMock);
103         Mockito.when(logMock.isDebugEnabled()).thenReturn(true);
104         Mockito.when(brokerMock.createTransactionChain(Mockito.any(DataStoreBackEnd.class))).thenReturn(txChainMock);
105         dataStoreBackEnd = PowerMockito.spy(new DataStoreBackEnd(brokerMock));
106
107         Mockito.when(txChainMock.newWriteOnlyTransaction()).thenReturn(wTxMock);
108         Mockito.when(wTxMock.submit()).
109                 thenReturn(Futures.<Void, TransactionCommitFailedException>immediateCheckedFuture(null));
110     }
111
112     /**
113      * Tests {@link DataStoreBackEnd#addAuthenticationKey} method.
114      */
115     @Test
116     public void addAuthenticationKeyTest() {
117         final AuthenticationKey authenticationKey = getDefaultAuthenticationKeyBuilder().build();
118
119         dataStoreBackEnd.addAuthenticationKey(authenticationKey);
120         Mockito.verify(wTxMock).put(Mockito.eq(LogicalDatastoreType.CONFIGURATION), iidCaptorAuthKey.capture(),
121                 Mockito.eq(authenticationKey), Mockito.eq(true));
122
123         // result
124         AuthenticationKeyKey result = iidCaptorAuthKey.getValue().firstKeyOf(AuthenticationKey.class);
125         assertEquals("ipv4:" + IPV4_STRING_1, result.getEidUri().getValue());
126     }
127
128     /**
129      * Tests {@link DataStoreBackEnd#addMapping} method.
130      */
131     @Test
132     public void addMappingTest() {
133         final Mapping mapping = new MappingBuilder()
134                 .setMappingRecord(getDefaultMappingRecordBuilder().build())
135                 .setOrigin(MappingOrigin.Northbound).build();
136
137         dataStoreBackEnd.addMapping(mapping);
138         Mockito.verify(wTxMock).put(Mockito.eq(LogicalDatastoreType.CONFIGURATION), iidCaptorMapping.capture(),
139                 Mockito.eq(mapping), Mockito.eq(true));
140
141         // result
142         MappingKey result = iidCaptorMapping.getValue().firstKeyOf(Mapping.class);
143         assertEquals("ipv4:" + IPV4_STRING_1, result.getEidUri().getValue());
144         assertEquals(MappingOrigin.Northbound, result.getOrigin());
145     }
146
147     /**
148      * Tests {@link DataStoreBackEnd#addXtrIdMapping} method.
149      */
150     @Test
151     public void addXtrIdMappingTest() {
152         XtrIdMapping xtrIdMapping = new XtrIdMappingBuilder()
153                 .setXtrIdUri(new XtrIdUri(DUMMY_URI))
154                 .setMappingRecord(getDefaultMappingRecordBuilder().build()).build();
155
156         dataStoreBackEnd.addXtrIdMapping(xtrIdMapping);
157         Mockito.verify(wTxMock).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), iidCaptorXtrIdMapping.capture(),
158                 Mockito.eq(xtrIdMapping), Mockito.eq(true));
159
160         // result
161         XtrIdMappingKey xtrIdResult = iidCaptorXtrIdMapping.getValue().firstKeyOf(XtrIdMapping.class);
162         MappingKey mappingResult = iidCaptorXtrIdMapping.getValue().firstKeyOf(Mapping.class);
163
164         assertEquals(DatatypeConverter.printHexBinary(XTR_ID), xtrIdResult.getXtrIdUri().getValue());
165         assertEquals(MappingOrigin.Southbound, mappingResult.getOrigin());
166         assertEquals("ipv4:" + IPV4_STRING_1, mappingResult.getEidUri().getValue());
167     }
168
169     /**
170      * Tests {@link DataStoreBackEnd#removeAuthenticationKey} method.
171      */
172     @Test
173     public void removeAuthenticationKeyTest() {
174         final AuthenticationKey authenticationKey = getDefaultAuthenticationKeyBuilder().build();
175
176         dataStoreBackEnd.removeAuthenticationKey(authenticationKey);
177         Mockito.verify(wTxMock).delete(Mockito.eq(LogicalDatastoreType.CONFIGURATION), iidCaptorAuthKey.capture());
178
179         // result
180         AuthenticationKeyKey result = iidCaptorAuthKey.getValue().firstKeyOf(AuthenticationKey.class);
181         assertEquals("ipv4:" + IPV4_STRING_1, result.getEidUri().getValue());
182     }
183
184     /**
185      * Tests {@link DataStoreBackEnd#removeMapping} method.
186      */
187     @Test
188     public void removeMapping() {
189         final Mapping mapping = new MappingBuilder()
190                 .setMappingRecord(getDefaultMappingRecordBuilder().build())
191                 .setOrigin(MappingOrigin.Northbound).build();
192
193         dataStoreBackEnd.removeMapping(mapping);
194         Mockito.verify(wTxMock).delete(Mockito.eq(LogicalDatastoreType.CONFIGURATION), iidCaptorMapping.capture());
195
196         // result
197         MappingKey result = iidCaptorMapping.getValue().firstKeyOf(Mapping.class);
198         assertEquals("ipv4:" + IPV4_STRING_1, result.getEidUri().getValue());
199         assertEquals(MappingOrigin.Northbound, result.getOrigin());
200     }
201
202     /**
203      * Tests {@link DataStoreBackEnd#addXtrIdMapping} method.
204      */
205     @Test
206     public void removeXtrIdMappingTest() {
207         XtrIdMapping xtrIdMapping = new XtrIdMappingBuilder()
208                 .setXtrIdUri(new XtrIdUri(DUMMY_URI))
209                 .setMappingRecord(getDefaultMappingRecordBuilder().build()).build();
210
211         dataStoreBackEnd.removeXtrIdMapping(xtrIdMapping);
212         Mockito.verify(wTxMock).delete(Mockito.eq(LogicalDatastoreType.OPERATIONAL), iidCaptorXtrIdMapping.capture());
213
214         // result
215         XtrIdMappingKey xtrIdResult = iidCaptorXtrIdMapping.getValue().firstKeyOf(XtrIdMapping.class);
216         MappingKey mappingResult = iidCaptorXtrIdMapping.getValue().firstKeyOf(Mapping.class);
217
218         assertEquals(DatatypeConverter.printHexBinary(XTR_ID), xtrIdResult.getXtrIdUri().getValue());
219         assertEquals(MappingOrigin.Southbound, mappingResult.getOrigin());
220         assertEquals("ipv4:" + IPV4_STRING_1, mappingResult.getEidUri().getValue());
221     }
222
223     /**
224      * Tests {@link DataStoreBackEnd#updateAuthenticationKey} method.
225      */
226     @Test
227     public void updateAuthenticationKeyTest() {
228         final AuthenticationKey authenticationKey = getDefaultAuthenticationKeyBuilder().build();
229
230         dataStoreBackEnd.updateAuthenticationKey(authenticationKey);
231         Mockito.verify(wTxMock).put(Mockito.eq(LogicalDatastoreType.CONFIGURATION), iidCaptorAuthKey.capture(),
232                 Mockito.eq(authenticationKey), Mockito.eq(true));
233
234         // result
235         AuthenticationKeyKey result = iidCaptorAuthKey.getValue().firstKeyOf(AuthenticationKey.class);
236         assertEquals("ipv4:" + IPV4_STRING_1, result.getEidUri().getValue());
237     }
238
239     /**
240      * Tests {@link DataStoreBackEnd#updateMapping} method.
241      */
242     @Test
243     public void updateMappingTest() {
244         final Mapping mapping = new MappingBuilder()
245                 .setMappingRecord(getDefaultMappingRecordBuilder().build())
246                 .setOrigin(MappingOrigin.Northbound).build();
247
248         dataStoreBackEnd.updateMapping(mapping);
249         Mockito.verify(wTxMock).put(Mockito.eq(LogicalDatastoreType.CONFIGURATION), iidCaptorMapping.capture(),
250                 Mockito.eq(mapping), Mockito.eq(true));
251
252         // result
253         MappingKey result = iidCaptorMapping.getValue().firstKeyOf(Mapping.class);
254         assertEquals("ipv4:" + IPV4_STRING_1, result.getEidUri().getValue());
255         assertEquals(MappingOrigin.Northbound, result.getOrigin());
256     }
257
258     /**
259      * Tests {@link DataStoreBackEnd#getAllMappings} method.
260      */
261     @Test
262     @SuppressWarnings("unchecked")
263     public void getAllMappingsTest() throws ReadFailedException {
264         final ReadOnlyTransaction rTxMock = Mockito.mock(ReadOnlyTransaction.class);
265         final CheckedFuture<Optional<MappingDatabase>, ReadFailedException> readFutureMock
266                 = Mockito.mock(CheckedFuture.class);
267         final Optional<MappingDatabase> optionalMock = Mockito.mock(Optional.class);
268
269         Mockito.when(txChainMock.newReadOnlyTransaction()).thenReturn(rTxMock);
270         Mockito.when(rTxMock.read(LogicalDatastoreType.CONFIGURATION, DATABASE_ROOT)).thenReturn(readFutureMock);
271         Mockito.when(rTxMock.read(LogicalDatastoreType.OPERATIONAL, DATABASE_ROOT)).thenReturn(readFutureMock);
272         Mockito.when(readFutureMock.checkedGet()).thenReturn(optionalMock);
273         Mockito.when(optionalMock.isPresent()).thenReturn(true);
274         Mockito.when(optionalMock.get()).thenReturn(getDefaultMappingDatabase().build());
275
276         assertEquals(8, dataStoreBackEnd.getAllMappings().size());
277         Mockito.verify(optionalMock, Mockito.times(2)).get();
278     }
279
280     /**
281      * Tests {@link DataStoreBackEnd#getAllAuthenticationKeys} method.
282      */
283     @Test
284     @SuppressWarnings("unchecked")
285     public void getAllAuthenticationKeysTest() throws ReadFailedException {
286         final ReadOnlyTransaction rTxMock = Mockito.mock(ReadOnlyTransaction.class);
287         final CheckedFuture<Optional<MappingDatabase>, ReadFailedException> readFutureMock
288                 = Mockito.mock(CheckedFuture.class);
289         final Optional<MappingDatabase> optionalMock = Mockito.mock(Optional.class);
290
291         Mockito.when(txChainMock.newReadOnlyTransaction()).thenReturn(rTxMock);
292         Mockito.when(rTxMock.read(LogicalDatastoreType.CONFIGURATION, DATABASE_ROOT)).thenReturn(readFutureMock);
293         Mockito.when(readFutureMock.checkedGet()).thenReturn(optionalMock);
294         Mockito.when(optionalMock.isPresent()).thenReturn(true);
295         Mockito.when(optionalMock.get()).thenReturn(getDefaultMappingDatabase().build());
296
297         assertEquals(4, dataStoreBackEnd.getAllAuthenticationKeys().size());
298         Mockito.verify(optionalMock).get();
299     }
300
301     /**
302      * Tests {@link DataStoreBackEnd#removeAllDatastoreContent} method.
303      */
304     @Test
305     public void removeAllDatastoreContentTest() {
306         dataStoreBackEnd.removeAllDatastoreContent();
307         Mockito.verify(wTxMock).delete(LogicalDatastoreType.CONFIGURATION, DATABASE_ROOT);
308         Mockito.verify(wTxMock).delete(LogicalDatastoreType.OPERATIONAL, DATABASE_ROOT);
309     }
310
311     /**
312      * Increases {@link DataStoreBackEnd} code coverage.
313      */
314     @Test
315     public void onTransactionChainFailedTest() {
316         AsyncTransaction<?,?> asyncTransactionMock = Mockito.mock(AsyncTransaction.class);
317         Mockito.when(asyncTransactionMock.getIdentifier()).thenReturn(new Object());
318         dataStoreBackEnd.onTransactionChainFailed(Mockito.mock(TransactionChain.class), asyncTransactionMock,
319                 Mockito.mock(Throwable.class));
320     }
321
322     /**
323      * Increases {@link DataStoreBackEnd} code coverage.
324      */
325     @Test
326     public void onTransactionChainSuccessfulTest() {
327         dataStoreBackEnd.onTransactionChainSuccessful(Mockito.mock(TransactionChain.class));
328     }
329
330     private static MappingRecordBuilder getDefaultMappingRecordBuilder() {
331         return new MappingRecordBuilder()
332                 .setEid(EID_IPV4_1)
333                 .setLocatorRecord(new ArrayList<>())
334                 .setXtrId(new XtrId(XTR_ID));
335     }
336
337     private static AuthenticationKeyBuilder getDefaultAuthenticationKeyBuilder() {
338         return new AuthenticationKeyBuilder()
339                 .setKey(new AuthenticationKeyKey(new EidUri(DUMMY_URI)))
340                 .setEid(EID_IPV4_1)
341                 .setMappingAuthkey(new MappingAuthkeyBuilder().setKeyString("password").setKeyType(0).build());
342     }
343
344     private static MappingDatabaseBuilder getDefaultMappingDatabase() {
345         final Mapping mapping_1 = new MappingBuilder()
346                 .setMappingRecord(getDefaultMappingRecordBuilder().build()).build();
347         final Mapping mapping_2 = new MappingBuilder()
348                 .setMappingRecord(getDefaultMappingRecordBuilder().setEid(EID_IPV4_2).build()).build();
349         final Mapping mapping_3 = new MappingBuilder()
350                 .setMappingRecord(getDefaultMappingRecordBuilder().setEid(EID_IPV4_3).build()).build();
351         final Mapping mapping_4 = new MappingBuilder()
352                 .setMappingRecord(getDefaultMappingRecordBuilder().setEid(EID_IPV4_4).build()).build();
353
354         final AuthenticationKey authenticationKey_1 = new AuthenticationKeyBuilder()
355                 .setKey(new AuthenticationKeyKey(new EidUri("uri-1"))).build();
356         final AuthenticationKey authenticationKey_2 = new AuthenticationKeyBuilder()
357                 .setKey(new AuthenticationKeyKey(new EidUri("uri-2"))).build();
358         final AuthenticationKey authenticationKey_3 = new AuthenticationKeyBuilder()
359                 .setKey(new AuthenticationKeyKey(new EidUri("uri-3"))).build();
360         final AuthenticationKey authenticationKey_4 = new AuthenticationKeyBuilder()
361                 .setKey(new AuthenticationKeyKey(new EidUri("uri-4"))).build();
362
363         final VirtualNetworkIdentifier vni_1 = new VirtualNetworkIdentifierBuilder()
364                 .setVni(new VniUri("vni/uri/1"))
365                 .setMapping(Lists.newArrayList(mapping_1, mapping_2))
366                 .setAuthenticationKey(Lists.newArrayList(authenticationKey_1, authenticationKey_2)).build();
367         final VirtualNetworkIdentifier vni_2 = new VirtualNetworkIdentifierBuilder()
368                 .setVni(new VniUri("vni/uri/2"))
369                 .setMapping(Lists.newArrayList(mapping_3, mapping_4))
370                 .setAuthenticationKey(Lists.newArrayList(authenticationKey_3, authenticationKey_4)).build();
371         return new MappingDatabaseBuilder().setVirtualNetworkIdentifier(Lists.newArrayList(vni_1, vni_2));
372     }
373 }