File: BrowserTestBase.cs
Web Access
Project: src\src\Shared\BrowserTesting\src\Microsoft.AspNetCore.BrowserTesting.csproj (Microsoft.AspNetCore.BrowserTesting)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.BrowserTesting;
using Microsoft.AspNetCore.InternalTesting;
using Microsoft.Extensions.Configuration;
using Microsoft.Playwright;
using Xunit;
using Xunit.Abstractions;
 
namespace Microsoft.AspNetCore.BrowserTesting;
 
public class BrowserTestBase : LoggedTest, IAsyncLifetime
{
    private static readonly bool _isCIEnvironment =
        !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("ContinuousIntegrationBuild")) ||
        !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("Helix"));
 
    private static readonly BrowserManagerConfiguration _config = new BrowserManagerConfiguration(CreateConfiguration());
 
    public BrowserTestBase(ITestOutputHelper output = null) : base(output) { }
 
    protected override async Task InitializeCoreAsync(TestContext context)
    {
        BrowserManager = await BrowserManager.CreateAsync(_config, LoggerFactory);
        BrowserContextInfo = new ContextInformation(LoggerFactory);
        _output = new BrowserTestOutputLogger(Logger);
    }
 
    public Task InitializeAsync() => Task.CompletedTask;
 
    private static IConfiguration CreateConfiguration()
    {
        var basePath = Path.GetDirectoryName(typeof(BrowserTestBase).Assembly.Location);
        var os = Environment.OSVersion.Platform switch
        {
            PlatformID.Win32NT => "win",
            PlatformID.Unix => "linux",
            PlatformID.MacOSX => "osx",
            _ => null
        };
 
        var builder = new ConfigurationBuilder()
            .AddJsonFile(Path.Combine(basePath, "playwrightSettings.json"))
            .AddJsonFile(Path.Combine(basePath, $"playwrightSettings.{os}.json"), optional: true);
 
        if (_isCIEnvironment)
        {
            builder.AddJsonFile(Path.Combine(basePath, "playwrightSettings.ci.json"), optional: true)
                .AddJsonFile(Path.Combine(basePath, $"playwrightSettings.ci.{os}.json"), optional: true);
        }
 
        if (Debugger.IsAttached)
        {
            builder.AddJsonFile(Path.Combine(basePath, "playwrightSettings.debug.json"), optional: true);
        }
 
        return builder.Build();
    }
 
    public virtual Task DisposeAsync() => BrowserManager?.DisposeAsync();
 
    private ITestOutputHelper _output;
    public ITestOutputHelper Output
    {
        get
        {
            if (_output == null)
            {
                _output = new BrowserTestOutputLogger(Logger);
            }
            return _output;
        }
    }
 
    public ContextInformation BrowserContextInfo { get; protected set; }
    public BrowserManager BrowserManager { get; private set; }
}