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