Improve HostLocationProviderTest

Use a list to store all host descriptions we received.
This allows us to create more complicated test scenarios
in which multiple hosts are expected.

Change-Id: I889283413dfd525ff168d52fde99c49e771c7573
diff --git a/providers/host/src/test/java/org/onosproject/provider/host/impl/HostLocationProviderTest.java b/providers/host/src/test/java/org/onosproject/provider/host/impl/HostLocationProviderTest.java
index 3a780cf..acf0a13 100644
--- a/providers/host/src/test/java/org/onosproject/provider/host/impl/HostLocationProviderTest.java
+++ b/providers/host/src/test/java/org/onosproject/provider/host/impl/HostLocationProviderTest.java
@@ -16,6 +16,8 @@
 package org.onosproject.provider.host.impl;
 
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.MoreExecutors;
 
 import org.junit.After;
@@ -73,6 +75,7 @@
 import java.util.Collections;
 import java.util.Dictionary;
 import java.util.Hashtable;
+import java.util.List;
 import java.util.Set;
 
 import static org.easymock.EasyMock.*;
@@ -187,33 +190,39 @@
 
     @Test
     public void events() {
-        // new host
+        // New host. Expect one additional host description.
         testProcessor.process(new TestArpPacketContext(DEV1));
-        assertNotNull("new host expected", providerService.added);
-        assertNull("host motion unexpected", providerService.moved);
+        assertThat("New host expected", providerService.descriptions.size(), is(1));
 
-        // the host moved to new switch
+        // The host moved to new switch. Expect one additional host description.
+        // The second host description should have a different location.
         testProcessor.process(new TestArpPacketContext(DEV2));
-        assertNotNull("host motion expected", providerService.moved);
+        assertThat("Host motion expected", providerService.descriptions.size(), is(2));
+        HostLocation loc1 = providerService.descriptions.get(0).location();
+        HostLocation loc2 = providerService.descriptions.get(1).location();
+        assertNotEquals("Host location should be different", loc1, loc2);
 
-        // the host was misheard on a spine
+        // The host was misheard on a spine. Expect no additional host description.
         testProcessor.process(new TestArpPacketContext(DEV3));
-        assertNull("host misheard on spine switch", providerService.spine);
+        assertThat("Host misheard on spine switch", providerService.descriptions.size(), is(2));
 
         providerService.clear();
 
-        // new host
+        // New host. Expect one additional host description.
         testProcessor.process(new TestNaPacketContext(DEV4));
-        assertNotNull("new host expected", providerService.added);
-        assertNull("host motion unexpected", providerService.moved);
+        assertThat("New host expected", providerService.descriptions.size(), is(1));
 
-        // the host moved to new switch
+        // The host moved to new switch. Expect one additional host description.
+        // The second host description should have a different location.
         testProcessor.process(new TestNaPacketContext(DEV5));
-        assertNotNull("host motion expected", providerService.moved);
+        assertThat("Host motion expected", providerService.descriptions.size(), is(2));
+        loc1 = providerService.descriptions.get(0).location();
+        loc2 = providerService.descriptions.get(1).location();
+        assertNotEquals("Host location should be different", loc1, loc2);
 
-        // the host was misheard on a spine
+        // The host was misheard on a spine. Expect no additional host description.
         testProcessor.process(new TestNaPacketContext(DEV6));
-        assertNull("host misheard on spine switch", providerService.spine);
+        assertThat("Host misheard on spine switch", providerService.descriptions.size(), is(2));
     }
 
     @Test
