Execute app after publish
This commit is contained in:
parent
2a7e6719a4
commit
1e5b3a5cc5
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue