Merge "Bug 1536: Fixed minimum values of SET_TP_SRC/DST."
[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 org.junit.AfterClass;
16 import org.junit.Assert;
17 import org.junit.BeforeClass;
18 import org.junit.Test;
19 import org.opendaylight.controller.remote.rpc.TerminationMonitor;
20
21 import java.util.HashMap;
22 import java.util.Map;
23
24 public class BucketStoreTest {
25
26     private static ActorSystem system;
27     private static BucketStore store;
28
29     @BeforeClass
30     public static void setup() {
31
32         system = ActorSystem.create("opendaylight-rpc", ConfigFactory.load().getConfig("unit-test"));
33         system.actorOf(Props.create(TerminationMonitor.class), "termination-monitor");
34
35         store = createStore();
36     }
37
38     @AfterClass
39     public static void teardown() {
40         system.shutdown();
41     }
42
43     /**
44      * Given a new local bucket
45      * Should replace
46      */
47     @Test
48     public void testReceiveUpdateBucket(){
49         Bucket bucket = new BucketImpl();
50         Long expectedVersion = bucket.getVersion();
51
52         store.receiveUpdateBucket(bucket);
53
54         Assert.assertEquals(bucket, store.getLocalBucket());
55         Assert.assertEquals(expectedVersion, store.getLocalBucket().getVersion());
56     }
57
58     /**
59      * Given remote buckets
60      * Should merge with local copy of remote buckets
61      */
62     @Test
63     public void testReceiveUpdateRemoteBuckets(){
64
65         Address localAddress = system.provider().getDefaultAddress();
66         Bucket localBucket = new BucketImpl();
67
68         Address a1 = new Address("tcp", "system1");
69         Address a2 = new Address("tcp", "system2");
70         Address a3 = new Address("tcp", "system3");
71
72         Bucket b1 = new BucketImpl();
73         Bucket b2 = new BucketImpl();
74         Bucket b3 = new BucketImpl();
75
76         Map<Address, Bucket> remoteBuckets = new HashMap<>(3);
77         remoteBuckets.put(a1, b1);
78         remoteBuckets.put(a2, b2);
79         remoteBuckets.put(a3, b3);
80         remoteBuckets.put(localAddress, localBucket);
81
82         //Given remote buckets
83         store.receiveUpdateRemoteBuckets(remoteBuckets);
84
85         //Should NOT contain local bucket
86         //Should contain ONLY 3 entries i.e a1, a2, a3
87         Map<Address, Bucket> remoteBucketsInStore = store.getRemoteBuckets();
88         Assert.assertFalse("remote buckets contains local bucket", remoteBucketsInStore.containsKey(localAddress));
89         Assert.assertTrue(remoteBucketsInStore.size() == 3);
90
91         //Add a new remote bucket
92         Address a4 = new Address("tcp", "system4");
93         Bucket b4 = new BucketImpl();
94         remoteBuckets.clear();
95         remoteBuckets.put(a4, b4);
96         store.receiveUpdateRemoteBuckets(remoteBuckets);
97
98         //Should contain a4
99         //Should contain 4 entries now i.e a1, a2, a3, a4
100         remoteBucketsInStore = store.getRemoteBuckets();
101         Assert.assertTrue("Does not contain a4", remoteBucketsInStore.containsKey(a4));
102         Assert.assertTrue(remoteBucketsInStore.size() == 4);
103
104         //Update a bucket
105         Bucket b3_new = new BucketImpl();
106         remoteBuckets.clear();
107         remoteBuckets.put(a3, b3_new);
108         remoteBuckets.put(a1, null);
109         remoteBuckets.put(a2, null);
110         store.receiveUpdateRemoteBuckets(remoteBuckets);
111
112         //Should only update a3
113         remoteBucketsInStore = store.getRemoteBuckets();
114         Bucket b3_inStore = remoteBucketsInStore.get(a3);
115         Assert.assertEquals(b3_new.getVersion(), b3_inStore.getVersion());
116
117         //Should NOT update a1 and a2
118         Bucket b1_inStore = remoteBucketsInStore.get(a1);
119         Bucket b2_inStore = remoteBucketsInStore.get(a2);
120         Assert.assertEquals(b1.getVersion(), b1_inStore.getVersion());
121         Assert.assertEquals(b2.getVersion(), b2_inStore.getVersion());
122         Assert.assertTrue(remoteBucketsInStore.size() == 4);
123
124         //Should update versions map
125         //versions map contains versions for all remote buckets (4) + local bucket
126         //so it should have total 5.
127         Map<Address, Long> versionsInStore = store.getVersions();
128         Assert.assertTrue(String.format("Expected:%s, Actual:%s", 5, versionsInStore.size()),
129                           versionsInStore.size() == 5);
130         Assert.assertEquals(b1.getVersion(), versionsInStore.get(a1));
131         Assert.assertEquals(b2.getVersion(), versionsInStore.get(a2));
132         Assert.assertEquals(b3_new.getVersion(), versionsInStore.get(a3));
133         Assert.assertEquals(b4.getVersion(), versionsInStore.get(a4));
134
135         //Send older version of bucket
136         remoteBuckets.clear();
137         remoteBuckets.put(a3, b3);
138         store.receiveUpdateRemoteBuckets(remoteBuckets);
139
140         //Should NOT update a3
141         remoteBucketsInStore = store.getRemoteBuckets();
142         b3_inStore = remoteBucketsInStore.get(a3);
143         Assert.assertTrue(b3_inStore.getVersion().longValue() == b3_new.getVersion().longValue());
144
145     }
146
147     /**
148      * Create BucketStore actor and returns the underlying instance of BucketStore class.
149      *
150      * @return instance of BucketStore class
151      */
152     private static BucketStore createStore(){
153         final Props props = Props.create(BucketStore.class);
154         final TestActorRef<BucketStore> testRef = TestActorRef.create(system, props, "testStore");
155         return testRef.underlyingActor();
156     }
157 }