/**
 *    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 net.onrc.onos.packet;

import net.onrc.onos.packet.LLDPOrganizationalTLV;

import org.junit.Test;

import java.nio.ByteBuffer;
import java.nio.charset.Charset;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

public class LLDPOrganizationalTLVTest {
    private final byte[] expected = new byte[] {
        //  Type: 127, Length: 13
        (byte) 254, 13,
        // OpenFlow OUI: 00-26-E1
        0x0, 0x26, (byte)0xe1,
        //  SubType: 12
        0xc,
        //  Bytes in "ExtraInfo"
        0x45, 0x78, 0x74, 0x72, 0x61, 0x49, 0x6e, 0x66, 0x6f
    };

    @Test(expected = IllegalArgumentException.class)
    public void testShortOUI() {
        LLDPOrganizationalTLV tlv = new LLDPOrganizationalTLV();
        tlv.setOUI(new byte[2]);
    }

    @Test(expected = IllegalArgumentException.class)
    public void testLongOUI() {
        LLDPOrganizationalTLV tlv = new LLDPOrganizationalTLV();
        tlv.setOUI(new byte[4]);
    }

    @Test(expected = IllegalArgumentException.class)
    public void testLongInfoString() {
        LLDPOrganizationalTLV tlv = new LLDPOrganizationalTLV();
        tlv.setInfoString(new byte[LLDPOrganizationalTLV.MAX_INFOSTRING_LENGTH + 1]);
    }

    @Test
    public void testMaxInfoString() {
        LLDPOrganizationalTLV tlv = new LLDPOrganizationalTLV();
        tlv.setInfoString(new byte[LLDPOrganizationalTLV.MAX_INFOSTRING_LENGTH]);
    }

    @Test
    public void testInfoString() {
        LLDPOrganizationalTLV tlv = new LLDPOrganizationalTLV();
        tlv.setInfoString("ExtraInfo");
        assertThat(tlv.getInfoString(), is("ExtraInfo".getBytes(Charset.forName("UTF-8"))));
    }

    @Test
    public void testSerialize() {
        LLDPOrganizationalTLV tlv = new LLDPOrganizationalTLV();
        tlv.setLength((short) 13);
        // OpenFlow OUI is 00-26-E1
        tlv.setOUI(new byte[] {0x0, 0x26, (byte) 0xe1});
        tlv.setSubType((byte) 12);
        tlv.setInfoString("ExtraInfo".getBytes(Charset.forName("UTF-8")));

        assertThat(tlv.getType(), is((byte)127));
        assertThat(tlv.getLength(), is((short)13));
        assertThat(tlv.getOUI(), is(new byte[] {0x0, 0x26, (byte) 0xe1}));
        assertThat(tlv.getSubType(), is((byte)12));
        assertThat(tlv.serialize(), is(expected));
    }

    @Test
    public void testDeserialize() {
        LLDPOrganizationalTLV tlv = new LLDPOrganizationalTLV();
        tlv.deserialize(ByteBuffer.wrap(expected));

        assertThat(tlv.getType(), is((byte)127));
        assertThat(tlv.getLength(), is((short)13));
        assertThat(tlv.getOUI(), is(new byte[] {0x0, 0x26, (byte) 0xe1}));
        assertThat(tlv.getSubType(), is((byte)12));
        assertThat(tlv.getInfoString(), is("ExtraInfo".getBytes(Charset.forName("UTF-8"))));
    }
}
