/******************************************************************************* * This file is part of OpenNMS(R). * * Copyright (C) 2011 The OpenNMS Group, Inc. * OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc. * * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. * * OpenNMS(R) is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published * by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * OpenNMS(R) is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenNMS(R). If not, see: * http://www.gnu.org/licenses/ * * For more information contact: * OpenNMS(R) Licensing <license@opennms.org> * http://www.opennms.org/ * http://www.opennms.com/ *******************************************************************************/ package org.opennms.jicmp.ip; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.sameInstance; import static org.junit.Assert.assertThat; import java.net.InetAddress; import java.nio.ByteBuffer; import org.junit.Test; import org.opennms.jicmp.ip.ICMPPacket.Type; import org.opennms.jicmp.ip.IPPacket.Protocol; import org.opennms.jicmp.jna.NativeDatagramPacket; /** * IPPacketTest * * @author brozow */ public class PacketTest { byte[] ip = new byte[] { (byte)0x45, (byte)0x00, (byte)0x40, (byte)0x00, (byte)0x1e, (byte)0x92, (byte)0x00, (byte)0x00, (byte)0x80, (byte)0x01, (byte)0x00, (byte)0x00, (byte)0x7f, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x7f, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x00, (byte)0x5e, (byte)0xf6, (byte)0xa8, (byte)0xfc, (byte)0x00, (byte)0xfa, (byte)0x00, (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04, (byte)0x05, (byte)0x06, (byte)0x07, (byte)0x08, (byte)0x09, (byte)0x0a, (byte)0x0b, (byte)0x0c, (byte)0x0d, (byte)0x0e, (byte)0x0f, (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, }; @Test public void testIPHeaderGets() throws Exception { IPPacket pkt = new IPPacket(ip, 0, ip.length); // test header data assertThat(pkt.getVersion(), is(equalTo(4))); assertThat(pkt.getHeaderLength(), is(equalTo(20))); assertThat(pkt.getTimeToLive(), is(equalTo(128))); assertThat(pkt.getProtocol(), is(equalTo(Protocol.ICMP))); assertThat(pkt.getSourceAddress(), is(equalTo(InetAddress.getByName("127.0.0.1")))); assertThat(pkt.getDestinationAddress(), is(equalTo(InetAddress.getByName("127.0.0.1")))); // payload 64 bytes: ICMP header (8 bytes) followed by byte values 1, 2, 3, ... 55, 56 ByteBuffer payload = pkt.getPayload(); assertThat(payload.remaining(), is(equalTo(64))); assertThat(payload.capacity(), is(equalTo(64))); assertThat(payload.position(), is(equalTo(0))); assertThat(payload.get(8), is(equalTo((byte)0))); assertThat(payload.get(16), is(equalTo((byte)8))); assertThat(payload.get(24), is(equalTo((byte)16))); } @Test public void testICMPPacketGets() throws Exception { IPPacket pkt = new IPPacket(ip, 0, ip.length); assertThat(pkt.getProtocol(), is(equalTo(Protocol.ICMP))); // payload 64 bytes: ICMP header (8 bytes) followed by byte values 1, 2, 3, ... 55, 56 ByteBuffer payload = pkt.getPayload(); ICMPPacket icmpPacket = new ICMPPacket(payload); assertThat(icmpPacket.getType(), is(equalTo(Type.EchoReply))); assertThat(icmpPacket.getCode(), is(equalTo(0))); assertThat(icmpPacket.getChecksum(), is(equalTo(24310))); assertThat(icmpPacket.getChecksum(), is(equalTo(icmpPacket.computeChecksum()))); ICMPEchoPacket echoReply = new ICMPEchoPacket(icmpPacket); assertThat(echoReply.getIdentifier(), is(equalTo(43260))); assertThat(echoReply.getSequenceNumber(), is(equalTo(250))); ByteBuffer content = echoReply.getContentBuffer(); for(int i = 0; i < 56; i++) { assertThat(content.get(i), is(equalTo((byte)i))); } } @Test public void testICMPPacketSets() throws Exception { // payload 64 bytes: ICMP header (8 bytes) followed by byte values 0, 1, 2, 3, ... 54, 55 byte[] bytes = new byte[64]; ByteBuffer buf = ByteBuffer.wrap(bytes, 0, 64); ICMPPacket icmpPacket = new ICMPPacket(buf); ICMPEchoPacket echoRequest = new ICMPEchoPacket(icmpPacket); echoRequest.setType(Type.EchoRequest); echoRequest.setCode(0); echoRequest.setIdentifier(0x1234); echoRequest.setSequenceNumber(0x5678); ByteBuffer content = echoRequest.getContentBuffer(); for(int i = 0; i < 56; i++) { content.put((byte)i); } echoRequest.setChecksum(); // check sum is 0x9840 assertThat(bytes[0], is(equalTo((byte)8))); // icmp type assertThat(bytes[1], is(equalTo((byte)0))); // icmp code (zero for echo pkts) assertThat(bytes[2], is(equalTo((byte)0x98))); // checksum hi assertThat(bytes[3], is(equalTo((byte)0x40))); // checksum lo assertThat(bytes[4], is(equalTo((byte)0x12))); // id hi assertThat(bytes[5], is(equalTo((byte)0x34))); // id lo assertThat(bytes[6], is(equalTo((byte)0x56))); // seq_num hi assertThat(bytes[7], is(equalTo((byte)0x78))); // seq_num lo for(int i = 0; i < 56; i++) { assertThat(bytes[8+i], is(equalTo((byte)i))); } NativeDatagramPacket pkt = echoRequest.toDatagramPacket(InetAddress.getByName("127.0.0.1")); assertThat(pkt.getAddress(), is(equalTo(InetAddress.getByName("127.0.0.1")))); assertThat(pkt.getPort(), is(equalTo(0))); ByteBuffer data = pkt.getContent(); assertThat(data.position(), is(equalTo(0))); assertThat(data.limit(), is(equalTo(64))); assertThat(data.remaining(), is(equalTo(64))); assertThat(data.hasArray(), is(true)); assertThat(data.array(), is(sameInstance(bytes))); assertThat(data.arrayOffset(), is(equalTo(0))); } }