[SEBA-40, SEBA-942 & SEBA-957] Operational status for IGMP Channel, IGMP Group and Invalid IGMP Packets

Change-Id: I8efb475f69ca5df8f2f4c1daaaba52b8ce8572f7
diff --git a/src/test/java/org/opencord/igmpproxy/IgmpManagerBase.java b/src/test/java/org/opencord/igmpproxy/IgmpManagerBase.java
index 05581ed..4c68b1b 100644
--- a/src/test/java/org/opencord/igmpproxy/IgmpManagerBase.java
+++ b/src/test/java/org/opencord/igmpproxy/IgmpManagerBase.java
@@ -17,6 +17,8 @@
 
 import com.google.common.collect.ImmutableSet;
 import org.onlab.packet.Ethernet;
+import org.onlab.packet.IGMP;
+import org.onlab.packet.IGMPMembership;
 import org.onlab.packet.Ip4Address;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
@@ -61,8 +63,6 @@
 import org.opencord.sadis.BaseInformationService;
 import org.opencord.sadis.SadisService;
 import org.opencord.sadis.SubscriberAndDeviceInformation;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
@@ -84,9 +84,12 @@
     // Device configuration
     protected static final DeviceId DEVICE_ID_OF_A = DeviceId.deviceId("of:1");
     protected static final DeviceId DEVICE_ID_OF_B = DeviceId.deviceId("of:2");
+    protected static final DeviceId DEVICE_ID_OF_C = DeviceId.deviceId("of:00000000000000003");
 
     //Multicast ip address
     protected static final Ip4Address GROUP_IP = Ip4Address.valueOf("224.0.0.0");
+    //Unknown group Ip address
+    protected static final Ip4Address UNKNOWN_GRP_IP = Ip4Address.valueOf("124.0.0.0");
     // Source ip address of two different device.
     protected static final Ip4Address SOURCE_IP_OF_A = Ip4Address.valueOf("10.177.125.4");
     protected static final Ip4Address SOURCE_IP_OF_B = Ip4Address.valueOf("10.177.125.5");
@@ -97,11 +100,13 @@
     // Uplink ports for two olts A and B
     protected static final PortNumber PORT_A = PortNumber.portNumber(1);
     protected static final PortNumber PORT_B = PortNumber.portNumber(2);
+    protected static final PortNumber PORT_C = PortNumber.portNumber(3);
     protected static final PortNumber PORT_NNI = PortNumber.portNumber(65536);
 
     // Connect Point mode for two olts
     protected static final ConnectPoint CONNECT_POINT_A = new ConnectPoint(DEVICE_ID_OF_A, PORT_A);
     protected static final ConnectPoint CONNECT_POINT_B = new ConnectPoint(DEVICE_ID_OF_B, PORT_B);
+    protected static final ConnectPoint CONNECT_POINT_C = new ConnectPoint(DEVICE_ID_OF_C, PORT_C);
 
     protected static final String CLIENT_NAS_PORT_ID = "PON 1/1";
     protected static final String CLIENT_CIRCUIT_ID = "CIR-PON 1/1";
@@ -112,15 +117,19 @@
     private static final String NNI_PREFIX = "nni";
 
     protected List<Port> lsPorts = new ArrayList<Port>();
+    protected List<Device> lsDevices = new ArrayList<Device>();
     // Flag for adding two different devices in oltData
     protected boolean flagForDevice = true;
     PacketContext context;
     // Flag for sending two different packets
     protected boolean flagForPacket = true;
+    // Flag for sending two different packets
+    protected boolean flagForQueryPacket = false;
+    // Flag to check permission
+    boolean flagForPermission = false;
     // List to store the packets emitted
     protected List<OutboundPacket> savedPackets;
     protected PacketProcessor packetProcessor;
-    private Logger log = LoggerFactory.getLogger(getClass());
 
     class MockDeviceService extends DeviceServiceAdapter {
 
@@ -149,6 +158,17 @@
         }
 
         @Override
