Skip to content

Commit 505d68b

Browse files
committed
[Templates] Separate F# from C# tests, unskip tests, include reliability improvements.
* Separates F# from C# tests. These tests have very different runtime characteristics and should not be bundled together as the same test scenario. For example, we want to quickly separate F# specific issues from C# specific ones. * Unskipping all skipped tests as the issue tracking their flakyness was closed. * Adding reliability improvements to network requests. * Adds retries.
1 parent 26f160d commit 505d68b

File tree

5 files changed

+58
-24
lines changed

5 files changed

+58
-24
lines changed

src/ProjectTemplates/test/EmptyWebTemplateTest.cs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,19 @@ public EmptyWebTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputHel
2222

2323
public ITestOutputHelper Output { get; }
2424

25-
[Theory]
26-
[InlineData(null)]
27-
[InlineData("F#")]
28-
public async Task EmptyWebTemplateAsync(string languageOverride)
25+
[Fact]
26+
public async Task EmptyWebTemplateCSharp()
27+
{
28+
await EmtpyTemplateCore(languageOverride: null);
29+
}
30+
31+
[Fact]
32+
public async Task EmptyWebTemplateFSharp()
33+
{
34+
await EmtpyTemplateCore("F#");
35+
}
36+
37+
private async Task EmtpyTemplateCore(string languageOverride)
2938
{
3039
Project = await ProjectFactory.GetOrCreateProject("empty" + (languageOverride == "F#" ? "fsharp" : "csharp"), Output);
3140

src/ProjectTemplates/test/Helpers/AspNetProcess.cs

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public AspNetProcess(
5858

5959
var arguments = published ? $"exec {dllPath}" : "run";
6060
Process = ProcessEx.Run(output, workingDirectory, DotNetMuxer.MuxerPathOrDefault(), arguments, envVars: environmentVariables);
61-
if(hasListeningUri)
61+
if (hasListeningUri)
6262
{
6363
ListeningUri = GetListeningUri(output);
6464
}
@@ -108,7 +108,7 @@ public async Task ContainsLinks(Page page)
108108
HttpMethod.Get,
109109
new Uri(ListeningUri, page.Url));
110110

111-
var response = await _httpClient.SendAsync(request);
111+
var response = await RequestWithRetries(client => client.SendAsync(request), _httpClient);
112112

113113
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
114114
var parser = new HtmlParser();
@@ -141,14 +141,36 @@ public async Task ContainsLinks(Page page)
141141
Assert.True(string.Equals(anchor.Href, expectedLink), $"Expected next link to be {expectedLink} but it was {anchor.Href}.");
142142
var result = await RetryHelper.RetryRequest(async () =>
143143
{
144-
return await _httpClient.GetAsync(anchor.Href);
144+
return await RequestWithRetries(client => client.GetAsync(anchor.Href), _httpClient);
145145
}, logger: NullLogger.Instance);
146146

147147
Assert.True(IsSuccessStatusCode(result), $"{anchor.Href} is a broken link!");
148148
}
149149
}
150150
}
151151

152+
private async Task<T> RequestWithRetries<T>(Func<HttpClient, Task<T>> requester, HttpClient client, int retries = 3, TimeSpan initialDelay = default)
153+
{
154+
var currentDelay = initialDelay == default ? TimeSpan.FromSeconds(30) : initialDelay;
155+
for (int i = 0; i <= retries; i++)
156+
{
157+
try
158+
{
159+
return await requester(client);
160+
}
161+
catch (Exception)
162+
{
163+
if (i == retries)
164+
{
165+
throw;
166+
}
167+
await Task.Delay(currentDelay);
168+
currentDelay *= 2;
169+
}
170+
}
171+
throw new InvalidOperationException("Max retries reached.");
172+
}
173+
152174
private Uri GetListeningUri(ITestOutputHelper output)
153175
{
154176
// Wait until the app is accepting HTTP requests
@@ -190,7 +212,7 @@ public Task AssertNotFound(string requestUrl)
190212

191213
internal Task<HttpResponseMessage> SendRequest(string path)
192214
{
193-
return _httpClient.GetAsync(new Uri(ListeningUri, path));
215+
return RequestWithRetries(client => client.GetAsync(new Uri(ListeningUri, path)), _httpClient);
194216
}
195217

196218
public async Task AssertStatusCode(string requestUrl, HttpStatusCode statusCode, string acceptContentType = null)
@@ -204,7 +226,7 @@ public async Task AssertStatusCode(string requestUrl, HttpStatusCode statusCode,
204226
request.Headers.Add("Accept", acceptContentType);
205227
}
206228

207-
var response = await _httpClient.SendAsync(request);
229+
var response = await RequestWithRetries(client => client.SendAsync(request), _httpClient);
208230
Assert.True(statusCode == response.StatusCode, $"Expected {requestUrl} to have status '{statusCode}' but it was '{response.StatusCode}'.");
209231
}
210232

