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