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