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 java.util.HashMap;
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.RemoteRpcProviderConfig;
22 import org.opendaylight.controller.remote.rpc.TerminationMonitor;
24 public class BucketStoreTest {
27 * Dummy class to eliminate rawtype warnings.
32 private static class T implements Copier<T> {
39 private static ActorSystem system;
42 public static void setup() {
44 system = ActorSystem.create("opendaylight-rpc", ConfigFactory.load().getConfig("unit-test"));
45 system.actorOf(Props.create(TerminationMonitor.class), "termination-monitor");
49 public static void teardown() {
54 * Given remote buckets
55 * Should merge with local copy of remote buckets
58 public void testReceiveUpdateRemoteBuckets(){
60 BucketStore<T> store = createStore();
62 Address localAddress = system.provider().getDefaultAddress();
63 Bucket<T> localBucket = new BucketImpl<>();
65 Address a1 = new Address("tcp", "system1");
66 Address a2 = new Address("tcp", "system2");
67 Address a3 = new Address("tcp", "system3");
69 Bucket<T> b1 = new BucketImpl<>();
70 Bucket<T> b2 = new BucketImpl<>();
71 Bucket<T> b3 = new BucketImpl<>();
73 Map<Address, Bucket<T>> remoteBuckets = new HashMap<>(3);
74 remoteBuckets.put(a1, b1);
75 remoteBuckets.put(a2, b2);
76 remoteBuckets.put(a3, b3);
77 remoteBuckets.put(localAddress, localBucket);
79 //Given remote buckets
80 store.receiveUpdateRemoteBuckets(remoteBuckets);
82 //Should NOT contain local bucket
83 //Should contain ONLY 3 entries i.e a1, a2, a3
84 Map<Address, Bucket<T>> remoteBucketsInStore = store.getRemoteBuckets();
85 Assert.assertFalse("remote buckets contains local bucket", remoteBucketsInStore.containsKey(localAddress));
86 Assert.assertTrue(remoteBucketsInStore.size() == 3);
88 //Add a new remote bucket
89 Address a4 = new Address("tcp", "system4");
90 Bucket<T> b4 = new BucketImpl<>();
91 remoteBuckets.clear();
92 remoteBuckets.put(a4, b4);
93 store.receiveUpdateRemoteBuckets(remoteBuckets);
96 //Should contain 4 entries now i.e a1, a2, a3, a4
97 remoteBucketsInStore = store.getRemoteBuckets();
98 Assert.assertTrue("Does not contain a4", remoteBucketsInStore.containsKey(a4));
99 Assert.assertTrue(remoteBucketsInStore.size() == 4);
102 Bucket<T> b3_new = new BucketImpl<>();
103 remoteBuckets.clear();
104 remoteBuckets.put(a3, b3_new);
105 remoteBuckets.put(a1, null);
106 remoteBuckets.put(a2, null);
107 store.receiveUpdateRemoteBuckets(remoteBuckets);
109 //Should only update a3
110 remoteBucketsInStore = store.getRemoteBuckets();
111 Bucket<T> b3_inStore = remoteBucketsInStore.get(a3);
112 Assert.assertEquals(b3_new.getVersion(), b3_inStore.getVersion());
114 //Should NOT update a1 and a2
115 Bucket<T> b1_inStore = remoteBucketsInStore.get(a1);
116 Bucket<T> b2_inStore = remoteBucketsInStore.get(a2);
117 Assert.assertEquals(b1.getVersion(), b1_inStore.getVersion());
118 Assert.assertEquals(b2.getVersion(), b2_inStore.getVersion());
119 Assert.assertTrue(remoteBucketsInStore.size() == 4);
121 //Should update versions map
122 //versions map contains versions for all remote buckets (4).
123 Map<Address, Long> versionsInStore = store.getVersions();
124 Assert.assertEquals(4, versionsInStore.size());
125 Assert.assertEquals(b1.getVersion(), versionsInStore.get(a1));
126 Assert.assertEquals(b2.getVersion(), versionsInStore.get(a2));
127 Assert.assertEquals(b3_new.getVersion(), versionsInStore.get(a3));
128 Assert.assertEquals(b4.getVersion(), versionsInStore.get(a4));
130 //Send older version of bucket
131 remoteBuckets.clear();
132 remoteBuckets.put(a3, b3);
133 store.receiveUpdateRemoteBuckets(remoteBuckets);
135 //Should NOT update a3
136 remoteBucketsInStore = store.getRemoteBuckets();
137 b3_inStore = remoteBucketsInStore.get(a3);
138 Assert.assertTrue(b3_inStore.getVersion().longValue() == b3_new.getVersion().longValue());
143 * Create BucketStore actor and returns the underlying instance of BucketStore class.
145 * @return instance of BucketStore class
147 private static BucketStore<T> createStore(){
148 final Props props = Props.create(BucketStore.class, new RemoteRpcProviderConfig(system.settings().config()));
149 final TestActorRef<BucketStore<T>> testRef = TestActorRef.create(system, props, "testStore");
150 return testRef.underlyingActor();