pcap: Move plugins to their own sub-directory
[deliverable/tracecompass.git] / pcap / org.eclipse.tracecompass.pcap.core.tests / src / org / eclipse / tracecompass / pcap / core / tests / protocol / tcp / TCPPacketTest.java
1 /*******************************************************************************
2 * Copyright (c) 2014 Ericsson
3 *
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *
9 * Contributors:
10 * Vincent Perot - Initial API and implementation
11 *******************************************************************************/
12
13 package org.eclipse.tracecompass.pcap.core.tests.protocol.tcp;
14
15 import static org.junit.Assert.assertEquals;
16 import static org.junit.Assert.assertFalse;
17 import static org.junit.Assert.assertTrue;
18 import static org.junit.Assert.fail;
19 import static org.junit.Assume.assumeTrue;
20
21 import java.io.IOException;
22 import java.nio.ByteBuffer;
23 import java.nio.ByteOrder;
24 import java.util.Arrays;
25 import java.util.LinkedHashMap;
26 import java.util.Map;
27
28 import org.eclipse.tracecompass.internal.pcap.core.packet.BadPacketException;
29 import org.eclipse.tracecompass.internal.pcap.core.protocol.PcapProtocol;
30 import org.eclipse.tracecompass.internal.pcap.core.protocol.tcp.TCPEndpoint;
31 import org.eclipse.tracecompass.internal.pcap.core.protocol.tcp.TCPPacket;
32 import org.eclipse.tracecompass.internal.pcap.core.trace.BadPcapFileException;
33 import org.eclipse.tracecompass.internal.pcap.core.trace.PcapFile;
34 import org.eclipse.tracecompass.pcap.core.tests.shared.PcapTestTrace;
35 import org.junit.Before;
36 import org.junit.Test;
37
38 /**
39 * JUnit Class that tests the TCPPacket class and its method.
40 *
41 * @author Vincent Perot
42 */
43 public class TCPPacketTest {
44
45 private static final Map<String, String> EXPECTED_FIELDS;
46 static {
47 EXPECTED_FIELDS = new LinkedHashMap<>();
48 EXPECTED_FIELDS.put("Source Port", "18057");
49 EXPECTED_FIELDS.put("Destination Port", "39611");
50 EXPECTED_FIELDS.put("Sequence Number", "2575857510");
51 EXPECTED_FIELDS.put("Acknowledgement Number", "1430532898");
52 EXPECTED_FIELDS.put("Length", "24 bytes");
53 EXPECTED_FIELDS.put("ECN-Nonce Flag", "true");
54 EXPECTED_FIELDS.put("Congestion Window Reduced Flag", "false");
55 EXPECTED_FIELDS.put("ECN-Echo Flag", "true");
56 EXPECTED_FIELDS.put("Urgent Flag", "false");
57 EXPECTED_FIELDS.put("ACK Flag", "true");
58 EXPECTED_FIELDS.put("PSH Flag", "false");
59 EXPECTED_FIELDS.put("RST Flag", "true");
60 EXPECTED_FIELDS.put("SYN Flag", "false");
61 EXPECTED_FIELDS.put("FIN Flag", "true");
62 EXPECTED_FIELDS.put("Window Size Value", "4352");
63 EXPECTED_FIELDS.put("Checksum", "0xffee");
64 EXPECTED_FIELDS.put("Urgent Pointer", "0xddcc");
65 EXPECTED_FIELDS.put("Options", "ad da bc cb");
66 }
67
68 private static final String EXPECTED_TOSTRING;
69 static {
70 StringBuilder sb = new StringBuilder();
71 sb.append("Transmission Control Protocol, Source Port: 18057, Destination Port: 39611\n");
72 sb.append("Sequence Number: 2575857510, Acknowledgment Number: 1430532898\n");
73 sb.append("Header length: 24 bytes, Data length: 4\n");
74 sb.append("Window size value: 4352, Urgent Pointer: 0xddcc\n");
75 sb.append("Checksum: 0xffee\n");
76 sb.append("Payload: 99 88 77 66");
77
78 EXPECTED_TOSTRING = sb.toString();
79 }
80
81 private ByteBuffer fPacket;
82
83 /**
84 * Initialize the packet.
85 */
86 @Before
87 public void initialize() {
88 fPacket = ByteBuffer.allocate(28);
89 fPacket.order(ByteOrder.BIG_ENDIAN);
90
91 // Source Port
92 fPacket.put((byte) 0x46);
93 fPacket.put((byte) 0x89);
94
95 // Destination Port
96 fPacket.put((byte) 0x9A);
97 fPacket.put((byte) 0xBB);
98
99 // Sequence Number
100 fPacket.put((byte) 0x99);
101 fPacket.put((byte) 0x88);
102 fPacket.put((byte) 0x77);
103 fPacket.put((byte) 0x66);
104
105 // Acknowledgment Number
106 fPacket.put((byte) 0x55);
107 fPacket.put((byte) 0x44);
108 fPacket.put((byte) 0x33);
109 fPacket.put((byte) 0x22);
110
111 // Data Offset + Reserved + NS
112 fPacket.put((byte) 0x61);
113
114 // Other flags
115 fPacket.put((byte) 0b01010101);
116
117 // Window Size
118 fPacket.put((byte) 0x11);
119 fPacket.put((byte) 0x00);
120
121 // Checksum
122 fPacket.put((byte) 0xFF);
123 fPacket.put((byte) 0xEE);
124
125 // Urgent Pointer
126 fPacket.put((byte) 0xDD);
127 fPacket.put((byte) 0xCC);
128
129 // Options - 4 bytes
130 fPacket.put((byte) 0xAD);
131 fPacket.put((byte) 0xDA);
132 fPacket.put((byte) 0xBC);
133 fPacket.put((byte) 0xCB);
134
135 // Payload - 4 bytes
136 fPacket.put((byte) 0x99);
137 fPacket.put((byte) 0x88);
138 fPacket.put((byte) 0x77);
139 fPacket.put((byte) 0x66);
140
141 fPacket.flip();
142 }
143
144 /**
145 * Test that verify the correctness of the TCPPacket's methods.
146 * @throws BadPcapFileException
147 * Thrown when the file is erroneous. Fails the test.
148 * @throws IOException
149 * Thrown when an IO error occurs. Fails the test.
150 * @throws BadPacketException
151 * Thrown when a packet is erroneous. Fails the test.
152 */
153 @Test
154 public void CompleteTCPPacketTest() throws BadPacketException, IOException, BadPcapFileException {
155 PcapTestTrace trace = PcapTestTrace.MOSTLY_TCP;
156 assumeTrue(trace.exists());
157 try (PcapFile dummy = new PcapFile(trace.getPath())) {
158 ByteBuffer byteBuffer = fPacket;
159 if (byteBuffer == null) {
160 fail("CompleteTCPPacketTest has failed!");
161 return;
162 }
163 TCPPacket packet = new TCPPacket(dummy, null, byteBuffer);
164
165 // Protocol Testing
166 assertEquals(PcapProtocol.TCP, packet.getProtocol());
167 assertTrue(packet.hasProtocol(PcapProtocol.TCP));
168 assertTrue(packet.hasProtocol(PcapProtocol.UNKNOWN));
169 assertFalse(packet.hasProtocol(PcapProtocol.IPV4));
170
171 // Abstract methods Testing
172 assertTrue(packet.validate());
173 assertEquals(-677046102, packet.hashCode());
174 assertFalse(packet.equals(null));
175 assertEquals(new TCPPacket(dummy, null, byteBuffer), packet);
176
177 assertEquals(EXPECTED_FIELDS, packet.getFields());
178 assertEquals(EXPECTED_TOSTRING, packet.toString());
179 assertEquals("Src Port: 18057, Dst Port: 39611, Seq: 2575857510, Ack: 1430532898, Len: 24", packet.getLocalSummaryString());
180 assertEquals("18057 > 39611 [ACK, FIN, RST, NS, ECE] Seq=2575857510 Ack=1430532898 Len=24", packet.getGlobalSummaryString());
181
182 assertEquals(new TCPEndpoint(packet, true), packet.getSourceEndpoint());
183 assertEquals(new TCPEndpoint(packet, false), packet.getDestinationEndpoint());
184
185 fPacket.position(24);
186 byte[] payload = new byte[4];
187 fPacket.get(payload);
188 assertEquals(ByteBuffer.wrap(payload), packet.getPayload());
189
190 // Packet-specific methods Testing
191 assertEquals(0x4689, packet.getSourcePort());
192 assertEquals(0x9ABB, packet.getDestinationPort());
193 assertEquals(2575857510L, packet.getSequenceNumber());
194 assertEquals(1430532898L, packet.getAcknowledgmentNumber());
195 assertEquals(6, packet.getDataOffset());
196 assertEquals(0, packet.getReservedField());
197 assertEquals(true, packet.isNSFlagSet());
198 assertEquals(false, packet.isCongestionWindowReducedFlagSet());
199 assertEquals(true, packet.isECNEchoFlagSet());
200 assertEquals(false, packet.isUrgentFlagSet());
201 assertEquals(true, packet.isAcknowledgeFlagSet());
202 assertEquals(false, packet.isPushFlagSet());
203 assertEquals(true, packet.isResetFlagSet());
204 assertEquals(false, packet.isSynchronizationFlagSet());
205 assertEquals(true, packet.isFinalFlagSet());
206 assertEquals(4352, packet.getWindowSize());
207 assertEquals(65518, packet.getChecksum());
208 assertEquals(56780, packet.getUrgentPointer());
209 assertTrue(Arrays.equals(packet.getOptions(), Arrays.copyOfRange(fPacket.array(), 20, 24)));
210
211 }
212 }
213 }
This page took 0.034419 seconds and 5 git commands to generate.