b01c07213e6858d4e0bdf289dd5c86a44f0d51f0
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / test / java / org / opendaylight / controller / cluster / datastore / messages / BatchedModificationsTest.java
1 /*
2  * Copyright (c) 2015 Brocade Communications 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.controller.cluster.datastore.messages;
9
10 import static org.junit.Assert.assertEquals;
11
12 import com.google.common.collect.ImmutableSortedSet;
13 import java.io.Serializable;
14 import java.util.Optional;
15 import java.util.SortedSet;
16 import org.apache.commons.lang.SerializationUtils;
17 import org.junit.Test;
18 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
19 import org.opendaylight.controller.cluster.datastore.AbstractTest;
20 import org.opendaylight.controller.cluster.datastore.DataStoreVersions;
21 import org.opendaylight.controller.cluster.datastore.modification.DeleteModification;
22 import org.opendaylight.controller.cluster.datastore.modification.MergeModification;
23 import org.opendaylight.controller.cluster.datastore.modification.WriteModification;
24 import org.opendaylight.controller.md.cluster.datastore.model.TestModel;
25 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
26 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
27 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
28 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
29
30 /**
31  * Unit tests for BatchedModifications.
32  *
33  * @author Thomas Pantelis
34  */
35 public class BatchedModificationsTest extends AbstractTest {
36
37     @Test
38     public void testSerialization() {
39         YangInstanceIdentifier writePath = TestModel.TEST_PATH;
40         NormalizedNode<?, ?> writeData = ImmutableContainerNodeBuilder.create().withNodeIdentifier(
41                 new YangInstanceIdentifier.NodeIdentifier(TestModel.TEST_QNAME))
42                 .withChild(ImmutableNodes.leafNode(TestModel.DESC_QNAME, "foo")).build();
43
44         YangInstanceIdentifier mergePath = TestModel.OUTER_LIST_PATH;
45         NormalizedNode<?, ?> mergeData = ImmutableContainerNodeBuilder.create().withNodeIdentifier(
46                 new YangInstanceIdentifier.NodeIdentifier(TestModel.OUTER_LIST_QNAME)).build();
47
48         YangInstanceIdentifier deletePath = TestModel.TEST_PATH;
49
50         final TransactionIdentifier tx1 = nextTransactionId();
51         BatchedModifications batched = new BatchedModifications(tx1, DataStoreVersions.CURRENT_VERSION);
52         batched.addModification(new WriteModification(writePath, writeData));
53         batched.addModification(new MergeModification(mergePath, mergeData));
54         batched.addModification(new DeleteModification(deletePath));
55         assertEquals("isReady", false, batched.isReady());
56         batched.setReady();
57         assertEquals("isReady", true, batched.isReady());
58         batched.setTotalMessagesSent(5);
59
60         BatchedModifications clone = (BatchedModifications) SerializationUtils.clone(
61                 (Serializable) batched.toSerializable());
62
63         assertEquals("getVersion", DataStoreVersions.CURRENT_VERSION, clone.getVersion());
64         assertEquals("getTransactionID", tx1, clone.getTransactionId());
65         assertEquals("isReady", true, clone.isReady());
66         assertEquals("isDoCommitOnReady", false, clone.isDoCommitOnReady());
67         assertEquals("participatingShardNames present", false, clone.getParticipatingShardNames().isPresent());
68         assertEquals("getTotalMessagesSent", 5, clone.getTotalMessagesSent());
69
70         assertEquals("getModifications size", 3, clone.getModifications().size());
71
72         WriteModification write = (WriteModification)clone.getModifications().get(0);
73         assertEquals("getVersion", DataStoreVersions.CURRENT_VERSION, write.getVersion());
74         assertEquals("getPath", writePath, write.getPath());
75         assertEquals("getData", writeData, write.getData());
76
77         MergeModification merge = (MergeModification)clone.getModifications().get(1);
78         assertEquals("getVersion", DataStoreVersions.CURRENT_VERSION, merge.getVersion());
79         assertEquals("getPath", mergePath, merge.getPath());
80         assertEquals("getData", mergeData, merge.getData());
81
82         DeleteModification delete = (DeleteModification)clone.getModifications().get(2);
83         assertEquals("getVersion", DataStoreVersions.CURRENT_VERSION, delete.getVersion());
84         assertEquals("getPath", deletePath, delete.getPath());
85
86         // Test with participating shard names.
87
88         final TransactionIdentifier tx2 = nextTransactionId();
89         batched = new BatchedModifications(tx2, (short)10000);
90         final SortedSet<String> shardNames = ImmutableSortedSet.of("one", "two");
91         batched.setReady(Optional.of(shardNames));
92         batched.setDoCommitOnReady(true);
93         assertEquals("isReady", true, batched.isReady());
94
95         clone = (BatchedModifications) SerializationUtils.clone((Serializable) batched.toSerializable());
96
97         assertEquals("getVersion", DataStoreVersions.CURRENT_VERSION, clone.getVersion());
98         assertEquals("getTransactionID", tx2, clone.getTransactionId());
99         assertEquals("isReady", true, clone.isReady());
100         assertEquals("isDoCommitOnReady", true, clone.isDoCommitOnReady());
101         assertEquals("participatingShardNames present", true, clone.getParticipatingShardNames().isPresent());
102         assertEquals("participatingShardNames", shardNames, clone.getParticipatingShardNames().get());
103         assertEquals("getModifications size", 0, clone.getModifications().size());
104
105         // Test not ready.
106
107         batched = new BatchedModifications(tx2, DataStoreVersions.CURRENT_VERSION);
108
109         clone = (BatchedModifications) SerializationUtils.clone((Serializable) batched.toSerializable());
110
111         assertEquals("getVersion", DataStoreVersions.CURRENT_VERSION, clone.getVersion());
112         assertEquals("getTransactionID", tx2, clone.getTransactionId());
113         assertEquals("isReady", false, clone.isReady());
114         assertEquals("getModifications size", 0, clone.getModifications().size());
115
116         // Test pre-Flourine
117
118         batched = new BatchedModifications(tx2, DataStoreVersions.BORON_VERSION);
119         batched.addModification(new WriteModification(writePath, writeData));
120         batched.setReady(Optional.of(ImmutableSortedSet.of("one", "two")));
121
122         clone = (BatchedModifications) SerializationUtils.clone((Serializable) batched.toSerializable());
123
124         assertEquals("getVersion", DataStoreVersions.BORON_VERSION, clone.getVersion());
125         assertEquals("getTransactionID", tx2, clone.getTransactionId());
126         assertEquals("isReady", true, clone.isReady());
127         assertEquals("participatingShardNames present", false, clone.getParticipatingShardNames().isPresent());
128         assertEquals("getModifications size", 1, clone.getModifications().size());
129     }
130
131     @Test
132     public void testBatchedModificationsReplySerialization() {
133         BatchedModificationsReply clone = (BatchedModificationsReply) SerializationUtils.clone(
134                 (Serializable) new BatchedModificationsReply(100).toSerializable());
135         assertEquals("getNumBatched", 100, clone.getNumBatched());
136     }
137 }