/*
 * 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.ospf.protocol.lsa.types;

import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.onlab.packet.Ip4Address;
import org.onosproject.ospf.controller.OspfLsaType;
import org.onosproject.ospf.protocol.lsa.OpaqueLsaHeader;
import org.onosproject.ospf.protocol.lsa.TlvHeader;
import org.onosproject.ospf.protocol.lsa.tlvtypes.LinkTlv;
import org.onosproject.ospf.protocol.lsa.tlvtypes.RouterTlv;


import java.util.List;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;

/**
 * Unit test class for OpaqueLsa10.
 */
public class OpaqueLsa10Test {

    private final byte[] packet = {0, 1, 0, 4, 1, 1, 1, 1, 0, 2, 0, 84, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    private OpaqueLsa10 opaqueLsa10;
    private TopLevelTlv tlv;
    private OpaqueLsaHeader opqueHeader;
    private ChannelBuffer channelBuffer;
    private byte[] result;
    private RouterTlv routerTlv;
    private RouterTlv routerTlv1;
    private LinkTlv linkTlv;
    private LinkTlv linkTlv1;
    private OspfLsaType ospflsaType;
    private int result1;
    private List result2;

    @Before
    public void setUp() throws Exception {
        opaqueLsa10 = new OpaqueLsa10(new OpaqueLsaHeader());
    }

    @After
    public void tearDown() throws Exception {
        opaqueLsa10 = null;
        tlv = null;
        opqueHeader = null;
        channelBuffer = null;
        result = null;
        routerTlv = null;
        routerTlv1 = null;
        linkTlv1 = null;
        ospflsaType = null;
    }

    /**
     * Tests to string method.
     */
    @Test
    public void testToString() throws Exception {
        assertThat(opaqueLsa10.toString(), is(notNullValue()));
    }

    /**
     * Tests addValue() method.
     */
    @Test
    public void testAddValue() throws Exception {
        tlv = new RouterTlv(new TlvHeader());
        opaqueLsa10.addValue(tlv);
        assertThat(opaqueLsa10, is(notNullValue()));
    }

    /**
     * Tests readFrom() method.
     */
    @Test(expected = Exception.class)
    public void testReadFrom() throws Exception {
        opqueHeader = new OpaqueLsaHeader();
        opqueHeader.setLsType(10);
        opqueHeader.setLsPacketLen(48);
        opqueHeader.setLsCheckSum(10);
        opqueHeader.setAge(4);
        opqueHeader.setOpaqueId(1);
        opqueHeader.setOpaqueType(10);
        opqueHeader.setLsSequenceNo(250);
        opqueHeader.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
        opqueHeader.setOptions(66);
        opaqueLsa10 = new OpaqueLsa10(opqueHeader);
        channelBuffer = ChannelBuffers.copiedBuffer(packet);
        opaqueLsa10.readFrom(channelBuffer);
        result = opaqueLsa10.asBytes();
        assertThat(result, is(notNullValue()));
    }

    /**
     * Tests asBytes() method.
     */
    @Test(expected = Exception.class)
    public void testAsBytes() throws Exception {
        opqueHeader = new OpaqueLsaHeader();
        opqueHeader.setLsType(10);
        opqueHeader.setLsPacketLen(48);
        opqueHeader.setLsCheckSum(10);
        opqueHeader.setAge(4);
        opqueHeader.setOpaqueId(1);
        opqueHeader.setOpaqueType(10);
        opqueHeader.setLsSequenceNo(250);
        opqueHeader.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
        opqueHeader.setOptions(66);
        opaqueLsa10 = new OpaqueLsa10(opqueHeader);
        channelBuffer = ChannelBuffers.copiedBuffer(packet);
        opaqueLsa10.readFrom(channelBuffer);
        result = opaqueLsa10.getLsaBodyAsByteArray();
        result = opaqueLsa10.asBytes();
        assertThat(result, is(notNullValue()));
    }

    /**
     * Tests getLsaBodyAsByteArray() method.
     */
    @Test(expected = Exception.class)
    public void testGetLsaBodyAsByteArray() throws Exception {
        opqueHeader = new OpaqueLsaHeader();
        opqueHeader.setLsType(10);
        opqueHeader.setLsPacketLen(48);
        opqueHeader.setLsCheckSum(10);
        opqueHeader.setAge(4);
        opqueHeader.setOpaqueId(1);
        opqueHeader.setOpaqueType(10);
        opqueHeader.setLsSequenceNo(250);
        opqueHeader.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
        opqueHeader.setOptions(2);
        opaqueLsa10 = new OpaqueLsa10(opqueHeader);
        routerTlv = new RouterTlv(new TlvHeader());
        linkTlv = new LinkTlv(new TlvHeader());
        opaqueLsa10.addValue(routerTlv);
        opaqueLsa10.addValue(linkTlv);
        routerTlv1 = new RouterTlv(new TlvHeader());
        linkTlv1 = new LinkTlv(new TlvHeader());
        opaqueLsa10.addValue(routerTlv1);
        opaqueLsa10.addValue(linkTlv1);
        channelBuffer = ChannelBuffers.copiedBuffer(packet);
        opaqueLsa10.readFrom(channelBuffer);
        result = opaqueLsa10.getLsaBodyAsByteArray();
        assertThat(result, is(notNullValue()));
    }

    /**
     * Tests getLsaBodyAsByteArray() method.
     */
    @Test(expected = Exception.class)
    public void testGetLsaBodyAsByteArray1() throws Exception {
        opqueHeader = new OpaqueLsaHeader();
        opqueHeader.setLsType(10);
        opqueHeader.setLsPacketLen(48);
        opqueHeader.setLsCheckSum(10);
        opqueHeader.setAge(4);
        opqueHeader.setOpaqueId(1);
        opqueHeader.setOpaqueType(10);
        opqueHeader.setLsSequenceNo(250);
        opqueHeader.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
        opqueHeader.setOptions(2);
        opaqueLsa10 = new OpaqueLsa10(opqueHeader);
        routerTlv = new RouterTlv(new TlvHeader());
        opaqueLsa10.addValue(routerTlv);
        channelBuffer = ChannelBuffers.copiedBuffer(packet);
        result = opaqueLsa10.getLsaBodyAsByteArray();
        assertThat(result, is(notNullValue()));
    }

    /**
     * Tests getLsaBodyAsByteArray() method.
     */
    @Test(expected = Exception.class)
    public void testGetLsaBodyAsByteArray2() throws Exception {
        opqueHeader = new OpaqueLsaHeader();
        opqueHeader.setLsType(10);
        opqueHeader.setLsPacketLen(48);
        opqueHeader.setLsCheckSum(10);
        opqueHeader.setAge(4);
        opqueHeader.setOpaqueId(1);
        opqueHeader.setOpaqueType(10);
        opqueHeader.setLsSequenceNo(250);
        opqueHeader.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
        opqueHeader.setOptions(2);
        opaqueLsa10 = new OpaqueLsa10(opqueHeader);
        linkTlv = new LinkTlv(new TlvHeader());
        opaqueLsa10.addValue(linkTlv);
        channelBuffer = ChannelBuffers.copiedBuffer(packet);
        opaqueLsa10.readFrom(channelBuffer);
        result = opaqueLsa10.getLsaBodyAsByteArray();
        assertThat(result, is(notNullValue()));
    }

    /**
     * Tests getOspfLsaType() getter method.
     */
    @Test
    public void testGetOspfLsaType() throws Exception {
        opaqueLsa10.setLsType(10);
        ospflsaType = opaqueLsa10.getOspfLsaType();
        assertThat(ospflsaType, is(notNullValue()));
        assertThat(ospflsaType, is(OspfLsaType.AREA_LOCAL_OPAQUE_LSA));
    }

    /**
     * Tests hashCode() method.
     */
    @Test
    public void testHashcode() throws Exception {

        result1 = opaqueLsa10.hashCode();
        assertThat(result1, is(notNullValue()));

    }

    /**
     * Tests topLevelValues() method.
     */
    @Test
    public void testTopLevelValues() throws Exception {

        result2 = opaqueLsa10.topLevelValues();
        assertThat(result2, is(notNullValue()));

    }

}