nuget-extensions/shared/testSrc/ProcessExecutor.cs (120 lines of code) (raw):
using System;
using System.Diagnostics;
using System.Text;
using NUnit.Framework;
using System.Linq;
namespace JetBrains.TeamCity.NuGet.Tests
{
public static class ProcessExecutor
{
public static Result ExecuteProcess(string exe, params string[] args)
{
var pi = new ProcessStartInfo
{
FileName = exe,
Arguments = string.Join(" ", args.Select(x => x.Contains(' ') ? "\"" + x + "\"" : x)),
RedirectStandardError = true,
RedirectStandardOutput = true,
RedirectStandardInput = true,
UseShellExecute = false,
CreateNoWindow = true,
};
Console.Out.WriteLine("Starting: " + pi.FileName + " " + pi.Arguments);
var process = new Process {StartInfo = pi};
var errorDataBuilder = new StringBuilder();
process.ErrorDataReceived += delegate(object sender, DataReceivedEventArgs e)
{
lock (errorDataBuilder)
{
errorDataBuilder.AppendLine(e.Data);
}
};
var outputDataBuilder = new StringBuilder();
process.OutputDataReceived += delegate(object sender, DataReceivedEventArgs e)
{
lock (outputDataBuilder)
{
outputDataBuilder.AppendLine(e.Data);
}
};
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
var exitCode = 1;
if (process.WaitForExit(60000))
{
exitCode = process.ExitCode;
}
return new Result(outputDataBuilder.ToString(), errorDataBuilder.ToString(), exitCode);
}
public class Result
{
public string Output { get; private set; }
public string Error { get; private set; }
public int ExitCode { get; private set; }
public Result(string output, string error, int exitCode)
{
Output = output;
Error = error;
ExitCode = exitCode;
}
public Result AssertOutputContains(params string[] text)
{
foreach (var _ in text)
{
var s = _.Trim();
Assert.IsTrue(Output.Contains(s), "Process Output must contain {0}. Output: {1}", s, Output);
}
return this;
}
public Result AssertErrorContains(params string[] text)
{
foreach (var _ in text)
{
var s = _.Trim();
Assert.IsTrue(Error.Contains(s), "Process Output must contain {0}. Output: {1}", s, Output);
}
return this;
}
public Result AssertNoErrorOutput()
{
Assert.IsTrue(string.IsNullOrWhiteSpace(Error), String.Format("Error recieved - {0}", Error));
return this;
}
public Result AssertExitedSuccessfully()
{
Assert.That(ExitCode, Is.EqualTo(0));
return this;
}
public Result AssertExitCode(int expectedExitCode)
{
Assert.That(ExitCode, Is.EqualTo(expectedExitCode));
return this;
}
public Result Dump()
{
Console.Out.WriteLine(this);
return this;
}
public override string ToString()
{
var sb = new StringBuilder();
sb.AppendFormat("ExitCode: {0}\r\n", ExitCode);
if (!string.IsNullOrWhiteSpace(Output))
{
sb
.Append("Output:\n")
.Append(Output)
.Append("\n");
}
if (!string.IsNullOrWhiteSpace(Error))
{
sb
.Append("Error:\n")
.Append(Error);
}
return sb.ToString();
}
}
}
}