Skip to content

Commit

Permalink
File scoped namespaces
Browse files Browse the repository at this point in the history
  • Loading branch information
damianh committed Jun 13, 2024
1 parent 3fd1ef0 commit 8c568e4
Show file tree
Hide file tree
Showing 16 changed files with 1,098 additions and 1,114 deletions.
39 changes: 19 additions & 20 deletions src/LittleForker.Tests/CooperativeShutdownTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,30 +6,29 @@
using Xunit;
using Xunit.Abstractions;

namespace LittleForker
namespace LittleForker;

public class CooperativeShutdownTests
{
public class CooperativeShutdownTests
{
private readonly ILoggerFactory _loggerFactory;
private readonly ILoggerFactory _loggerFactory;

public CooperativeShutdownTests(ITestOutputHelper outputHelper)
{
_loggerFactory = new XunitLoggerFactory(outputHelper).LoggerFactory;
}
public CooperativeShutdownTests(ITestOutputHelper outputHelper)
{
_loggerFactory = new XunitLoggerFactory(outputHelper).LoggerFactory;
}

[Fact]
public async Task When_server_signals_exit_then_should_notify_client_to_exit()
{
var exitCalled = new TaskCompletionSource<bool>();
var listener = await CooperativeShutdown.Listen(
() => exitCalled.SetResult(true),
_loggerFactory);
[Fact]
public async Task When_server_signals_exit_then_should_notify_client_to_exit()
{
var exitCalled = new TaskCompletionSource<bool>();
var listener = await CooperativeShutdown.Listen(
() => exitCalled.SetResult(true),
_loggerFactory);

await CooperativeShutdown.SignalExit(Process.GetCurrentProcess().Id, _loggerFactory);
await CooperativeShutdown.SignalExit(Process.GetCurrentProcess().Id, _loggerFactory);

(await exitCalled.Task).ShouldBeTrue();
(await exitCalled.Task).ShouldBeTrue();

listener.Dispose();
}
listener.Dispose();
}
}
}
13 changes: 6 additions & 7 deletions src/LittleForker.Tests/Infra/TestOutputHelperExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
using Xunit.Abstractions;

namespace LittleForker
namespace LittleForker;

public static class TestOutputHelperExtensions
{
public static class TestOutputHelperExtensions
public static void WriteLine2(this ITestOutputHelper outputHelper, object o)
{
public static void WriteLine2(this ITestOutputHelper outputHelper, object o)
if (o != null)
{
if (o != null)
{
outputHelper.WriteLine(o.ToString());
}
outputHelper.WriteLine(o.ToString());
}
}
}
141 changes: 70 additions & 71 deletions src/LittleForker.Tests/ProcessExitedHelperTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,89 +5,88 @@
using Xunit;
using Xunit.Abstractions;

namespace LittleForker
namespace LittleForker;

