Unit tests for interface config class

Change-Id: I28d68ddf3847dcc6ec6b58d36b81bba6e3ac9f02
diff --git a/core/api/src/main/java/org/onosproject/net/config/basics/InterfaceConfig.java b/core/api/src/main/java/org/onosproject/net/config/basics/InterfaceConfig.java
index f1f5ebc..74baa5b 100644
--- a/core/api/src/main/java/org/onosproject/net/config/basics/InterfaceConfig.java
+++ b/core/api/src/main/java/org/onosproject/net/config/basics/InterfaceConfig.java
@@ -177,7 +177,7 @@
         }
 
         if (!intf.vlanTagged().isEmpty()) {
-            intfNode.set(VLAN_UNTAGGED, putVlans(intf.vlanTagged()));
+            intfNode.set(VLAN_TAGGED, putVlans(intf.vlanTagged()));
         }
 
         if (!intf.vlanNative().equals(VlanId.NONE)) {
diff --git a/core/api/src/test/java/org/onosproject/net/config/basics/InterfaceConfigTest.java b/core/api/src/test/java/org/onosproject/net/config/basics/InterfaceConfigTest.java
new file mode 100644
index 0000000..587d23f
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/config/basics/InterfaceConfigTest.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright 2018-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.onosproject.net.config.basics;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.NetTestTools;
+import org.onosproject.net.config.ConfigApplyDelegate;
+import org.onosproject.net.host.InterfaceIpAddress;
+import org.onosproject.net.intf.Interface;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.allOf;
+import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.Matchers.hasItems;
+import static org.hamcrest.Matchers.hasSize;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.Matchers.nullValue;
+
+public class InterfaceConfigTest extends AbstractConfigTest {
+
+    private JsonNode data;
+
+    private ConnectPoint cp1 = NetTestTools.connectPoint("device1", 1);
+    private ConfigApplyDelegate delegate = configApply -> { };
+    private VlanId vl1 = VlanId.vlanId((short) 1);
+
+    private String name1 = getName(1);
+    private String name2 = getName(2);
+    private String name3 = getName(3);
+    private String name4 = getName(4);
+
+    @Before
+    public void setUp() {
+        data = getTestJson("interface-config-1.json");
+    }
+
+    private String getName(int index) {
+        String nameTemplate = "interface";
+        return nameTemplate + Integer.toString(index);
+    }
+
+    private MacAddress getMac(int index) {
+        String macTemplate = "AB:CD:EF:00:00:0";
+        return MacAddress.valueOf(macTemplate + Integer.toString(index));
+    }
+
+    private InterfaceIpAddress getIp(int index, int position) {
+        IpPrefix subnet1 = IpPrefix.valueOf("1.2.0.0/16");
+        IpAddress ip = IpAddress.valueOf("1.2.3." + Integer.toString(index + ((position - 1) * 10)));
+        return new InterfaceIpAddress(ip, subnet1);
+    }
+
+    private Interface findInterface(Collection<Interface> ifs, String name) {
+        return ifs.stream()
+                .filter(iface -> iface.name().equals(name))
+                .findFirst()
+                .orElse(null);
+    }
+
+    private void checkInterface(Interface fetchedInterface, int index) {
+        String name = getName(index);
+        assertThat(fetchedInterface, notNullValue());
+        assertThat(fetchedInterface.name(), is(name));
+        assertThat(fetchedInterface.connectPoint(), is(cp1));
+        assertThat(fetchedInterface.mac(), is(getMac(index)));
+        List<InterfaceIpAddress> fetchedIpAddresses = fetchedInterface.ipAddressesList();
+        assertThat(fetchedIpAddresses, hasItems(getIp(index, 1), getIp(index, 2)));
+    }
+
+    /**
+     * Tests construction, setters and getters of an InterfaceConfig object.
+     */
+    @Test
+    public void testConstruction() throws Exception {
+        InterfaceConfig config = new InterfaceConfig();
+        config.init(cp1, "KEY", data, mapper, delegate);
+
+        assertThat(config.isValid(), is(true));
+        assertThat(config.getInterfaces(), hasSize(4));
+
+        Interface fetchedInterface1 = findInterface(config.getInterfaces(), name1);
+        checkInterface(fetchedInterface1, 1);
+        assertThat(fetchedInterface1.vlan(), is(vl1));
+
+        Interface fetchedInterface2 = findInterface(config.getInterfaces(), name2);
+        checkInterface(fetchedInterface2, 2);
+        assertThat(fetchedInterface2.vlanUntagged().toShort(),  is((short) 22));
+        assertThat(fetchedInterface2.vlan().toShort(), is((short) 2));
+
+        Interface fetchedInterface3 = findInterface(config.getInterfaces(), name3);
+        checkInterface(fetchedInterface3, 3);
+        assertThat(fetchedInterface3.vlanTagged(),  is(allOf(notNullValue(), hasSize(1))));
+        assertThat(fetchedInterface3.vlan().toShort(), is((short) 3));
+        assertThat(fetchedInterface3.vlanTagged(), contains(VlanId.vlanId((short) 33)));
+
+        Interface fetchedInterface4 = findInterface(config.getInterfaces(), name4);
+        checkInterface(fetchedInterface4, 4);
+        assertThat(fetchedInterface4.vlanTagged(),  is(allOf(notNullValue(), hasSize(1))));
+        assertThat(fetchedInterface4.vlanTagged(), contains(VlanId.vlanId((short) 44)));
+        assertThat(fetchedInterface4.vlanNative().toShort(), is((short) 4));
+    }
+
+    @Test
+    public void testAddRemoveInterface() throws Exception {
+        InterfaceConfig config = new InterfaceConfig();
+        config.init(cp1, "KEY", data, mapper, delegate);
+
+        Set<VlanId> vlanTagged = ImmutableSet.of(VlanId.vlanId((short) 33), VlanId.vlanId((short) 44));
+        String newName = "interface5";
+        Interface toAdd1 = new Interface(
+                newName,
+                cp1,
+                ImmutableList.of(getIp(5, 1), getIp(5, 2)),
+                getMac(5),
+                vl1,
+                null,
+                vlanTagged,
+                vl1);
+        config.addInterface(toAdd1);
+
+        assertThat(config.isValid(), is(true));
+        assertThat(config.getInterfaces(), allOf(notNullValue(), hasSize(5)));
+
+        assertThat(findInterface(config.getInterfaces(), name1), notNullValue());
+        assertThat(findInterface(config.getInterfaces(), name2), notNullValue());
+        assertThat(findInterface(config.getInterfaces(), name3), notNullValue());
+
+        Interface addedInterface1 = findInterface(config.getInterfaces(), newName);
+        checkInterface(addedInterface1, 5);
+        assertThat(addedInterface1.vlan(), is(vl1));
+        assertThat(addedInterface1.vlanTagged(), allOf(notNullValue(), hasSize(2)));
+
+        config.removeInterface(newName);
+        assertThat(config.getInterfaces(), allOf(notNullValue(), hasSize(4)));
+        assertThat(findInterface(config.getInterfaces(), newName), nullValue());
+
+        newName = getName(6);
+        Interface toAdd2 = new Interface(
+                newName,
+                cp1,
+                ImmutableList.of(getIp(6, 1), getIp(6, 2)),
+                getMac(6),
+                vl1,
+                VlanId.vlanId((short) 77),
+                null,
+                vl1);
+        config.addInterface(toAdd2);
+
+        Interface addedInterface2 = findInterface(config.getInterfaces(), newName);
+        checkInterface(addedInterface2, 6);
+        assertThat(addedInterface2.vlan(), is(vl1));
+        assertThat(addedInterface2.vlanUntagged().toShort(), is((short) 77));
+    }
+
+}
\ No newline at end of file
diff --git a/core/api/src/test/resources/org/onosproject/net/config/basics/interface-config-1.json b/core/api/src/test/resources/org/onosproject/net/config/basics/interface-config-1.json
new file mode 100644
index 0000000..a3fee43
--- /dev/null
+++ b/core/api/src/test/resources/org/onosproject/net/config/basics/interface-config-1.json
@@ -0,0 +1,48 @@
+[
+
+  {
+    "name": "interface1",
+    "mac": "AB:CD:EF:00:00:01",
+    "vlan": 1,
+    "vlan-tagged": [11],
+    "ips" : [
+        "1.2.3.1/16",
+        "1.2.3.11/16"
+    ]
+  },
+
+  {
+    "name": "interface2",
+    "mac": "AB:CD:EF:00:00:02",
+    "vlan": 2,
+    "vlan-untagged": 22,
+    "ips" : [
+      "1.2.3.2/16",
+      "1.2.3.12/16"
+    ]
+  },
+
+  {
+    "name": "interface3",
+    "mac": "AB:CD:EF:00:00:03",
+    "vlan": 3,
+    "vlan-tagged": [33],
+    "ips" : [
+      "1.2.3.3/16",
+      "1.2.3.13/16"
+    ]
+  },
+
+  {
+    "name": "interface4",
+    "mac": "AB:CD:EF:00:00:04",
+    "vlan-native": 4,
+    "vlan-tagged": [44],
+    "ips" : [
+      "1.2.3.4/16",
+      "1.2.3.14/16"
+    ]
+  }
+  ]
+
+