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.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.junit.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.authkey.container.MappingAuthkeyBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.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.XtrIdMappingBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.db.instance.mapping.XtrIdMappingKey;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.mapping.database.VirtualNetworkIdentifier;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.mapping.database.VirtualNetworkIdentifierBuilder;
57 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
58 import org.powermock.api.mockito.PowerMockito;
59 import org.powermock.core.classloader.annotations.PrepareForTest;
60 import org.powermock.modules.junit4.PowerMockRunner;
61 import org.powermock.modules.junit4.PowerMockRunnerDelegate;
62 import org.slf4j.Logger;
63 import org.slf4j.LoggerFactory;
65 @RunWith(PowerMockRunner.class)
66 @PowerMockRunnerDelegate(MockitoJUnitRunner.class)
67 @PrepareForTest({LoggerFactory.class})
68 public class DataStoreBackEndTest {
70 @Captor private static ArgumentCaptor<InstanceIdentifier<AuthenticationKey>> iidCaptorAuthKey;
71 @Captor private static ArgumentCaptor<InstanceIdentifier<Mapping>> iidCaptorMapping;
72 @Captor private static ArgumentCaptor<InstanceIdentifier<XtrIdMapping>> iidCaptorXtrIdMapping;
73 @Mock private static BindingTransactionChain txChainMock;
74 @Mock private static WriteTransaction wTxMock;
75 private static DataStoreBackEnd dataStoreBackEnd;
77 private static final String IPV4_STRING_1 = "1.2.3.0";
78 private static final String IPV4_STRING_2 = "1.2.4.0";
79 private static final String IPV4_STRING_3 = "1.2.5.0";
80 private static final String IPV4_STRING_4 = "1.2.6.0";
81 private static final String DUMMY_URI = "dummy/uri";
82 private static final Eid EID_IPV4_1 = LispAddressUtil.asIpv4Eid(IPV4_STRING_1);
83 private static final Eid EID_IPV4_2 = LispAddressUtil.asIpv4Eid(IPV4_STRING_2);
84 private static final Eid EID_IPV4_3 = LispAddressUtil.asIpv4Eid(IPV4_STRING_3);
85 private static final Eid EID_IPV4_4 = LispAddressUtil.asIpv4Eid(IPV4_STRING_4);
86 private static final byte[] XTR_ID = new byte[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
87 private static final InstanceIdentifier<MappingDatabase> DATABASE_ROOT =
88 InstanceIdentifier.create(MappingDatabase.class);
92 final DataBroker brokerMock = Mockito.mock(DataBroker.class);
93 final Logger logMock = Mockito.mock(Logger.class, "LOG");
95 PowerMockito.mockStatic(LoggerFactory.class);
96 PowerMockito.when(LoggerFactory.getLogger(DataStoreBackEnd.class))
98 Mockito.when(logMock.isDebugEnabled()).thenReturn(true);
99 Mockito.when(brokerMock.createTransactionChain(Mockito.any(DataStoreBackEnd.class))).thenReturn(txChainMock);
100 dataStoreBackEnd = PowerMockito.spy(new DataStoreBackEnd(brokerMock));
102 Mockito.when(txChainMock.newWriteOnlyTransaction()).thenReturn(wTxMock);
103 Mockito.when(wTxMock.submit())
104 .thenReturn(Futures.<Void, TransactionCommitFailedException>immediateCheckedFuture(null));
108 * Tests {@link DataStoreBackEnd#addAuthenticationKey} method.
111 public void addAuthenticationKeyTest() {
112 final AuthenticationKey authenticationKey = getDefaultAuthenticationKeyBuilder().build();
114 dataStoreBackEnd.addAuthenticationKey(authenticationKey);
115 Mockito.verify(wTxMock).put(Mockito.eq(LogicalDatastoreType.CONFIGURATION), iidCaptorAuthKey.capture(),
116 Mockito.eq(authenticationKey), Mockito.eq(true));
119 AuthenticationKeyKey result = iidCaptorAuthKey.getValue().firstKeyOf(AuthenticationKey.class);
120 assertEquals("ipv4:" + IPV4_STRING_1, result.getEidUri().getValue());
124 * Tests {@link DataStoreBackEnd#addMapping} method.
127 public void addMappingTest() {
128 final Mapping mapping = new MappingBuilder()
129 .setMappingRecord(getDefaultMappingRecordBuilder().build())
130 .setOrigin(MappingOrigin.Northbound).build();
132 dataStoreBackEnd.addMapping(mapping);
133 Mockito.verify(wTxMock).put(Mockito.eq(LogicalDatastoreType.CONFIGURATION), iidCaptorMapping.capture(),
134 Mockito.eq(mapping), Mockito.eq(true));
137 MappingKey result = iidCaptorMapping.getValue().firstKeyOf(Mapping.class);
138 assertEquals("ipv4:" + IPV4_STRING_1, result.getEidUri().getValue());
139 assertEquals(MappingOrigin.Northbound, result.getOrigin());
143 * Tests {@link DataStoreBackEnd#addXtrIdMapping} method.
146 public void addXtrIdMappingTest() {
147 XtrIdMapping xtrIdMapping = new XtrIdMappingBuilder()
148 .setXtrIdUri(new XtrIdUri(DUMMY_URI))
149 .setMappingRecord(getDefaultMappingRecordBuilder().build()).build();
151 dataStoreBackEnd.addXtrIdMapping(xtrIdMapping);
152 Mockito.verify(wTxMock).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), iidCaptorXtrIdMapping.capture(),
153 Mockito.eq(xtrIdMapping), Mockito.eq(true));
156 XtrIdMappingKey xtrIdResult = iidCaptorXtrIdMapping.getValue().firstKeyOf(XtrIdMapping.class);
157 MappingKey mappingResult = iidCaptorXtrIdMapping.getValue().firstKeyOf(Mapping.class);
159 assertEquals(DatatypeConverter.printHexBinary(XTR_ID), xtrIdResult.getXtrIdUri().getValue());
160 assertEquals(MappingOrigin.Southbound, mappingResult.getOrigin());
161 assertEquals("ipv4:" + IPV4_STRING_1, mappingResult.getEidUri().getValue());
165 * Tests {@link DataStoreBackEnd#removeAuthenticationKey} method.
168 public void removeAuthenticationKeyTest() {
169 final AuthenticationKey authenticationKey = getDefaultAuthenticationKeyBuilder().build();
171 dataStoreBackEnd.removeAuthenticationKey(authenticationKey);
172 Mockito.verify(wTxMock).delete(Mockito.eq(LogicalDatastoreType.CONFIGURATION), iidCaptorAuthKey.capture());
175 AuthenticationKeyKey result = iidCaptorAuthKey.getValue().firstKeyOf(AuthenticationKey.class);
176 assertEquals("ipv4:" + IPV4_STRING_1, result.getEidUri().getValue());
180 * Tests {@link DataStoreBackEnd#removeMapping} method.
183 public void removeMapping() {
184 final Mapping mapping = new MappingBuilder()
185 .setMappingRecord(getDefaultMappingRecordBuilder().build())
186 .setOrigin(MappingOrigin.Northbound).build();
188 dataStoreBackEnd.removeMapping(mapping);
189 Mockito.verify(wTxMock).delete(Mockito.eq(LogicalDatastoreType.CONFIGURATION), iidCaptorMapping.capture());
192 MappingKey result = iidCaptorMapping.getValue().firstKeyOf(Mapping.class);
193 assertEquals("ipv4:" + IPV4_STRING_1, result.getEidUri().getValue());
194 assertEquals(MappingOrigin.Northbound, result.getOrigin());
198 * Tests {@link DataStoreBackEnd#addXtrIdMapping} method.
201 public void removeXtrIdMappingTest() {
202 XtrIdMapping xtrIdMapping = new XtrIdMappingBuilder()
203 .setXtrIdUri(new XtrIdUri(DUMMY_URI))
204 .setMappingRecord(getDefaultMappingRecordBuilder().build()).build();
206 dataStoreBackEnd.removeXtrIdMapping(xtrIdMapping);
207 Mockito.verify(wTxMock).delete(Mockito.eq(LogicalDatastoreType.OPERATIONAL), iidCaptorXtrIdMapping.capture());
210 XtrIdMappingKey xtrIdResult = iidCaptorXtrIdMapping.getValue().firstKeyOf(XtrIdMapping.class);
211 MappingKey mappingResult = iidCaptorXtrIdMapping.getValue().firstKeyOf(Mapping.class);
213 assertEquals(DatatypeConverter.printHexBinary(XTR_ID), xtrIdResult.getXtrIdUri().getValue());
214 assertEquals(MappingOrigin.Southbound, mappingResult.getOrigin());
215 assertEquals("ipv4:" + IPV4_STRING_1, mappingResult.getEidUri().getValue());
219 * Tests {@link DataStoreBackEnd#updateAuthenticationKey} method.
222 public void updateAuthenticationKeyTest() {
223 final AuthenticationKey authenticationKey = getDefaultAuthenticationKeyBuilder().build();
225 dataStoreBackEnd.updateAuthenticationKey(authenticationKey);
226 Mockito.verify(wTxMock).put(Mockito.eq(LogicalDatastoreType.CONFIGURATION), iidCaptorAuthKey.capture(),
227 Mockito.eq(authenticationKey), Mockito.eq(true));
230 AuthenticationKeyKey result = iidCaptorAuthKey.getValue().firstKeyOf(AuthenticationKey.class);
231 assertEquals("ipv4:" + IPV4_STRING_1, result.getEidUri().getValue());
235 * Tests {@link DataStoreBackEnd#updateMapping} method.
238 public void updateMappingTest() {
239 final Mapping mapping = new MappingBuilder()
240 .setMappingRecord(getDefaultMappingRecordBuilder().build())
241 .setOrigin(MappingOrigin.Northbound).build();
243 dataStoreBackEnd.updateMapping(mapping);
244 Mockito.verify(wTxMock).put(Mockito.eq(LogicalDatastoreType.CONFIGURATION), iidCaptorMapping.capture(),
245 Mockito.eq(mapping), Mockito.eq(true));
248 MappingKey result = iidCaptorMapping.getValue().firstKeyOf(Mapping.class);
249 assertEquals("ipv4:" + IPV4_STRING_1, result.getEidUri().getValue());
250 assertEquals(MappingOrigin.Northbound, result.getOrigin());
254 * Tests {@link DataStoreBackEnd#getAllMappings} method.
257 @SuppressWarnings("unchecked")
258 public void getAllMappingsTest() throws ReadFailedException {
259 final ReadOnlyTransaction rTxMock = Mockito.mock(ReadOnlyTransaction.class);
260 final CheckedFuture<Optional<MappingDatabase>, ReadFailedException> readFutureMock
261 = Mockito.mock(CheckedFuture.class);
262 final Optional<MappingDatabase> optionalMock = Mockito.mock(Optional.class);
264 Mockito.when(txChainMock.newReadOnlyTransaction()).thenReturn(rTxMock);
265 Mockito.when(rTxMock.read(LogicalDatastoreType.CONFIGURATION, DATABASE_ROOT)).thenReturn(readFutureMock);
266 Mockito.when(rTxMock.read(LogicalDatastoreType.OPERATIONAL, DATABASE_ROOT)).thenReturn(readFutureMock);
267 Mockito.when(readFutureMock.checkedGet()).thenReturn(optionalMock);
268 Mockito.when(optionalMock.isPresent()).thenReturn(true);
269 Mockito.when(optionalMock.get()).thenReturn(getDefaultMappingDatabase().build());
271 assertEquals(8, dataStoreBackEnd.getAllMappings().size());
272 Mockito.verify(optionalMock, Mockito.times(2)).get();
276 * Tests {@link DataStoreBackEnd#getAllAuthenticationKeys} method.
279 @SuppressWarnings("unchecked")
280 public void getAllAuthenticationKeysTest() throws ReadFailedException {
281 final ReadOnlyTransaction rTxMock = Mockito.mock(ReadOnlyTransaction.class);
282 final CheckedFuture<Optional<MappingDatabase>, ReadFailedException> readFutureMock
283 = Mockito.mock(CheckedFuture.class);
284 final Optional<MappingDatabase> optionalMock = Mockito.mock(Optional.class);
286 Mockito.when(txChainMock.newReadOnlyTransaction()).thenReturn(rTxMock);
287 Mockito.when(rTxMock.read(LogicalDatastoreType.CONFIGURATION, DATABASE_ROOT)).thenReturn(readFutureMock);
288 Mockito.when(readFutureMock.checkedGet()).thenReturn(optionalMock);
289 Mockito.when(optionalMock.isPresent()).thenReturn(true);
290 Mockito.when(optionalMock.get()).thenReturn(getDefaultMappingDatabase().build());
292 assertEquals(4, dataStoreBackEnd.getAllAuthenticationKeys().size());
293 Mockito.verify(optionalMock).get();
297 * Tests {@link DataStoreBackEnd#removeAllDatastoreContent} method.
300 public void removeAllDatastoreContentTest() {
301 dataStoreBackEnd.removeAllDatastoreContent();
302 Mockito.verify(wTxMock).delete(LogicalDatastoreType.CONFIGURATION, DATABASE_ROOT);
303 Mockito.verify(wTxMock).delete(LogicalDatastoreType.OPERATIONAL, DATABASE_ROOT);
307 * Increases {@link DataStoreBackEnd} code coverage.
310 public void onTransactionChainFailedTest() {
311 AsyncTransaction<?,?> asyncTransactionMock = Mockito.mock(AsyncTransaction.class);
312 Mockito.when(asyncTransactionMock.getIdentifier()).thenReturn(new Object());
313 dataStoreBackEnd.onTransactionChainFailed(Mockito.mock(TransactionChain.class), asyncTransactionMock,
314 Mockito.mock(Throwable.class));
318 * Increases {@link DataStoreBackEnd} code coverage.
321 public void onTransactionChainSuccessfulTest() {
322 dataStoreBackEnd.onTransactionChainSuccessful(Mockito.mock(TransactionChain.class));
325 private static MappingRecordBuilder getDefaultMappingRecordBuilder() {
326 return new MappingRecordBuilder()
328 .setLocatorRecord(new ArrayList<>())
329 .setXtrId(new XtrId(XTR_ID));
332 private static AuthenticationKeyBuilder getDefaultAuthenticationKeyBuilder() {
333 return new AuthenticationKeyBuilder()
334 .withKey(new AuthenticationKeyKey(new EidUri(DUMMY_URI)))
336 .setMappingAuthkey(new MappingAuthkeyBuilder().setKeyString("password").setKeyType(0).build());
339 private static MappingDatabaseBuilder getDefaultMappingDatabase() {
340 final Mapping mapping_1 = new MappingBuilder()
341 .setMappingRecord(getDefaultMappingRecordBuilder().build()).build();
342 final Mapping mapping_2 = new MappingBuilder()
343 .setMappingRecord(getDefaultMappingRecordBuilder().setEid(EID_IPV4_2).build()).build();
344 final Mapping mapping_3 = new MappingBuilder()
345 .setMappingRecord(getDefaultMappingRecordBuilder().setEid(EID_IPV4_3).build()).build();
346 final Mapping mapping_4 = new MappingBuilder()
347 .setMappingRecord(getDefaultMappingRecordBuilder().setEid(EID_IPV4_4).build()).build();
349 final AuthenticationKey authenticationKey_1 = new AuthenticationKeyBuilder()
350 .withKey(new AuthenticationKeyKey(new EidUri("uri-1"))).build();
351 final AuthenticationKey authenticationKey_2 = new AuthenticationKeyBuilder()
352 .withKey(new AuthenticationKeyKey(new EidUri("uri-2"))).build();
353 final AuthenticationKey authenticationKey_3 = new AuthenticationKeyBuilder()
354 .withKey(new AuthenticationKeyKey(new EidUri("uri-3"))).build();
355 final AuthenticationKey authenticationKey_4 = new AuthenticationKeyBuilder()
356 .withKey(new AuthenticationKeyKey(new EidUri("uri-4"))).build();
358 final VirtualNetworkIdentifier vni_1 = new VirtualNetworkIdentifierBuilder()
359 .setVni(new VniUri("vni/uri/1"))
360 .setMapping(Lists.newArrayList(mapping_1, mapping_2))
361 .setAuthenticationKey(Lists.newArrayList(authenticationKey_1, authenticationKey_2)).build();
362 final VirtualNetworkIdentifier vni_2 = new VirtualNetworkIdentifierBuilder()
363 .setVni(new VniUri("vni/uri/2"))
364 .setMapping(Lists.newArrayList(mapping_3, mapping_4))
365 .setAuthenticationKey(Lists.newArrayList(authenticationKey_3, authenticationKey_4)).build();
366 return new MappingDatabaseBuilder().setVirtualNetworkIdentifier(Lists.newArrayList(vni_1, vni_2));