[SEBA-862] Unit test for SEBA-644 igmpproxy should forward IGMP to BNG on a per pod basis or a per OLT basis

Change-Id: Iec1b99be97f1d916cc640db75ca84eec7bce7cc4
diff --git a/src/test/java/org/opencord/igmpproxy/IgmpManagerTest.java b/src/test/java/org/opencord/igmpproxy/IgmpManagerTest.java
new file mode 100644
index 0000000..62ab4c0
--- /dev/null
+++ b/src/test/java/org/opencord/igmpproxy/IgmpManagerTest.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.opencord.igmpproxy;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ethernet;
+import org.onosproject.core.CoreServiceAdapter;
+import org.onosproject.net.flow.FlowRuleServiceAdapter;
+import org.onosproject.net.flowobjective.FlowObjectiveServiceAdapter;
+
+import static org.junit.Assert.*;
+
+public class IgmpManagerTest extends IgmpManagerBase {
+
+    private static final int WAIT_TIMEOUT = 1000;
+
+    private IgmpManager igmpManager;
+
+    // Set up the IGMP application.
+    @Before
+    public void setUp() {
+        igmpManager = new IgmpManager();
+        igmpManager.coreService = new CoreServiceAdapter();
+        igmpManager.mastershipService = new MockMastershipService();
+        igmpManager.flowObjectiveService = new FlowObjectiveServiceAdapter();
+        igmpManager.deviceService = new MockDeviceService();
+        igmpManager.packetService = new MockPacketService();
+        igmpManager.flowRuleService = new FlowRuleServiceAdapter();
+        igmpManager.multicastService = new TestMulticastRouteService();
+        // By default - we send query messages
+        SingleStateMachine.sendQuery = true;
+    }
+
+    // Tear Down the IGMP application.
+    @After
+    public void tearDown() {
+        igmpManager.deactivate();
+        IgmpManager.groupMemberMap.clear();
+        StateMachine.clearMap();
+    }
+
+    // Checking the Default value of IGMP_ON_POD_BASIS.
+    @Test
+    public void testIsIgmpOnPodBasisDefaultValue() {
+        igmpManager.networkConfig = new TestNetworkConfigRegistry(false);
+        igmpManager.activate();
+        assertFalse(IgmpManager.isIgmpOnPodBasis());
+    }
+
+
+    // Checking the value of IGMP_ON_POD_BASIS.
+    @Test
+    public void testIsIgmpOnPodBasisTrueValue() {
+        igmpManager.networkConfig = new TestNetworkConfigRegistry(true);
+        igmpManager.activate();
+        assertTrue(IgmpManager.isIgmpOnPodBasis());
+    }
+
+    // Testing the flow of packet when isIgmpOnPodBasis value is false.
+    @Test
+    public void testIgmpOnPodBasisDefaultValue() throws InterruptedException {
+        // We need to count join messages sent on the upstream
+        SingleStateMachine.sendQuery = false;
+
+        igmpManager.networkConfig = new TestNetworkConfigRegistry(false);
+        igmpManager.activate();
+
+        Ethernet firstPacket = IgmpSender.getInstance().buildIgmpV3Join(GROUP_IP, SOURCE_IP_OF_A);
+        Ethernet secondPacket = IgmpSender.getInstance().buildIgmpV3Join(GROUP_IP, SOURCE_IP_OF_B);
+        // Sending first packet and here shouldSendjoin flag will be true
+        sendPacket(firstPacket);
+        // Emitted packet is stored in list savedPackets
+        assertNotNull(savedPackets);
+        synchronized (savedPackets) {
+            savedPackets.wait(WAIT_TIMEOUT);
+        }
+        assertNotNull(savedPackets);
+        assertEquals(1, savedPackets.size());
+        // Sending the second packet with same group ip address
+        sendPacket(secondPacket);
+        synchronized (savedPackets) {
+            savedPackets.wait(WAIT_TIMEOUT);
+        }
+        // Emitted packet is stored in list savedPackets as shouldSendJoin flag is true
+        assertEquals(2, savedPackets.size());
+    }
+
+    // Testing IGMP_ON_POD_BASIS value by sending two packets.
+    @Test
+    public void testIgmpOnPodBasisTrueValue() throws InterruptedException {
+        // We need to count join messages
+        SingleStateMachine.sendQuery = false;
+
+        igmpManager.networkConfig = new TestNetworkConfigRegistry(true);
+        igmpManager.activate();
+
+        Ethernet firstPacket = IgmpSender.getInstance().buildIgmpV3Join(GROUP_IP, SOURCE_IP_OF_A);
+        Ethernet secondPacket = IgmpSender.getInstance().buildIgmpV3Join(GROUP_IP, SOURCE_IP_OF_B);
+        // Sending first packet and here shouldSendjoin flag will be true
+        sendPacket(firstPacket);
+        // Emitted packet is stored in list savedPackets
+        synchronized (savedPackets) {
+          savedPackets.wait(WAIT_TIMEOUT);
+        }
+        assertNotNull(savedPackets);
+        assertEquals(1, savedPackets.size());
+        // Sending the second packet with same group ip address which will not be emitted
+        // shouldSendJoin flag will be false.
+        sendPacket(secondPacket);
+        synchronized (savedPackets) {
+            savedPackets.wait(WAIT_TIMEOUT);
+        }
+        assertEquals(1, savedPackets.size());
+    }
+
+}