File: BrowserLogsPipeBrowserProcessLauncherTests.cs
Web Access
Project: src\tests\Aspire.Hosting.Browsers.Tests\Aspire.Hosting.Browsers.Tests.csproj (Aspire.Hosting.Browsers.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Text;
using Microsoft.AspNetCore.InternalTesting;
 
namespace Aspire.Hosting.Browsers.Tests;
 
[Trait("Partition", "2")]
public class BrowserLogsPipeBrowserProcessLauncherTests
{
    [Fact]
    public void CreatePipeArguments_AppendsRemoteDebuggingPipeArgument()
    {
        var originalArguments = new[]
        {
            "--user-data-dir=/tmp/aspire-browser",
            "--new-window",
            "about:blank"
        };
 
        var pipeArguments = BrowserLogsPipeBrowserProcessLauncher.CreatePipeArguments(originalArguments);
 
        Assert.Equal(
            [
                "--user-data-dir=/tmp/aspire-browser",
                "--new-window",
                "about:blank",
                "--remote-debugging-pipe"
            ],
            pipeArguments);
        Assert.DoesNotContain("--remote-debugging-pipe", originalArguments);
    }
 
    [Fact]
    public void BuildWindowsCommandLine_QuotesExecutableAndArguments()
    {
        var commandLine = BrowserLogsPipeBrowserProcessLauncher.BuildWindowsCommandLine(
            @"C:\Program Files\Browser\chrome.exe",
            [
                "--flag",
                @"--user-data-dir=C:\Users\Test User\Profile",
                "quote\"value"
            ]);
 
        Assert.Equal("\"C:\\Program Files\\Browser\\chrome.exe\" --flag \"--user-data-dir=C:\\Users\\Test User\\Profile\" \"quote\\\"value\"", commandLine);
    }
 
    [Fact]
    public async Task Start_MapsPosixPipeDescriptorsToChildFd3AndFd4()
    {
        if (OperatingSystem.IsWindows())
        {
            return;
        }
 
        await using var process = BrowserLogsPipeBrowserProcessLauncher.Start(
            "/bin/sh",
            [
                "-c",
                "IFS= read -r line <&3; printf '%s' \"$line\" >&4",
                "browserlogs-pipe-test"
            ]);
 
        await process.BrowserInput.WriteAsync(Encoding.UTF8.GetBytes("ping\n")).DefaultTimeout();
        await process.BrowserInput.FlushAsync().DefaultTimeout();
 
        var response = await ReadExactlyAsync(process.BrowserOutput, byteCount: 4).DefaultTimeout();
        Assert.Equal("ping", Encoding.UTF8.GetString(response));
 
        var result = await process.ProcessTask.DefaultTimeout();
        Assert.Equal(0, result.ExitCode);
    }
 
    private static async Task<byte[]> ReadExactlyAsync(Stream stream, int byteCount)
    {
        var buffer = new byte[byteCount];
        var offset = 0;
 
        while (offset < buffer.Length)
        {
            var read = await stream.ReadAsync(buffer.AsMemory(offset, buffer.Length - offset));
            if (read == 0)
            {
                throw new EndOfStreamException("The process exited before the expected pipe response was read.");
            }
 
            offset += read;
        }
 
        return buffer;
    }
}