/*
 * Copyright 2016-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.segmentrouting.config;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Before;
import org.junit.Test;
import org.onlab.packet.MplsLabel;
import org.onlab.packet.VlanId;
import org.onosproject.TestApplicationId;
import org.onosproject.core.ApplicationId;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.config.Config;
import org.onosproject.net.config.ConfigApplyDelegate;
import org.onosproject.segmentrouting.SegmentRoutingManager;
import org.onosproject.segmentrouting.pwaas.DefaultL2Tunnel;
import org.onosproject.segmentrouting.pwaas.DefaultL2TunnelDescription;
import org.onosproject.segmentrouting.pwaas.DefaultL2TunnelPolicy;
import org.onosproject.segmentrouting.pwaas.L2Mode;

import java.io.InputStream;
import java.util.Set;

import static org.hamcrest.Matchers.is;
import static org.junit.Assert.*;

/**
 * Unit tests for class {@link PwaasConfig}.
 */
public class PwaasConfigTest {

    private static final String TUNNEL_ID_1 = "1";
    private static final String TUNNEL_ID_2 = "20";
    private static final String NOT_PRESENT_TUNNEL_ID = "2";
    private static final ConnectPoint INGRESS_1 = ConnectPoint.deviceConnectPoint("of:0000000000000001/1");
    private static final ConnectPoint INGRESS_2 = ConnectPoint.deviceConnectPoint("of:0000000000000002/1");
    private static final ConnectPoint EGRESS_1 = ConnectPoint.deviceConnectPoint("of:0000000000000011/1");
    private static final ConnectPoint EGRESS_2 = ConnectPoint.deviceConnectPoint("of:0000000000000012/1");
    private static final VlanId INGRESS_INNER_TAG_1 = VlanId.vlanId("10");
    private static final VlanId INGRESS_INNER_TAG_2 = VlanId.vlanId("100");
    private static final VlanId INGRESS_OUTER_TAG_1 = VlanId.vlanId("20");
    private static final VlanId INGRESS_OUTER_TAG_2 = VlanId.vlanId("200");
    private static final VlanId EGRESS_INNER_TAG_1 = VlanId.vlanId("11");
    private static final VlanId EGRESS_INNER_TAG_2 = VlanId.vlanId("110");
    private static final VlanId EGRESS_OUTER_TAG_1 = VlanId.vlanId("21");
    private static final VlanId EGRESS_OUTER_TAG_2 = VlanId.vlanId("210");
    private static final String MODE_1 = "RAW";
    private static final String MODE_2 = "TAGGED";
    private static final boolean ALL_VLAN_1 = true;
    private static final boolean ALL_VLAN_2 = false;
    private static final VlanId SD_TAG_1 = VlanId.vlanId("40");
    private static final VlanId SD_TAG_2 = VlanId.NONE;
    private static final MplsLabel PW_LABEL_1 = MplsLabel.mplsLabel("255");
    private static final MplsLabel PW_LABEL_2 = MplsLabel.mplsLabel("4095");

    private PwaasConfig config;
    private PwaasConfig invalidConfig;

    @Before
    public void setUp() throws Exception {
        InputStream jsonStream = PwaasConfig.class
                .getResourceAsStream("/pwaas.json");
        InputStream invalidJsonStream = PwaasConfig.class
                .getResourceAsStream("/pwaas-invalid.json");

        String key = SegmentRoutingManager.APP_NAME;
        ApplicationId subject = new TestApplicationId(key);
        ObjectMapper mapper = new ObjectMapper();
        JsonNode jsonNode = mapper.readTree(jsonStream);
        JsonNode invalidJsonNode = mapper.readTree(invalidJsonStream);
        ConfigApplyDelegate delegate = new MockDelegate();

        config = new PwaasConfig();
        config.init(subject, key, jsonNode, mapper, delegate);
        invalidConfig = new PwaasConfig();
        invalidConfig.init(subject, key, invalidJsonNode, mapper, delegate);
    }

    /**
     * Tests config validity.
     */
    @Test
    public void testIsValid() {
        assertTrue(config.isValid());
        assertFalse(invalidConfig.isValid());
    }

    /**
     * Tests getPwIds.
     */
    @Test
    public void testGetPwIds() {
        Set<Long> pwIds = config.getPwIds();
        assertThat(pwIds.size(), is(2));
        assertTrue(pwIds.contains(Long.parseLong(TUNNEL_ID_1)));
        assertTrue(pwIds.contains(Long.parseLong(TUNNEL_ID_2)));
        assertFalse(pwIds.contains(Long.parseLong(NOT_PRESENT_TUNNEL_ID)));
    }

