using System;
|
using System.Diagnostics;
|
using System.IO.Pipes;
|
using System.Linq;
|
using System.Text;
|
using System.Threading;
|
using System.Threading.Tasks;
|
using NUnit.Framework;
|
using OpenTap.Engine.UnitTests.TestTestSteps;
|
using OpenTap.Plugins.BasicSteps;
|
|
namespace OpenTap.Package.UnitTests
|
{
|
[TestFixture]
|
public class SubProcessTest
|
{
|
[Test]
|
public void TestProcessIO()
|
{
|
var step = new LogStep
|
{
|
LogMessage = "Hello World"
|
};
|
|
var ph = new SubProcessHost(){ForwardLogs = true, LogHeader = "testprefix"};
|
var listener = new LoggingTraceListener();
|
using (Session.Create(SessionOptions.RedirectLogging))
|
{
|
Log.AddListener(listener);
|
ph.Run(step, false, CancellationToken.None);
|
}
|
|
CollectionAssert.Contains(listener.Events.Select(x => x.Message), "testprefix: Hello World");
|
}
|
|
[Test]
|
public void TestSubprocessRun()
|
{
|
var verdicts = new[]
|
{ Verdict.Aborted, Verdict.Error, Verdict.Fail, Verdict.Inconclusive, Verdict.Pass, Verdict.NotSet };
|
foreach (var ver in verdicts)
|
{
|
var step = new VerdictStep
|
{
|
VerdictOutput = ver
|
};
|
var verdict = new SubProcessHost().Run(step, false, CancellationToken.None);
|
Assert.AreEqual(ver, verdict);
|
}
|
}
|
|
[Test]
|
public void TestCancel()
|
{
|
var token = new CancellationTokenSource();
|
|
var step = new DelayStep() { DelaySecs = 10 };
|
var ph = new SubProcessHost();
|
Task.Run(() => ph.Run(step, false, token.Token));
|
|
// wait for process to start
|
while (ph.LastProcessHandle == null)
|
TapThread.Sleep(TimeSpan.FromMilliseconds(10));
|
|
var sw = Stopwatch.StartNew();
|
token.Cancel();
|
ph.LastProcessHandle.WaitForExit();
|
Assert.IsTrue(sw.Elapsed < TimeSpan.FromSeconds(3), "Process failed to exit in time.");
|
}
|
|
[Test]
|
public void TestPipes()
|
{
|
var handle = "TestPipes";
|
var server = new NamedPipeServerStream(handle, PipeDirection.InOut);
|
var client = new NamedPipeClientStream(".", handle, PipeDirection.InOut);
|
|
var conn = server.WaitForConnectionAsync();
|
client.Connect();
|
conn.GetAwaiter().GetResult();
|
|
{ // short message
|
var testMessage = "Hello World";
|
|
Task.Run(() => { client.WriteMessage(testMessage); });
|
var msg = server.ReadMessage<string>();
|
|
Assert.AreEqual(testMessage, msg);
|
}
|
{ // many guids
|
var testMessage = string.Join(" ", Enumerable.Repeat(Guid.NewGuid().ToString(), 1000));
|
|
Task.Run(() => { client.WriteMessage(testMessage); });
|
var msg = server.ReadMessage<string>();
|
|
Assert.AreEqual(testMessage, msg);
|
}
|
{ // random utf8 symbols
|
var bytes = new byte[1 << 5];
|
var rand = new Random(0);
|
rand.NextBytes(bytes);
|
|
var testMessage = Encoding.UTF8.GetString(bytes);
|
|
Task.Run(() => { client.WriteMessage(testMessage); });
|
var msg = server.ReadMessage<string>();
|
|
Assert.AreEqual(testMessage, msg);
|
}
|
}
|
}
|
}
|