Merge "Add better error reporting to ConfigSnapshot parser"
[controller.git] / opendaylight / md-sal / sal-remoterpc-connector / src / test / java / org / opendaylight / controller / remote / rpc / registry / gossip / BucketStoreTest.java
1 /*
2  * Copyright (c) 2014 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.controller.remote.rpc.registry.gossip;
9
10 import akka.actor.ActorSystem;
11 import akka.actor.Address;
12 import akka.actor.Props;
13 import akka.testkit.TestActorRef;
14 import com.typesafe.config.ConfigFactory;
15 import java.util.HashMap;
16 import java.util.Map;
17 import org.junit.AfterClass;
18 import org.junit.Assert;
19 import org.junit.BeforeClass;
20 import org.junit.Test;
21 import org.opendaylight.controller.remote.rpc.TerminationMonitor;
22
23 public class BucketStoreTest {
24
25     private static ActorSystem system;
26
27     @BeforeClass
28     public static void setup() {
29
30         system = ActorSystem.create("opendaylight-rpc", ConfigFactory.load().getConfig("unit-test"));
31         system.actorOf(Props.create(TerminationMonitor.class), "termination-monitor");
32     }
33
34     @AfterClass
35     public static void teardown() {
36         system.shutdown();
37     }
38
39     /**
40      * Given remote buckets
41      * Should merge with local copy of remote buckets
42      */
43     @Test
44     public void testReceiveUpdateRemoteBuckets(){
45
46         BucketStore store = createStore();
47
48         Address localAddress = system.provider().getDefaultAddress();
49         Bucket localBucket = new BucketImpl();
50
51         Address a1 = new Address("tcp", "system1");
52         Address a2 = new Address("tcp", "system2");
53         Address a3 = new Address("tcp", "system3");
54
55         Bucket b1 = new BucketImpl();
56         Bucket b2 = new BucketImpl();
57         Bucket b3 = new BucketImpl();
58
59         Map<Address, Bucket> remoteBuckets = new HashMap<>(3);
60         remoteBuckets.put(a1, b1);
61         remoteBuckets.put(a2, b2);
62         remoteBuckets.put(a3, b3);
63         remoteBuckets.put(localAddress, localBucket);
64
65         //Given remote buckets
66         store.receiveUpdateRemoteBuckets(remoteBuckets);
67
68         //Should NOT contain local bucket
69         //Should contain ONLY 3 entries i.e a1, a2, a3
70         Map<Address, Bucket<?>> remoteBucketsInStore = store.getRemoteBuckets();
71         Assert.assertFalse("remote buckets contains local bucket", remoteBucketsInStore.containsKey(localAddress));
72         Assert.assertTrue(remoteBucketsInStore.size() == 3);
73
74         //Add a new remote bucket
75         Address a4 = new Address("tcp", "system4");
76         Bucket b4 = new BucketImpl();
77         remoteBuckets.clear();
78         remoteBuckets.put(a4, b4);
79         store.receiveUpdateRemoteBuckets(remoteBuckets);
80
81         //Should contain a4
82         //Should contain 4 entries now i.e a1, a2, a3, a4
83         remoteBucketsInStore = store.getRemoteBuckets();
84         Assert.assertTrue("Does not contain a4", remoteBucketsInStore.containsKey(a4));
85         Assert.assertTrue(remoteBucketsInStore.size() == 4);
86
87         //Update a bucket
88         Bucket b3_new = new BucketImpl();
89         remoteBuckets.clear();
90         remoteBuckets.put(a3, b3_new);
91         remoteBuckets.put(a1, null);
92         remoteBuckets.put(a2, null);
93         store.receiveUpdateRemoteBuckets(remoteBuckets);
94
95         //Should only update a3
96         remoteBucketsInStore = store.getRemoteBuckets();
97         Bucket b3_inStore = remoteBucketsInStore.get(a3);
98         Assert.assertEquals(b3_new.getVersion(), b3_inStore.getVersion());
99
100         //Should NOT update a1 and a2
101         Bucket b1_inStore = remoteBucketsInStore.get(a1);
102         Bucket b2_inStore = remoteBucketsInStore.get(a2);
103         Assert.assertEquals(b1.getVersion(), b1_inStore.getVersion());
104         Assert.assertEquals(b2.getVersion(), b2_inStore.getVersion());
105         Assert.assertTrue(remoteBucketsInStore.size() == 4);
106
107         //Should update versions map
108         //versions map contains versions for all remote buckets (4).
109         Map<Address, Long> versionsInStore = store.getVersions();
110         Assert.assertEquals(4, versionsInStore.size());
111         Assert.assertEquals(b1.getVersion(), versionsInStore.get(a1));
112         Assert.assertEquals(b2.getVersion(), versionsInStore.get(a2));
113         Assert.assertEquals(b3_new.getVersion(), versionsInStore.get(a3));
114         Assert.assertEquals(b4.getVersion(), versionsInStore.get(a4));
115
116         //Send older version of bucket
117         remoteBuckets.clear();
118         remoteBuckets.put(a3, b3);
119         store.receiveUpdateRemoteBuckets(remoteBuckets);
120
121         //Should NOT update a3
122         remoteBucketsInStore = store.getRemoteBuckets();
123         b3_inStore = remoteBucketsInStore.get(a3);
124         Assert.assertTrue(b3_inStore.getVersion().longValue() == b3_new.getVersion().longValue());
125
126     }
127
128     /**
129      * Create BucketStore actor and returns the underlying instance of BucketStore class.
130      *
131      * @return instance of BucketStore class
132      */
133     private static BucketStore createStore(){
134         final Props props = Props.create(BucketStore.class);
135         final TestActorRef<BucketStore> testRef = TestActorRef.create(system, props, "testStore");
136         return testRef.underlyingActor();
137     }
138 }