Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WASI] HTTP server, exit code #1244

Merged
merged 7 commits into from
Sep 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@

using System;
using System.Collections.Generic;
using Microsoft.DotNet.XHarness.CLI.CommandArguments.Wasm;

namespace Microsoft.DotNet.XHarness.CLI.CommandArguments.Wasi;

internal class WasiTestCommandArguments : XHarnessCommandArguments
internal class WasiTestCommandArguments : XHarnessCommandArguments, IWebServerArguments
{
public WasmEngineArgument Engine { get; } = new();
public WasmEngineLocationArgument EnginePath { get; } = new();
Expand All @@ -16,6 +17,15 @@ internal class WasiTestCommandArguments : XHarnessCommandArguments
public OutputDirectoryArgument OutputDirectory { get; } = new();
public TimeoutArgument Timeout { get; } = new(TimeSpan.FromMinutes(15));

public WebServerMiddlewareArgument WebServerMiddlewarePathsAndTypes { get; } = new();
public WebServerHttpEnvironmentVariables WebServerHttpEnvironmentVariables { get; } = new();
public WebServerHttpsEnvironmentVariables WebServerHttpsEnvironmentVariables { get; } = new();
public WebServerUseHttpsArguments WebServerUseHttps { get; } = new();
public WebServerUseCorsArguments WebServerUseCors { get; } = new();
public WebServerUseCrossOriginPolicyArguments WebServerUseCrossOriginPolicy { get; } = new();
public WebServerUseDefaultFilesArguments WebServerUseDefaultFiles { get; } = new();
public bool IsWebServerEnabled => WebServerMiddlewarePathsAndTypes.Value.Count > 0;

protected override IEnumerable<Argument> GetArguments() => new Argument[]
{
Engine,
Expand All @@ -24,5 +34,13 @@ internal class WasiTestCommandArguments : XHarnessCommandArguments
OutputDirectory,
Timeout,
ExpectedExitCode,

WebServerMiddlewarePathsAndTypes,
WebServerHttpEnvironmentVariables,
WebServerHttpsEnvironmentVariables,
WebServerUseHttps,
WebServerUseCors,
WebServerUseCrossOriginPolicy,
WebServerUseDefaultFiles,
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ namespace Microsoft.DotNet.XHarness.CLI.CommandArguments.Wasm;

internal interface IWebServerArguments
{
bool IsWebServerEnabled { get; }
WebServerMiddlewareArgument WebServerMiddlewarePathsAndTypes { get; }
WebServerHttpEnvironmentVariables WebServerHttpEnvironmentVariables { get; }
WebServerHttpsEnvironmentVariables WebServerHttpsEnvironmentVariables { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ internal class WasmTestBrowserCommandArguments : XHarnessCommandArguments, IWebS
public WebServerUseCorsArguments WebServerUseCors { get; } = new();
public WebServerUseCrossOriginPolicyArguments WebServerUseCrossOriginPolicy { get; } = new();
public WebServerUseDefaultFilesArguments WebServerUseDefaultFiles { get; } = new();
public bool IsWebServerEnabled => WebServerMiddlewarePathsAndTypes.Value.Count > 0;

protected override IEnumerable<Argument> GetArguments() => new Argument[]
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ internal class WasmTestCommandArguments : XHarnessCommandArguments, IWebServerAr
public WebServerUseCorsArguments WebServerUseCors { get; } = new();
public WebServerUseCrossOriginPolicyArguments WebServerUseCrossOriginPolicy { get; } = new();
public WebServerUseDefaultFilesArguments WebServerUseDefaultFiles { get; } = new();
public bool IsWebServerEnabled => WebServerMiddlewarePathsAndTypes.Value.Count > 0;

protected override IEnumerable<Argument> GetArguments() => new Argument[]
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ internal class WebServerCommandArguments : XHarnessCommandArguments, IWebServerA
public WebServerUseCorsArguments WebServerUseCors { get; } = new();
public WebServerUseCrossOriginPolicyArguments WebServerUseCrossOriginPolicy { get; } = new();
public WebServerUseDefaultFilesArguments WebServerUseDefaultFiles { get; } = new();
public bool IsWebServerEnabled => WebServerMiddlewarePathsAndTypes.Value.Count > 0;

public TimeoutArgument Timeout { get; } = new(TimeSpan.FromMinutes(15));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,35 @@ protected override async Task<ExitCode> InvokeInternal(ILogger logger)
logger.LogInformation($"Using wasm engine {Arguments.Engine.Value} from path {engineBinary}");
await PrintVersionAsync(Arguments.Engine.Value.Value, engineBinary);

ServerURLs? serverURLs = null;
if (Arguments.IsWebServerEnabled)
{
serverURLs = await WebServer.Start(
Arguments,
logger,
cts.Token);
}

var engineArgs = new List<string>();
engineArgs.AddRange(Arguments.EngineArgs.Value);

if (Arguments.IsWebServerEnabled)
{
foreach (var envVariable in Arguments.WebServerHttpEnvironmentVariables.Value)
{
engineArgs.Add($"--env");
engineArgs.Add($"{envVariable}={serverURLs!.Http}");
pavelsavara marked this conversation as resolved.
Show resolved Hide resolved
}
if (Arguments.WebServerUseHttps)
{
foreach (var envVariable in Arguments.WebServerHttpsEnvironmentVariables.Value)
{
engineArgs.Add($"--env");
engineArgs.Add($"{envVariable}={serverURLs!.Https}");
}
}
}

engineArgs.AddRange(PassThroughArguments);

var xmlResultsFilePath = Path.Combine(Arguments.OutputDirectory, "testResults.xml");
Expand Down Expand Up @@ -115,6 +142,11 @@ protected override async Task<ExitCode> InvokeInternal(ILogger logger)
// process should be done too, or about to be done!
var result = await processTask;
ExitCode logProcessorExitCode = await logProcessor.CompleteAndFlushAsync();
if (logProcessor.ForwardedExitCode != null)
{
// until WASI can work with unix exit code https:/WebAssembly/wasi-cli/pull/44
result.ExitCode = logProcessor.ForwardedExitCode.Value;
}

if (result.ExitCode != Arguments.ExpectedExitCode)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,13 +75,12 @@ protected override async Task<ExitCode> InvokeInternal(ILogger logger)
diagnosticsData.TargetOS = versionString;

ServerURLs? serverURLs = null;
if (Arguments.WebServerMiddlewarePathsAndTypes.Value.Count > 0)
if (Arguments.IsWebServerEnabled)
{
serverURLs = await WebServer.Start(
Arguments,
logger,
cts.Token);
cts.CancelAfter(Arguments.Timeout);
}

var engineArgs = new List<string>();
Expand All @@ -101,7 +100,7 @@ protected override async Task<ExitCode> InvokeInternal(ILogger logger)
engineArgs.Add("--");
}

if (Arguments.WebServerMiddlewarePathsAndTypes.Value.Count > 0)
if (Arguments.IsWebServerEnabled)
{
foreach (var envVariable in Arguments.WebServerHttpEnvironmentVariables.Value)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public class WasmTestMessagesProcessor

// Set once `WASM EXIT` message is received
public TaskCompletionSource WasmExitReceivedTcs { get; } = new ();
public int? ForwardedExitCode {get; private set; }

public WasmTestMessagesProcessor(string xmlResultsFilePath, string stdoutFilePath, ILogger logger, string? errorPatternsFile = null, WasmSymbolicatorBase? symbolicator = null)
{
Expand Down Expand Up @@ -224,6 +225,14 @@ private void ProcessMessage(string message, bool isError = false)
if (line.StartsWith("WASM EXIT"))
{
_logger.LogDebug("Reached wasm exit");

// until WASI can work with unix exit code https:/WebAssembly/wasi-cli/pull/44
if (line.Length > 10)
{
// the message on WASI looks like WASM EXIT 123
// here we strip the first 10 characters and parse the rest
ForwardedExitCode = int.Parse(line.Substring(10));
pavelsavara marked this conversation as resolved.
Show resolved Hide resolved
}
if (!WasmExitReceivedTcs.TrySetResult())
_logger.LogDebug("Got a duplicate exit message.");
}
Expand Down
Loading