Initial import of CFM and SOAM api

Change-Id: Icf5cc2d5fb34b75460e80e8cced0d70265bcd33b
diff --git a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java
index 2908d53..fe99bf3 100644
--- a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java
@@ -26,18 +26,42 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.onlab.packet.Ip4Address;
+import org.onosproject.drivers.microsemi.yang.MseaCfmNetconfService.DmEntryParts;
 import org.onosproject.drivers.microsemi.yang.impl.MseaCfmManager;
+import org.onosproject.drivers.microsemi.yang.utils.MepIdUtil;
+import org.onosproject.drivers.microsemi.yang.utils.MepIdUtil2;
+import org.onosproject.drivers.microsemi.yang.utils.MepIdUtil3;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdCharStr;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdCharStr;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MepId;
+import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
+import org.onosproject.incubator.net.l2monitoring.soam.SoamId;
 import org.onosproject.netconf.NetconfDeviceInfo;
 import org.onosproject.netconf.NetconfException;
 import org.onosproject.netconf.NetconfSession;
+import org.onosproject.yang.gen.v1.ietfyangtypes.rev20130715.ietfyangtypes.MacAddress;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.MseaCfm;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.DefaultMefCfm;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.MefCfm;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.abortloopback.AbortLoopbackInput;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.abortloopback.DefaultAbortLoopbackInput;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.DefaultMaintenanceDomain;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.MaintenanceDomain;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.maintenanceassociation.MaintenanceAssociationEndPoint;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.mdnameandtypecombo.DefaultNameCharacterString;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.mdnameandtypecombo.NameCharacterString;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.targetaddressgroup.AddressType;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.targetaddressgroup.addresstype.DefaultMacAddress;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.targetaddressgroup.addresstype.DefaultMepId;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitloopback.DefaultTransmitLoopbackInput;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitloopback.TransmitLoopbackInput;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitloopback.transmitloopbackinput.DefaultTargetAddress;
+import org.onosproject.yang.gen.v1.mseasoampm.rev20160229.mseasoampm.mefcfm.maintenancedomain.maintenanceassociation.maintenanceassociationendpoint.augmentedmseacfmmaintenanceassociationendpoint.delaymeasurements.DelayMeasurement;
+import org.onosproject.yang.gen.v1.mseasoampm.rev20160229.mseasoampm.mefcfm.maintenancedomain.maintenanceassociation.maintenanceassociationendpoint.augmentedmseacfmmaintenanceassociationendpoint.lossmeasurements.lossmeasurement.MessagePeriodEnum;
+import org.onosproject.yang.gen.v1.mseasoampm.rev20160229.mseasoampm.sessionstatustype.SessionStatusTypeEnum;
 import org.onosproject.yang.gen.v1.mseatypes.rev20160229.mseatypes.Identifier45;
+import org.onosproject.yang.gen.v1.mseatypes.rev20160229.mseatypes.MepIdType;
+import org.onosproject.yang.gen.v1.mseatypes.rev20160229.mseatypes.PriorityType;
 
 public class MseaCfmManagerTest {
 
@@ -52,7 +76,8 @@
         } catch (UncheckedIOException e) {
             fail(e.getMessage());
         }
-        NetconfDeviceInfo deviceInfo = new NetconfDeviceInfo("netconf", "netconf", Ip4Address.valueOf("1.2.3.4"), 830);
+        NetconfDeviceInfo deviceInfo = new NetconfDeviceInfo("netconf", "netconf",
+                Ip4Address.valueOf("1.2.3.4"), 830);
         session = new MockNetconfSessionEa1000(deviceInfo);
     }
 
@@ -61,13 +86,92 @@
     }
 
     @Test
