/*
 * 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().bps(), 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));
    }
}
