Refactored the HostStore to allow multiple MAC addresses bound to a single port

Change-Id: Icd3b2e483b15486251ac1cca107478a012d1a3e7
diff --git a/core/net/src/test/java/org/onlab/onos/net/host/impl/HostManagerTest.java b/core/net/src/test/java/org/onlab/onos/net/host/impl/HostManagerTest.java
index cbc9cf1..6a058ab 100644
--- a/core/net/src/test/java/org/onlab/onos/net/host/impl/HostManagerTest.java
+++ b/core/net/src/test/java/org/onlab/onos/net/host/impl/HostManagerTest.java
@@ -234,10 +234,10 @@
             new PortAddresses(CP1, Sets.newHashSet(IA1, IA2), MAC1);
 
         mgr.bindAddressesToPort(add1);
-        PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1);
+        Set<PortAddresses> storedAddresses = mgr.getAddressBindingsForPort(CP1);
 
-        assertTrue(add1.ipAddresses().equals(storedAddresses.ipAddresses()));
-        assertTrue(add1.mac().equals(storedAddresses.mac()));
+        assertEquals(1, storedAddresses.size());
+        assertTrue(storedAddresses.contains(add1));
 
         // Add some more addresses and check that they're added correctly
         PortAddresses add2 =
@@ -246,18 +246,19 @@
         mgr.bindAddressesToPort(add2);
         storedAddresses = mgr.getAddressBindingsForPort(CP1);
 
-        assertTrue(storedAddresses.ipAddresses().equals(
-                Sets.newHashSet(IA1, IA2, IA3)));
-        assertTrue(storedAddresses.mac().equals(MAC1));
+        assertEquals(2, storedAddresses.size());
+        assertTrue(storedAddresses.contains(add1));
+        assertTrue(storedAddresses.contains(add2));
 
         PortAddresses add3 = new PortAddresses(CP1, null, MAC2);
 
         mgr.bindAddressesToPort(add3);
         storedAddresses = mgr.getAddressBindingsForPort(CP1);
 
-        assertTrue(storedAddresses.ipAddresses().equals(
-                Sets.newHashSet(IA1, IA2, IA3)));
-        assertTrue(storedAddresses.mac().equals(MAC2));
+        assertEquals(3, storedAddresses.size());
+        assertTrue(storedAddresses.contains(add1));
+        assertTrue(storedAddresses.contains(add2));
+        assertTrue(storedAddresses.contains(add3));
     }
 
     @Test
@@ -266,10 +267,10 @@
             new PortAddresses(CP1, Sets.newHashSet(IA1, IA2), MAC1);
 
         mgr.bindAddressesToPort(add1);
-        PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1);
+        Set<PortAddresses> storedAddresses = mgr.getAddressBindingsForPort(CP1);
 
-        assertTrue(storedAddresses.ipAddresses().size() == 2);
-        assertNotNull(storedAddresses.mac());
+        assertEquals(1, storedAddresses.size());
+        assertTrue(storedAddresses.contains(add1));
 
         PortAddresses rem1 =
             new PortAddresses(CP1, Sets.newHashSet(IA1), null);
@@ -277,25 +278,15 @@
         mgr.unbindAddressesFromPort(rem1);
         storedAddresses = mgr.getAddressBindingsForPort(CP1);
 
-        assertTrue(storedAddresses.ipAddresses().equals(Sets.newHashSet(IA2)));
-        assertTrue(storedAddresses.mac().equals(MAC1));
+        // It shouldn't have been removed because it didn't match the originally
+        // submitted address object
+        assertEquals(1, storedAddresses.size());
+        assertTrue(storedAddresses.contains(add1));
 
-        PortAddresses rem2 = new PortAddresses(CP1, null, MAC1);
-
-        mgr.unbindAddressesFromPort(rem2);
+        mgr.unbindAddressesFromPort(add1);
         storedAddresses = mgr.getAddressBindingsForPort(CP1);
 
-        assertTrue(storedAddresses.ipAddresses().equals(Sets.newHashSet(IA2)));
-        assertNull(storedAddresses.mac());
-
-        PortAddresses rem3 =
-            new PortAddresses(CP1, Sets.newHashSet(IA2), MAC1);
-
-        mgr.unbindAddressesFromPort(rem3);
-        storedAddresses = mgr.getAddressBindingsForPort(CP1);
-
-        assertTrue(storedAddresses.ipAddresses().isEmpty());
-        assertNull(storedAddresses.mac());
+        assertTrue(storedAddresses.isEmpty());
     }
 
     @Test
@@ -304,16 +295,15 @@
             new PortAddresses(CP1, Sets.newHashSet(IA1, IA2), MAC1);
 
         mgr.bindAddressesToPort(add1);
-        PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1);
+        Set<PortAddresses> storedAddresses = mgr.getAddressBindingsForPort(CP1);
 
-        assertTrue(storedAddresses.ipAddresses().size() == 2);
-        assertNotNull(storedAddresses.mac());
+        assertEquals(1, storedAddresses.size());
+        assertTrue(storedAddresses.contains(add1));
 
         mgr.clearAddresses(CP1);
         storedAddresses = mgr.getAddressBindingsForPort(CP1);
 
-        assertTrue(storedAddresses.ipAddresses().isEmpty());
-        assertNull(storedAddresses.mac());
+        assertTrue(storedAddresses.isEmpty());
     }
 
     @Test
@@ -322,12 +312,10 @@
             new PortAddresses(CP1, Sets.newHashSet(IA1, IA2), MAC1);
 
         mgr.bindAddressesToPort(add1);
