Skip to content

Commit

Permalink
System.Net.Ping: Skip TimeoutIsRespected test if network is unreachab…
Browse files Browse the repository at this point in the history
…le (dotnet#58745)

The TestSettings.UnreachableAddress is using 192.0.2.0 which is documented in RFC5735 as a network to be used in docs/example code.
On the Android devices in Helix the upstream network is configured to not route this address which results in a "Destination Net Unreachable" response
which causes the timeout argument to ping to be ignored and ping returns immediately.
Skip the test in these cases.

Example output from ping on the device:

```
1|sunfish:/ $ time ping -c 1 -W 2 -s 50 192.0.2.0
PING 192.0.2.0 (192.0.2.0) 50(78) bytes of data.
From 131.107.5.118: icmp_seq=1 Destination Net Unreachable

--- 192.0.2.0 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time Oms

   0m00.03s real   0m00.00s user   0m00.00s system
```

(cherry picked from commit 84fb871)
  • Loading branch information
akoeplinger committed Sep 9, 2021
1 parent 6ecf2ba commit b138558
Showing 1 changed file with 15 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using System.Threading.Tasks;

using Xunit;
using Microsoft.DotNet.XUnitExtensions;

namespace System.Net.NetworkInformation.Tests
{
Expand All @@ -19,7 +20,7 @@ public class UnixPingUtilityTests
{
private const int IcmpHeaderLengthInBytes = 8;

[Theory]
[ConditionalTheory]
[InlineData(0)]
[InlineData(100)]
[InlineData(1000)]
Expand All @@ -32,11 +33,24 @@ public static void TimeoutIsRespected(int timeout)
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardOutput = true;

bool destinationNetUnreachable = false;
p.OutputDataReceived += delegate (object sendingProcess, DataReceivedEventArgs outputLine)
{
if (outputLine.Data?.Contains("Destination Net Unreachable", StringComparison.OrdinalIgnoreCase) == true)
destinationNetUnreachable = true;
};

Stopwatch stopWatch = Stopwatch.StartNew();

p.Start();
p.BeginOutputReadLine();
p.WaitForExit();

if (destinationNetUnreachable)
{
throw new SkipTestException($"Network doesn't route {TestSettings.UnreachableAddress}, skipping test.");
}

//ensure that the process takes longer than or within 10ms of 'timeout', with a 5s maximum
Assert.InRange(stopWatch.ElapsedMilliseconds, timeout - 10, 5000);
}
Expand Down

0 comments on commit b138558

Please sign in to comment.