[SEBA-898] Add unit test cases for SEBA-36

Change-Id: I3b2b5df30b7b9734dee019371bd750f052596555
diff --git a/app/src/main/java/org/opencord/aaa/impl/AaaManager.java b/app/src/main/java/org/opencord/aaa/impl/AaaManager.java
index 1a246f4..015f608 100644
--- a/app/src/main/java/org/opencord/aaa/impl/AaaManager.java
+++ b/app/src/main/java/org/opencord/aaa/impl/AaaManager.java
@@ -144,7 +144,7 @@
 
     protected AuthenticationStatisticsEventPublisher authenticationStatisticsPublisher;
     protected BaseInformationService<SubscriberAndDeviceInformation> subsService;
-    private final DeviceListener deviceListener = new InternalDeviceListener();
+    protected final DeviceListener deviceListener = new InternalDeviceListener();
 
     private static final int DEFAULT_REPEAT_DELAY = 20;
     @Property(name = "statisticsGenerationPeriodInSeconds", intValue = DEFAULT_REPEAT_DELAY,
@@ -578,7 +578,8 @@
                 //pushing machine stats to kafka
                 AaaSupplicantMachineStats machineObj = aaaSupplicantStatsManager.getSupplicantStats(machineStats);
                 aaaSupplicantStatsManager.getMachineStatsDelegate()
-                        .notify(new AaaMachineStatisticsEvent(AaaMachineStatisticsEvent.Type.STATS_UPDATE, machineObj));
+                        .notify(new AaaMachineStatisticsEvent(
+                                AaaMachineStatisticsEvent.Type.STATS_UPDATE, machineObj));
                 break;
             default:
                 log.warn("Unknown RADIUS message received with code: {}", radiusPacket.getCode());
@@ -756,7 +757,8 @@
                     }
                     AaaSupplicantMachineStats obj = aaaSupplicantStatsManager.getSupplicantStats(stateMachine);
                     aaaSupplicantStatsManager.getMachineStatsDelegate()