    /**
     * Tests getPwDescription.
     */
    @Test
    public void testGetPwDescription() {
        DefaultL2TunnelDescription l2TunnelDescription = null;

        DefaultL2Tunnel l2Tunnel = new DefaultL2Tunnel(
            L2Mode.valueOf(MODE_1),
            SD_TAG_1,
            Long.parseLong(TUNNEL_ID_1),
            PW_LABEL_1
        );
        DefaultL2TunnelPolicy l2TunnelPolicy = new DefaultL2TunnelPolicy(
                Long.parseLong(TUNNEL_ID_1),
                INGRESS_1,
                INGRESS_INNER_TAG_1,
                INGRESS_OUTER_TAG_1,
                EGRESS_1,
                EGRESS_INNER_TAG_1,
                EGRESS_OUTER_TAG_1,
                ALL_VLAN_1
        );
        l2TunnelDescription = config.getPwDescription(Long.parseLong(TUNNEL_ID_1));
        assertThat(l2TunnelDescription.l2Tunnel().pwMode(), is(l2Tunnel.pwMode()));
        assertThat(l2TunnelDescription.l2Tunnel().sdTag(), is(l2Tunnel.sdTag()));
        assertThat(l2TunnelDescription.l2Tunnel().tunnelId(), is(l2Tunnel.tunnelId()));
        assertThat(l2TunnelDescription.l2Tunnel().pwLabel(), is(l2Tunnel.pwLabel()));
        assertThat(l2TunnelDescription.l2TunnelPolicy().tunnelId(), is(l2TunnelPolicy.tunnelId()));
        assertThat(l2TunnelDescription.l2TunnelPolicy().cP1InnerTag(), is(l2TunnelPolicy.cP1InnerTag()));
        assertThat(l2TunnelDescription.l2TunnelPolicy().cP1OuterTag(), is(l2TunnelPolicy.cP1OuterTag()));
        assertThat(l2TunnelDescription.l2TunnelPolicy().cP2InnerTag(), is(l2TunnelPolicy.cP2InnerTag()));
        assertThat(l2TunnelDescription.l2TunnelPolicy().cP2OuterTag(), is(l2TunnelPolicy.cP2OuterTag()));
        assertThat(l2TunnelDescription.l2TunnelPolicy().cP1(), is(l2TunnelPolicy.cP1()));
        assertThat(l2TunnelDescription.l2TunnelPolicy().cP2(), is(l2TunnelPolicy.cP2()));
        assertThat(l2TunnelDescription.l2TunnelPolicy().isAllVlan(), is(l2TunnelPolicy.isAllVlan()));

        l2Tunnel = new DefaultL2Tunnel(
                L2Mode.valueOf(MODE_2),
                SD_TAG_2,
                Long.parseLong(TUNNEL_ID_2),
                PW_LABEL_2
        );
        l2TunnelPolicy = new DefaultL2TunnelPolicy(
                Long.parseLong(TUNNEL_ID_2),
                INGRESS_2,
                INGRESS_INNER_TAG_2,
                INGRESS_OUTER_TAG_2,
                EGRESS_2,
                EGRESS_INNER_TAG_2,
                EGRESS_OUTER_TAG_2,
                ALL_VLAN_2
        );
        l2TunnelDescription = config.getPwDescription(Long.parseLong(TUNNEL_ID_2));
        assertThat(l2TunnelDescription.l2Tunnel().pwMode(), is(l2Tunnel.pwMode()));
        assertThat(l2TunnelDescription.l2Tunnel().sdTag(), is(l2Tunnel.sdTag()));
        assertThat(l2TunnelDescription.l2Tunnel().tunnelId(), is(l2Tunnel.tunnelId()));
        assertThat(l2TunnelDescription.l2Tunnel().pwLabel(), is(l2Tunnel.pwLabel()));
        assertThat(l2TunnelDescription.l2TunnelPolicy().tunnelId(), is(l2TunnelPolicy.tunnelId()));
        assertThat(l2TunnelDescription.l2TunnelPolicy().cP1InnerTag(), is(l2TunnelPolicy.cP1InnerTag()));
        assertThat(l2TunnelDescription.l2TunnelPolicy().cP1OuterTag(), is(l2TunnelPolicy.cP1OuterTag()));
        assertThat(l2TunnelDescription.l2TunnelPolicy().cP2OuterTag(), is(l2TunnelPolicy.cP2OuterTag()));
        assertThat(l2TunnelDescription.l2TunnelPolicy().cP2OuterTag(), is(l2TunnelPolicy.cP2OuterTag()));
        assertThat(l2TunnelDescription.l2TunnelPolicy().cP1(), is(l2TunnelPolicy.cP1()));
        assertThat(l2TunnelDescription.l2TunnelPolicy().cP2(), is(l2TunnelPolicy.cP2()));
        assertThat(l2TunnelDescription.l2TunnelPolicy().isAllVlan(), is(l2TunnelPolicy.isAllVlan()));

    }

    private class MockDelegate implements ConfigApplyDelegate {
        @Override
        public void onApply(Config config) {
        }
    }

}
