2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.controller.remote.rpc.registry.gossip;
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;
21 import java.util.HashMap;
24 public class BucketStoreTest {
26 private static ActorSystem system;
27 private static BucketStore store;
30 public static void setup() {
32 system = ActorSystem.create("opendaylight-rpc", ConfigFactory.load().getConfig("unit-test"));
33 system.actorOf(Props.create(TerminationMonitor.class), "termination-monitor");
35 store = createStore();
39 public static void teardown() {
44 * Given a new local bucket
48 public void testReceiveUpdateBucket(){
49 Bucket bucket = new BucketImpl();
50 Long expectedVersion = bucket.getVersion();
52 store.receiveUpdateBucket(bucket);
54 Assert.assertEquals(bucket, store.getLocalBucket());
55 Assert.assertEquals(expectedVersion, store.getLocalBucket().getVersion());
59 * Given remote buckets
60 * Should merge with local copy of remote buckets
63 public void testReceiveUpdateRemoteBuckets(){
65 Address localAddress = system.provider().getDefaultAddress();
66 Bucket localBucket = new BucketImpl();
68 Address a1 = new Address("tcp", "system1");
69 Address a2 = new Address("tcp", "system2");
70 Address a3 = new Address("tcp", "system3");
72 Bucket b1 = new BucketImpl();
73 Bucket b2 = new BucketImpl();
74 Bucket b3 = new BucketImpl();
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);
82 //Given remote buckets
83 store.receiveUpdateRemoteBuckets(remoteBuckets);
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);
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);
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);
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);
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());
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);
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));
135 //Send older version of bucket
136 remoteBuckets.clear();
137 remoteBuckets.put(a3, b3);
138 store.receiveUpdateRemoteBuckets(remoteBuckets);
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());
148 * Create BucketStore actor and returns the underlying instance of BucketStore class.
150 * @return instance of BucketStore class
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();