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

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.util.Arrays;

import net.onrc.onos.packet.BSN;
import net.onrc.onos.packet.BSNPROBE;
import net.onrc.onos.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);
    }
}
