Changed ProxyArpManager to make use of EdgeManager.

Change-Id: I05193146490aba6736c1815bf0d9022df8628973
diff --git a/core/net/src/test/java/org/onosproject/net/proxyarp/impl/ProxyArpManagerTest.java b/core/net/src/test/java/org/onosproject/net/proxyarp/impl/ProxyArpManagerTest.java
index c79d44c..4a1c446 100644
--- a/core/net/src/test/java/org/onosproject/net/proxyarp/impl/ProxyArpManagerTest.java
+++ b/core/net/src/test/java/org/onosproject/net/proxyarp/impl/ProxyArpManagerTest.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.net.proxyarp.impl;
 
+import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import org.junit.Before;
 import org.junit.Test;
@@ -36,6 +37,7 @@
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.edgeservice.impl.EdgeManager;
 import org.onosproject.net.flow.instructions.Instruction;
 import org.onosproject.net.flow.instructions.Instructions.OutputInstruction;
 import org.onosproject.net.host.HostService;
@@ -53,8 +55,14 @@
 import java.util.List;
 import java.util.Set;
 
-import static org.easymock.EasyMock.*;
-import static org.junit.Assert.*;
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 /**
  * Tests for the {@link ProxyArpManager} class.
@@ -85,6 +93,11 @@
     private static final HostLocation LOC2 = new HostLocation(DID2, P1, 123L);
     private static final byte[] ZERO_MAC_ADDRESS = MacAddress.ZERO.toBytes();
 
+    //Return values used for various functions of the TestPacketService inner class.
+    private boolean isEdgePointReturn;
+    private List<ConnectPoint> getEdgePointsNoArg;
+
+
     private ProxyArpManager proxyArp;
 
     private TestPacketService packetService;
@@ -98,6 +111,8 @@
         packetService = new TestPacketService();
         proxyArp.packetService = packetService;
 
+        proxyArp.edgeService = new TestEdgePortService();
+
         // Create a host service mock here. Must be replayed by tests once the
         // expectations have been set up
         hostService = createMock(HostService.class);
@@ -112,7 +127,7 @@
 
     /**
      * Creates a fake topology to feed into the ARP module.
-     * <p/>
+     * <p>
      * The default topology is a unidirectional ring topology. Each switch has
      * 3 ports. Ports 2 and 3 have the links to neighbor switches, and port 1
      * is free (edge port).
@@ -205,12 +220,12 @@
             InterfaceIpAddress ia2 = new InterfaceIpAddress(addr2, prefix2);
             PortAddresses pa1 =
                     new PortAddresses(cp, Sets.newHashSet(ia1),
-                                      MacAddress.valueOf(2 * i - 1),
-                                      VlanId.vlanId((short) 1));
+                            MacAddress.valueOf(2 * i - 1),
+                            VlanId.vlanId((short) 1));
             PortAddresses pa2 =
                     new PortAddresses(cp, Sets.newHashSet(ia2),
-                                      MacAddress.valueOf(2 * i),
-                                      VlanId.NONE);
+                            MacAddress.valueOf(2 * i),
+                            VlanId.NONE);
 
             addresses.add(pa1);
             addresses.add(pa2);
@@ -223,7 +238,7 @@
 
         for (int i = 1; i <= NUM_FLOOD_PORTS; i++) {
             ConnectPoint cp = new ConnectPoint(getDeviceId(i + NUM_ADDRESS_PORTS),
-                                               P1);
+                    P1);
             expect(hostService.getAddressBindingsForPort(cp))
                     .andReturn(Collections.<PortAddresses>emptySet()).anyTimes();
         }
@@ -266,11 +281,14 @@
      */
     @Test
     public void testReplyKnown() {
+        //Set the return value of isEdgePoint from the edgemanager.
+        isEdgePointReturn = true;
+
         Host replyer = new DefaultHost(PID, HID1, MAC1, VLAN1, getLocation(4),
-                                       Collections.singleton(IP1));
+                Collections.singleton(IP1));
 
         Host requestor = new DefaultHost(PID, HID2, MAC2, VLAN1, getLocation(5),
-                                         Collections.singleton(IP2));
+                Collections.singleton(IP2));
 
         expect(hostService.getHostsByIp(IP1))
                 .andReturn(Collections.singleton(replyer));
@@ -294,17 +312,25 @@
      */
     @Test
     public void testReplyUnknown() {
+        isEdgePointReturn = true;
+
         Host requestor = new DefaultHost(PID, HID2, MAC2, VLAN1, getLocation(5),
-                                         Collections.singleton(IP2));
+                Collections.singleton(IP2));
 
         expect(hostService.getHostsByIp(IP1))
                 .andReturn(Collections.<Host>emptySet());
         expect(hostService.getHost(HID2)).andReturn(requestor);
 
+
         replay(hostService);
 
         Ethernet arpRequest = buildArp(ARP.OP_REQUEST, MAC2, null, IP2, IP1);
 
+        //Setup the set of edge ports to be used in the reply method
+        getEdgePointsNoArg = Lists.newLinkedList();
+        getEdgePointsNoArg.add(new ConnectPoint(DeviceId.deviceId("5"), PortNumber.portNumber(1)));
+        getEdgePointsNoArg.add(new ConnectPoint(DeviceId.deviceId("4"), PortNumber.portNumber(1)));
+
         proxyArp.reply(arpRequest, getLocation(6));
 
         verifyFlood(arpRequest);
