Skip to content

Commit

Permalink
Add cancellation token based on a timeout
Browse files Browse the repository at this point in the history
  • Loading branch information
premun committed Apr 23, 2020
1 parent 9d7c784 commit 572007c
Show file tree
Hide file tree
Showing 6 changed files with 25 additions and 16 deletions.
9 changes: 6 additions & 3 deletions src/Microsoft.DotNet.XHarness.CLI/iOS/iOSTestCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,13 +53,15 @@ protected override async Task<ExitCode> InvokeInternal()
var simulatorLoader = new SimulatorLoader(processManager);

var logs = new Logs(_arguments.OutputDirectory);
var cancellationToken = new CancellationToken(); // TODO: Get cancellation from command line env? Set timeout through it?

var cts = new CancellationTokenSource();
cts.CancelAfter(_arguments.Timeout);

var exitCode = ExitCode.SUCCESS;

foreach (TestTarget target in _arguments.TestTargets)
{
var exitCodeForRun = await RunTest(target, logs, processManager, deviceLoader, simulatorLoader, cancellationToken);
var exitCodeForRun = await RunTest(target, logs, processManager, deviceLoader, simulatorLoader, cts.Token);

if (exitCodeForRun != ExitCode.SUCCESS)
{
Expand Down Expand Up @@ -156,7 +158,8 @@ private async Task<ExitCode> RunTest(TestTarget target,
_arguments.LaunchTimeout,
deviceName,
verbosity: verbosity,
xmlResultJargon: XmlResultJargon.xUnit);
xmlResultJargon: XmlResultJargon.xUnit,
cancellationToken: cancellationToken);

if (exitCode != 0)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,13 @@ public interface IProcessManager
string MlaunchPath { get; }
Version XcodeVersion { get; }

Task<ProcessExecutionResult> ExecuteCommandAsync(string filename, IList<string> args, ILog log, TimeSpan timeout, Dictionary<string, string> environment_variables = null, CancellationToken? cancellationToken = null);
Task<ProcessExecutionResult> ExecuteCommandAsync(string filename, IList<string> args, ILog log, ILog stdoutLog, ILog stderrLog, TimeSpan timeout, Dictionary<string, string> environment_variables = null, CancellationToken? cancellationToken = null);
Task<ProcessExecutionResult> ExecuteCommandAsync(MlaunchArguments args, ILog log, TimeSpan timeout, Dictionary<string, string> environment_variables = null, CancellationToken? cancellation_token = null);
Task<ProcessExecutionResult> ExecuteCommandAsync(string filename, IList<string> args, ILog log, TimeSpan timeout, Dictionary<string, string> environmentVariables = null, CancellationToken? cancellationToken = null);
Task<ProcessExecutionResult> ExecuteCommandAsync(string filename, IList<string> args, ILog log, ILog stdoutLog, ILog stderrLog, TimeSpan timeout, Dictionary<string, string> environmentVariables = null, CancellationToken? cancellationToken = null);
Task<ProcessExecutionResult> ExecuteCommandAsync(MlaunchArguments args, ILog log, TimeSpan timeout, Dictionary<string, string> environmentVariables = null, CancellationToken? cancellationToken = null);
Task<ProcessExecutionResult> ExecuteXcodeCommandAsync(string executable, IList<string> args, ILog log, TimeSpan timeout);
Task<ProcessExecutionResult> RunAsync(Process process, ILog log, TimeSpan? timeout = null, Dictionary<string, string> environment_variables = null, CancellationToken? cancellation_token = null, bool? diagnostics = null);
Task<ProcessExecutionResult> RunAsync(Process process, MlaunchArguments args, ILog log, TimeSpan? timeout = null, Dictionary<string, string> environment_variables = null, CancellationToken? cancellation_token = null, bool? diagnostics = null);
Task<ProcessExecutionResult> RunAsync(Process process, ILog log, ILog stdoutLog, ILog stderrLog, TimeSpan? timeout = null, Dictionary<string, string> environment_variables = null, CancellationToken? cancellation_token = null, bool? diagnostics = null);
Task<ProcessExecutionResult> RunAsync(Process process, ILog log, TimeSpan? timeout = null, Dictionary<string, string> environmentVariables = null, CancellationToken? cancellationToken = null, bool? diagnostics = null);
Task<ProcessExecutionResult> RunAsync(Process process, MlaunchArguments args, ILog log, TimeSpan? timeout = null, Dictionary<string, string> environmentVariables = null, CancellationToken? cancellationToken = null, bool? diagnostics = null);
Task<ProcessExecutionResult> RunAsync(Process process, ILog log, ILog stdoutLog, ILog stderrLog, TimeSpan? timeout = null, Dictionary<string, string> environmentVariables = null, CancellationToken? cancellationToken = null, bool? diagnostics = null);
Task KillTreeAsync(Process process, ILog log, bool? diagnostics = true);
Task KillTreeAsync(int pid, ILog log, bool? diagnostics = true);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,11 +94,11 @@ public Task<ProcessExecutionResult> ExecuteXcodeCommandAsync(string executable,
public Task<ProcessExecutionResult> RunAsync(Process process,
ILog log,
TimeSpan? timeout = null,
Dictionary<string, string> environment_variables = null,
Dictionary<string, string> environmentVariables = null,
CancellationToken? cancellationToken = null,
bool? diagnostics = null)
{
return RunAsync(process, log, log, log, timeout, environment_variables, cancellationToken, diagnostics);
return RunAsync(process, log, log, log, timeout, environmentVariables, cancellationToken, diagnostics);
}

public Task<ProcessExecutionResult> RunAsync(Process process,
Expand Down
2 changes: 1 addition & 1 deletion src/Microsoft.DotNet.XHarness.iOS/AppInstaller.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public AppInstaller(IProcessManager processManager, IHardwareDeviceLoader device
var totalSize = Directory.GetFiles(appPath, "*", SearchOption.AllDirectories).Select((v) => new FileInfo(v).Length).Sum();
_mainLog.WriteLine($"Installing '{appPath}' to '{deviceName}' ({totalSize / 1024.0 / 1024.0:N2} MB)");

ProcessExecutionResult result = await _processManager.ExecuteCommandAsync(args, _mainLog, TimeSpan.FromHours(1), cancellation_token: cancellationToken);
ProcessExecutionResult result = await _processManager.ExecuteCommandAsync(args, _mainLog, TimeSpan.FromHours(1), cancellationToken: cancellationToken);

return (deviceName, result);
}
Expand Down
12 changes: 9 additions & 3 deletions src/Microsoft.DotNet.XHarness.iOS/AppRunner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.DotNet.XHarness.iOS.Shared;
using Microsoft.DotNet.XHarness.iOS.Shared.Execution;
Expand Down Expand Up @@ -62,7 +63,8 @@ public AppRunner(IProcessManager processManager,
bool ensureCleanSimulatorState = false,
string variation = null,
int verbosity = 1,
XmlResultJargon xmlResultJargon = XmlResultJargon.xUnit)
XmlResultJargon xmlResultJargon = XmlResultJargon.xUnit,
CancellationToken cancellationToken = default)
{
var args = new MlaunchArguments
{
Expand Down Expand Up @@ -169,6 +171,8 @@ public AppRunner(IProcessManager processManager,
null,
(level, message) => _mainLog.WriteLine(message));

using var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(testReporter.CancellationToken, cancellationToken);

listener.ConnectedTask
.TimeoutAfter(testLaunchTimeout)
.ContinueWith(testReporter.LaunchCallback)
Expand Down Expand Up @@ -246,7 +250,7 @@ public AppRunner(IProcessManager processManager,

_mainLog.WriteLine("Starting test run");

var result = _processManager.ExecuteCommandAsync(args, _mainLog, timeout, cancellation_token: testReporter.CancellationToken);
var result = _processManager.ExecuteCommandAsync(args, _mainLog, timeout, cancellationToken: linkedCts.Token);

await testReporter.CollectSimulatorResult(result);

Expand Down Expand Up @@ -296,6 +300,8 @@ public AppRunner(IProcessManager processManager,
null,
(level, message) => _mainLog.WriteLine(message));

using var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(testReporter.CancellationToken, cancellationToken);

listener.ConnectedTask
.TimeoutAfter(testLaunchTimeout)
.ContinueWith(testReporter.LaunchCallback)
Expand Down Expand Up @@ -330,7 +336,7 @@ public AppRunner(IProcessManager processManager,
args,
aggregatedLog,
timeout,
cancellation_token: testReporter.CancellationToken);
cancellationToken: linkedCts.Token);

await testReporter.CollectDeviceResult(runTestTask);
}
Expand Down
2 changes: 1 addition & 1 deletion src/Microsoft.DotNet.XHarness.iOS/AppUninstaller.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public async Task<ProcessExecutionResult> UninstallApp(string deviceName, string
args.Add(new UninstallAppFromDeviceArgument(appBundleId));
args.Add(new DeviceNameArgument(deviceName));

return await _processManager.ExecuteCommandAsync(args, _mainLog, TimeSpan.FromMinutes(1), cancellation_token: cancellationToken);
return await _processManager.ExecuteCommandAsync(args, _mainLog, TimeSpan.FromMinutes(1), cancellationToken: cancellationToken);
}
}
}

0 comments on commit 572007c

Please sign in to comment.