Move adsal into its own subdirectory.
[controller.git] / opendaylight / sal / api / src / test / java / org / opendaylight / controller / sal / packet / IPv4Test.java
diff --git a/opendaylight/sal/api/src/test/java/org/opendaylight/controller/sal/packet/IPv4Test.java b/opendaylight/sal/api/src/test/java/org/opendaylight/controller/sal/packet/IPv4Test.java
deleted file mode 100644 (file)
index b983428..0000000
+++ /dev/null
@@ -1,680 +0,0 @@
-/*
- * Copyright (c) 2013-2014 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.controller.sal.packet;
-
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.Arrays;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import org.opendaylight.controller.sal.match.Match;
-import org.opendaylight.controller.sal.match.MatchType;
-import org.opendaylight.controller.sal.utils.EtherTypes;
-import org.opendaylight.controller.sal.utils.IPProtocols;
-import org.opendaylight.controller.sal.utils.NetUtils;
-
-public class IPv4Test {
-
-    @Test
-    public void testGetVersion() {
-        IPv4 ip = new IPv4();
-        byte[] ipVersion = { (byte) 4 };
-        ip.hdrFieldsMap.put("Version", ipVersion);
-        byte version = ip.getVersion();
-        Assert.assertTrue(version == (byte) 4);
-    }
-
-    @Test
-    public void testGetHeaderLength() {
-        IPv4 ip = new IPv4();
-        byte[] ipHeaderLength = { 5 };
-        ip.hdrFieldsMap.put("HeaderLength", ipHeaderLength);
-        byte headerLength = (byte) ip.getHeaderLen();
-        Assert.assertTrue(headerLength == 20);
-    }
-
-    @Test
-    public void testGetDiffServ() {
-        IPv4 ip = new IPv4();
-        byte[] ipDiffServ = { 20 };
-        ip.hdrFieldsMap.put("DiffServ", ipDiffServ);
-        byte diffServ = ip.getDiffServ();
-        Assert.assertTrue(diffServ == 20);
-    }
-
-    @Test
-    public void testGetTotalLength() {
-        IPv4 ip = new IPv4();
-        byte[] iptotLength = { 3, -24 };
-        ip.hdrFieldsMap.put("TotalLength", iptotLength);
-        short totalLength = ip.getTotalLength();
-        Assert.assertTrue(totalLength == 1000);
-    }
-
-    @Test
-    public void testGetIdentification() {
-        IPv4 ip = new IPv4();
-        byte[] ipIdentification = { 7, -48 };
-        ip.hdrFieldsMap.put("Identification", ipIdentification);
-        short identification = ip.getIdentification();
-        Assert.assertTrue(identification == 2000);
-    }
-
-    @Test
-    public void testGetFlags() {
-        IPv4 ip = new IPv4();
-        byte[] ipFlags = { 7 };
-        ip.hdrFieldsMap.put("Flags", ipFlags);
-        byte flags = ip.getFlags();
-        Assert.assertTrue(flags == 7);
-    }
-
-    @Test
-    public void testGetTtl() {
-        IPv4 ip = new IPv4();
-        byte[] ipTtl = { 100 };
-        ip.hdrFieldsMap.put("TTL", ipTtl);
-        byte ttl = ip.getTtl();
-        Assert.assertTrue(ttl == 100);
-    }
-
-    @Test
-    public void testGetProtocol() {
-        IPv4 ip = new IPv4();
-        byte[] ipProtocol = { 1 };
-        ip.hdrFieldsMap.put("Protocol", ipProtocol);
-        byte protocol = ip.getProtocol();
-        Assert.assertTrue(protocol == 1);
-
-        Class<? extends Packet> clazz = IPv4.protocolClassMap.get(protocol);
-        Assert.assertTrue(clazz == ICMP.class);
-    }
-
-    @Test
-    public void testGetFragmentOffset() {
-        IPv4 ip = new IPv4();
-        byte[] ipFragmentOffset = { 6, -35 };
-        ip.hdrFieldsMap.put("FragmentOffset", ipFragmentOffset);
-        short fragmentOffset = ip.getFragmentOffset();
-        Assert.assertTrue(fragmentOffset == 1757);
-    }
-
-    @Test
-    public void testGetSourceAddress() {
-        IPv4 ip = new IPv4();
-        byte[] ipSourceAddress = { 10, 110, 31, 55 };
-        ip.hdrFieldsMap.put("SourceIPAddress", ipSourceAddress);
-        int sourceAddress = ip.getSourceAddress();
-        Assert.assertTrue(sourceAddress == 174989111);
-    }
-
-    @Test
-    public void testGetDestinationAddress() {
-        IPv4 ip = new IPv4();
-        byte[] ipDestinationAddress = { 20, 55, 62, 110 };
-        ip.hdrFieldsMap.put("DestinationIPAddress", ipDestinationAddress);
-        int destinationAddress = ip.getDestinationAddress();
-        Assert.assertTrue(destinationAddress == 339164782);
-    }
-
-    @Test
-    public void testSetVersion() {
-        IPv4 ip = new IPv4();
-        byte ipVersion = (byte) 4;
-        ip.setVersion(ipVersion);
-        byte[] version = ip.hdrFieldsMap.get("Version");
-        Assert.assertTrue(version[0] == (byte) 4);
-    }
-
-    @Test
-    public void testSetHeaderLength() {
-        IPv4 ip = new IPv4();
-        byte ipHeaderLength = 5;
-        ip.setHeaderLength(ipHeaderLength);
-        byte[] headerLength = ip.hdrFieldsMap.get("HeaderLength");
-        Assert.assertTrue(headerLength[0] == 5);
-    }
-
-    @Test
-    public void testSetDiffServ() {
-        IPv4 ip = new IPv4();
-        byte ipDiffServ = 20;
-        ip.setDiffServ(ipDiffServ);
-        byte[] diffServ = ip.hdrFieldsMap.get("DiffServ");
-        Assert.assertTrue(diffServ[0] == 20);
-    }
-
-    @Test
-    public void testSetTotalLength() {
-        IPv4 ip = new IPv4();
-        short iptotLength = 1000;
-        ip.setTotalLength(iptotLength);
-        byte[] totalLength = ip.hdrFieldsMap.get("TotalLength");
-        Assert.assertTrue(totalLength[0] == 3);
-        Assert.assertTrue(totalLength[1] == -24);
-
-        ip.setTotalLength((short)84);
-        totalLength = ip.hdrFieldsMap.get("TotalLength");
-        Assert.assertTrue(totalLength[0] == 0);
-        Assert.assertTrue(totalLength[1] == 84);
-    }
-
-    @Test
-    public void testSetIdentification() {
-        IPv4 ip = new IPv4();
-        short ipIdentification = 2000;
-        ip.setIdentification(ipIdentification);
-        byte[] identification = ip.hdrFieldsMap.get("Identification");
-        Assert.assertTrue(identification[0] == 7);
-        Assert.assertTrue(identification[1] == -48);
-    }
-
-    @Test
-    public void testSetFlags() {
-        IPv4 ip = new IPv4();
-        byte ipFlags = 7;
-        ip.setFlags(ipFlags);
-        byte[] flags = ip.hdrFieldsMap.get("Flags");
-        Assert.assertTrue(flags[0] == 7);
-    }
-
-    @Test
-    public void testSetTtl() {
-        IPv4 ip = new IPv4();
-        byte ipTtl = 100;
-        ip.setTtl(ipTtl);
-        byte[] ttl = ip.hdrFieldsMap.get("TTL");
-        Assert.assertTrue(ttl[0] == 100);
-    }
-
-    @Test
-    public void testSetProtocol() {
-        IPv4 ip = new IPv4();
-        byte ipProtocol = 11;
-        ip.setProtocol(ipProtocol);
-        byte[] protocol = ip.hdrFieldsMap.get("Protocol");
-        Assert.assertTrue(protocol[0] == 11);
-    }
-
-    @Test
-    public void testSetFragmentOffset() {
-        IPv4 ip = new IPv4();
-        short ipFragmentOffset = 1757;
-        ip.setFragmentOffset(ipFragmentOffset);
-        byte[] fragmentOffset = ip.hdrFieldsMap.get("FragmentOffset");
-        Assert.assertTrue(fragmentOffset[0] == 6);
-        Assert.assertTrue(fragmentOffset[1] == -35);
-    }
-
-    @Test
-    public void testSetDestinationAddress() {
-        IPv4 ip = new IPv4();
-        int ipDestinationAddress = 339164782;
-        ip.setDestinationAddress(ipDestinationAddress);
-        byte[] destinationAddress = ip.hdrFieldsMap.get("DestinationIPAddress");
-        Assert.assertTrue(destinationAddress[0] == 20);
-        Assert.assertTrue(destinationAddress[1] == 55);
-        Assert.assertTrue(destinationAddress[2] == 62);
-        Assert.assertTrue(destinationAddress[3] == 110);
-    }
-
-    @Test
-    public void testOptions() throws Exception {
-        IPv4 ip = new IPv4();
-        Assert.assertEquals(20, ip.getHeaderLen());
-        Assert.assertEquals(160, ip.getHeaderSize());
-        Assert.assertEquals(0, ip.getfieldnumBits("Options"));
-
-        byte[][] options = {
-            new byte[] {
-                (byte)0x01,
-            },
-            new byte[] {
-                (byte)0x01, (byte)0x02,
-            },
-            new byte[] {
-                (byte)0x01, (byte)0x02, (byte)0x03,
-            },
-            new byte[] {
-                (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04,
-            },
-            null,
-            new byte[] {
-                (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04,
-                (byte)0x05,
-            },
-            new byte[] {
-                (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04,
-                (byte)0x05, (byte)0x06,
-            },
-            new byte[] {
-                (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04,
-                (byte)0x05, (byte)0x06, (byte)0x07,
-            },
-            new byte[] {
-                (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04,
-                (byte)0x05, (byte)0x06, (byte)0x07, (byte)0x08,
-            },
-            new byte[0],
-        };
-
-        byte[][] expected = {
-            new byte[] {
-                (byte)0x01, (byte)0x00, (byte)0x00, (byte)0x00,
-            },
-            new byte[] {
-                (byte)0x01, (byte)0x02, (byte)0x00, (byte)0x00,
-            },
-            new byte[] {
-                (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x00,
-            },
-            new byte[] {
-                (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04,
-            },
-            null,
-            new byte[] {
-                (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04,
-                (byte)0x05, (byte)0x00, (byte)0x00, (byte)0x00,
-            },
-            new byte[] {
-                (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04,
-                (byte)0x05, (byte)0x06, (byte)0x00, (byte)0x00,
-            },
-            new byte[] {
-                (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04,
-                (byte)0x05, (byte)0x06, (byte)0x07, (byte)0x00,
-            },
-            new byte[] {
-                (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04,
-                (byte)0x05, (byte)0x06, (byte)0x07, (byte)0x08,
-            },
-            null,
-        };
-
-        byte[] echo = {
-            (byte)0x11, (byte)0x22, (byte)0x33, (byte)0x44,
-            (byte)0x55, (byte)0x66, (byte)0x77, (byte)0x88,
-            (byte)0x99, (byte)0xaa,
-        };
-        ICMP icmp = new ICMP();
-        icmp.setType((byte)8);
-        icmp.setCode((byte)0);
-        icmp.setIdentifier((short)0xabcd);
-        icmp.setSequenceNumber((short)7777);
-        icmp.setRawPayload(echo);
-
-        ip.setSourceAddress(InetAddress.getByName("192.168.10.20"));
-        ip.setDestinationAddress(InetAddress.getByName("192.168.30.40"));
-        ip.setProtocol(IPProtocols.ICMP.byteValue());
-
-        for (int i = 0; i < options.length; i++) {
-            byte[] opts = options[i];
-            byte[] exp = expected[i];
-
-            // Set IPv4 options.
-            int hlen = 20;
-            int optlen;
-            if (exp != null) {
-                optlen = exp.length;
-                hlen += optlen;
-            } else {
-                optlen = 0;
-            }
-            ip.setOptions(opts);
-            Assert.assertTrue(Arrays.equals(exp, ip.getOptions()));
-            Assert.assertEquals(hlen, ip.getHeaderLen());
-            Assert.assertEquals(hlen * 8, ip.getHeaderSize());
-            Assert.assertEquals(optlen * 8, ip.getfieldnumBits("Options"));
-
-            // Serialize/Deserialize test.
-            ip.setPayload(icmp);
-
-            byte[] raw = ip.serialize();
-            IPv4 newip = new IPv4();
-            newip.deserialize(raw, 0, raw.length * 8);
-            Assert.assertEquals(ip, newip);
-            Assert.assertEquals(icmp, newip.getPayload());
-            Assert.assertTrue(Arrays.equals(exp, newip.getOptions()));
-        }
-    }
-
-    @Test
-    public void testChecksum() {
-        byte header[] = { (byte) 0x45, 00, 00, (byte) 0x3c, (byte) 0x1c,
-                (byte) 0x46, (byte) 0x40, 00, (byte) 0x40, 06, (byte) 0xb1,
-                (byte) 0xe6, (byte) 0xac, (byte) 0x10, (byte) 0x0a,
-                (byte) 0x63, (byte) 0xac, (byte) 0x10, (byte) 0x0a, (byte) 0x0c };
-        byte header2[] = { (byte) 0x45, 00, 00, (byte) 0x73, 00, 00,
-                (byte) 0x40, 00, (byte) 0x40, (byte) 0x11, (byte) 0xb8,
-                (byte) 0x61, (byte) 0xc0, (byte) 0xa8, 00, 01, (byte) 0xc0,
-                (byte) 0xa8, 00, (byte) 0xc7 };
-        byte header3[] = { (byte) 0x45, 00, 00, (byte) 0x47, (byte) 0x73,
-                (byte) 0x88, (byte) 0x40, 00, (byte) 0x40, 06, (byte) 0xA2,
-                (byte) 0xC4, (byte) 0x83, (byte) 0x9F, (byte) 0x0E,
-                (byte) 0x85, (byte) 0x83, (byte) 0x9F, (byte) 0x0E, (byte) 0xA1 };
-        byte header4[] = { (byte) 0x45, 00, 00, (byte) 0x54, 00, 00,
-                (byte) 0x40, 00, (byte) 0x40, 01, (byte) 0xf0, (byte) 0x8e,
-                (byte) 0xc0, (byte) 0xa8, (byte) 0x64, (byte) 0x65,
-                (byte) 0xc0, (byte) 0xa8, (byte) 0x64, (byte) 0x64 };
-        byte header5[] = { (byte) 0x45, 00, 00, (byte) 0x54, 00, 00,
-                (byte) 0x40, 00, (byte) 0x40, 01, (byte) 0xef, (byte) 0x8d,
-                (byte) 0xc0, (byte) 0xa8, (byte) 0x64, (byte) 0x65,
-                (byte) 0xc0, (byte) 0xa8, (byte) 0x65, (byte) 0x65 };
-        byte header6[] = { (byte) 0x45, 00, 00, (byte) 0x54, 00, 00,
-                (byte) 0x40, 00, (byte) 0x40, 01, (byte) 0x0b, (byte) 0x92,
-                (byte) 0xc0, (byte) 0xa8, (byte) 0x64, (byte) 0x65, (byte) 0x9,
-                (byte) 0x9, (byte) 0x1, (byte) 0x1 };
-        byte header7[] = { (byte) 0x45, 00, 00, (byte) 0x54, 00, 00,
-                (byte) 0x40, 00, (byte) 0x40, 01, (byte) 0, (byte) 0,
-                (byte) 0xc0, (byte) 0xa8, (byte) 0x64, (byte) 0x65, (byte) 0x9,
-                (byte) 0x9, (byte) 0x2, (byte) 0x2 };
-
-        IPv4 ip = new IPv4();
-
-        Assert.assertTrue(NetUtils.getUnsignedShort(ip.computeChecksum(header,
-                0)) == 0xB1E6);
-        Assert.assertTrue(NetUtils.getUnsignedShort(ip.computeChecksum(header2,
-                0)) == 0xb861);
-        Assert.assertTrue(NetUtils.getUnsignedShort(ip.computeChecksum(header3,
-                0)) == 0xa2c4);
-        Assert.assertTrue(NetUtils.getUnsignedShort(ip.computeChecksum(header4,
-                0)) == 0xf08e);
-        Assert.assertTrue(NetUtils.getUnsignedShort(ip.computeChecksum(header5,
-                0)) == 0xef8d);
-        Assert.assertTrue(NetUtils.getUnsignedShort(ip.computeChecksum(header6,
-                0)) == 0x0b92);
-        Assert.assertTrue(NetUtils.getUnsignedShort(ip.computeChecksum(header7,
-                0)) == 0x0a91);
-    }
-
-    @Test
-    public void testFullIP() throws UnknownHostException, PacketException {
-        byte[] icmpRawPayload = new byte[] { (byte) 0x38, (byte) 0x26,
-                (byte) 0x9e, (byte) 0x51, (byte) 0x00, (byte) 0x00,
-                (byte) 0x00, (byte) 0x00, (byte) 0x2e, (byte) 0x6a,
-                (byte) 0x08, (byte) 0x00, (byte) 0x00, (byte) 0x00,
-                (byte) 0x00, (byte) 0x00, (byte) 0x10, (byte) 0x11,
-                (byte) 0x12, (byte) 0x13, (byte) 0x14, (byte) 0x15,
-                (byte) 0x16, (byte) 0x17, (byte) 0x18, (byte) 0x19,
-                (byte) 0x1a, (byte) 0x1b, (byte) 0x1c, (byte) 0x1d,
-                (byte) 0x1e, (byte) 0x1f, (byte) 0x20, (byte) 0x21,
-                (byte) 0x22, (byte) 0x23, (byte) 0x24, (byte) 0x25,
-                (byte) 0x26, (byte) 0x27, (byte) 0x28, (byte) 0x29,
-                (byte) 0x2a, (byte) 0x2b, (byte) 0x2c, (byte) 0x2d,
-                (byte) 0x2e, (byte) 0x2f, (byte) 0x30, (byte) 0x31,
-                (byte) 0x32, (byte) 0x33, (byte) 0x34, (byte) 0x35,
-                (byte) 0x36, (byte) 0x37 };
-        ICMP icmp = new ICMP();
-        icmp.setType((byte) 8);
-        icmp.setCode((byte) 0);
-        icmp.setIdentifier((short) 0x46f5);
-        icmp.setSequenceNumber((short) 2);
-        icmp.setRawPayload(icmpRawPayload);
-
-        IPv4 ip = new IPv4();
-        ip.setVersion((byte) 4);
-        ip.setIdentification((short) 5);
-        ip.setDiffServ((byte) 0);
-        ip.setECN((byte) 0);
-        ip.setTotalLength((short) 84);
-        ip.setFlags((byte) 2);
-        ip.setFragmentOffset((short) 0);
-        ip.setTtl((byte) 64);
-        ip.setProtocol(IPProtocols.ICMP.byteValue());
-        ip.setDestinationAddress(InetAddress.getByName("192.168.100.100"));
-        ip.setSourceAddress(InetAddress.getByName("192.168.100.101"));
-        ip.setPayload(icmp);
-
-        Ethernet eth = new Ethernet();
-        eth.setDestinationMACAddress(new byte[] { (byte) 0x98, (byte) 0xfc,
-                (byte) 0x11, (byte) 0x93, (byte) 0x5c, (byte) 0xb8 });
-        eth.setSourceMACAddress(new byte[] { (byte) 0x00, (byte) 0x24,
-                (byte) 0xd7, (byte) 0xa9, (byte) 0xa3, (byte) 0x50 });
-        eth.setEtherType(EtherTypes.IPv4.shortValue());
-        eth.setPayload(ip);
-
-        byte[] stream = eth.serialize();
-
-        Ethernet decEth = new Ethernet();
-        decEth.deserialize(stream, 0, stream.length * NetUtils.NumBitsInAByte);
-
-        IPv4 decIp = (IPv4) decEth.getPayload();
-        Assert.assertFalse(decIp.isCorrupted());
-        Assert.assertTrue(ip.equals(decIp));
-
-        ICMP decIcmp = (ICMP) decIp.getPayload();
-        Assert.assertFalse(decIcmp.isCorrupted());
-        Assert.assertTrue(Arrays.equals(icmpRawPayload, decIcmp.getRawPayload()));
-    }
-
-    @Test
-    public void testGetMatch() throws Exception {
-        IPv4 ip = new IPv4();
-        InetAddress sourceAddress = InetAddress.getByName("172.168.190.15");
-        InetAddress destintationAddress = InetAddress.getByName("23.128.0.11");
-        byte protocol = IPProtocols.TCP.byteValue();
-        byte tos = 7;
-        ip.setVersion((byte) 4);
-        ip.setIdentification((short) 5);
-        ip.setDiffServ(tos);
-        ip.setECN((byte) 0);
-        ip.setTotalLength((short) 84);
-        ip.setFlags((byte) 2);
-        ip.setFragmentOffset((short) 0);
-        ip.setTtl((byte) 64);
-        ip.setProtocol(protocol);
-        ip.setDestinationAddress(destintationAddress);
-        ip.setSourceAddress(sourceAddress);
-
-        Match match = ip.getMatch();
-
-        Assert.assertEquals(sourceAddress, match.getField(MatchType.NW_SRC).getValue());
-        Assert.assertEquals(destintationAddress, match.getField(MatchType.NW_DST).getValue());
-        Assert.assertEquals(protocol, (byte) match.getField(MatchType.NW_PROTO).getValue());
-        Assert.assertEquals(tos, (byte) match.getField(MatchType.NW_TOS).getValue());
-    }
-
-    @Test
-    public void testFragment() throws Exception {
-        byte[] payload1 = new byte[0];
-        byte[] payload2 = {
-            (byte)0x61, (byte)0xd1, (byte)0x3d, (byte)0x51,
-            (byte)0x1b, (byte)0x75, (byte)0xa7, (byte)0x83,
-        };
-        byte[] payload3 = {
-            (byte)0xe7, (byte)0x0f, (byte)0x2d, (byte)0x7e,
-            (byte)0x15, (byte)0xba, (byte)0xe7, (byte)0x6d,
-            (byte)0xb5, (byte)0xc5, (byte)0xb5, (byte)0x37,
-            (byte)0x59, (byte)0xbc, (byte)0x91, (byte)0x43,
-            (byte)0xb5, (byte)0xb7, (byte)0xe4, (byte)0x28,
-            (byte)0xec, (byte)0x62, (byte)0x6b, (byte)0x6a,
-            (byte)0xd1, (byte)0xcb, (byte)0x79, (byte)0x1e,
-            (byte)0xfc, (byte)0x82, (byte)0xf5, (byte)0xb4,
-        };
-
-        // Ensure that the payload is not deserialized if the fragment offset
-        // is not zero.
-        byte proto = IPProtocols.TCP.byteValue();
-        fragmentTest(payload1, proto, (short)0xf250);
-        fragmentTest(payload2, proto, (short)0xf248);
-        fragmentTest(payload3, proto, (short)0xf230);
-
-        proto = IPProtocols.UDP.byteValue();
-        fragmentTest(payload1, proto, (short)0xf245);
-        fragmentTest(payload2, proto, (short)0xf23d);
-        fragmentTest(payload3, proto, (short)0xf225);
-
-        proto = IPProtocols.ICMP.byteValue();
-        fragmentTest(payload1, proto, (short)0xf255);
-        fragmentTest(payload2, proto, (short)0xf24d);
-        fragmentTest(payload3, proto, (short)0xf235);
-
-        // Ensure that the protocol header in the first fragment is
-        // deserialized.
-        proto = IPProtocols.TCP.byteValue();
-        TCP tcp = new TCP();
-        tcp.setSourcePort((short)1234).setDestinationPort((short)32000).
-            setSequenceNumber((int)0xd541f5f8).setAckNumber((int)0x58da787d).
-            setDataOffset((byte)5).setReserved((byte)0).
-            setHeaderLenFlags((short)0x18).setWindowSize((short)0x40e8).
-            setUrgentPointer((short)0x15f7).setChecksum((short)0x0d4e);
-        firstFragmentTest(tcp, payload1, proto, (short)0xdfe6);
-        tcp.setChecksum((short)0xab2a);
-        firstFragmentTest(tcp, payload2, proto, (short)0xdfde);
-        tcp.setChecksum((short)0x1c75);
-        firstFragmentTest(tcp, payload3, proto, (short)0xdfc6);
-
-        proto = IPProtocols.UDP.byteValue();
-        UDP udp = new UDP();
-        udp.setSourcePort((short)53).setDestinationPort((short)45383).
-            setLength((short)(payload1.length + 8)).setChecksum((short)0);
-        firstFragmentTest(udp, payload1, proto, (short)0xdfe7);
-        udp.setLength((short)(payload2.length + 8));
-        firstFragmentTest(udp, payload2, proto, (short)0xdfdf);
-        udp.setLength((short)(payload3.length + 8));
-        firstFragmentTest(udp, payload3, proto, (short)0xdfc7);
-
-        proto = IPProtocols.ICMP.byteValue();
-        ICMP icmp = new ICMP();
-        icmp.setType((byte)8).setCode((byte)0).setIdentifier((short)0x3d1e).
-            setSequenceNumber((short)1);
-        firstFragmentTest(icmp, payload1, proto, (short)0xdff7);
-        firstFragmentTest(icmp, payload2, proto, (short)0xdfef);
-        firstFragmentTest(icmp, payload3, proto, (short)0xdfd7);
-    }
-
-    private void fragmentTest(byte[] payload, byte proto, short checksum)
-        throws Exception {
-        // Construct a fragmented raw IPv4 packet.
-        int ipv4Len = 20;
-        byte[] rawIp = new byte[ipv4Len + payload.length];
-
-        byte ipVersion = 4;
-        byte dscp = 35;
-        byte ecn = 2;
-        byte tos = (byte)((dscp << 2) | ecn);
-        short totalLen = (short)rawIp.length;
-        short id = 22143;
-        short offset = 0xb9;
-        byte ttl = 64;
-        byte[] srcIp = {(byte)0x0a, (byte)0x00, (byte)0x00, (byte)0x01};
-        byte[] dstIp = {(byte)0xc0, (byte)0xa9, (byte)0x66, (byte)0x23};
-
-        rawIp[0] = (byte)((ipVersion << 4) | (ipv4Len >> 2));
-        rawIp[1] = tos;
-        rawIp[2] = (byte)(totalLen >>> Byte.SIZE);
-        rawIp[3] = (byte)totalLen;
-        rawIp[4] = (byte)(id >>> Byte.SIZE);
-        rawIp[5] = (byte)id;
-        rawIp[6] = (byte)(offset >>> Byte.SIZE);
-        rawIp[7] = (byte)offset;
-        rawIp[8] = ttl;
-        rawIp[9] = proto;
-        rawIp[10] = (byte)(checksum >>> Byte.SIZE);
-        rawIp[11] = (byte)checksum;
-        System.arraycopy(srcIp, 0, rawIp, 12, srcIp.length);
-        System.arraycopy(dstIp, 0, rawIp, 16, srcIp.length);
-        System.arraycopy(payload, 0, rawIp, ipv4Len, payload.length);
-
-        // Deserialize.
-        IPv4 ipv4 = new IPv4();
-        ipv4.deserialize(rawIp, 0, rawIp.length * Byte.SIZE);
-
-        Assert.assertEquals(ipVersion, ipv4.getVersion());
-        Assert.assertEquals(ipv4Len, ipv4.getHeaderLen());
-        Assert.assertEquals(dscp, ipv4.getDiffServ());
-        Assert.assertEquals(ecn, ipv4.getECN());
-        Assert.assertEquals(totalLen, ipv4.getTotalLength());
-        Assert.assertEquals(id, ipv4.getIdentification());
-        Assert.assertEquals((byte)0, ipv4.getFlags());
-        Assert.assertEquals(offset, ipv4.getFragmentOffset());
-        Assert.assertEquals(ttl, ipv4.getTtl());
-        Assert.assertEquals(proto, ipv4.getProtocol());
-        Assert.assertEquals(checksum, ipv4.getChecksum());
-        Assert.assertEquals(NetUtils.byteArray4ToInt(srcIp),
-                            ipv4.getSourceAddress());
-        Assert.assertEquals(NetUtils.byteArray4ToInt(dstIp),
-                            ipv4.getDestinationAddress());
-        Assert.assertFalse(ipv4.isCorrupted());
-
-        // payloadClass should not be set if fragment offset is not zero.
-        Assert.assertEquals(null, ipv4.getPayload());
-        Assert.assertArrayEquals(payload, ipv4.getRawPayload());
-    }
-
-    private void firstFragmentTest(Packet payload, byte[] rawPayload,
-                                   byte proto, short checksum)
-        throws Exception {
-        // Construct a raw IPv4 packet with MF flag.
-        int ipv4Len = 20;
-        payload.setRawPayload(rawPayload);
-        byte[] payloadBytes = payload.serialize();
-        byte[] rawIp = new byte[ipv4Len + payloadBytes.length];
-
-        byte ipVersion = 4;
-        byte dscp = 13;
-        byte ecn = 1;
-        byte tos = (byte)((dscp << 2) | ecn);
-        short totalLen = (short)rawIp.length;
-        short id = 19834;
-        byte flags = 0x1;
-        short offset = 0;
-        short off = (short)(((short)flags << 13) | offset);
-        byte ttl = 64;
-        byte[] srcIp = {(byte)0xac, (byte)0x23, (byte)0x5b, (byte)0xfd};
-        byte[] dstIp = {(byte)0xc0, (byte)0xa8, (byte)0x64, (byte)0x71};
-
-        rawIp[0] = (byte)((ipVersion << 4) | (ipv4Len >> 2));
-        rawIp[1] = tos;
-        rawIp[2] = (byte)(totalLen >>> Byte.SIZE);
-        rawIp[3] = (byte)totalLen;
-        rawIp[4] = (byte)(id >>> Byte.SIZE);
-        rawIp[5] = (byte)id;
-        rawIp[6] = (byte)(off >>> Byte.SIZE);
-        rawIp[7] = (byte)off;
-        rawIp[8] = ttl;
-        rawIp[9] = proto;
-        rawIp[10] = (byte)(checksum >>> Byte.SIZE);
-        rawIp[11] = (byte)checksum;
-        System.arraycopy(srcIp, 0, rawIp, 12, srcIp.length);
-        System.arraycopy(dstIp, 0, rawIp, 16, srcIp.length);
-        System.arraycopy(payloadBytes, 0, rawIp, ipv4Len, payloadBytes.length);
-
-        // Deserialize.
-        IPv4 ipv4 = new IPv4();
-        ipv4.deserialize(rawIp, 0, rawIp.length * Byte.SIZE);
-
-        Assert.assertEquals(ipVersion, ipv4.getVersion());
-        Assert.assertEquals(ipv4Len, ipv4.getHeaderLen());
-        Assert.assertEquals(dscp, ipv4.getDiffServ());
-        Assert.assertEquals(ecn, ipv4.getECN());
-        Assert.assertEquals(totalLen, ipv4.getTotalLength());
-        Assert.assertEquals(id, ipv4.getIdentification());
-        Assert.assertEquals(flags, ipv4.getFlags());
-        Assert.assertEquals(offset, ipv4.getFragmentOffset());
-        Assert.assertEquals(ttl, ipv4.getTtl());
-        Assert.assertEquals(proto, ipv4.getProtocol());
-        Assert.assertEquals(checksum, ipv4.getChecksum());
-        Assert.assertEquals(NetUtils.byteArray4ToInt(srcIp),
-                            ipv4.getSourceAddress());
-        Assert.assertEquals(NetUtils.byteArray4ToInt(dstIp),
-                            ipv4.getDestinationAddress());
-        Assert.assertFalse(ipv4.isCorrupted());
-
-        // Protocol header in the first fragment should be deserialized.
-        Assert.assertEquals(null, ipv4.getRawPayload());
-
-        Packet desPayload = ipv4.getPayload();
-        Assert.assertEquals(payload, desPayload);
-        Assert.assertFalse(desPayload.isCorrupted());
-        Assert.assertArrayEquals(rawPayload, desPayload.getRawPayload());
-    }
-}