/*
 * Copyright 2018-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.drivers.odtn;

import com.google.common.io.CharSource;
import java.io.IOException;
import java.util.List;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.XMLConfiguration;
import org.junit.Test;
import org.onosproject.net.device.PortDescription;
import org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery;

import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery.OC_NAME;
import static org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery.OC_TYPE;
import static org.onosproject.odtn.utils.tapi.TapiInstanceBuilder.ODTN_PORT_TYPE;

public class InfineraOpenConfigDeviceDiscoveryTest {

    @Test
    public void testToPortDescription() throws ConfigurationException, IOException {
        // CHECKSTYLE:OFF
        String input =
          "<data>\n" +
          "  <interfaces xmlns=\"http://openconfig.net/yang/interfaces\">\n" +
          "    <interface>\n" +
          "      <name>CARRIERCTP.1-L1-1</name>\n" +
          "      <config>\n" +
          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
          "        <name>CARRIERCTP.1-L1-1</name>\n" +
          "        <description/>\n" +
          "        <enabled>true</enabled>\n" +
          "      </config>\n" +
          "    </interface>\n" +
          "    <interface>\n" +
          "      <name>CARRIERCTP.1-L1-2</name>\n" +
          "      <config>\n" +
          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
          "        <name>CARRIERCTP.1-L1-2</name>\n" +
          "        <description/>\n" +
          "        <enabled>true</enabled>\n" +
          "      </config>\n" +
          "    </interface>\n" +
          "    <interface>\n" +
          "      <name>CARRIERCTP.1-L1-3</name>\n" +
          "      <config>\n" +
          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
          "        <name>CARRIERCTP.1-L1-3</name>\n" +
          "        <description/>\n" +
          "        <enabled>true</enabled>\n" +
          "      </config>\n" +
          "    </interface>\n" +
          "    <interface>\n" +
          "      <name>CARRIERCTP.1-L1-4</name>\n" +
          "      <config>\n" +
          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
          "        <name>CARRIERCTP.1-L1-4</name>\n" +
          "        <description/>\n" +
          "        <enabled>true</enabled>\n" +
          "      </config>\n" +
          "    </interface>\n" +
          "    <interface>\n" +
          "      <name>CARRIERCTP.1-L1-5</name>\n" +
          "      <config>\n" +
          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
          "        <name>CARRIERCTP.1-L1-5</name>\n" +
          "        <description/>\n" +
          "        <enabled>true</enabled>\n" +
          "      </config>\n" +
          "    </interface>\n" +
          "    <interface>\n" +
          "      <name>CARRIERCTP.1-L1-6</name>\n" +
          "      <config>\n" +
          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
          "        <name>CARRIERCTP.1-L1-6</name>\n" +
          "        <description/>\n" +
          "        <enabled>true</enabled>\n" +
          "      </config>\n" +
          "    </interface>\n" +
          "    <interface>\n" +
          "      <name>GIGECLIENTCTP.1-A-2-T1</name>\n" +
          "      <config>\n" +
          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
          "        <name>GIGECLIENTCTP.1-A-2-T1</name>\n" +
          "        <description/>\n" +
          "        <enabled>true</enabled>\n" +
          "      </config>\n" +
          "    </interface>\n" +
          "    <interface>\n" +
          "      <name>GIGECLIENTCTP.1-A-2-T2</name>\n" +
          "      <config>\n" +
          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
          "        <name>GIGECLIENTCTP.1-A-2-T2</name>\n" +
          "        <description/>\n" +
          "        <enabled>true</enabled>\n" +
          "      </config>\n" +
          "    </interface>\n" +
          "    <interface>\n" +
          "      <name>GIGECLIENTCTP.1-L1-1-1</name>\n" +
          "      <config>\n" +
          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
          "        <name>GIGECLIENTCTP.1-L1-1-1</name>\n" +
          "        <description/>\n" +
          "        <enabled>true</enabled>\n" +
          "      </config>\n" +
          "    </interface>\n" +
          "    <interface>\n" +
          "      <name>GIGECLIENTCTP.1-L2-1-1</name>\n" +
          "      <config>\n" +
          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
          "        <name>GIGECLIENTCTP.1-L2-1-1</name>\n" +
          "        <description/>\n" +
          "        <enabled>true</enabled>\n" +
          "      </config>\n" +
          "    </interface>\n" +
          "    <interface>\n" +
          "      <name>NCTGIGE.1-NCT-1</name>\n" +
          "      <config>\n" +
          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:ethernetCsmacd</type>\n" +
          "        <name>NCTGIGE.1-NCT-1</name>\n" +
          "        <description/>\n" +
          "        <enabled>true</enabled>\n" +
          "      </config>\n" +
          "    </interface>\n" +
          "    <interface>\n" +
          "      <name>NCTGIGE.1-NCT-2</name>\n" +
          "      <config>\n" +
          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:ethernetCsmacd</type>\n" +
          "        <name>NCTGIGE.1-NCT-2</name>\n" +
          "        <description/>\n" +
          "        <enabled>true</enabled>\n" +
          "      </config>\n" +
          "    </interface>\n" +
          "    <interface>\n" +
          "      <name>OCHCTP.1-L1-1</name>\n" +
          "      <config>\n" +
          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
          "        <name>OCHCTP.1-L1-1</name>\n" +
          "        <description/>\n" +
          "        <enabled>true</enabled>\n" +
          "      </config>\n" +
          "    </interface>\n" +
          "    <interface>\n" +
          "      <name>SCHCTP.1-L1-1</name>\n" +
          "      <config>\n" +
          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
          "        <name>SCHCTP.1-L1-1</name>\n" +
          "        <description/>\n" +
          "        <enabled>true</enabled>\n" +
          "      </config>\n" +
          "    </interface>\n" +
          "    <interface>\n" +
          "      <name>TRIBPTP.1-A-2-T1</name>\n" +
          "      <config>\n" +
          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
          "        <name>TRIBPTP.1-A-2-T1</name>\n" +
          "        <description/>\n" +
          "        <enabled>true</enabled>\n" +
          "      </config>\n" +
          "    </interface>\n" +
          "    <interface>\n" +
          "      <name>TRIBPTP.1-A-2-T2</name>\n" +
          "      <config>\n" +
          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
          "        <name>TRIBPTP.1-A-2-T2</name>\n" +
          "        <description/>\n" +
          "        <enabled>true</enabled>\n" +
          "      </config>\n" +
          "    </interface>\n" +
          "    <interface>\n" +
          "      <name>XTSCGPTP.1-L1</name>\n" +
          "      <config>\n" +
          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
          "        <name>XTSCGPTP.1-L1</name>\n" +
          "        <description/>\n" +
          "        <enabled>true</enabled>\n" +
          "      </config>\n" +
          "    </interface>\n" +
          "  </interfaces>\n" +
          "</data>\n";
        // CHECKSTYLE:ON

        InfineraOpenConfigDeviceDiscovery sut = new InfineraOpenConfigDeviceDiscovery();

        XMLConfiguration cfg = new XMLConfiguration();
        cfg.load(CharSource.wrap(input).openStream());

        List<PortDescription> ports = sut.discoverPorts(cfg);

        assertThat(ports, hasSize(4));

        PortDescription portDescription;
        portDescription = ports.get(0);
        assertThat(portDescription.portNumber().toLong(), is(1L));
        assertThat(portDescription.portNumber().name(), is("GIGECLIENTCTP.1-A-2-T1"));
        assertThat(portDescription.annotations().value(OC_NAME), is("GIGECLIENTCTP.1-A-2-T1"));
        assertThat(portDescription.annotations().value(OC_TYPE), is("GIGECLIENTCTP.1-A-2-T1"));
        assertThat(portDescription.annotations().value(ODTN_PORT_TYPE),
                is(OdtnDeviceDescriptionDiscovery.OdtnPortType.CLIENT.value()));

        portDescription = ports.get(3);
        assertThat(portDescription.portNumber().toLong(), is(102L));
        assertThat(portDescription.portNumber().name(), is("GIGECLIENTCTP.1-L2-1-1"));
        assertThat(portDescription.annotations().value(OC_NAME), is("GIGECLIENTCTP.1-L2-1-1"));
        assertThat(portDescription.annotations().value(OC_TYPE), is("GIGECLIENTCTP.1-L2-1-1"));
        assertThat(portDescription.annotations().value(ODTN_PORT_TYPE),
                is(OdtnDeviceDescriptionDiscovery.OdtnPortType.LINE.value()));
    }
}
