c02cea95b83b91264929017ecddec1d6f6b8f1b8
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / test / java / org / opendaylight / controller / cluster / datastore / persisted / FrontendShardDataTreeSnapshotMetadataTest.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
9 package org.opendaylight.controller.cluster.datastore.persisted;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertFalse;
13 import static org.junit.Assert.assertThrows;
14 import static org.junit.Assert.assertTrue;
15
16 import com.google.common.collect.ImmutableMap;
17 import com.google.common.primitives.UnsignedLong;
18 import java.io.ByteArrayInputStream;
19 import java.io.ByteArrayOutputStream;
20 import java.io.IOException;
21 import java.io.ObjectInputStream;
22 import java.io.ObjectOutputStream;
23 import java.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.List;
26 import java.util.Map;
27 import org.junit.Test;
28 import org.opendaylight.controller.cluster.access.concepts.ClientIdentifier;
29 import org.opendaylight.controller.cluster.access.concepts.FrontendIdentifier;
30 import org.opendaylight.controller.cluster.access.concepts.FrontendType;
31 import org.opendaylight.controller.cluster.access.concepts.MemberName;
32 import org.opendaylight.controller.cluster.datastore.utils.ImmutableUnsignedLongSet;
33 import org.opendaylight.controller.cluster.datastore.utils.MutableUnsignedLongSet;
34
35 public class FrontendShardDataTreeSnapshotMetadataTest {
36
37     @Test
38     public void testCreateMetadataSnapshotNullInput() {
39         assertThrows(NullPointerException.class, () -> new FrontendShardDataTreeSnapshotMetadata(null));
40     }
41
42     @Test
43     public void testCreateMetadataSnapshotEmptyInput() throws Exception {
44         final FrontendShardDataTreeSnapshotMetadata emptyOrigSnapshot = createEmptyMetadataSnapshot();
45         final FrontendShardDataTreeSnapshotMetadata emptyCopySnapshot = copy(emptyOrigSnapshot, 127);
46         testMetadataSnapshotEqual(emptyOrigSnapshot, emptyCopySnapshot);
47     }
48
49     @Test
50     public void testSerializeMetadataSnapshotWithOneClient() throws Exception {
51         final FrontendShardDataTreeSnapshotMetadata origSnapshot = createMetadataSnapshot(1);
52         final FrontendShardDataTreeSnapshotMetadata copySnapshot = copy(origSnapshot, 162);
53         testMetadataSnapshotEqual(origSnapshot, copySnapshot);
54     }
55
56     @Test
57     public void testSerializeMetadataSnapshotWithMoreClients() throws Exception {
58         final FrontendShardDataTreeSnapshotMetadata origSnapshot = createMetadataSnapshot(5);
59         final FrontendShardDataTreeSnapshotMetadata copySnapshot = copy(origSnapshot, 314);
60         testMetadataSnapshotEqual(origSnapshot, copySnapshot);
61     }
62
63     private static void testMetadataSnapshotEqual(final FrontendShardDataTreeSnapshotMetadata origSnapshot,
64             final FrontendShardDataTreeSnapshotMetadata copySnapshot) {
65
66         final List<FrontendClientMetadata> origClientList = origSnapshot.getClients();
67         final List<FrontendClientMetadata> copyClientList = copySnapshot.getClients();
68
69         assertEquals(origClientList.size(), copyClientList.size());
70
71         final Map<ClientIdentifier, FrontendClientMetadata> origIdent = new HashMap<>();
72         final Map<ClientIdentifier, FrontendClientMetadata> copyIdent = new HashMap<>();
73         origClientList.forEach(client -> origIdent.put(client.getIdentifier(), client));
74         origClientList.forEach(client -> copyIdent.put(client.getIdentifier(), client));
75
76         assertTrue(origIdent.keySet().containsAll(copyIdent.keySet()));
77         assertTrue(copyIdent.keySet().containsAll(origIdent.keySet()));
78
79         origIdent.values().forEach(client -> {
80             final FrontendClientMetadata copyClient = copyIdent.get(client.getIdentifier());
81             testObject(client.getIdentifier(), copyClient.getIdentifier());
82             assertEquals(client.getPurgedHistories(), copyClient.getPurgedHistories());
83             assertEquals(client.getCurrentHistories(), copyClient.getCurrentHistories());
84         });
85     }
86
87     private static FrontendShardDataTreeSnapshotMetadata createEmptyMetadataSnapshot() {
88         return new FrontendShardDataTreeSnapshotMetadata(List.of());
89     }
90
91     private static FrontendShardDataTreeSnapshotMetadata createMetadataSnapshot(final int size) {
92         final List<FrontendClientMetadata> clients = new ArrayList<>(size);
93         for (long i = 0; i < size; i++) {
94             clients.add(createFrontedClientMetadata(i));
95         }
96         return new FrontendShardDataTreeSnapshotMetadata(clients);
97     }
98
99     private static FrontendClientMetadata createFrontedClientMetadata(final long num) {
100         final String index = String.valueOf(num);
101         final String indexName = "test_" + index;
102         final FrontendIdentifier frontendIdentifier = FrontendIdentifier.create(MemberName.forName(indexName),
103                 FrontendType.forName(index));
104         final ClientIdentifier clientIdentifier = ClientIdentifier.create(frontendIdentifier, num);
105
106         final MutableUnsignedLongSet tmp = MutableUnsignedLongSet.of();
107         tmp.add(0);
108         final ImmutableUnsignedLongSet purgedHistories = tmp.immutableCopy();
109
110         return new FrontendClientMetadata(clientIdentifier, purgedHistories.immutableCopy(), List.of(
111             new FrontendHistoryMetadata(num, num, true, ImmutableMap.of(UnsignedLong.ZERO, Boolean.TRUE),
112                 purgedHistories)));
113     }
114
115     private static <T> void testObject(final T object, final T equalObject) {
116         assertEquals(object.hashCode(), equalObject.hashCode());
117         assertTrue(object.equals(object));
118         assertTrue(object.equals(equalObject));
119         assertFalse(object.equals(null));
120         assertFalse(object.equals("dummy"));
121     }
122
123     @SuppressWarnings("unchecked")
124     private static <T> T copy(final T obj, final int expectedSize) throws IOException, ClassNotFoundException {
125         final ByteArrayOutputStream bos = new ByteArrayOutputStream();
126         try (ObjectOutputStream oos = new ObjectOutputStream(bos)) {
127             oos.writeObject(obj);
128         }
129
130         final byte[] bytes = bos.toByteArray();
131         assertEquals(expectedSize, bytes.length);
132
133         try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes))) {
134             return (T) ois.readObject();
135         }
136     }
137 }