Add firewall exclusions for test executables (#244)

This commit is contained in:
Jass Bagga 2018-01-24 15:11:28 -08:00 committed by GitHub
parent d3c8231ed3
commit 1669e39735
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 76 additions and 3 deletions

View File

@ -0,0 +1,65 @@
using System;
using System.Diagnostics;
using System.IO;
namespace Templates.Test.Helpers
{
internal class AddFirewallExclusion : IDisposable
{
private bool _disposedValue = false;
private readonly string _exclusionPath;
public AddFirewallExclusion(string exclusionPath)
{
if (!File.Exists(exclusionPath))
{
throw new FileNotFoundException($"File {exclusionPath} was not found.");
}
_exclusionPath = exclusionPath;
var startInfo = new ProcessStartInfo
{
RedirectStandardError = true,
RedirectStandardOutput = true,
CreateNoWindow = true,
FileName = "cmd.exe",
Arguments = $"/c netsh advfirewall firewall add rule name=\"Allow {exclusionPath}\" dir=in action=allow program=\"{exclusionPath}\"",
UseShellExecute = false,
Verb = "runas",
WindowStyle = ProcessWindowStyle.Hidden,
};
Process.Start(startInfo);
}
public void Dispose()
{
Dispose(true);
}
private void Dispose(bool disposing)
{
if (!_disposedValue)
{
if (disposing)
{
var startInfo = new ProcessStartInfo
{
RedirectStandardError = true,
RedirectStandardOutput = true,
CreateNoWindow = true,
FileName = "cmd.exe",
Arguments = $"/c netsh advfirewall firewall delete rule name=\"Allow {_exclusionPath}\"",
UseShellExecute = false,
Verb = "runas",
WindowStyle = ProcessWindowStyle.Hidden,
};
Process.Start(startInfo);
}
_disposedValue = true;
}
}
}
}

View File

@ -74,15 +74,24 @@ namespace Templates.Test.Helpers
{
var dllPath = publish ? $"{projectName}.dll" : $"bin/Debug/{framework}/{projectName}.dll";
_process = ProcessEx.Run(output, workingDirectory, DotNetMuxer.MuxerPathOrDefault(), $"exec {dllPath}", envVars: envVars);
_listeningUri = GetListeningUri(output);
}
else
{
var exeFullPath = publish
? Path.Combine(workingDirectory, $"{projectName}.exe")
: Path.Combine(workingDirectory, "bin", "Debug", framework, $"{projectName}.exe");
_process = ProcessEx.Run(output, workingDirectory, exeFullPath, envVars: envVars);
using (new AddFirewallExclusion(exeFullPath))
{
_process = ProcessEx.Run(output, workingDirectory, exeFullPath, envVars: envVars);
_listeningUri = GetListeningUri(output);
}
}
}
private Uri GetListeningUri(ITestOutputHelper output)
{
// Wait until the app is accepting HTTP requests
output.WriteLine("Waiting until ASP.NET application is accepting connections...");
var listeningMessage = _process
@ -99,8 +108,7 @@ namespace Templates.Test.Helpers
listeningUrlString.Substring(listeningUrlString.LastIndexOf(':'));
output.WriteLine("Sending requests to " + listeningUrlString);
_listeningUri = new Uri(listeningUrlString, UriKind.Absolute);
return new Uri(listeningUrlString, UriKind.Absolute);
}
public void AssertOk(string requestUrl)