Commit a2b06200 authored by Brickner_cp's avatar Brickner_cp

Better comparison to Wireshark.

Improved Ethernet FCS.
parent cdf717f9
......@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using PcapDotNet.Base;
using PcapDotNet.Core.Extensions;
using PcapDotNet.Packets;
using Microsoft.VisualStudio.TestTools.UnitTesting;
......@@ -160,7 +161,7 @@ namespace PcapDotNet.Core.Test
TestReceivePackets(NumPacketsToSend, NumPacketsToSend / 2, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.Ok, NumPacketsToSend / 2, 0, 0.02);
// Wait for more packets
TestReceivePackets(NumPacketsToSend, 0, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.None, NumPacketsToSend, 2, 2.071);
TestReceivePackets(NumPacketsToSend, 0, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.None, NumPacketsToSend, 2, 2.14);
TestReceivePackets(NumPacketsToSend, -1, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.None, NumPacketsToSend, 2, 2.3);
TestReceivePackets(NumPacketsToSend, NumPacketsToSend + 1, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.None, NumPacketsToSend, 2, 2.051);
......@@ -570,30 +571,30 @@ namespace PcapDotNet.Core.Test
communicator.SetSamplingMethod(new SamplingMethodFirstAfterInterval(TimeSpan.FromSeconds(1)));
int numPacketsGot;
communicator.ReceiveSomePackets(out numPacketsGot, 100, p => { });
Packet expectedPacket = _random.NextEthernetPacket(60, sourceMac, destinationMac);
Packet[] packetsToSend = new Packet[11];
packetsToSend[0] = _random.NextEthernetPacket(60, sourceMac, destinationMac);
for (int i = 0; i != 10; ++i)
packetsToSend[i + 1] = _random.NextEthernetPacket(60 * (i + 2), sourceMac, destinationMac);
List<Packet> packets = new List<Packet>(6);
Thread thread = new Thread(() => packets.AddRange(communicator.ReceivePackets(6)));
thread.Start();
communicator.SendPacket(expectedPacket);
Thread.Sleep(TimeSpan.FromSeconds(0.75));
communicator.SendPacket(packetsToSend[0]);
Thread.Sleep(TimeSpan.FromSeconds(0.7));
for (int i = 0; i != 10; ++i)
{
expectedPacket = _random.NextEthernetPacket(60 * (i + 2), sourceMac, destinationMac);
communicator.SendPacket(expectedPacket);
Thread.Sleep(TimeSpan.FromSeconds(0.5));
communicator.SendPacket(packetsToSend[i + 1]);
Thread.Sleep(TimeSpan.FromSeconds(0.55));
}
if (!thread.Join(TimeSpan.FromSeconds(10)))
thread.Abort();
Assert.AreEqual(6, packets.Count);
Assert.AreEqual(6, packets.Count, packets.Select(p => (p.Timestamp-packets[0].Timestamp).TotalSeconds + "(" + p.Length + ")").SequenceToString(", "));
Packet packet;
for (int i = 0; i != 6; ++i)
{
// result = communicator.ReceivePacket(out packet);
// Assert.AreEqual(PacketCommunicatorReceiveResult.Ok, result);
// Assert.AreEqual(60 * (i * 2 + 1), packet.Length, i.ToString());
Assert.AreEqual(60 * (i * 2 + 1), packets[i].Length, i.ToString());
}
PacketCommunicatorReceiveResult result = communicator.ReceivePacket(out packet);
Assert.AreEqual(PacketCommunicatorReceiveResult.Timeout, result);
Assert.IsNull(packet);
......
......@@ -213,7 +213,7 @@ namespace PcapDotNet.Core.Test
}
else
{
const byte RetryNumber = 244;
const byte RetryNumber = 89;
pcapFilename = Path.GetTempPath() + "temp." + RetryNumber + ".pcap";
List<Packet> packetsList = new List<Packet>();
new OfflinePacketDevice(pcapFilename).Open().ReceivePackets(1000, packetsList.Add);
......@@ -630,6 +630,7 @@ namespace PcapDotNet.Core.Test
field.Show().StartsWith("Stream identifier (with option length = ") ||
field.Show().Contains("with too") ||
field.Show().Contains(" bytes says option goes past end of options") ||
field.Show().Contains("(length byte past end of options)") ||
field.Fields().First().Show().StartsWith("Pointer: ") && field.Fields().First().Show().EndsWith(" (points to middle of address)") ||
field.Fields().Where(value => value.Show() == "(suboption would go past end of option)").Count() != 0, field.Show());
break;
......@@ -803,15 +804,28 @@ namespace PcapDotNet.Core.Test
break;
case "data":
field.AssertValue(((IcmpIpV4HeaderPlus64BitsPayloadDatagram)icmpDatagram).IpV4.Payload);
var casted1 = icmpDatagram as IcmpIpV4HeaderPlus64BitsPayloadDatagram;
if (casted1 != null)
field.AssertValue(casted1.IpV4.Payload);
else
field.AssertValue(icmpDatagram.Payload);
break;
case "data.data":
field.AssertShow(((IcmpIpV4HeaderPlus64BitsPayloadDatagram)icmpDatagram).IpV4.Payload);
var casted2 = icmpDatagram as IcmpIpV4HeaderPlus64BitsPayloadDatagram;
if (casted2 != null)
field.AssertShow(casted2.IpV4.Payload);
else
field.AssertShow(icmpDatagram.Payload);
break;
case "data.len":
field.AssertShowDecimal(((IcmpIpV4HeaderPlus64BitsPayloadDatagram)icmpDatagram).IpV4.Payload.Length);
var casted3 = icmpDatagram as IcmpIpV4HeaderPlus64BitsPayloadDatagram;
if (casted3 != null)
field.AssertShowDecimal(casted3.IpV4.Payload.Length);
else
field.AssertShowDecimal(icmpDatagram.Payload.Length);
break;
case "":
......@@ -929,10 +943,15 @@ namespace PcapDotNet.Core.Test
(greDatagram.RoutingPresent ? "Routing" : "No routing")));
innerFields[currentInnerFieldIndex++].AssertShow(string.Format("..{0}. .... .... .... = {1}", greDatagram.KeyPresent.ToInt(),
(greDatagram.KeyPresent ? "Key" : "No key")));
innerFields[currentInnerFieldIndex++].AssertShow(string.Format("...{0} .... .... .... = {1}", greDatagram.SequenceNumberPresent.ToInt(),
(greDatagram.SequenceNumberPresent ? "Sequence number" : "No sequence number")));
innerFields[currentInnerFieldIndex++].AssertShow(string.Format("...{0} .... .... .... = {1}",
greDatagram.SequenceNumberPresent.ToInt(),
(greDatagram.SequenceNumberPresent
? "Sequence number"
: "No sequence number")));
innerFields[currentInnerFieldIndex++].AssertShow(string.Format(".... {0}... .... .... = {1}", greDatagram.StrictSourceRoute.ToInt(),
(greDatagram.StrictSourceRoute ? "Strict source route" : "No strict source route")));
(greDatagram.StrictSourceRoute
? "Strict source route"
: "No strict source route")));
innerFields[currentInnerFieldIndex++].AssertShow(string.Format(".... .{0} .... .... = Recursion control: {1}",
greDatagram.RecursionControl.ToBits().Skip(5).Select(b => b.ToInt()).
SequenceToString(),
......@@ -946,7 +965,8 @@ namespace PcapDotNet.Core.Test
: "No acknowledgment number")));
innerFields[currentInnerFieldIndex++].AssertShow(string.Format(".... .... .{0}... = Flags: {1}",
greDatagram.FutureUseBits.ToBits().Skip(3).Take(4).Select(b => b.ToInt()).
greDatagram.FutureUseBits.ToBits().Skip(3).Take(4).Select(
b => b.ToInt()).
SequenceToString().
Insert(3, " "),
greDatagram.FutureUseBits));
......@@ -1022,19 +1042,21 @@ namespace PcapDotNet.Core.Test
case "data":
case "data.data":
if (greDatagram.Version != GreVersion.EnhancedGre &&
greDatagram.AcknowledgmentSequenceNumberPresent)
if (greDatagram.AcknowledgmentSequenceNumberPresent &&
(greDatagram.Version != GreVersion.EnhancedGre || !greDatagram.SequenceNumberPresent))
{
Assert.AreEqual(field.Value().Skip(8).SequenceToString(), greDatagram.Payload.BytesSequenceToHexadecimalString(), "GRE data.data");
}
else
{
field.AssertValue(greDatagram.Payload, "GRE data.data");
}
break;
case "data.len":
field.AssertShowDecimal(
greDatagram.Payload.Length + (greDatagram.Version != GreVersion.EnhancedGre &&
greDatagram.AcknowledgmentSequenceNumberPresent
greDatagram.Payload.Length + (greDatagram.AcknowledgmentSequenceNumberPresent &&
(greDatagram.Version != GreVersion.EnhancedGre || !greDatagram.SequenceNumberPresent)
? 4
: 0), "GRE data.len");
break;
......@@ -1234,9 +1256,15 @@ namespace PcapDotNet.Core.Test
{
if (currentOptionIndex >= options.Count)
{
Assert.IsFalse(options.IsValid);
Assert.IsTrue(field.Show().Contains("bytes says option goes past end of options"));
Assert.AreEqual(options.Count, currentOptionIndex);
Assert.IsFalse(options.IsValid, "Options IsValid");
// if (field.Show().StartsWith("Unknown ("))
// {
// int.Parse()
// }
Assert.IsTrue(
// field.Show().StartsWith("Unknown (") || // Unknown in Wireshark but known (and invalid) in Pcap.Net
field.Show().Contains("bytes says option goes past end of options"), "Options show: " + field.Show());
Assert.AreEqual(options.Count, currentOptionIndex, "Options Count");
return;
}
......
......@@ -129,7 +129,7 @@ namespace PcapDotNet.Packets.Ethernet
if (payloadByEtherType == null)
return null;
if (Length - payloadByEtherType.Length >= 4 && Length >= 68)
if (Length - HeaderLength - payloadByEtherType.Length >= 4 && Length >= 68)
return new Datagram(Buffer, Length - 4, 4);
return null;
}
......
......@@ -11,21 +11,21 @@ namespace PcapDotNet.TestUtils
public static void IsBigger<T>(T expectedMinimum, T actual) where T : IComparable<T>
{
if (expectedMinimum.CompareTo(actual) >= 0)
throw new AssertFailedException("Assert.IsBigger failed. Expected minimum: <" + expectedMinimum +
throw new AssertFailedException("MoreAssert.IsBigger failed. Expected minimum: <" + expectedMinimum +
"> Actual: <" + actual + ">.");
}
public static void IsSmaller<T>(T expectedMaximum, T actual) where T : IComparable<T>
{
if (expectedMaximum.CompareTo(actual) <= 0)
throw new AssertFailedException("Assert.IsSmaller failed. Expected maximum: <" + expectedMaximum +
throw new AssertFailedException("MoreAssert.IsSmaller failed. Expected maximum: <" + expectedMaximum +
"> Actual: <" + actual + ">.");
}
public static void IsBiggerOrEqual<T>(T expectedMinimum, T actual, string message) where T : IComparable<T>
{
if (expectedMinimum.CompareTo(actual) > 0)
throw new AssertFailedException("Assert.IsBiggerOrEqual failed. Expected minimum: <" + expectedMinimum +
throw new AssertFailedException("MoreAssert.IsBiggerOrEqual failed. Expected minimum: <" + expectedMinimum +
"> Actual: <" + actual + ">. " + message);
}
......@@ -37,7 +37,7 @@ namespace PcapDotNet.TestUtils
public static void IsSmallerOrEqual<T>(T expectedMaximum, T actual, string message) where T : IComparable<T>
{
if (expectedMaximum.CompareTo(actual) < 0)
throw new AssertFailedException("Assert.IsSmallerOrEqual failed. Expected maximum: <" + expectedMaximum +
throw new AssertFailedException("MoreAssert.IsSmallerOrEqual failed. Expected maximum: <" + expectedMaximum +
"> Actual: <" + actual + ">. " + message);
}
......@@ -57,6 +57,13 @@ namespace PcapDotNet.TestUtils
IsInRange(expectedMinimum, expectedMaximum, actual, string.Empty);
}
public static void IsContains(string expectedContained, string actualValue, string message = "")
{
if (!actualValue.Contains(expectedContained))
throw new AssertFailedException(string.Format("MoreAssert.IsContains failed. Expected contained: <{0}> Actual: <{1}>. {2}",
expectedContained, actualValue, message));
}
public static void IsMatch(string expectedPattern, string actualValue)
{
Assert.IsTrue(Regex.IsMatch(actualValue, expectedPattern), "Expected pattern: <" + expectedPattern + ">. Actual value: <" + actualValue + ">.");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment