/**
 *    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.core.packet;

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

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

import org.junit.Test;

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"))));
    }
}