-    public void testGetConfigMseaCfmEssentials() throws NetconfException {
-        MseaCfm mseaCfm = mseaCfmService.getMepEssentials("md-1", "ma-1-1", 1, session);
+    public void testGetConfigMseaCfmEssentials()
+            throws NetconfException, CfmConfigException {
+        MseaCfm mseaCfm = mseaCfmService.getMepEssentials(
+                MdIdCharStr.asMdId("md-1"),
+                MaIdCharStr.asMaId("ma-1-1"),
+                MepId.valueOf((short) 1), session);
         assertNotNull(mseaCfm);
 
-        //See SAMPLE_MSEACFM_MD_MA_MEP_REPLY in MockNetconfSessionEa1000
+        //See SAMPLE_MSEACFM_MD_MA_MEP_ESSENTIALS_REPLY in MockNetconfSessionEa1000
         assertEquals(1, mseaCfm.mefCfm().maintenanceDomain().size());
-        assertEquals(2, mseaCfm.mefCfm().maintenanceDomain().get(0).mdLevel().uint8());
+    }
+
+    @Test
+    public void testGetConfigMseaCfmFull()
+            throws NetconfException, CfmConfigException {
+        MseaCfm mseaCfm = mseaCfmService.getMepFull(
+                MdIdCharStr.asMdId("md-1"),
+                MaIdCharStr.asMaId("ma-1-1"),
+                MepId.valueOf((short) 1), session);
+        assertNotNull(mseaCfm);
+
+        //See SAMPLE_MSEACFM_MD_MA_MEP_FULL_REPLY in MockNetconfSessionEa1000
+        assertEquals(1, mseaCfm.mefCfm().maintenanceDomain().size());
+        MaintenanceAssociationEndPoint mep = mseaCfm.mefCfm()
+                .maintenanceDomain().get(0)
+                .maintenanceAssociation().get(0)
+                .maintenanceAssociationEndPoint().get(0);
+        assertTrue(mep.administrativeState());
+        assertEquals("00:b0:ae:03:ff:31", mep.macAddress().toString());
+
+        org.onosproject.yang.gen.v1.mseasoamfm.rev20160229.mseasoamfm.mefcfm.maintenancedomain
+        .maintenanceassociation.maintenanceassociationendpoint
+        .AugmentedMseaCfmMaintenanceAssociationEndPoint augmentedMep =
+            MepIdUtil2.convertFmAugmentedMep(mep);
+
+        assertEquals("partially-active", augmentedMep.connectivityStatus().toString());
+        assertEquals("up", augmentedMep.interfaceStatus().enumeration().toString());
+    }
+
+    /**
+     * Driven by SAMPLE_MSEACFM_DELAY_MEASUREMENT_FULL_REPLY.
+     * @throws NetconfException If there's a problem
+     */
+    @Test
+    public void testGetSoamDm() throws NetconfException {
+        MseaCfm mseaCfmWithDm = mseaCfmService.getSoamDm(
+                MdIdCharStr.asMdId("md-1"),
+                MaIdCharStr.asMaId("ma-1-1"),
+                MepId.valueOf((short) 1),
+                SoamId.valueOf(1),
+                DmEntryParts.ALL_PARTS, session);
+
+        assertNotNull(mseaCfmWithDm);
+        MaintenanceAssociationEndPoint mep = mseaCfmWithDm.mefCfm()
+            .maintenanceDomain().get(0)
+            .maintenanceAssociation().get(0)
+            .maintenanceAssociationEndPoint().get(0);
+
+        //Because of a checkstyle problem with typecasts including really long
+        //package names, this has to be handed off to a different class
+        org.onosproject.yang.gen.v1.mseasoampm.rev20160229.mseasoampm.mefcfm.maintenancedomain
+        .maintenanceassociation.maintenanceassociationendpoint
+        .AugmentedMseaCfmMaintenanceAssociationEndPoint augmentedMep =
+                MepIdUtil.convertPmAugmentedMep(mep);
+
+        DelayMeasurement dm = augmentedMep.delayMeasurements().delayMeasurement().get(0);
+        assertEquals(true, dm.administrativeState());
+        assertTrue(dm.measurementEnable().get(3)); //frame-delay-two-way-bins
+        assertTrue(dm.measurementEnable().get(1)); //frame-delay-two-way-max
+
+        assertEquals(MessagePeriodEnum.YANGAUTOPREFIX3MS.name(), dm.messagePeriod().name());
+        assertEquals(6, dm.priority().uint8());
+        assertEquals(1000, dm.frameSize());
+        assertEquals(15, dm.measurementInterval());
+        assertEquals(32, dm.numberIntervalsStored());
+        assertEquals(SessionStatusTypeEnum.ACTIVE.name(),
+                dm.sessionStatus().enumeration().name());
+        assertEquals(100, dm.frameDelayTwoWay().uint32());
+        assertEquals(101, dm.interFrameDelayVariationTwoWay().uint32());
+
+        //The remoteMep of the DM is a choice, which for mepId is a leafref object
+        org.onosproject.yang.gen.v1.mseasoampm.rev20160229.mseasoampm.remotemepgroup.remotemep
+        .DefaultMepId remoteMepId = MepIdUtil3.convertPmRemoteMepToMepId(dm.remoteMep());
+        assertNotNull(remoteMepId);
+        assertEquals(10, ((MepIdType) remoteMepId.mepId()).uint16());
+
     }
 
     /**
@@ -91,20 +195,67 @@
     }
 
     @Test
-    public void testTransmitLoopback() throws NetconfException {
+    /**
+     * Using Remote remote MEP ID and all arguments.
+     */
+    public void testTransmitLoopback1() {
+        TransmitLoopbackInput lbTr1 = new DefaultTransmitLoopbackInput();
+        lbTr1.maintenanceDomain(Short.valueOf((short) 1));
+        lbTr1.maintenanceAssociation(Short.valueOf((short) 2));
+        lbTr1.maintenanceAssociationEndPoint(Short.valueOf((short) 3));
+
+        DefaultTargetAddress ta = new DefaultTargetAddress();
+        DefaultMepId mepId = new DefaultMepId();
+        mepId.mepId(MepIdType.of(4));
+        ta.addressType((AddressType) mepId);
+        lbTr1.targetAddress(ta);
+
+//        lbTr1.dataTlv(new byte[]{0x01, 0x02, 0x03}); Not supported in onos-yang-tools just yet
+        lbTr1.numberOfMessages(10);
+        lbTr1.vlanDropEligible(true);
+        lbTr1.vlanPriority(PriorityType.of((short) 1));
         try {
-            mseaCfmService.transmitLoopback(null, session);
-        } catch (UnsupportedOperationException e) {
-            assertTrue(e.getMessage().contains("Not yet implemented"));
+            mseaCfmService.transmitLoopback(lbTr1, session);
+        } catch (NetconfException e) {
+            fail("Calling of TransmitLoopback failed: " + e.getMessage());
+        }
+    }
+
+    @Test
+    /**
+     * Using Remote Mac address in place of remote MEP ID and fewer arguments.
+     */
+    public void testTransmitLoopback2() {
+        TransmitLoopbackInput lbTr2 = new DefaultTransmitLoopbackInput();
+
+        lbTr2.maintenanceDomain(Short.valueOf((short) 63));
+        lbTr2.maintenanceAssociation(Short.valueOf((short) 62));
+        lbTr2.maintenanceAssociationEndPoint(Short.valueOf((short) 61));
+
+        DefaultTargetAddress ta = new DefaultTargetAddress();
+        DefaultMacAddress macAddr = new DefaultMacAddress();
+        macAddr.macAddress(MacAddress.of("FF:EE:DD:CC:BB:AA"));
+        ta.addressType(macAddr);
+        lbTr2.targetAddress(ta);
+        try {
+            mseaCfmService.transmitLoopback(lbTr2, session);
+        } catch (NetconfException e) {
+            fail("Calling of TransmitLoopback failed: " + e.getMessage());
         }
     }
 
     @Test
     public void testAbortLoopback() throws NetconfException {
+        AbortLoopbackInput lbAbort = new DefaultAbortLoopbackInput();
+
+        lbAbort.maintenanceDomain((short) 70);
+        lbAbort.maintenanceAssociation((short) 71);
+        lbAbort.maintenanceAssociationEndPoint((short) 72);
+
         try {
-            mseaCfmService.abortLoopback(null, session);
-        } catch (UnsupportedOperationException e) {
-            assertTrue(e.getMessage().contains("Not yet implemented"));
+            mseaCfmService.abortLoopback(lbAbort, session);
+        } catch (NetconfException e) {
+            fail("Calling of AbortLoopback failed: " + e.getMessage());
         }
     }