2 * Copyright (c) 2016 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.lispflowmapping.dsbackend;
10 import static org.junit.Assert.assertEquals;
12 import com.google.common.util.concurrent.FluentFuture;
13 import java.util.ArrayList;
14 import java.util.LinkedHashMap;
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.LispAddressStringifier;
27 import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
28 import org.opendaylight.mdsal.binding.api.DataBroker;
29 import org.opendaylight.mdsal.binding.api.ReadTransaction;
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._record.container.MappingRecordBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.authkey.container.MappingAuthkeyBuilder;
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;
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 {
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;
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);
95 final DataBroker brokerMock = Mockito.mock(DataBroker.class);
96 final Logger logMock = Mockito.mock(Logger.class, "LOG");
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())
103 .thenReturn(txChainMock);
104 dataStoreBackEnd = PowerMockito.spy(new DataStoreBackEnd(brokerMock));
106 Mockito.when(txChainMock.newWriteOnlyTransaction()).thenReturn(wTxMock);
107 Mockito.doReturn(CommitInfo.emptyFluentFuture()).when(wTxMock).commit();
111 * Tests {@link DataStoreBackEnd#addAuthenticationKey} method.
114 public void addAuthenticationKeyTest() {
115 final AuthenticationKey authenticationKey = getDefaultAuthenticationKeyBuilder().build();
117 dataStoreBackEnd.addAuthenticationKey(authenticationKey);
118 Mockito.verify(wTxMock).mergeParentStructurePut(Mockito.eq(LogicalDatastoreType.CONFIGURATION),
119 iidCaptorAuthKey.capture(), Mockito.eq(authenticationKey));
122 AuthenticationKeyKey result = iidCaptorAuthKey.getValue().firstKeyOf(AuthenticationKey.class);
123 assertEquals("ipv4:" + IPV4_STRING_1, result.getEidUri().getValue());
127 * Tests {@link DataStoreBackEnd#addMapping} method.
130 public void addMappingTest() {
131 final Mapping mapping = new MappingBuilder()
132 .withKey(new MappingKey(new EidUri(LispAddressStringifier.getURIString(EID_IPV4_1)),
133 MappingOrigin.Northbound))
134 .setMappingRecord(getDefaultMappingRecordBuilder().build())
135 .setOrigin(MappingOrigin.Northbound).build();
137 dataStoreBackEnd.addMapping(mapping);
138 Mockito.verify(wTxMock).mergeParentStructurePut(Mockito.eq(LogicalDatastoreType.CONFIGURATION),
139 iidCaptorMapping.capture(), Mockito.eq(mapping));
142 MappingKey result = iidCaptorMapping.getValue().firstKeyOf(Mapping.class);
143 assertEquals("ipv4:" + IPV4_STRING_1, result.getEidUri().getValue());
144 assertEquals(MappingOrigin.Northbound, result.getOrigin());
148 * Tests {@link DataStoreBackEnd#addXtrIdMapping} method.
151 public void addXtrIdMappingTest() {
152 XtrIdMapping xtrIdMapping = new XtrIdMappingBuilder()
153 .setXtrIdUri(new XtrIdUri(DUMMY_URI))
154 .setMappingRecord(getDefaultMappingRecordBuilder().build()).build();
156 dataStoreBackEnd.addXtrIdMapping(xtrIdMapping);
157 Mockito.verify(wTxMock).mergeParentStructurePut(Mockito.eq(LogicalDatastoreType.OPERATIONAL),
158 iidCaptorXtrIdMapping.capture(), Mockito.eq(xtrIdMapping));
161 XtrIdMappingKey xtrIdResult = iidCaptorXtrIdMapping.getValue().firstKeyOf(XtrIdMapping.class);
162 MappingKey mappingResult = iidCaptorXtrIdMapping.getValue().firstKeyOf(Mapping.class);
164 assertEquals(DatatypeConverter.printHexBinary(XTR_ID), xtrIdResult.getXtrIdUri().getValue());
165 assertEquals(MappingOrigin.Southbound, mappingResult.getOrigin());
166 assertEquals("ipv4:" + IPV4_STRING_1, mappingResult.getEidUri().getValue());
170 * Tests {@link DataStoreBackEnd#removeAuthenticationKey} method.
173 public void removeAuthenticationKeyTest() {
174 final AuthenticationKey authenticationKey = getDefaultAuthenticationKeyBuilder().build();
176 dataStoreBackEnd.removeAuthenticationKey(authenticationKey);
177 Mockito.verify(wTxMock).delete(Mockito.eq(LogicalDatastoreType.CONFIGURATION), iidCaptorAuthKey.capture());
180 AuthenticationKeyKey result = iidCaptorAuthKey.getValue().firstKeyOf(AuthenticationKey.class);
181 assertEquals("ipv4:" + IPV4_STRING_1, result.getEidUri().getValue());
185 * Tests {@link DataStoreBackEnd#removeMapping} method.
188 public void removeMapping() {
189 final Mapping mapping = new MappingBuilder()
190 .withKey(new MappingKey(new EidUri(LispAddressStringifier.getURIString(EID_IPV4_1)),
191 MappingOrigin.Northbound))
192 .setMappingRecord(getDefaultMappingRecordBuilder().build())
193 .setOrigin(MappingOrigin.Northbound).build();
195 dataStoreBackEnd.removeMapping(mapping);
196 Mockito.verify(wTxMock).delete(Mockito.eq(LogicalDatastoreType.CONFIGURATION), iidCaptorMapping.capture());
199 MappingKey result = iidCaptorMapping.getValue().firstKeyOf(Mapping.class);
200 assertEquals("ipv4:" + IPV4_STRING_1, result.getEidUri().getValue());
201 assertEquals(MappingOrigin.Northbound, result.getOrigin());
205 * Tests {@link DataStoreBackEnd#addXtrIdMapping} method.
208 public void removeXtrIdMappingTest() {
209 XtrIdMapping xtrIdMapping = new XtrIdMappingBuilder()
210 .setXtrIdUri(new XtrIdUri(DUMMY_URI))
211 .setMappingRecord(getDefaultMappingRecordBuilder().build()).build();
213 dataStoreBackEnd.removeXtrIdMapping(xtrIdMapping);
214 Mockito.verify(wTxMock).delete(Mockito.eq(LogicalDatastoreType.OPERATIONAL), iidCaptorXtrIdMapping.capture());
217 XtrIdMappingKey xtrIdResult = iidCaptorXtrIdMapping.getValue().firstKeyOf(XtrIdMapping.class);
218 MappingKey mappingResult = iidCaptorXtrIdMapping.getValue().firstKeyOf(Mapping.class);
220 assertEquals(DatatypeConverter.printHexBinary(XTR_ID), xtrIdResult.getXtrIdUri().getValue());
221 assertEquals(MappingOrigin.Southbound, mappingResult.getOrigin());
222 assertEquals("ipv4:" + IPV4_STRING_1, mappingResult.getEidUri().getValue());
226 * Tests {@link DataStoreBackEnd#updateAuthenticationKey} method.
229 public void updateAuthenticationKeyTest() {
230 final AuthenticationKey authenticationKey = getDefaultAuthenticationKeyBuilder().build();
232 dataStoreBackEnd.updateAuthenticationKey(authenticationKey);
233 Mockito.verify(wTxMock).mergeParentStructurePut(Mockito.eq(LogicalDatastoreType.CONFIGURATION),
234 iidCaptorAuthKey.capture(), Mockito.eq(authenticationKey));
237 AuthenticationKeyKey result = iidCaptorAuthKey.getValue().firstKeyOf(AuthenticationKey.class);
238 assertEquals("ipv4:" + IPV4_STRING_1, result.getEidUri().getValue());
242 * Tests {@link DataStoreBackEnd#updateMapping} method.
245 public void updateMappingTest() {
246 final Mapping mapping = new MappingBuilder()
247 .withKey(new MappingKey(new EidUri(LispAddressStringifier.getURIString(EID_IPV4_1)),
248 MappingOrigin.Northbound))
249 .setMappingRecord(getDefaultMappingRecordBuilder().build())
250 .setOrigin(MappingOrigin.Northbound).build();
252 dataStoreBackEnd.updateMapping(mapping);
253 Mockito.verify(wTxMock).mergeParentStructurePut(Mockito.eq(LogicalDatastoreType.CONFIGURATION),
254 iidCaptorMapping.capture(), Mockito.eq(mapping));
257 MappingKey result = iidCaptorMapping.getValue().firstKeyOf(Mapping.class);
258 assertEquals("ipv4:" + IPV4_STRING_1, result.getEidUri().getValue());
259 assertEquals(MappingOrigin.Northbound, result.getOrigin());
263 * Tests {@link DataStoreBackEnd#getAllMappings} method.
266 public void getAllMappingsTest() {
267 final ReadTransaction rTxMock = Mockito.mock(ReadTransaction.class);
268 final FluentFuture<Optional<MappingDatabase>> readFutureMock = FluentFutures.immediateFluentFuture(
269 Optional.of(getDefaultMappingDatabase().build()));
271 Mockito.when(txChainMock.newReadOnlyTransaction()).thenReturn(rTxMock);
272 Mockito.when(rTxMock.read(LogicalDatastoreType.CONFIGURATION, DATABASE_ROOT)).thenReturn(readFutureMock);
273 Mockito.when(rTxMock.read(LogicalDatastoreType.OPERATIONAL, DATABASE_ROOT)).thenReturn(readFutureMock);
275 assertEquals(8, dataStoreBackEnd.getAllMappings().size());
279 * Tests {@link DataStoreBackEnd#getAllAuthenticationKeys} method.
282 public void getAllAuthenticationKeysTest() {
283 final ReadTransaction rTxMock = Mockito.mock(ReadTransaction.class);
284 final FluentFuture<Optional<MappingDatabase>> readFutureMock = FluentFutures.immediateFluentFuture(
285 Optional.of(getDefaultMappingDatabase().build()));
287 Mockito.when(txChainMock.newReadOnlyTransaction()).thenReturn(rTxMock);
288 Mockito.when(rTxMock.read(LogicalDatastoreType.CONFIGURATION, DATABASE_ROOT)).thenReturn(readFutureMock);
290 assertEquals(4, dataStoreBackEnd.getAllAuthenticationKeys().size());
294 * Tests {@link DataStoreBackEnd#removeAllDatastoreContent} method.
297 public void removeAllDatastoreContentTest() {
298 dataStoreBackEnd.removeAllDatastoreContent();
299 Mockito.verify(wTxMock).delete(LogicalDatastoreType.CONFIGURATION, DATABASE_ROOT);
300 Mockito.verify(wTxMock).delete(LogicalDatastoreType.OPERATIONAL, DATABASE_ROOT);
304 * Increases {@link DataStoreBackEnd} code coverage.
307 public void onTransactionChainFailedTest() {
308 dataStoreBackEnd.onTransactionChainFailed(Mockito.mock(TransactionChain.class), Mockito.mock(Throwable.class));
312 * Increases {@link DataStoreBackEnd} code coverage.
315 public void onTransactionChainSuccessfulTest() {
316 dataStoreBackEnd.onTransactionChainSuccessful(Mockito.mock(TransactionChain.class));
319 private static MappingRecordBuilder getDefaultMappingRecordBuilder() {
320 return new MappingRecordBuilder()
322 .setLocatorRecord(new ArrayList<>())
323 .setXtrId(new XtrId(XTR_ID));
326 private static AuthenticationKeyBuilder getDefaultAuthenticationKeyBuilder() {
327 return new AuthenticationKeyBuilder()
328 .withKey(new AuthenticationKeyKey(new EidUri(DUMMY_URI)))
330 .setMappingAuthkey(new MappingAuthkeyBuilder().setKeyString("password").setKeyType(Uint16.valueOf(0))
334 private static MappingDatabaseBuilder getDefaultMappingDatabase() {
335 final Mapping mapping_1 = new MappingBuilder()
336 .withKey(new MappingKey(new EidUri(LispAddressStringifier.getURIString(EID_IPV4_1)),
337 MappingOrigin.Northbound))
338 .setMappingRecord(getDefaultMappingRecordBuilder().build()).build();
339 final Mapping mapping_2 = new MappingBuilder()
340 .withKey(new MappingKey(new EidUri(LispAddressStringifier.getURIString(EID_IPV4_2)),
341 MappingOrigin.Northbound))
342 .setMappingRecord(getDefaultMappingRecordBuilder().setEid(EID_IPV4_2).build()).build();
343 final Mapping mapping_3 = new MappingBuilder()
344 .withKey(new MappingKey(new EidUri(LispAddressStringifier.getURIString(EID_IPV4_3)),
345 MappingOrigin.Northbound))
346 .setMappingRecord(getDefaultMappingRecordBuilder().setEid(EID_IPV4_3).build()).build();
347 final Mapping mapping_4 = new MappingBuilder()
348 .withKey(new MappingKey(new EidUri(LispAddressStringifier.getURIString(EID_IPV4_4)),
349 MappingOrigin.Northbound))
350 .setMappingRecord(getDefaultMappingRecordBuilder().setEid(EID_IPV4_4).build()).build();
352 final Map<MappingKey, Mapping> mappingEntries_1 = new LinkedHashMap<>();
353 mappingEntries_1.put(new MappingKey(new EidUri("uri-1"), MappingOrigin.Northbound), mapping_1);
354 mappingEntries_1.put(new MappingKey(new EidUri("uri-2"), MappingOrigin.Northbound), mapping_2);
355 final Map<MappingKey, Mapping> mappingEntries_2 = new LinkedHashMap<>();
356 mappingEntries_2.put(new MappingKey(new EidUri("uri-3"), MappingOrigin.Northbound), mapping_3);
357 mappingEntries_2.put(new MappingKey(new EidUri("uri-4"), MappingOrigin.Northbound), mapping_4);
359 final AuthenticationKey authenticationKey_1 = new AuthenticationKeyBuilder()
360 .withKey(new AuthenticationKeyKey(new EidUri("uri-1"))).build();
361 final AuthenticationKey authenticationKey_2 = new AuthenticationKeyBuilder()
362 .withKey(new AuthenticationKeyKey(new EidUri("uri-2"))).build();
363 final AuthenticationKey authenticationKey_3 = new AuthenticationKeyBuilder()
364 .withKey(new AuthenticationKeyKey(new EidUri("uri-3"))).build();
365 final AuthenticationKey authenticationKey_4 = new AuthenticationKeyBuilder()
366 .withKey(new AuthenticationKeyKey(new EidUri("uri-4"))).build();
368 final Map<AuthenticationKeyKey, AuthenticationKey> authKey_1 = new LinkedHashMap<>();
369 authKey_1.put(new AuthenticationKeyKey(new EidUri("uri-1")), authenticationKey_1);
370 authKey_1.put(new AuthenticationKeyKey(new EidUri("uri-2")), authenticationKey_2);
371 final Map<AuthenticationKeyKey, AuthenticationKey> authKey_2 = new LinkedHashMap<>();
372 authKey_2.put(new AuthenticationKeyKey(new EidUri("uri-3")), authenticationKey_3);
373 authKey_2.put(new AuthenticationKeyKey(new EidUri("uri-4")), authenticationKey_4);
375 final VirtualNetworkIdentifier vni_1 = new VirtualNetworkIdentifierBuilder()
376 .setVni(new VniUri("vni/uri/1"))
377 .setMapping(mappingEntries_1)
378 .setAuthenticationKey(authKey_1).build();
379 final VirtualNetworkIdentifier vni_2 = new VirtualNetworkIdentifierBuilder()
380 .setVni(new VniUri("vni/uri/2"))
381 .setMapping(mappingEntries_2)
382 .setAuthenticationKey(authKey_2).build();
384 final Map<VirtualNetworkIdentifierKey, VirtualNetworkIdentifier> vniEntries = new LinkedHashMap<>();
385 vniEntries.put(new VirtualNetworkIdentifierKey(new VniUri("vni/uri/1")), vni_1);
386 vniEntries.put(new VirtualNetworkIdentifierKey(new VniUri("vni/uri/2")), vni_2);
388 return new MappingDatabaseBuilder().setVirtualNetworkIdentifier(vniEntries);