@@ -275,7 +284,9 @@
     @Test
     public void testReceiveArp() {
         testProcessor.process(new TestArpPacketContext(DEV1));
-        HostDescription descr = providerService.added;
+        assertThat("testReceiveArp. One host description expected",
+                providerService.descriptions.size(), is(1));
+        HostDescription descr = providerService.descriptions.get(0);
         assertThat(descr.location(), is(LOCATION));
         assertThat(descr.hwAddress(), is(MAC));
         assertThat(descr.ipAddress().toArray()[0], is(IP_ADDRESS));
@@ -288,7 +299,9 @@
     @Test
     public void testReceiveIpv4() {
         testProcessor.process(new TestIpv4PacketContext(DEV1));
-        HostDescription descr = providerService.added;
+        assertThat("testReceiveIpv4. One host description expected",
+                providerService.descriptions.size(), is(1));
+        HostDescription descr = providerService.descriptions.get(0);
         assertThat(descr.location(), is(LOCATION));
         assertThat(descr.hwAddress(), is(MAC));
         assertThat(descr.ipAddress().size(), is(0));
@@ -301,8 +314,9 @@
     @Test
     public void testReceiveNa() {
         testProcessor.process(new TestNaPacketContext(DEV4));
-        assertNotNull(providerService.added);
-        HostDescription descr = providerService.added;
+        assertThat("testReceiveNa. One host description expected",
+                providerService.descriptions.size(), is(1));
+        HostDescription descr = providerService.descriptions.get(0);
         assertThat(descr.location(), is(LOCATION2));
         assertThat(descr.hwAddress(), is(MAC2));
         assertThat(descr.ipAddress().toArray()[0], is(IP_ADDRESS2));
@@ -315,7 +329,9 @@
     @Test
     public void testReceiveNs() {
         testProcessor.process(new TestNsPacketContext(DEV4));
-        HostDescription descr = providerService.added;
+        assertThat("testReceiveNs. One host description expected",
+                providerService.descriptions.size(), is(1));
+        HostDescription descr = providerService.descriptions.get(0);
         assertThat(descr.location(), is(LOCATION2));
         assertThat(descr.hwAddress(), is(MAC2));
         assertThat(descr.ipAddress().toArray()[0], is(IP_ADDRESS2));
@@ -328,7 +344,8 @@
     @Test
     public void testReceivesRa() {
         testProcessor.process(new TestRAPacketContext(DEV4));
-        assertNull(providerService.added);
+        assertThat("testReceiveRa. No host description expected",
+                providerService.descriptions.size(), is(0));
     }
 
     /**
@@ -337,7 +354,8 @@
     @Test
     public void testReceiveRs() {
         testProcessor.process(new TestRSPacketContext(DEV4));
-        assertNull(providerService.added);
+        assertThat("testReceiveRs. No host description expected",
+                providerService.descriptions.size(), is(0));
     }
 
     /**
@@ -346,7 +364,8 @@
     @Test
     public void testReceiveDad() {
         testProcessor.process(new TestDadPacketContext(DEV4));
-        assertNull(providerService.added);
+        assertThat("testReceiveDad. No host description expected",
+                providerService.descriptions.size(), is(0));
     }
 
     /**
@@ -355,7 +374,8 @@
     @Test
     public void testReceiveIpv6Multicast() {
         testProcessor.process(new TestIpv6McastPacketContext(DEV4));
-        assertNull(providerService.added);
+        assertThat("testReceiveIpv6Multicast. No host description expected",
+                providerService.descriptions.size(), is(0));
     }
 
     /**
@@ -364,8 +384,9 @@
     @Test
     public void testReceiveIpv6Unicast() {
         testProcessor.process(new TestIpv6PacketContext(DEV4));
-        assertNotNull(providerService.added);
-        HostDescription descr = providerService.added;
+        assertThat("testReceiveIpv6Unicast. One host description expected",
+                providerService.descriptions.size(), is(1));
+        HostDescription descr = providerService.descriptions.get(0);
         assertThat(descr.location(), is(LOCATION2));
         assertThat(descr.hwAddress(), is(MAC2));
         assertThat(descr.ipAddress().size(), is(0));
@@ -402,15 +423,11 @@
             extends AbstractProviderService<HostProvider>
             implements HostProviderService {
 
-        HostDescription added = null;
-        HostDescription moved = null;
-        HostDescription spine = null;
-        public int removeCount;
+        List<HostDescription> descriptions = Lists.newArrayList();
+        int removeCount;
 
         public void clear() {
-            added = null;
-            moved = null;
-            spine = null;
+            descriptions.clear();
             removeCount = 0;
         }
 
@@ -420,13 +437,7 @@
 
         @Override
         public void hostDetected(HostId hostId, HostDescription hostDescription, boolean replaceIps) {
-            if (added == null) {
-                added = hostDescription;
-            } else if ((moved == null) && hostDescription != added) {
-                moved = hostDescription;
-            } else {
-                spine = hostDescription;
-            }
+            descriptions.add(hostDescription);
         }
 
         @Override