Execute app after publish

This commit is contained in:
Mike Harder 2018-05-01 12:46:05 -07:00 committed by GitHub
parent 2a7e6719a4
commit 1e5b3a5cc5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 58 additions and 15 deletions

View File

@ -23,9 +23,9 @@ namespace AspNetCoreSdkTests
[TestCaseSource(typeof(TemplateData), nameof(TemplateData.Current))] [TestCaseSource(typeof(TemplateData), nameof(TemplateData.Current))]
public void RestoreBuildRunPublish(Template template, NuGetConfig nuGetConfig) public void RestoreBuildRunPublish(Template template, NuGetConfig nuGetConfig)
{ {
using (var context = new DotNetContext()) using (var context = new DotNetContext(template))
{ {
context.New(template); context.New();
context.Restore(nuGetConfig); context.Restore(nuGetConfig);
CollectionAssert.AreEquivalent(template.ExpectedObjFilesAfterRestore, context.GetObjFiles()); CollectionAssert.AreEquivalent(template.ExpectedObjFilesAfterRestore, context.GetObjFiles());
@ -43,6 +43,13 @@ namespace AspNetCoreSdkTests
context.Publish(); context.Publish();
CollectionAssert.AreEquivalent(template.ExpectedFilesAfterPublish, context.GetPublishFiles()); CollectionAssert.AreEquivalent(template.ExpectedFilesAfterPublish, context.GetPublishFiles());
if (template.Type == TemplateType.WebApplication)
{
var (httpUrl, httpsUrl) = context.Exec();
Assert.AreEqual(HttpStatusCode.OK, GetAsync(new Uri(new Uri(httpUrl), template.RelativeUrl)).StatusCode);
Assert.AreEqual(HttpStatusCode.OK, GetAsync(new Uri(new Uri(httpsUrl), template.RelativeUrl)).StatusCode);
}
} }
} }

View File

@ -11,11 +11,16 @@ namespace AspNetCoreSdkTests.Util
{ {
private static readonly TimeSpan _sleepBetweenOutputContains = TimeSpan.FromMilliseconds(100); private static readonly TimeSpan _sleepBetweenOutputContains = TimeSpan.FromMilliseconds(100);
private (Process Process, ConcurrentStringBuilder OutputBuilder, ConcurrentStringBuilder ErrorBuilder) _process; private (Process Process, ConcurrentStringBuilder OutputBuilder, ConcurrentStringBuilder ErrorBuilder) _runProcess;
private (Process Process, ConcurrentStringBuilder OutputBuilder, ConcurrentStringBuilder ErrorBuilder) _execProcess;
public string New(Template template) public DotNetContext(Template template) { Template = template; }
public Template Template { get; }
public string New()
{ {
return DotNetUtil.New(template.Name, Path); return DotNetUtil.New(Template.Name, Path);
} }
public string Restore(NuGetConfig config) public string Restore(NuGetConfig config)
@ -30,18 +35,35 @@ namespace AspNetCoreSdkTests.Util
public (string httpUrl, string httpsUrl) Run() public (string httpUrl, string httpsUrl) Run()
{ {
_process = DotNetUtil.Run(Path); _runProcess = DotNetUtil.Run(Path);
return ScrapeUrls(_runProcess);
}
public (string httpUrl, string httpsUrl) Exec()
{
_execProcess = DotNetUtil.Exec(Path, Template.Name);
return ScrapeUrls(_execProcess);
}
private (string httpUrl, string httpsUrl) ScrapeUrls(
(Process Process, ConcurrentStringBuilder OutputBuilder, ConcurrentStringBuilder ErrorBuilder) process)
{
// Extract URLs from output // Extract URLs from output
while (true) while (true)
{ {
var output = _process.OutputBuilder.ToString(); var output = process.OutputBuilder.ToString();
if (output.Contains("Application started")) if (output.Contains("Application started"))
{ {
var httpUrl = Regex.Match(output, @"Now listening on: (http:\S*)").Groups[1].Value; var httpUrl = Regex.Match(output, @"Now listening on: (http:\S*)").Groups[1].Value;
var httpsUrl = Regex.Match(output, @"Now listening on: (https:\S*)").Groups[1].Value; var httpsUrl = Regex.Match(output, @"Now listening on: (https:\S*)").Groups[1].Value;
return (httpUrl, httpsUrl); return (httpUrl, httpsUrl);
} }
else if (process.Process.HasExited)
{
var startInfo = process.Process.StartInfo;
throw new InvalidOperationException(
$"Failed to start process '{startInfo.FileName} {startInfo.Arguments}'" + Environment.NewLine + output);
}
else else
{ {
Thread.Sleep(_sleepBetweenOutputContains); Thread.Sleep(_sleepBetweenOutputContains);
@ -71,14 +93,20 @@ namespace AspNetCoreSdkTests.Util
public override void Dispose() public override void Dispose()
{ {
// Must stop process to release filehandles before calling base.Dispose() which deletes app dir // Must stop processes to release filehandles before calling base.Dispose() which deletes app dir
if (_process.Process != null) Dispose(_runProcess);
{ Dispose(_execProcess);
DotNetUtil.StopProcess(_process.Process, _process.OutputBuilder, _process.ErrorBuilder, throwOnError: false);
_process.Process = null;
}
base.Dispose(); base.Dispose();
} }
private static void Dispose((Process Process, ConcurrentStringBuilder OutputBuilder, ConcurrentStringBuilder ErrorBuilder) process)
{
if (process.Process != null)
{
DotNetUtil.StopProcess(process.Process, process.OutputBuilder, process.ErrorBuilder, throwOnError: false);
process.Process = null;
}
}
} }
} }

View File

@ -9,6 +9,9 @@ namespace AspNetCoreSdkTests.Util
{ {
internal static class DotNetUtil internal static class DotNetUtil
{ {
// Bind to dynamic port 0 to avoid port conflicts during parallel tests
private const string _urls = "--urls http://127.0.0.1:0;https://127.0.0.1:0";
public static string PublishOutput => "pub"; public static string PublishOutput => "pub";
private static IEnumerable<KeyValuePair<string, string>> GetEnvironment(string workingDirectory) private static IEnumerable<KeyValuePair<string, string>> GetEnvironment(string workingDirectory)
@ -36,8 +39,13 @@ namespace AspNetCoreSdkTests.Util
public static (Process Process, ConcurrentStringBuilder OutputBuilder, ConcurrentStringBuilder ErrorBuilder) Run(string workingDirectory) public static (Process Process, ConcurrentStringBuilder OutputBuilder, ConcurrentStringBuilder ErrorBuilder) Run(string workingDirectory)
{ {
// Bind to dynamic port 0 to avoid port conflicts during parallel tests return StartDotNet($"run --no-build {_urls}", workingDirectory, GetEnvironment(workingDirectory));
return StartDotNet("run --no-build --urls http://127.0.0.1:0;https://127.0.0.1:0", workingDirectory, GetEnvironment(workingDirectory)); }
internal static (Process Process, ConcurrentStringBuilder OutputBuilder, ConcurrentStringBuilder ErrorBuilder) Exec(string workingDirectory, string name)
{
var path = Path.Combine(PublishOutput, $"{name}.dll");
return StartDotNet($"exec {path} {_urls}", workingDirectory, GetEnvironment(workingDirectory));
} }
public static string Publish(string workingDirectory) public static string Publish(string workingDirectory)