Skip to content

Commit c968e0f

Browse files
committed
More debug info, fix casing issues
1 parent 7d156bd commit c968e0f

File tree

1 file changed

+54
-17
lines changed

1 file changed

+54
-17
lines changed

src/ProjectTemplates/Shared/AspNetProcess.cs

Lines changed: 54 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System;
55
using System.Collections.Generic;
66
using System.Diagnostics;
7+
using System.IO;
78
using System.Linq;
89
using System.Net;
910
using System.Net.Http;
@@ -13,6 +14,7 @@
1314
using Microsoft.AspNetCore.Certificates.Generation;
1415
using Microsoft.AspNetCore.Server.IntegrationTesting;
1516
using Microsoft.Extensions.CommandLineUtils;
17+
using Microsoft.Extensions.Logging;
1618
using Microsoft.Extensions.Logging.Abstractions;
1719
using OpenQA.Selenium;
1820
using OpenQA.Selenium.Edge;
@@ -28,6 +30,10 @@ public class AspNetProcess : IDisposable
2830
private readonly HttpClient _httpClient;
2931
private readonly ITestOutputHelper _output;
3032

33+
private string _certificatePath;
34+
private string _certificatePassword = Guid.NewGuid().ToString();
35+
private string _certificateThumbprint;
36+
3137
internal readonly Uri ListeningUri;
3238
internal ProcessEx Process { get; }
3339

@@ -37,33 +43,57 @@ public AspNetProcess(
3743
string dllPath,
3844
IDictionary<string, string> environmentVariables,
3945
bool published = true,
40-
bool hasListeningUri = true)
46+
bool hasListeningUri = true,
47+
ILogger logger = null)
4148
{
4249
_output = output;
4350
_httpClient = new HttpClient(new HttpClientHandler()
4451
{
4552
AllowAutoRedirect = true,
4653
UseCookies = true,
4754
CookieContainer = new CookieContainer(),
48-
ServerCertificateCustomValidationCallback = (m, c, ch, p) => true,
55+
ServerCertificateCustomValidationCallback = (request, certificate, chain, errors) => certificate?.Thumbprint == _certificateThumbprint,
4956
})
5057
{
5158
Timeout = TimeSpan.FromMinutes(2)
5259
};
5360

54-
var now = DateTimeOffset.Now;
55-
new CertificateManager().EnsureAspNetCoreHttpsDevelopmentCertificate(now, now.AddYears(1));
61+
_certificatePath = Path.Combine(workingDirectory, $"{Guid.NewGuid()}.pfx");
62+
EnsureDevelopmentCertificates();
5663

5764
output.WriteLine("Running ASP.NET application...");
5865

5966
var arguments = published ? $"exec {dllPath}" : "run";
60-
Process = ProcessEx.Run(output, workingDirectory, DotNetMuxer.MuxerPathOrDefault(), arguments, envVars: environmentVariables);
67+
68+
logger?.LogInformation($"AspNetProcess - process: {DotNetMuxer.MuxerPathOrDefault()} arguments: {arguments}");
69+
70+
var finalEnvironmentVariables = new Dictionary<string, string>(environmentVariables)
71+
{
72+
["ASPNETCORE_Kestrel__Certificates__Default__Path"] = _certificatePath,
73+
["ASPNETCORE_Kestrel__Certificates__Default__Password"] = _certificatePassword
74+
};
75+
76+
Process = ProcessEx.Run(output, workingDirectory, DotNetMuxer.MuxerPathOrDefault(), arguments, envVars: finalEnvironmentVariables);
77+
78+
logger?.LogInformation("AspNetProcess - process started");
79+
6180
if (hasListeningUri)
6281
{
63-
ListeningUri = GetListeningUri(output) ?? throw new InvalidOperationException("Couldn't find the listening URL.");
82+
logger?.LogInformation("AspNetProcess - Getting listening uri");
83+
ListeningUri = ResolveListeningUrl(output);
84+
logger?.LogInformation($"AspNetProcess - Got {ListeningUri}");
6485
}
6586
}
6687

88+
internal void EnsureDevelopmentCertificates()
89+
{
90+
var now = DateTimeOffset.Now;
91+
var manager = new CertificateManager();
92+
var certificate = manager.CreateAspNetCoreHttpsDevelopmentCertificate(now, now.AddYears(1), "CN=localhost");
93+
_certificateThumbprint = certificate.Thumbprint;
94+
manager.ExportCertificate(certificate, path: _certificatePath, includePrivateKey: true, _certificatePassword);
95+
}
96+
6797
public void VisitInBrowser(IWebDriver driver)
6898
{
6999
_output.WriteLine($"Opening browser at {ListeningUri}...");
@@ -173,7 +203,7 @@ private async Task<T> RequestWithRetries<T>(Func<HttpClient, Task<T>> requester,
173203
throw new InvalidOperationException("Max retries reached.");
174204
}
175205

176-
private Uri GetListeningUri(ITestOutputHelper output)
206+
private Uri ResolveListeningUrl(ITestOutputHelper output)
177207
{
178208
// Wait until the app is accepting HTTP requests
179209
output.WriteLine("Waiting until ASP.NET application is accepting connections...");
@@ -202,21 +232,27 @@ private Uri GetListeningUri(ITestOutputHelper output)
202232

203233
private string GetListeningMessage()
204234
{
235+
var buffer = new List<string>();
205236
try
206237
{
207-
return Process
208-
// This will timeout at most after 5 minutes.
209-
.OutputLinesAsEnumerable
210-
.Where(line => line != null)
211-
// This used to do StartsWith, but this is less strict and can prevent issues (very rare) where
212-
// console logging interleaves with other console output in a bad way. For example:
213-
// dbugNow listening on: http://127.0.0.1:12857
214-
.FirstOrDefault(line => line.Trim().Contains(ListeningMessagePrefix, StringComparison.Ordinal));
238+
foreach (var line in Process.OutputLinesAsEnumerable)
239+
{
240+
if (line != null)
241+
{
242+
buffer.Add(line);
243+
if (line.Trim().Contains(ListeningMessagePrefix, StringComparison.Ordinal))
244+
{
245+
return line;
246+
}
247+
}
248+
}
215249
}
216250
catch (OperationCanceledException)
217251
{
218-
return null;
219252
}
253+
254+
throw new InvalidOperationException(@$"Couldn't find listening url:
255+
{string.Join(Environment.NewLine, buffer)}");
220256
}
221257

222258
private bool IsSuccessStatusCode(HttpResponseMessage response)
@@ -237,7 +273,8 @@ internal Task<HttpResponseMessage> SendRequest(string path)
237273

238274
public async Task AssertStatusCode(string requestUrl, HttpStatusCode statusCode, string acceptContentType = null)
239275
{
240-
var response = await RequestWithRetries(client => {
276+
var response = await RequestWithRetries(client =>
277+
{
241278
var request = new HttpRequestMessage(
242279
HttpMethod.Get,
243280
new Uri(ListeningUri, requestUrl));

0 commit comments

Comments
 (0)