/**
*    Copyright 2011, Big Switch Networks, Inc. 
*    Originally created by David Erickson, Stanford University
* 
*    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.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.util.Arrays;

import net.onrc.onos.core.packet.BSN;
import net.onrc.onos.core.packet.BSNPROBE;
import net.onrc.onos.core.packet.Ethernet;

import org.junit.Test;

/**
 *
 * @author David Erickson (daviderickson@cs.stanford.edu)
 *
 */
public class BSNTest {       
    protected byte[] probePkt = {
		0x00, 0x00, 0x00, 0x00, 0x00, 0x01, // src mac
		0x00, 0x00, 0x00, 0x00, 0x00, 0x04, // dst mac
		(byte) 0x89, 0x42, // BSN type
        0x20, 0x00, 0x06, 0x04, 0x00, 0x01, 0x00, 0x00, // BSN header
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // controller id
		0x00, 0x00, 0x00, 0x03, // sequence id
		0x00, 0x00, 0x00, 0x00, 0x00, 0x01, // src mac
		0x00, 0x00, 0x00, 0x00, 0x00, 0x04, // dst mac
		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, // switch dpid
		0x00, 0x00, 0x00, 0x01 // port number
    };
    
    protected Ethernet getProbePacket() {
        return (Ethernet) new Ethernet()
            .setSourceMACAddress("00:00:00:00:00:04")
            .setDestinationMACAddress("00:00:00:00:00:01")
            .setEtherType(Ethernet.TYPE_BSN)
            .setPayload(new BSN(BSN.BSN_TYPE_PROBE)
	            .setPayload(new BSNPROBE()
		            .setSequenceId(3)
		            .setSrcMac(new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x01})
		            .setDstMac(new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x04})
		            .setSrcSwDpid(0x06)
		            .setSrcPortNo(0x01)
		            )
	            );
    }

    @Test
    public void testSerialize() throws Exception {
        Ethernet pkt = getProbePacket();
        byte[] serialized = pkt.serialize();
        assertTrue(Arrays.equals(probePkt, serialized));
    }

    @Test
    public void testDeserialize() throws Exception {
        Ethernet pkt = (Ethernet) new Ethernet().deserialize(probePkt, 0, probePkt.length);
        assertTrue(Arrays.equals(probePkt, pkt.serialize()));

        Ethernet expected = getProbePacket();
        assertEquals(expected, pkt);
    }
}