@@ -318,11 +344,12 @@
      */
     @Test
     public void testReplyDifferentVlan() {
+
         Host replyer = new DefaultHost(PID, HID1, MAC1, VLAN2, getLocation(4),
-                                       Collections.singleton(IP1));
+                Collections.singleton(IP1));
 
         Host requestor = new DefaultHost(PID, HID2, MAC2, VLAN1, getLocation(5),
-                                         Collections.singleton(IP2));
+                Collections.singleton(IP2));
 
         expect(hostService.getHostsByIp(IP1))
                 .andReturn(Collections.singleton(replyer));
@@ -332,6 +359,10 @@
 
         Ethernet arpRequest = buildArp(ARP.OP_REQUEST, MAC2, null, IP2, IP1);
 
+        //Setup for flood test
+        getEdgePointsNoArg = Lists.newLinkedList();
+        getEdgePointsNoArg.add(new ConnectPoint(DeviceId.deviceId("5"), PortNumber.portNumber(1)));
+        getEdgePointsNoArg.add(new ConnectPoint(DeviceId.deviceId("4"), PortNumber.portNumber(1)));
         proxyArp.reply(arpRequest, getLocation(6));
 
         verifyFlood(arpRequest);
@@ -346,13 +377,13 @@
         MacAddress secondMac = MacAddress.valueOf(2L);
 
         Host requestor = new DefaultHost(PID, HID2, MAC2, VLAN1, LOC1,
-                                         Collections.singleton(theirIp));
+                Collections.singleton(theirIp));
 
         expect(hostService.getHost(HID2)).andReturn(requestor);
         replay(hostService);
 
         Ethernet arpRequest = buildArp(ARP.OP_REQUEST, MAC2, null, theirIp, ourFirstIp);
-
+        isEdgePointReturn = true;
         proxyArp.reply(arpRequest, LOC1);
 
         assertEquals(1, packetService.packets.size());
@@ -378,7 +409,7 @@
 
         // Request for a valid external IP address but coming in the wrong port
         Ethernet arpRequest = buildArp(ARP.OP_REQUEST, MAC1, null, theirIp,
-                                       Ip4Address.valueOf("10.0.3.1"));
+                Ip4Address.valueOf("10.0.3.1"));
         proxyArp.reply(arpRequest, LOC1);
         assertEquals(0, packetService.packets.size());
 
@@ -402,8 +433,10 @@
         // This is a request from something inside our network (like a BGP
         // daemon) to an external host.
         Ethernet arpRequest = buildArp(ARP.OP_REQUEST, ourMac, null, ourIp, theirIp);
-        proxyArp.reply(arpRequest, getLocation(5));
+        //Ensure the packet is allowed through (it is not to an internal port)
+        isEdgePointReturn = true;
 
+        proxyArp.reply(arpRequest, getLocation(5));
         assertEquals(1, packetService.packets.size());
         verifyPacketOut(arpRequest, getLocation(1), packetService.packets.get(0));
 
@@ -421,7 +454,7 @@
     @Test
     public void testForwardToHost() {
         Host host1 = new DefaultHost(PID, HID1, MAC1, VLAN1, LOC1,
-                                     Collections.singleton(IP1));
+                Collections.singleton(IP1));
 
         expect(hostService.getHost(HID1)).andReturn(host1);
         replay(hostService);
@@ -448,6 +481,13 @@
 
         Ethernet arpRequest = buildArp(ARP.OP_REPLY, MAC2, MAC1, IP2, IP1);
 
+        //populate the list of edges when so that when forward hits flood in the manager it contains the values
+        //that should continue on
+        getEdgePointsNoArg = Lists.newLinkedList();
+        getEdgePointsNoArg.add(new ConnectPoint(DeviceId.deviceId("3"), PortNumber.portNumber(1)));
+        getEdgePointsNoArg.add(new ConnectPoint(DeviceId.deviceId("5"), PortNumber.portNumber(1)));
+        getEdgePointsNoArg.add(new ConnectPoint(DeviceId.deviceId("4"), PortNumber.portNumber(1)));
+
         proxyArp.forward(arpRequest, getLocation(6));
 
         verifyFlood(arpRequest);
@@ -464,17 +504,17 @@
         assertEquals(NUM_FLOOD_PORTS - 1, packetService.packets.size());
 
         Collections.sort(packetService.packets,
-                         new Comparator<OutboundPacket>() {
-                             @Override
-                             public int compare(OutboundPacket o1, OutboundPacket o2) {
-                                 return o1.sendThrough().uri().compareTo(o2.sendThrough().uri());
-                             }
-                         });
+                new Comparator<OutboundPacket>() {
+                    @Override
+                    public int compare(OutboundPacket o1, OutboundPacket o2) {
+                        return o1.sendThrough().uri().compareTo(o2.sendThrough().uri());
+                    }
+                });
 
 
         for (int i = 0; i < NUM_FLOOD_PORTS - 1; i++) {
             ConnectPoint cp = new ConnectPoint(getDeviceId(NUM_ADDRESS_PORTS + i + 1),
-                                               PortNumber.portNumber(1));
+                    PortNumber.portNumber(1));
 
             OutboundPacket outboundPacket = packetService.packets.get(i);
             verifyPacketOut(packet, cp, outboundPacket);
@@ -572,4 +612,17 @@
         }
 
     }
+
+    class TestEdgePortService extends EdgeManager {
+
+        @Override
+        public boolean isEdgePoint(ConnectPoint connectPoint) {
+            return isEdgePointReturn;
+        }
+
+        @Override
+        public Iterable<ConnectPoint> getEdgePoints() {
+            return getEdgePointsNoArg;
+        }
+    }
 }