/*
 * Copyright 2016 Open Networking Laboratory
 *
 * 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.ospfpacket;

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 static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;

/**
 * Unit test class for OspfMessageReader.
 */

public class OspfMessageReaderTest {

    private final byte[] packet1 = {1, 1, 1, 1, 2, 1, 0, 44, -64, -88, -86, 8,
            0, 0, 0, 1, 39, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0,
            10, 2, 1, 0, 0, 0, 40, -64, -88, -86, 8, 0, 0, 0, 0};
    private final byte[] packet2 = {1, 1, 1, 1, 2, 2, 0, 52, -64, -88, -86, 8, 0,
            0, 0, 1, -96, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, -36, 2, 7, 65, 119,
            -87, 126, 0, 23, 2, 1, 10, 10, 10, 10, 10, 10, 10, 10, -128, 0, 0, 6,
            -69, 26, 0, 36};
    private final byte[] packet3 = {1, 1, 1, 1, 2, 3, 0, 36, -64, -88, -86, 3, 0,
            0, 0, 1, -67, -57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -64, -88,
            -86, 8, -64, -88, -86, 8};
    private final byte[] packet4 = {1, 1, 1, 1, 2, 4, 1, 36, -64, -88, -86, 3, 0,
            0, 0, 1, 54, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0,
            2, 2, 1, -64, -88, -86, 3, -64, -88, -86, 3, -128, 0,
            0, 1, 58, -100, 0, 48, 2, 0, 0, 2, -64, -88, -86,
            0, -1, -1, -1, 0, 3, 0, 0, 10, -64, -88, -86, 0,
            -1, -1, -1, 0, 3, 0, 0, 10, 0, 3, 2, 5, 80, -44,
            16, 0, -64, -88, -86, 2, -128, 0, 0, 1, 42, 73, 0,
            36, -1, -1, -1, -1, -128, 0, 0, 20, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 3, 2, 5, -108, 121, -85, 0, -64, -88,
            -86, 2, -128, 0, 0, 1, 52, -91, 0, 36, -1, -1, -1,
            0, -128, 0, 0, 20, -64, -88, -86, 1, 0, 0, 0, 0, 0,
            3, 2, 5, -64, -126, 120, 0, -64, -88, -86, 2, -128, 0,
            0, 1, -45, 25, 0, 36, -1, -1, -1, 0, -128, 0, 0, 20,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 5, -64, -88, 0, 0,
            -64, -88, -86, 2, -128, 0, 0, 1, 55, 8, 0, 36, -1, -1,
            -1, 0, -128, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            3, 2, 5, -64, -88, 1, 0, -64, -88, -86, 2, -128, 0, 0,
            1, 44, 18, 0, 36, -1, -1, -1, 0, -128, 0, 0, 20, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 3, 2, 5, -64, -88, -84, 0, -64,
            -88, -86, 2, -128, 0, 0, 1, 51, 65, 0, 36, -1, -1, -1, 0,
            -128, 0, 0, 20, -64, -88, -86, 10, 0, 0, 0, 0};
    private final byte[] packet5 = {1, 1, 1, 1, 2, 5, 0, 44, -64, -88, -86, 8, 0, 0,
            0, 1, -30, -12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 16, 2, 1, -64, -88, -86,
            2, -64, -88, -86, 2, -128, 0, 0, 1, 74, -114, 0, 48};
    private OspfMessageReader ospfMessageReader;
    private ChannelBuffer channelBuffer;

    @Before
    public void setUp() throws Exception {
        ospfMessageReader = new OspfMessageReader();
    }

    @After
    public void tearDown() throws Exception {
        ospfMessageReader = null;
        channelBuffer = null;
    }

    /**
     * Tests readFromBuffer() method.
     */
    @Test
    public void testReadFromBuffer() throws Exception {
        channelBuffer = ChannelBuffers.copiedBuffer(packet1);
        ospfMessageReader.readFromBuffer(channelBuffer);

        channelBuffer = ChannelBuffers.copiedBuffer(packet2);
        ospfMessageReader.readFromBuffer(channelBuffer);

        channelBuffer = ChannelBuffers.copiedBuffer(packet3);
        ospfMessageReader.readFromBuffer(channelBuffer);

        channelBuffer = ChannelBuffers.copiedBuffer(packet4);
        ospfMessageReader.readFromBuffer(channelBuffer);

        channelBuffer = ChannelBuffers.copiedBuffer(packet5);
        ospfMessageReader.readFromBuffer(channelBuffer);
        assertThat(ospfMessageReader, is(notNullValue()));

    }
}