-                            .notify(new AaaMachineStatisticsEvent(AaaMachineStatisticsEvent.Type.STATS_UPDATE, obj));
+                            .notify(new AaaMachineStatisticsEvent(
+                                    AaaMachineStatisticsEvent.Type.STATS_UPDATE, obj));
                     if (stateMachine.state() == StateMachine.STATE_AUTHORIZED) {
                         stateMachine.logoff();
                         aaaStatisticsManager.getAaaStats().incrementEapolLogoffRx();
@@ -957,41 +959,41 @@
         @Override
         public void event(DeviceEvent event) {
 
-            switch (event.type()) {
-                case PORT_REMOVED:
-                    DeviceId devId = event.subject().id();
-                    PortNumber portNumber = event.port().number();
-                    String sessionId = devId.toString() + portNumber.toString();
+             switch (event.type()) {
+                 case PORT_REMOVED:
+                     DeviceId devId = event.subject().id();
+                     PortNumber portNumber = event.port().number();
+                     String sessionId = devId.toString() + portNumber.toString();
 
-                    log.info("Received PORT_REMOVED event. Clearing AAA Session with Id {}", sessionId);
-                    flushStateMachineSession(sessionId,
-                            StateMachine.SessionTerminationReasons.PORT_REMOVED.getReason());
+                     log.info("Received PORT_REMOVED event. Clearing AAA Session with Id {}", sessionId);
+                     flushStateMachineSession(sessionId,
+                             StateMachine.SessionTerminationReasons.PORT_REMOVED.getReason());
 
-                    break;
+                     break;
 
-                case DEVICE_REMOVED:
-                    DeviceId deviceId = event.subject().id();
-                    log.info("Received DEVICE_REMOVED event for {}", deviceId);
+                 case DEVICE_REMOVED:
+                     DeviceId deviceId = event.subject().id();
+                     log.info("Received DEVICE_REMOVED event for {}", deviceId);
 
-                    Set<String> associatedSessions = Sets.newHashSet();
-                    for (Entry<String, StateMachine> stateMachineEntry : StateMachine.sessionIdMap().entrySet()) {
-                        ConnectPoint cp = stateMachineEntry.getValue().supplicantConnectpoint();
-                        if (cp != null && cp.deviceId().toString().equals(deviceId.toString())) {
-                            associatedSessions.add(stateMachineEntry.getKey());
-                        }
-                    }
+                     Set<String> associatedSessions = Sets.newHashSet();
+                     for (Entry<String, StateMachine> stateMachineEntry : StateMachine.sessionIdMap().entrySet()) {
+                         ConnectPoint cp = stateMachineEntry.getValue().supplicantConnectpoint();
+                         if (cp != null && cp.deviceId().toString().equals(deviceId.toString())) {
+                             associatedSessions.add(stateMachineEntry.getKey());
+                         }
+                     }
 
-                    for (String session : associatedSessions) {
-                        log.info("Clearing AAA Session {} associated with Removed Device", session);
-                        flushStateMachineSession(session,
-                               StateMachine.SessionTerminationReasons.DEVICE_REMOVED.getReason());
-                    }
+                     for (String session : associatedSessions) {
+                         log.info("Clearing AAA Session {} associated with Removed Device", session);
+                         flushStateMachineSession(session,
+                                 StateMachine.SessionTerminationReasons.DEVICE_REMOVED.getReason());
+                     }
 
-                    break;
+                     break;
 
-                default:
-                    return;
-            }
+                 default:
+                     return;
+             }
         }
 
         private void flushStateMachineSession(String sessionId, String terminationReason) {
diff --git a/app/src/test/java/org/opencord/aaa/impl/AaaStatisticsTest.java b/app/src/test/java/org/opencord/aaa/impl/AaaStatisticsTest.java
index 28d789d..3be3f4c 100644
--- a/app/src/test/java/org/opencord/aaa/impl/AaaStatisticsTest.java
+++ b/app/src/test/java/org/opencord/aaa/impl/AaaStatisticsTest.java
@@ -24,6 +24,7 @@
 import org.onlab.packet.DeserializationException;
 import org.onlab.packet.EAP;
 import org.onlab.packet.Ethernet;
+import org.onlab.packet.Ip4Address;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.RADIUS;
 import org.onlab.packet.RADIUSAttribute;
@@ -33,13 +34,26 @@
 import org.onosproject.event.Event;
 import org.onosproject.event.EventDeliveryService;
 import org.onosproject.event.EventSink;
+import org.onosproject.net.AnnotationKeys;
+import org.onosproject.net.Annotations;
+import org.onosproject.net.DefaultAnnotations;
+import org.onosproject.net.DefaultDevice;
+import org.onosproject.net.DefaultPort;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Port;
+import org.onosproject.net.SparseAnnotations;
+import org.onosproject.net.Port.Type;
+import org.onosproject.net.PortNumber;
 import org.onosproject.net.config.Config;
 import org.onosproject.net.config.NetworkConfigRegistryAdapter;
+import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.packet.DefaultInboundPacket;
 import org.onosproject.net.packet.InboundPacket;
 import org.onosproject.net.packet.PacketContext;
 import org.onosproject.net.packet.PacketService;
 import org.opencord.aaa.AaaConfig;
+import org.opencord.aaa.AaaSupplicantMachineStats;
 import org.slf4j.Logger;
 
 import java.lang.reflect.Field;
@@ -50,6 +64,7 @@
 import static com.google.common.base.Preconditions.checkState;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertThat;
 import static org.onosproject.net.NetTestTools.connectPoint;
@@ -553,7 +568,6 @@
 
     }
 
-
     /** Tests the authentication path through the AAA application.
      *  And counts the aaa Stats for timeout.
      *   @throws DeserializationException
@@ -602,6 +616,130 @@
 
     }
 
+
+    /** Tests the authentication path through the AAA application.
+     *  And counts the aaa Stats for logoff transactionXZ.
+     *   @throws DeserializationException
+     *  if packed deserialization fails.
+     */
+    @Test
+    public void testAaaSuplicantStatsForEapolLogOff() throws Exception {
+
+        // (1) Supplicant start up
+        Ethernet startPacket = constructSupplicantStartPacket();
+        sendPacket(startPacket);
+
+        Ethernet responsePacket = (Ethernet) fetchPacket(0);
+        checkRadiusPacket(aaaManager, responsePacket, EAP.ATTR_IDENTITY);
+
+        // (2) Supplicant identify
+
+        Ethernet identifyPacket = constructSupplicantIdentifyPacket(null, EAP.ATTR_IDENTITY, (byte) 1, null);
+        sendPacket(identifyPacket);
+
+        RADIUS radiusIdentifyPacket = (RADIUS) fetchPacket(1);
+        checkRadiusPacketFromSupplicant(radiusIdentifyPacket);
+
+        // State machine should have been created by now
+
+        StateMachine stateMachine = StateMachine.lookupStateMachineBySessionId(SESSION_ID);
+
+        // (3) RADIUS MD5 challenge
+
+        RADIUS radiusCodeAccessChallengePacket = constructRadiusCodeAccessChallengePacket(
+                  RADIUS.RADIUS_CODE_ACCESS_CHALLENGE, EAP.ATTR_MD5);
+        aaaManager.handleRadiusPacket(radiusCodeAccessChallengePacket);
+
+        Ethernet radiusChallengeMD5Packet = (Ethernet) fetchPacket(2);
+        checkRadiusPacket(aaaManager, radiusChallengeMD5Packet, EAP.ATTR_MD5);
+
+        // (4) Supplicant MD5 response
+
+        Ethernet md5RadiusPacket = constructSupplicantIdentifyPacket(stateMachine, EAP.ATTR_MD5,
+           stateMachine.challengeIdentifier(), radiusChallengeMD5Packet);
+        sendPacket(md5RadiusPacket);
+
+        RADIUS responseMd5RadiusPacket = (RADIUS) fetchPacket(3);
+
+        checkRadiusPacketFromSupplicant(responseMd5RadiusPacket);
+
+        // (5) RADIUS Success
+
+        RADIUS successPacket =
+                constructRadiusCodeAccessChallengePacket(RADIUS.RADIUS_CODE_ACCESS_ACCEPT, EAP.SUCCESS);
+        aaaManager.handleRadiusPacket((successPacket));
+        Ethernet supplicantSuccessPacket = (Ethernet) fetchPacket(4);
+
+        checkRadiusPacket(aaaManager, supplicantSuccessPacket, EAP.SUCCESS);
+
+        // Supplicant trigger EAP Logoff
+        Ethernet loggoffPacket = constructSupplicantLogoffPacket();
+        sendPacket(loggoffPacket);
+        AaaSupplicantMachineStats aaaSupplicantObj = aaaSupplicantStatsManager.getSupplicantStats(stateMachine);
+
+        // Check the aaa supplicant stats.
+        assertEquals(aaaSupplicantObj.getSessionTerminateReason(), "SUPPLICANT_LOGOFF");
+        assertEquals(aaaSupplicantObj.getEapolType(), "EAPOL_LOGOFF");
+        assertNotEquals(aaaSupplicantObj.getSessionDuration(), 0);
+        assertEquals(aaaSupplicantObj.getSessionName(), "testuser");
+        assertEquals(aaaSupplicantObj.getSessionId(), SESSION_ID);
+        assertEquals(aaaSupplicantObj.getSrcMacAddress(), serverMac.toString());
+        assertNotEquals(aaaSupplicantObj.getTotalFramesReceived(), 0);
+        assertNotEquals(aaaSupplicantObj.getTotalFramesSent(), 0);
+        assertNotEquals(aaaSupplicantObj.getTotalPacketsRecieved(), 0);
+        assertNotEquals(aaaSupplicantObj.getTotalPacketsSent(), 0);
+    }
+
+
+    @Test
+    public void testAaaSuplicantStatsForPortRemoved() throws Exception {
+
+        // (1) Supplicant start up
+        Ethernet startPacket = constructSupplicantStartPacket();
+        sendPacket(startPacket);
+
+        Ethernet responsePacket = (Ethernet) fetchPacket(0);
+        checkRadiusPacket(aaaManager, responsePacket, EAP.ATTR_IDENTITY);
+
+        // (2) Supplicant identify
+
+        Ethernet identifyPacket = constructSupplicantIdentifyPacket(null, EAP.ATTR_IDENTITY, (byte) 1, null);
+        sendPacket(identifyPacket);
+
+        RADIUS radiusIdentifyPacket = (RADIUS) fetchPacket(1);
+        checkRadiusPacketFromSupplicant(radiusIdentifyPacket);
+
+        // State machine should have been created by now
+        StateMachine stateMachine = StateMachine.lookupStateMachineBySessionId(SESSION_ID);
+
+        // Device configuration
+        DeviceId deviceId = DeviceId.deviceId("of:1");
+        // Source ip address of two different device.
+        Ip4Address sourceIp = Ip4Address.valueOf("10.177.125.4");
+        DefaultAnnotations.Builder annotationsBuilder = DefaultAnnotations.builder()
+                .set(AnnotationKeys.MANAGEMENT_ADDRESS, sourceIp.toString());
+        SparseAnnotations annotations = annotationsBuilder.build();
+        Annotations[] deviceAnnotations = {annotations };
+        Device deviceA = new DefaultDevice(null, deviceId, Device.Type.OTHER, "", "", "", "", null, deviceAnnotations);
+        Port port =
+             new DefaultPort(null, PortNumber.portNumber(1), true, Type.COPPER, DefaultPort.DEFAULT_SPEED, annotations);
+        DeviceEvent deviceEvent = new DeviceEvent(DeviceEvent.Type.PORT_REMOVED, deviceA, port);
+        aaaManager.deviceListener.event(deviceEvent);
+        AaaSupplicantMachineStats aaaSupplicantObj = aaaSupplicantStatsManager.getSupplicantStats(stateMachine);
+
+        // Check the aaa supplicant stats.
+        assertEquals(aaaSupplicantObj.getSessionTerminateReason(), "PORT_REMOVED");
+        assertEquals(aaaSupplicantObj.getEapolType(), "EAPOL_PACKET");
+        assertNotEquals(aaaSupplicantObj.getSessionDuration(), 0);
+        assertEquals(aaaSupplicantObj.getSessionName(), "testuser");
+        assertEquals(aaaSupplicantObj.getSessionId(), SESSION_ID);
+        assertEquals(aaaSupplicantObj.getSrcMacAddress(), serverMac.toString());
+        assertEquals(aaaSupplicantObj.getTotalFramesReceived(), 0);
+        assertEquals(aaaSupplicantObj.getTotalFramesSent(), 0);
+        assertEquals(aaaSupplicantObj.getTotalPacketsRecieved(), 0);
+        assertEquals(aaaSupplicantObj.getTotalPacketsSent(), 0);
+    }
+
     // Calculates the AAA statistics count.
     public void countAaaStatistics() {
         assertThat(aaaStatisticsManager.getAaaStats().getAcceptResponsesRx(), notNullValue());