-        PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1);
+        Set<PortAddresses> storedAddresses = mgr.getAddressBindingsForPort(CP1);
 
-        assertTrue(storedAddresses.connectPoint().equals(CP1));
-        assertTrue(storedAddresses.ipAddresses().equals(
-                        Sets.newHashSet(IA1, IA2)));
-        assertTrue(storedAddresses.mac().equals(MAC1));
+        assertEquals(1, storedAddresses.size());
+        assertTrue(storedAddresses.contains(add1));
     }
 
     @Test
diff --git a/core/net/src/test/java/org/onlab/onos/net/host/impl/HostMonitorTest.java b/core/net/src/test/java/org/onlab/onos/net/host/impl/HostMonitorTest.java
index 654cab1..a8febd7 100644
--- a/core/net/src/test/java/org/onlab/onos/net/host/impl/HostMonitorTest.java
+++ b/core/net/src/test/java/org/onlab/onos/net/host/impl/HostMonitorTest.java
@@ -20,7 +20,9 @@
 import static org.easymock.EasyMock.expectLastCall;
 import static org.easymock.EasyMock.replay;
 import static org.easymock.EasyMock.verify;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -130,7 +132,7 @@
         expect(hostManager.getHostsByIp(TARGET_IP_ADDR))
                 .andReturn(Collections.<Host>emptySet()).anyTimes();
         expect(hostManager.getAddressBindingsForPort(cp))
-                .andReturn(pa).anyTimes();
+                .andReturn(Collections.singleton(pa)).anyTimes();
         replay(hostManager);
 
         TestPacketService packetService = new TestPacketService();
diff --git a/core/net/src/test/java/org/onlab/onos/net/proxyarp/impl/ProxyArpManagerTest.java b/core/net/src/test/java/org/onlab/onos/net/proxyarp/impl/ProxyArpManagerTest.java
index e82151e..8beac4a 100644
--- a/core/net/src/test/java/org/onlab/onos/net/proxyarp/impl/ProxyArpManagerTest.java
+++ b/core/net/src/test/java/org/onlab/onos/net/proxyarp/impl/ProxyArpManagerTest.java
@@ -19,7 +19,10 @@
 import static org.easymock.EasyMock.createMock;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -207,13 +210,18 @@
             IpAddress addr2 = IpAddress.valueOf("10.0." + (2 * i) + ".1");
             InterfaceIpAddress ia1 = new InterfaceIpAddress(addr1, prefix1);
             InterfaceIpAddress ia2 = new InterfaceIpAddress(addr2, prefix2);
-            PortAddresses pa =
-                new PortAddresses(cp, Sets.newHashSet(ia1, ia2),
-                                  MacAddress.valueOf(i));
-            addresses.add(pa);
+            PortAddresses pa1 =
+                new PortAddresses(cp, Sets.newHashSet(ia1),
+                                  MacAddress.valueOf(2 * i - 1));
+            PortAddresses pa2 =
+                    new PortAddresses(cp, Sets.newHashSet(ia2),
+                                      MacAddress.valueOf(2 * i));
+
+            addresses.add(pa1);
+            addresses.add(pa2);
 
             expect(hostService.getAddressBindingsForPort(cp))
-                    .andReturn(pa).anyTimes();
+                    .andReturn(Sets.newHashSet(pa1, pa2)).anyTimes();
         }
 
         expect(hostService.getAddressBindings()).andReturn(addresses).anyTimes();
@@ -222,7 +230,7 @@
             ConnectPoint cp = new ConnectPoint(getDeviceId(i + NUM_ADDRESS_PORTS),
                     P1);
             expect(hostService.getAddressBindingsForPort(cp))
-                    .andReturn(new PortAddresses(cp, null, null)).anyTimes();
+                    .andReturn(Collections.<PortAddresses>emptySet()).anyTimes();
         }
     }
 
@@ -339,7 +347,8 @@
         IpAddress theirIp = IpAddress.valueOf("10.0.1.254");
         IpAddress ourFirstIp = IpAddress.valueOf("10.0.1.1");
         IpAddress ourSecondIp = IpAddress.valueOf("10.0.2.1");
-        MacAddress ourMac = MacAddress.valueOf(1L);
+        MacAddress firstMac = MacAddress.valueOf(1L);
+        MacAddress secondMac = MacAddress.valueOf(2L);
 
         Host requestor = new DefaultHost(PID, HID2, MAC2, VLAN1, LOC1,
                 Collections.singleton(theirIp));
@@ -352,7 +361,7 @@
         proxyArp.reply(arpRequest, LOC1);
 
         assertEquals(1, packetService.packets.size());
-        Ethernet arpReply = buildArp(ARP.OP_REPLY, ourMac, MAC2, ourFirstIp, theirIp);
+        Ethernet arpReply = buildArp(ARP.OP_REPLY, firstMac, MAC2, ourFirstIp, theirIp);
         verifyPacketOut(arpReply, LOC1, packetService.packets.get(0));
 
         // Test a request for the second address on that port
@@ -362,7 +371,7 @@
         proxyArp.reply(arpRequest, LOC1);
 
         assertEquals(1, packetService.packets.size());
-        arpReply = buildArp(ARP.OP_REPLY, ourMac, MAC2, ourSecondIp, theirIp);
+        arpReply = buildArp(ARP.OP_REPLY, secondMac, MAC2, ourSecondIp, theirIp);
         verifyPacketOut(arpReply, LOC1, packetService.packets.get(0));
     }