src/ProjectTemplates/test/MvcTemplateTest.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,14 @@ public MvcTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputHelper o
2525
public ProjectFactoryFixture ProjectFactory { get; }
2626
public ITestOutputHelper Output { get; }
2727

28-
[Theory]
29-
[InlineData(null)]
30-
[InlineData("F#", Skip = "https://github.com/aspnet/AspNetCore/issues/14022")]
31-
[Flaky("https://github.com/aspnet/AspNetCore-Internal/issues/2267", FlakyOn.All)]
32-
public async Task MvcTemplate_NoAuthImplAsync(string languageOverride)
28+
[Fact(Skip = "https://github.com/aspnet/AspNetCore/issues/14022")]
29+
public async Task MvcTemplate_NoAuthFSharp() => await MvcTemplateCore(languageOverride: "F#");
30+
31+
[Fact]
32+
public async Task MvcTemplate_NoAuthCSharp() => await MvcTemplateCore(languageOverride: null);
33+
34+
35+
private async Task MvcTemplateCore(string languageOverride)
3336
{
3437
Project = await ProjectFactory.GetOrCreateProject("mvcnoauth" + (languageOverride == "F#" ? "fsharp" : "csharp"), Output);
3538

@@ -98,8 +101,7 @@ public async Task MvcTemplate_NoAuthImplAsync(string languageOverride)
98101
[Theory]
99102
[InlineData(true)]
100103
[InlineData(false)]
101-
[Flaky("https://github.com/aspnet/AspNetCore-Internal/issues/2267", FlakyOn.All)]
102-
public async Task MvcTemplate_IndividualAuthImplAsync(bool useLocalDB)
104+
public async Task MvcTemplate_IndividualAuth(bool useLocalDB)
103105
{
104106
Project = await ProjectFactory.GetOrCreateProject("mvcindividual" + (useLocalDB ? "uld" : ""), Output);
105107

src/ProjectTemplates/test/RazorPagesTemplateTest.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ public RazorPagesTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputH
2626
public ITestOutputHelper Output { get; }
2727

2828
[Fact]
29-
[Flaky("https://github.com/aspnet/AspNetCore-Internal/issues/2327", FlakyOn.All)]
30-
public async Task RazorPagesTemplate_NoAuthImplAsync()
29+
public async Task RazorPagesTemplate_NoAuth()
3130
{
3231
Project = await ProjectFactory.GetOrCreateProject("razorpagesnoauth", Output);
3332

@@ -95,10 +94,9 @@ public async Task RazorPagesTemplate_NoAuthImplAsync()
9594
}
9695

9796
[Theory]
98-
[Flaky("https://github.com/aspnet/AspNetCore-Internal/issues/2335", FlakyOn.All)]
9997
[InlineData(false)]
10098
[InlineData(true)]
101-
public async Task RazorPagesTemplate_IndividualAuthImplAsync(bool useLocalDB)
99+
public async Task RazorPagesTemplate_IndividualAuth(bool useLocalDB)
102100
{
103101
Project = await ProjectFactory.GetOrCreateProject("razorpagesindividual" + (useLocalDB ? "uld" : ""), Output);
104102

src/ProjectTemplates/test/WebApiTemplateTest.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,13 @@ public WebApiTemplateTest(ProjectFactoryFixture factoryFixture, ITestOutputHelpe
2222

2323
public Project Project { get; set; }
2424

25-
[Theory]
26-
[InlineData(null)]
27-
[InlineData("F#")]
28-
public async Task WebApiTemplateAsync(string languageOverride)
25+
[Fact]
26+
public async Task WebApiTemplateFSharp() => await WebApiTemplateCore(languageOverride: "F#");
27+
28+
[Fact]
29+
public async Task WebApiTemplateCSharp() => await WebApiTemplateCore(languageOverride: null);
30+
31+
private async Task WebApiTemplateCore(string languageOverride)
2932
{
3033
Project = await FactoryFixture.GetOrCreateProject("webapi" + (languageOverride == "F#" ? "fsharp" : "csharp"), Output);
3134

0 commit comments

Comments
 (0)