+        public Iterable<Device> getAvailableDevices() {
+            DefaultAnnotations.Builder annotationsBuilder = DefaultAnnotations.builder()
+                    .set(AnnotationKeys.MANAGEMENT_ADDRESS, SOURCE_IP_OF_A.toString());
+            SparseAnnotations annotations = annotationsBuilder.build();
+            Annotations[] da = {annotations };
+            Device deviceA = new DefaultDevice(null, DEVICE_ID_OF_C, Device.Type.OTHER, "", "", "", "", null, da);
+            lsDevices.add(deviceA);
+            return lsDevices;
+        }
+
+        @Override
         public Port getPort(DeviceId deviceId, PortNumber portNumber) {
             if (portNumber.equals(PORT_NNI)) {
                 DefaultAnnotations.Builder annotationsBuilder = DefaultAnnotations.builder()
@@ -196,7 +216,10 @@
 
         @Override
         public ConnectPoint getSourceDeviceAndPort() {
-              return COMMON_CONNECT_POINT;
+            if (flagForPermission) {
+                return null;
+            }
+            return COMMON_CONNECT_POINT;
         }
 
         @Override
@@ -400,32 +423,32 @@
      * @param reply Ethernet packet
      * @throws InterruptedException
      */
-   void sendPacket(Ethernet reply, boolean isSingleSend) {
+     void sendPacket(Ethernet reply) {
 
-        final ByteBuffer byteBuffer = ByteBuffer.wrap(reply.serialize());
+         if (reply != null) {
+             final ByteBuffer byteBuffer = ByteBuffer.wrap(reply.serialize());
 
-        if (isSingleSend) {
-            InboundPacket inBoundPacket = new DefaultInboundPacket(CONNECT_POINT_B, reply, byteBuffer);
-            context = new TestPacketContext(127L, inBoundPacket, null, false);
+             if (flagForQueryPacket) {
+                 InboundPacket inBoundPacket = new DefaultInboundPacket(CONNECT_POINT_C, reply, byteBuffer);
+                 context = new TestPacketContext(127L, inBoundPacket, null, false);
+                 packetProcessor.process(context);
+             } else {
+                 if (flagForPacket) {
+                     InboundPacket inPacket = new DefaultInboundPacket(CONNECT_POINT_A, reply, byteBuffer);
+                     context = new TestPacketContext(127L, inPacket, null, false);
+                     flagForPacket = false;
 
-            packetProcessor.process(context);
-        } else {
-            if (flagForPacket) {
-                InboundPacket inPacket = new DefaultInboundPacket(CONNECT_POINT_A, reply, byteBuffer);
-                context = new TestPacketContext(127L, inPacket, null, false);
-                flagForPacket = false;
+                     packetProcessor.process(context);
+                 } else {
+                     InboundPacket inBoundPacket = new DefaultInboundPacket(CONNECT_POINT_B, reply, byteBuffer);
+                     context = new TestPacketContext(127L, inBoundPacket, null, false);
+                     flagForPacket = true;
 
-                packetProcessor.process(context);
-            } else {
-                InboundPacket inBoundPacket = new DefaultInboundPacket(CONNECT_POINT_B, reply, byteBuffer);
-                context = new TestPacketContext(127L, inBoundPacket, null, false);
-                flagForPacket = true;
-
-                packetProcessor.process(context);
-            }
-        }
-
-   }
+                     packetProcessor.process(context);
+                 }
+             }
+         }
+    }
 
     protected class MockSadisService implements SadisService {
 
@@ -640,4 +663,20 @@
              return null;
          }
     }
+
+    Ethernet buildWrongIgmpPacket(Ip4Address groupIp, Ip4Address sourceIp) {
+        IGMPMembership igmpMembership = new IGMPMembership(groupIp);
+        igmpMembership.setRecordType((byte) 0x33);
+
+        return IgmpSender.getInstance().buildIgmpPacket(IGMP.TYPE_IGMPV3_MEMBERSHIP_REPORT, groupIp,
+            igmpMembership, sourceIp, false);
+    }
+
+    Ethernet buildUnknownIgmpPacket(Ip4Address groupIp, Ip4Address sourceIp) {
+        IGMPMembership igmpMembership = new IGMPMembership(groupIp);
+        igmpMembership.setRecordType((byte) 0x33);
+
+        return IgmpSender.getInstance().buildIgmpPacket((byte) 0x44, groupIp, igmpMembership, sourceIp, false);
+    }
+
 }