Implementation of REST POST API for creating intents
- codec for constraint decode
- codec for intent decode
- POST method for intents
- unit tests for codecs and POST method

Change-Id: Ibc0ef8f99a0c0664710a733985424c77010c49b5
diff --git a/core/common/src/test/java/org/onosproject/codec/impl/ConstraintCodecTest.java b/core/common/src/test/java/org/onosproject/codec/impl/ConstraintCodecTest.java
new file mode 100644
index 0000000..2a47d11
--- /dev/null
+++ b/core/common/src/test/java/org/onosproject/codec/impl/ConstraintCodecTest.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.codec.impl;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.core.CoreService;
+import org.onosproject.net.Link;
+import org.onosproject.net.intent.Constraint;
+import org.onosproject.net.intent.constraint.AnnotationConstraint;
+import org.onosproject.net.intent.constraint.AsymmetricPathConstraint;
+import org.onosproject.net.intent.constraint.BandwidthConstraint;
+import org.onosproject.net.intent.constraint.LambdaConstraint;
+import org.onosproject.net.intent.constraint.LatencyConstraint;
+import org.onosproject.net.intent.constraint.LinkTypeConstraint;
+import org.onosproject.net.intent.constraint.ObstacleConstraint;
+import org.onosproject.net.intent.constraint.WaypointConstraint;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.hasItem;
+import static org.hamcrest.Matchers.hasSize;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.onosproject.net.NetTestTools.APP_ID;
+import static org.onosproject.net.NetTestTools.did;
+
+/**
+ * Unit tests for Constraint codec.
+ */
+public class ConstraintCodecTest {
+
+    MockCodecContext context;
+    JsonCodec<Constraint> constraintCodec;
+    final CoreService mockCoreService = createMock(CoreService.class);
+
+    /**
+     * Sets up for each test.  Creates a context and fetches the flow rule
+     * codec.
+     */
+    @Before
+    public void setUp() {
+        context = new MockCodecContext();
+        constraintCodec = context.codec(Constraint.class);
+        assertThat(constraintCodec, notNullValue());
+
+        expect(mockCoreService.registerApplication(FlowRuleCodec.REST_APP_ID))
+                .andReturn(APP_ID).anyTimes();
+        replay(mockCoreService);
+        context.registerService(CoreService.class, mockCoreService);
+    }
+
+    /**
+     * Reads in a constraint from the given resource and decodes it.
+     *
+     * @param resourceName resource to use to read the JSON for the constraint
+     * @return decoded constraint
+     */
+    private Constraint getConstraint(String resourceName) {
+        InputStream jsonStream = ConstraintCodecTest.class
+                .getResourceAsStream(resourceName);
+        try {
+            JsonNode json = context.mapper().readTree(jsonStream);
+            assertThat(json, notNullValue());
+            Constraint constraint = constraintCodec.decode((ObjectNode) json, context);
+            assertThat(constraint, notNullValue());
+            return checkNotNull(constraint);
+        } catch (IOException ioe) {
+            Assert.fail(ioe.getMessage());
+            throw new IllegalStateException("cannot happen");
+        }
+    }
+
+
+    /**
+     * Tests link type constraint.
+     */
+    @Test
+    public void linkTypeConstraint() {
+        Constraint constraint = getConstraint("LinkTypeConstraint.json");
+        assertThat(constraint, instanceOf(LinkTypeConstraint.class));
+
+        LinkTypeConstraint linkTypeConstraint = (LinkTypeConstraint) constraint;
+        assertThat(linkTypeConstraint.isInclusive(), is(false));
+        assertThat(linkTypeConstraint.types(), hasSize(2));
+        assertThat(linkTypeConstraint.types(), hasItem(Link.Type.OPTICAL));
+        assertThat(linkTypeConstraint.types(), hasItem(Link.Type.DIRECT));
+    }
+
+    /**
+     * Tests annotation constraint.
+     */
+    @Test
+    public void annotationConstraint() {
+        Constraint constraint = getConstraint("AnnotationConstraint.json");
+        assertThat(constraint, instanceOf(AnnotationConstraint.class));
+
+        AnnotationConstraint annotationConstraint = (AnnotationConstraint) constraint;
+        assertThat(annotationConstraint.key(), is("key"));
+        assertThat(annotationConstraint.threshold(), is(123.0D));
+    }
+
+    /**
+     * Tests bandwidth constraint.
+     */
+    @Test
+    public void bandwidthConstraint() {
+        Constraint constraint = getConstraint("BandwidthConstraint.json");
+        assertThat(constraint, instanceOf(BandwidthConstraint.class));
+
+        BandwidthConstraint bandwidthConstraint = (BandwidthConstraint) constraint;
+        assertThat(bandwidthConstraint.bandwidth().toDouble(), is(345.678D));
+    }
+
+    /**
+     * Tests lambda constraint.
+     */
+    @Test
+    public void lambdaConstraint() {
+        Constraint constraint = getConstraint("LambdaConstraint.json");
+        assertThat(constraint, instanceOf(LambdaConstraint.class));
+
+        LambdaConstraint lambdaConstraint = (LambdaConstraint) constraint;
+        assertThat(lambdaConstraint.lambda().toInt(), is(444));
+    }
+
+    /**
+     * Tests latency constraint.
+     */
+    @Test
+    public void latencyConstraint() {
+        Constraint constraint = getConstraint("LatencyConstraint.json");
+        assertThat(constraint, instanceOf(LatencyConstraint.class));
+
+        LatencyConstraint latencyConstraint = (LatencyConstraint) constraint;
+        assertThat(latencyConstraint.latency().toMillis(), is(111L));
+    }
+
+    /**
+     * Tests obstacle constraint.
+     */
+    @Test
+    public void obstacleConstraint() {
+        Constraint constraint = getConstraint("ObstacleConstraint.json");
+        assertThat(constraint, instanceOf(ObstacleConstraint.class));
+
+        ObstacleConstraint obstacleConstraint = (ObstacleConstraint) constraint;
+
+        assertThat(obstacleConstraint.obstacles(), hasItem(did("dev1")));
+        assertThat(obstacleConstraint.obstacles(), hasItem(did("dev2")));
+        assertThat(obstacleConstraint.obstacles(), hasItem(did("dev3")));
+    }
+
+    /**
+     * Tests waypoint constaint.
+     */
+    @Test
+    public void waypointConstraint() {
+        Constraint constraint = getConstraint("WaypointConstraint.json");
+        assertThat(constraint, instanceOf(WaypointConstraint.class));
+
+        WaypointConstraint waypointConstraint = (WaypointConstraint) constraint;
+
+        assertThat(waypointConstraint.waypoints(), hasItem(did("devA")));
+        assertThat(waypointConstraint.waypoints(), hasItem(did("devB")));
+        assertThat(waypointConstraint.waypoints(), hasItem(did("devC")));
+    }
+
+    /**
+     * Tests asymmetric path constraint.
+     */
+    @Test
+    public void asymmetricPathConstraint() {
+        Constraint constraint = getConstraint("AsymmetricPathConstraint.json");
+        assertThat(constraint, instanceOf(AsymmetricPathConstraint.class));
+    }
+}