/*
 * Copyright 2015-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.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.DomainConstraint;
import org.onosproject.net.intent.constraint.LatencyConstraint;
import org.onosproject.net.intent.constraint.LinkTypeConstraint;
import org.onosproject.net.intent.constraint.MeteredConstraint;
import org.onosproject.net.intent.constraint.ObstacleConstraint;
import org.onosproject.net.intent.constraint.TierConstraint;
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 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));
    }

    /**
     * Tests domain constraint.
     */
    @Test
    public void domainConstraint() {
        Constraint constraint = getConstraint("DomainConstraint.json");
        assertThat(constraint, instanceOf(DomainConstraint.class));
    }

    /**
     * Tests metered constraint.
     */
    @Test
    public void meteredConstraint() {
        Constraint constraint = getConstraint("MeteredConstraint.json");
        assertThat(constraint, instanceOf(MeteredConstraint.class));

        MeteredConstraint meteredConstraint = (MeteredConstraint) constraint;

        assertThat(meteredConstraint.isUseMetered(), is(true));
    }

    /**
     * Tests tier constraint.
     */
    @Test
    public void tierConstraint() {
        Constraint constraint = getConstraint("TierConstraint.json");
        assertThat(constraint, instanceOf(TierConstraint.class));

        TierConstraint tierConstraint = (TierConstraint) constraint;

        assertThat(tierConstraint.isInclusive(), is(true));
        assertThat(tierConstraint.costType(), is(TierConstraint.CostType.ORDER));

        assertThat(tierConstraint.tiers().get(0), is(3));
        assertThat(tierConstraint.tiers().get(1), is(2));
        assertThat(tierConstraint.tiers().get(2), is(1));
    }


}
