diff --git a/src/Shared/E2ETesting/BrowserTestBase.cs b/src/Shared/E2ETesting/BrowserTestBase.cs index 6299b4b020..8e94a4bfb2 100644 --- a/src/Shared/E2ETesting/BrowserTestBase.cs +++ b/src/Shared/E2ETesting/BrowserTestBase.cs @@ -21,6 +21,11 @@ namespace Microsoft.AspNetCore.E2ETesting private static readonly AsyncLocal _logs = new AsyncLocal(); private static readonly AsyncLocal _output = new AsyncLocal(); + // Limit the number of concurrent browser tests. + private readonly static int MaxConcurrentBrowsers = Environment.ProcessorCount * 2; + private static readonly SemaphoreSlim _semaphore = new SemaphoreSlim(MaxConcurrentBrowsers); + private bool _semaphoreHeld; + public BrowserTestBase(BrowserFixture browserFixture, ITestOutputHelper output) { BrowserFixture = browserFixture; @@ -39,6 +44,11 @@ namespace Microsoft.AspNetCore.E2ETesting public Task DisposeAsync() { + if (_semaphoreHeld) + { + _semaphore.Release(); + } + return Task.CompletedTask; } @@ -49,6 +59,9 @@ namespace Microsoft.AspNetCore.E2ETesting public virtual async Task InitializeAsync(string isolationContext) { + await _semaphore.WaitAsync(TimeSpan.FromMinutes(30)); + _semaphoreHeld = true; + var (browser, logs) = await BrowserFixture.GetOrCreateBrowserAsync(Output, isolationContext); _asyncBrowser.Value = browser; _logs.Value = logs;