acdream/tests/AcDream.Launcher.Core.Tests.Fixtures.ConsoleSignalChild/Program.cs

54 lines
1.3 KiB
C#

using System.Text.Json;
if (args.Length < 4
|| args[0] != "wait-for-break"
|| string.IsNullOrWhiteSpace(args[1])
|| string.IsNullOrWhiteSpace(args[2]))
{
return 64;
}
string readyPath = Path.GetFullPath(args[1]);
string breakPath = Path.GetFullPath(args[2]);
string label = args[3];
string[] payloadArguments = args.Skip(4).ToArray();
using var stopped = new ManualResetEventSlim(false);
ConsoleCancelEventHandler handler = (_, eventArgs) =>
{
if (eventArgs.SpecialKey != ConsoleSpecialKey.ControlBreak)
{
return;
}
eventArgs.Cancel = true;
try
{
File.WriteAllText(breakPath, label);
}
finally
{
stopped.Set();
}
};
Console.CancelKeyPress += handler;
try
{
string stdin = Console.In.ReadToEnd();
Directory.CreateDirectory(Path.GetDirectoryName(readyPath)!);
File.WriteAllText(
readyPath,
JsonSerializer.Serialize(new
{
processId = Environment.ProcessId,
label,
arguments = payloadArguments,
stdinLength = stdin.Length,
stdinLineCount = stdin.Count(character => character == '\n'),
}));
return stopped.Wait(TimeSpan.FromSeconds(30)) ? 0 : 75;
}
finally
{
Console.CancelKeyPress -= handler;
}