+ public void testReceiveUpdateRemoteBuckets() {
+
+ final BucketStore<T> store = createStore();
+
+ Address localAddress = system.provider().getDefaultAddress();
+ Bucket<T> localBucket = new BucketImpl<>(new T());
+
+ Address a1 = new Address("tcp", "system1");
+ Address a2 = new Address("tcp", "system2");
+ Address a3 = new Address("tcp", "system3");
+
+ Bucket<T> b1 = new BucketImpl<>(new T());
+ Bucket<T> b2 = new BucketImpl<>(new T());
+ Bucket<T> b3 = new BucketImpl<>(new T());
+
+ Map<Address, Bucket<T>> remoteBuckets = new HashMap<>(3);
+ remoteBuckets.put(a1, b1);
+ remoteBuckets.put(a2, b2);
+ remoteBuckets.put(a3, b3);
+ remoteBuckets.put(localAddress, localBucket);
+
+ //Given remote buckets
+ store.receiveUpdateRemoteBuckets(remoteBuckets);
+
+ //Should NOT contain local bucket
+ //Should contain ONLY 3 entries i.e a1, a2, a3
+ Map<Address, Bucket<T>> remoteBucketsInStore = store.getRemoteBuckets();
+ Assert.assertFalse("remote buckets contains local bucket", remoteBucketsInStore.containsKey(localAddress));
+ Assert.assertTrue(remoteBucketsInStore.size() == 3);
+
+ //Add a new remote bucket
+ Address a4 = new Address("tcp", "system4");
+ Bucket<T> b4 = new BucketImpl<>(new T());
+ remoteBuckets.clear();
+ remoteBuckets.put(a4, b4);
+ store.receiveUpdateRemoteBuckets(remoteBuckets);
+
+ //Should contain a4
+ //Should contain 4 entries now i.e a1, a2, a3, a4
+ remoteBucketsInStore = store.getRemoteBuckets();
+ Assert.assertTrue("Does not contain a4", remoteBucketsInStore.containsKey(a4));
+ Assert.assertTrue(remoteBucketsInStore.size() == 4);
+
+ //Update a bucket
+ Bucket<T> b3New = new BucketImpl<>(new T());
+ remoteBuckets.clear();
+ remoteBuckets.put(a3, b3New);
+ remoteBuckets.put(a1, null);
+ remoteBuckets.put(a2, null);
+ store.receiveUpdateRemoteBuckets(remoteBuckets);
+
+ //Should only update a3
+ remoteBucketsInStore = store.getRemoteBuckets();
+ Bucket<T> b3InStore = remoteBucketsInStore.get(a3);
+ Assert.assertEquals(b3New.getVersion(), b3InStore.getVersion());
+
+ //Should NOT update a1 and a2
+ Bucket<T> b1InStore = remoteBucketsInStore.get(a1);
+ Bucket<T> b2InStore = remoteBucketsInStore.get(a2);
+ Assert.assertEquals(b1.getVersion(), b1InStore.getVersion());
+ Assert.assertEquals(b2.getVersion(), b2InStore.getVersion());
+ Assert.assertTrue(remoteBucketsInStore.size() == 4);
+
+ //Should update versions map
+ //versions map contains versions for all remote buckets (4).
+ Map<Address, Long> versionsInStore = store.getVersions();
+ Assert.assertEquals(4, versionsInStore.size());
+ Assert.assertEquals((Long)b1.getVersion(), versionsInStore.get(a1));
+ Assert.assertEquals((Long)b2.getVersion(), versionsInStore.get(a2));
+ Assert.assertEquals((Long)b3New.getVersion(), versionsInStore.get(a3));
+ Assert.assertEquals((Long)b4.getVersion(), versionsInStore.get(a4));
+
+ //Send older version of bucket
+ remoteBuckets.clear();
+ remoteBuckets.put(a3, b3);
+ store.receiveUpdateRemoteBuckets(remoteBuckets);
+
+ //Should NOT update a3
+ remoteBucketsInStore = store.getRemoteBuckets();
+ b3InStore = remoteBucketsInStore.get(a3);
+ Assert.assertEquals(b3InStore.getVersion(), b3New.getVersion());