Fixed issue with canonicalization of link identifiers.
- added asId() to LinkKey
- BiLink.linkId() now returns LinkKey.asId()

Change-Id: Ie9069ca5302f09fca9e213ce33fa87bd8868e752
diff --git a/core/api/src/test/java/org/onosproject/net/LinkKeyTest.java b/core/api/src/test/java/org/onosproject/net/LinkKeyTest.java
index 0b036be..075f165 100644
--- a/core/api/src/test/java/org/onosproject/net/LinkKeyTest.java
+++ b/core/api/src/test/java/org/onosproject/net/LinkKeyTest.java
@@ -126,4 +126,10 @@
                                    containsString("src=1/1"),
                                    containsString("dst=2/1}")));
     }
+
+    @Test
+    public void asId() {
+        LinkKey k1 = LinkKey.linkKey(SRC1, DST2);
+        assertThat(k1.asId(), is(equalTo("1/1-2/2")));
+    }
 }
diff --git a/core/api/src/test/java/org/onosproject/ui/topo/BiLinkTest.java b/core/api/src/test/java/org/onosproject/ui/topo/BiLinkTest.java
index e7c5048..df6d3f7 100644
--- a/core/api/src/test/java/org/onosproject/ui/topo/BiLinkTest.java
+++ b/core/api/src/test/java/org/onosproject/ui/topo/BiLinkTest.java
@@ -57,5 +57,25 @@
         blink = new ConcreteLink(KEY_AB, LINK_AB);
         blink.setOther(null);
     }
+
+    @Test
+    public void canonIdentifiers() {
+        // FIRST: an assumption that the LinkKey used is canonicalized
+        //        ( See TopoUtils.canonicalLinkKey(Link) )
+        //  so in both the following cases, KEY_AB is used...
+        String expected = CP_A1 + "-" + CP_B2;
+
+        // let's assume that link [A -> B] was dealt with first...
+        blink = new ConcreteLink(KEY_AB, LINK_AB);
+        blink.setOther(LINK_BA);
+        print(blink);
+        assertEquals("non-canon AB", expected, blink.linkId());
+
+        // let's assume that link [B -> A] was dealt with first...
+        blink = new ConcreteLink(KEY_AB, LINK_BA);
+        blink.setOther(LINK_AB);
+        print(blink);
+        assertEquals("non-canon BA", expected, blink.linkId());
+    }
 }
 
diff --git a/core/api/src/test/java/org/onosproject/ui/topo/BiLinkTestBase.java b/core/api/src/test/java/org/onosproject/ui/topo/BiLinkTestBase.java
index bcfd408..77b6858 100644
--- a/core/api/src/test/java/org/onosproject/ui/topo/BiLinkTestBase.java
+++ b/core/api/src/test/java/org/onosproject/ui/topo/BiLinkTestBase.java
@@ -24,11 +24,12 @@
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.driver.Behaviour;
 import org.onosproject.net.provider.ProviderId;
+import org.onosproject.ui.AbstractUiTest;
 
 /**
  * Base class for unit tests of {@link BiLink} and {@link BiLinkMap}.
  */
-public abstract class BiLinkTestBase {
+public abstract class BiLinkTestBase extends AbstractUiTest {
 
     protected static class FakeLink implements Link {
         private final ConnectPoint src;
@@ -39,29 +40,43 @@
             this.dst = dst;
         }
 
-        @Override public ConnectPoint src() {
+        @Override
+        public ConnectPoint src() {
             return src;
         }
-        @Override public ConnectPoint dst() {
+
+        @Override
+        public ConnectPoint dst() {
             return dst;
         }
 
-        @Override public Type type() {
+        @Override
+        public Type type() {
             return null;
         }
-        @Override public State state() {
+
+        @Override
+        public State state() {
             return null;
         }
-        @Override public boolean isDurable() {
+
+        @Override
+        public boolean isDurable() {
             return false;
         }
-        @Override public boolean isExpected() {
+
+        @Override
+        public boolean isExpected() {
             return false;
         }
-        @Override public Annotations annotations() {
+
+        @Override
+        public Annotations annotations() {
             return null;
         }
-        @Override public ProviderId providerId() {
+
+        @Override
+        public ProviderId providerId() {
             return null;
         }
 
@@ -94,6 +109,7 @@
         public ConcreteLink(LinkKey key, Link link) {
             super(key, link);
         }
+
         @Override
         public LinkHighlight highlight(Enum<?> type) {
             return null;
@@ -107,5 +123,4 @@
         }
     }
 
-
 }
diff --git a/core/api/src/test/java/org/onosproject/ui/topo/TopoUtilsTest.java b/core/api/src/test/java/org/onosproject/ui/topo/TopoUtilsTest.java
index f7b56eb..e8712dc 100644
--- a/core/api/src/test/java/org/onosproject/ui/topo/TopoUtilsTest.java
+++ b/core/api/src/test/java/org/onosproject/ui/topo/TopoUtilsTest.java
@@ -22,6 +22,7 @@
 import org.onosproject.net.Link;
 import org.onosproject.net.LinkKey;
 import org.onosproject.net.provider.ProviderId;
+import org.onosproject.ui.AbstractUiTest;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -31,7 +32,7 @@
 /**
  * Unit tests for {@link TopoUtils}.
  */
-public class TopoUtilsTest {
+public class TopoUtilsTest extends AbstractUiTest {
     private static final String AM_WL = "wrong label";
     private static final String AM_WM = "wrong magnitude";
     private static final String AM_CL = "clipped?";
@@ -54,6 +55,21 @@
             .providerId(ProviderId.NONE)
             .build();
 
+    private static final Link LINK_7_TO_3 = DefaultLink.builder()
+            .src(deviceConnectPoint("of:0000000000000007/2"))
+            .dst(deviceConnectPoint("of:0000000000000003/2"))
+            .type(Link.Type.DIRECT)
+            .providerId(ProviderId.NONE)
+            .build();
+
+    private static final Link LINK_3_TO_7 = DefaultLink.builder()
+            .src(deviceConnectPoint("of:0000000000000003/2"))
+            .dst(deviceConnectPoint("of:0000000000000007/2"))
+            .type(Link.Type.DIRECT)
+            .providerId(ProviderId.NONE)
+            .build();
+
+
     private TopoUtils.ValueLabel vl;
 
     @Test
@@ -76,6 +92,15 @@
     }
 
     @Test
+    public void canon723() {
+        LinkKey lk1 = TopoUtils.canonicalLinkKey(LINK_7_TO_3);
+        print(lk1);
+        LinkKey lk2 = TopoUtils.canonicalLinkKey(LINK_3_TO_7);
+        print(lk2);
+        assertEquals("not canonical 3/7", lk1, lk2);
+    }
+
+    @Test
     public void formatSmallBytes() {
         vl = TopoUtils.formatBytes(1_000L);
         assertEquals(AM_WM, TopoUtils.Magnitude.ONE, vl.magnitude());