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