public class ProcessExitedHelperTests
{
public class ProcessExitedHelperTests
private readonly ITestOutputHelper _outputHelper;
private readonly ILoggerFactory _loggerFactory;

public ProcessExitedHelperTests(ITestOutputHelper outputHelper)
{
private readonly ITestOutputHelper _outputHelper;
private readonly ILoggerFactory _loggerFactory;
_outputHelper = outputHelper;
_loggerFactory = new XunitLoggerFactory(outputHelper).LoggerFactory;
}

public ProcessExitedHelperTests(ITestOutputHelper outputHelper)
[Fact]
public async Task When_parent_process_does_not_exist_then_should_call_parent_exited_callback()
{
var parentExited = new TaskCompletionSource<int?>();
using (new ProcessExitedHelper(-1, watcher => parentExited.SetResult(watcher.ProcessId), _loggerFactory))
{
_outputHelper = outputHelper;
_loggerFactory = new XunitLoggerFactory(outputHelper).LoggerFactory;
var processId = await parentExited.Task.TimeoutAfter(TimeSpan.FromSeconds(2));
processId.ShouldBe(-1);
}
}

[Fact]
public async Task When_parent_process_does_not_exist_then_should_call_parent_exited_callback()
{
var parentExited = new TaskCompletionSource<int?>();
using (new ProcessExitedHelper(-1, watcher => parentExited.SetResult(watcher.ProcessId), _loggerFactory))
{
var processId = await parentExited.Task.TimeoutAfter(TimeSpan.FromSeconds(2));
processId.ShouldBe(-1);
}
}
[Fact]
public async Task When_parent_process_exits_than_should_call_parent_exited_callback()
{
// Start parent
var supervisor = new ProcessSupervisor(
_loggerFactory,
ProcessRunType.NonTerminating,
Environment.CurrentDirectory,
"dotnet",
"./NonTerminatingProcess/NonTerminatingProcess.dll");
var parentIsRunning = supervisor.WhenStateIs(ProcessSupervisor.State.Running);
supervisor.OutputDataReceived += data => _outputHelper.WriteLine($"Parent Process: {data}");
await supervisor.Start();
await parentIsRunning;

[Fact]
public async Task When_parent_process_exits_than_should_call_parent_exited_callback()
// Monitor parent
var parentExited = new TaskCompletionSource<int?>();
using (new ProcessExitedHelper(supervisor.ProcessInfo.Id, watcher => parentExited.SetResult(watcher.ProcessId), _loggerFactory))
{
// Start parent
var supervisor = new ProcessSupervisor(
_loggerFactory,
ProcessRunType.NonTerminating,
Environment.CurrentDirectory,
"dotnet",
"./NonTerminatingProcess/NonTerminatingProcess.dll");
var parentIsRunning = supervisor.WhenStateIs(ProcessSupervisor.State.Running);
supervisor.OutputDataReceived += data => _outputHelper.WriteLine($"Parent Process: {data}");
await supervisor.Start();
await parentIsRunning;

// Monitor parent
var parentExited = new TaskCompletionSource<int?>();
using (new ProcessExitedHelper(supervisor.ProcessInfo.Id, watcher => parentExited.SetResult(watcher.ProcessId), _loggerFactory))
{
// Stop parent
await supervisor.Stop(TimeSpan.FromSeconds(2));
var processId = await parentExited.Task.TimeoutAfter(TimeSpan.FromSeconds(2));
processId.Value.ShouldBeGreaterThan(0);
}
// Stop parent
await supervisor.Stop(TimeSpan.FromSeconds(2));
var processId = await parentExited.Task.TimeoutAfter(TimeSpan.FromSeconds(2));
processId.Value.ShouldBeGreaterThan(0);
}
}

[Fact]
public async Task When_parent_process_exits_then_child_process_should_also_do_so()
{
// Start parent
var parentSupervisor = new ProcessSupervisor(
_loggerFactory,
ProcessRunType.NonTerminating,
Environment.CurrentDirectory,
"dotnet",
"./NonTerminatingProcess/NonTerminatingProcess.dll");
parentSupervisor.OutputDataReceived += data => _outputHelper.WriteLine($"Parent: {data}");
var parentIsRunning = parentSupervisor.WhenStateIs(ProcessSupervisor.State.Running);
await parentSupervisor.Start();
await parentIsRunning;
[Fact]
public async Task When_parent_process_exits_then_child_process_should_also_do_so()
{
// Start parent
var parentSupervisor = new ProcessSupervisor(
_loggerFactory,
ProcessRunType.NonTerminating,
Environment.CurrentDirectory,
"dotnet",
"./NonTerminatingProcess/NonTerminatingProcess.dll");
parentSupervisor.OutputDataReceived += data => _outputHelper.WriteLine($"Parent: {data}");
var parentIsRunning = parentSupervisor.WhenStateIs(ProcessSupervisor.State.Running);
await parentSupervisor.Start();
await parentIsRunning;

// Start child
var childSupervisor = new ProcessSupervisor(
_loggerFactory,
ProcessRunType.SelfTerminating,
Environment.CurrentDirectory,
"dotnet",
$"./NonTerminatingProcess/NonTerminatingProcess.dll --ParentProcessId={parentSupervisor.ProcessInfo.Id}");
childSupervisor.OutputDataReceived += data => _outputHelper.WriteLine($"Child: {data}");
var childIsRunning = childSupervisor.WhenStateIs(ProcessSupervisor.State.Running);
var childHasStopped = childSupervisor.WhenStateIs(ProcessSupervisor.State.ExitedSuccessfully);
await childSupervisor.Start();
await childIsRunning;
// Start child
var childSupervisor = new ProcessSupervisor(
_loggerFactory,
ProcessRunType.SelfTerminating,
Environment.CurrentDirectory,
"dotnet",
$"./NonTerminatingProcess/NonTerminatingProcess.dll --ParentProcessId={parentSupervisor.ProcessInfo.Id}");
childSupervisor.OutputDataReceived += data => _outputHelper.WriteLine($"Child: {data}");
var childIsRunning = childSupervisor.WhenStateIs(ProcessSupervisor.State.Running);
var childHasStopped = childSupervisor.WhenStateIs(ProcessSupervisor.State.ExitedSuccessfully);
await childSupervisor.Start();
await childIsRunning;

// Stop parent
await parentSupervisor.Stop();
// Stop parent
await parentSupervisor.Stop();

// Wait for child to stop
await childHasStopped.TimeoutAfter(TimeSpan.FromSeconds(2));
}
// Wait for child to stop
await childHasStopped.TimeoutAfter(TimeSpan.FromSeconds(2));
}
}
Loading

0 comments on commit 8c568e4

Please sign in to comment.