Commit 02e50af6 authored by Brickner_cp's avatar Brickner_cp

UInt128. Uses BigInteger to support formatting. Casting to and from...

UInt128. Uses BigInteger to support formatting. Casting to and from BigInteger. Cast to ulong can throw OverflowException. Improved GetHashCode().
Improved GRE tests.
4 warnings left.
parent 18182881
......@@ -64,6 +64,7 @@
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Numerics" />
</ItemGroup>
<ItemGroup>
<Compile Include="FuncExtensionsTest.cs" />
......
using System;
using System.Globalization;
using System.Numerics;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using PcapDotNet.TestUtils;
......@@ -47,6 +48,7 @@ namespace PcapDotNet.Base.Test
{
UInt128 value = random.NextUInt128();
// Test equality
Assert.AreEqual(value, value);
Assert.AreNotEqual(value, string.Empty);
Assert.AreNotEqual(value, UInt128.MaxValue);
......@@ -55,10 +57,63 @@ namespace PcapDotNet.Base.Test
Assert.IsTrue(value == value);
Assert.IsFalse(value != value);
// ReSharper restore EqualExpressionComparison
// Test GetHashCode
Assert.IsNotNull(value.GetHashCode());
Assert.AreEqual(value, UInt128.Parse(value.ToString("X32"), NumberStyles.HexNumber, CultureInfo.InvariantCulture));
Assert.AreEqual(value >> 64, UInt128.Parse(((ulong)(value >> 64)).ToString("X16"), NumberStyles.HexNumber, CultureInfo.InvariantCulture));
// Test Parse()
Assert.AreEqual(value, UInt128.Parse(value.ToString()));
Assert.AreEqual(value, UInt128.Parse(value.ToString(), CultureInfo.InvariantCulture));
Assert.AreEqual(value, UInt128.Parse(value.ToString(), NumberStyles.Integer));
// Test TryParse()
UInt128 actualValue;
Assert.IsTrue(UInt128.TryParse(value.ToString(), out actualValue));
Assert.AreEqual(value, actualValue);
Assert.IsTrue(UInt128.TryParse(value.ToString(CultureInfo.InvariantCulture), out actualValue));
Assert.AreEqual(value, actualValue);
// Cast to UInt64
ulong smallValue = random.NextULong();
Assert.AreEqual(smallValue, (ulong)((UInt128)smallValue));
}
}
[TestMethod]
[ExpectedException(typeof(OverflowException))]
public void CastToULongOverflow()
{
Random random = new Random();
UInt128 value;
try
{
value = (UInt128)(((BigInteger)ulong.MaxValue) + random.NextULong(ulong.MaxValue) + 1);
}
catch (Exception)
{
Assert.Fail();
return;
}
Assert.AreEqual(value, (ulong)value);
Assert.Fail();
}
[TestMethod]
[ExpectedException(typeof(OverflowException))]
public void ParseOverflow()
{
Assert.AreEqual(0, UInt128.Parse("-1"));
Assert.Fail();
}
[TestMethod]
public void TryParseOverflow()
{
UInt128 actual;
Assert.IsFalse(UInt128.TryParse("-1", out actual));
Assert.AreEqual(UInt128.Zero, actual);
Assert.IsFalse(UInt128.TryParse((UInt128.MaxValue + BigInteger.One).ToString(), out actual));
Assert.AreEqual(UInt128.Zero, actual);
}
[TestMethod]
......@@ -88,7 +143,7 @@ namespace PcapDotNet.Base.Test
for (int i = 0; i <= 32; ++i)
{
string andValueString = new string('0', i) + new string('F', ValueString.Length - i);
UInt128 andValue = UInt128.Parse(andValueString, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
UInt128 andValue = UInt128.Parse("0" + andValueString, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
string expectedValueString = new string('0', i) + ValueString.Substring(i, ValueString.Length - i);
UInt128 expectedValue = UInt128.Parse(expectedValueString, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
UInt128 actualValue = value & andValue;
......
......@@ -74,6 +74,7 @@
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
......
This diff is collapsed.
......@@ -869,6 +869,7 @@ namespace PcapDotNet.Core.Test
address.ToString());
}
}
PacketCommunicator communicator = device.Open();
try
{
......
......@@ -62,7 +62,7 @@ namespace PcapDotNet.Core.Test
[TestMethod]
public void ComparePacketsToWiresharkTest()
{
for (int i = 0; i != 50; ++i)
for (int i = 0; i != 10; ++i)
{
// Create packets
List<Packet> packets = new List<Packet>(CreateRandomPackets(200));
......
......@@ -33,6 +33,7 @@
<CopyLocalSatelliteAssemblies>true</CopyLocalSatelliteAssemblies>
<ReferenceOutputAssembly>true</ReferenceOutputAssembly>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Xml">
<CopyLocalSatelliteAssemblies>true</CopyLocalSatelliteAssemblies>
<ReferenceOutputAssembly>true</ReferenceOutputAssembly>
......
......@@ -205,6 +205,8 @@ namespace PcapDotNet.Packets.Test
Random random = new Random();
for (int i = 0; i != 100; ++i)
{
IpV4Layer ipV4Layer = random.NextIpV4Layer(IpV4Protocol.Gre);
ipV4Layer.HeaderChecksum = null;
......@@ -219,7 +221,9 @@ namespace PcapDotNet.Packets.Test
PacketBuilder packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, greLayer);
Packet packet = packetBuilder.Build(DateTime.Now);
Assert.IsTrue(packet.IsValid, "IsValid");
Assert.IsTrue(packet.IsValid ||
new[]{EthernetType.IpV4, EthernetType.Arp}.Contains(greLayer.ProtocolType),
"IsValid. ProtoclType=" + greLayer.ProtocolType);
GreDatagram gre = packet.Ethernet.IpV4.Gre;
......@@ -234,7 +238,7 @@ namespace PcapDotNet.Packets.Test
byte[] buffer = gre.ToArray();
buffer[buffer.Length - 1] = 200;
newIpPayload = new Datagram(buffer);
packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, new PayloadLayer { Data = newIpPayload });
packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, new PayloadLayer {Data = newIpPayload});
packet = packetBuilder.Build(DateTime.Now);
Assert.IsFalse(packet.IsValid);
......@@ -242,7 +246,7 @@ namespace PcapDotNet.Packets.Test
buffer = gre.ToArray();
buffer[gre.Length - 10] = 100;
newIpPayload = new Datagram(buffer);
packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, new PayloadLayer { Data = newIpPayload });
packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, new PayloadLayer {Data = newIpPayload});
packet = packetBuilder.Build(DateTime.Now);
Assert.IsFalse(packet.IsValid);
......@@ -250,7 +254,7 @@ namespace PcapDotNet.Packets.Test
buffer = gre.ToArray();
buffer[gre.Length - 10] = 3;
newIpPayload = new Datagram(buffer);
packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, new PayloadLayer { Data = newIpPayload });
packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, new PayloadLayer {Data = newIpPayload});
packet = packetBuilder.Build(DateTime.Now);
Assert.IsFalse(packet.IsValid);
......@@ -258,9 +262,10 @@ namespace PcapDotNet.Packets.Test
buffer = gre.ToArray();
buffer[gre.Length - 16] = 1;
newIpPayload = new Datagram(buffer);
packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, new PayloadLayer { Data = newIpPayload });
packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, new PayloadLayer {Data = newIpPayload});
packet = packetBuilder.Build(DateTime.Now);
Assert.IsFalse(packet.IsValid);
}
}
}
}
\ No newline at end of file
......@@ -64,6 +64,7 @@
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Numerics" />
</ItemGroup>
<ItemGroup>
<Compile Include="ArpTests.cs" />
......
......@@ -61,6 +61,7 @@
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
......
......@@ -135,18 +135,13 @@ namespace PcapDotNet.Packets.IpV6
/// </summary>
public override string ToString()
{
string valueString = _value.ToString("X33", CultureInfo.InvariantCulture).Substring(1);
StringBuilder stringBuilder = new StringBuilder(39);
for (int i = 0; i != 8; ++i)
{
if (i != 0)
stringBuilder.Append(':');
string andZerosBefore = new string('0', i * 4);
string andZerosAfter = new string('0', 28 - i * 4);
string andString = andZerosBefore + "FFFF" + andZerosAfter;
UInt128 andValue = UInt128.Parse(andString, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
ushort value = (ushort)((_value & andValue) >> (112 - i * 16));
stringBuilder.Append(value.ToString("X4", CultureInfo.InvariantCulture));
stringBuilder.Append(valueString.Substring(i * 4, 4));
}
return stringBuilder.ToString();
......
......@@ -74,6 +74,7 @@
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
......
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