test(streaming): close lifecycle gate after cutover
This commit is contained in:
parent
db3ca59fd0
commit
4a205a3e56
7 changed files with 173 additions and 17 deletions
|
|
@ -1,5 +1,6 @@
|
|||
using System.Net;
|
||||
using AcDream.App.Net;
|
||||
using AcDream.App.Rendering;
|
||||
using AcDream.Core.Net;
|
||||
using AcDream.Core.Net.Messages;
|
||||
using AcDream.UI.Abstractions;
|
||||
|
|
@ -833,6 +834,48 @@ public sealed class LiveSessionControllerTests
|
|||
Assert.Throws<ObjectDisposedException>(() => controller.Start(LiveOptions(), host));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ReentrantShutdownRetainsControllerAndDependentsUntilDeferredDisposeCompletes()
|
||||
{
|
||||
var calls = new List<string>();
|
||||
var operations = new TestOperations(calls);
|
||||
var host = new TestHost(calls);
|
||||
var controller = new LiveSessionController(operations);
|
||||
controller.Start(LiveOptions(), host);
|
||||
bool dependentDisposed = false;
|
||||
var shutdown = new ResourceShutdownTransaction(
|
||||
new ResourceShutdownStage("session lifetime",
|
||||
[
|
||||
new("live session", () =>
|
||||
{
|
||||
controller.Dispose();
|
||||
if (!controller.IsDisposalComplete)
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
"live-session disposal is still deferred");
|
||||
}
|
||||
}),
|
||||
]),
|
||||
new ResourceShutdownStage("session dependents",
|
||||
[
|
||||
new("streamer", () => dependentDisposed = true),
|
||||
]));
|
||||
operations.OnTick = () =>
|
||||
{
|
||||
Assert.Throws<AggregateException>(shutdown.CompleteOrThrow);
|
||||
Assert.Equal(0, shutdown.CurrentStage);
|
||||
Assert.False(dependentDisposed);
|
||||
};
|
||||
|
||||
controller.Tick();
|
||||
|
||||
Assert.True(controller.IsDisposalComplete);
|
||||
Assert.False(dependentDisposed);
|
||||
shutdown.CompleteOrThrow();
|
||||
Assert.True(shutdown.IsComplete);
|
||||
Assert.True(dependentDisposed);
|
||||
}
|
||||
|
||||
private static RuntimeOptions LiveOptions(
|
||||
bool live = true,
|
||||
string? user = "user")
|
||||
|
|
|
|||
|
|
@ -342,6 +342,58 @@ public sealed class LandblockBuildOriginTests
|
|||
Assert.DoesNotContain("_liveCenterY", renderPublisherSource, StringComparison.Ordinal);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GameWindowShutdownKeepsStreamerAliveUntilSessionResetConverges()
|
||||
{
|
||||
string source = File.ReadAllText(Path.Combine(
|
||||
FindRepoRoot(),
|
||||
"src",
|
||||
"AcDream.App",
|
||||
"Rendering",
|
||||
"GameWindow.cs"));
|
||||
int sessionStage = source.IndexOf(
|
||||
"new ResourceShutdownStage(\"session lifetime\"",
|
||||
StringComparison.Ordinal);
|
||||
Assert.True(sessionStage >= 0);
|
||||
|
||||
int sessionOperation = source.IndexOf(
|
||||
"new(\"live session\", () =>",
|
||||
sessionStage,
|
||||
StringComparison.Ordinal);
|
||||
Assert.True(sessionOperation > sessionStage);
|
||||
|
||||
int sessionDispose = source.IndexOf(
|
||||
"controller.Dispose()",
|
||||
sessionOperation,
|
||||
StringComparison.Ordinal);
|
||||
Assert.True(sessionDispose > sessionOperation);
|
||||
|
||||
int disposalCompletionBarrier = source.IndexOf(
|
||||
"if (!controller.IsDisposalComplete)",
|
||||
sessionDispose,
|
||||
StringComparison.Ordinal);
|
||||
Assert.True(disposalCompletionBarrier > sessionDispose);
|
||||
|
||||
int sessionReferenceRelease = source.IndexOf(
|
||||
"_liveSessionController = null;",
|
||||
disposalCompletionBarrier,
|
||||
StringComparison.Ordinal);
|
||||
Assert.True(sessionReferenceRelease > disposalCompletionBarrier);
|
||||
|
||||
int dependentStage = source.IndexOf(
|
||||
"new ResourceShutdownStage(\"session dependents\"",
|
||||
sessionReferenceRelease,
|
||||
StringComparison.Ordinal);
|
||||
Assert.True(dependentStage > sessionReferenceRelease);
|
||||
|
||||
int streamerDispose = source.IndexOf(
|
||||
"new(\"streamer\", () => _streamer?.Dispose())",
|
||||
dependentStage,
|
||||
StringComparison.Ordinal);
|
||||
|
||||
Assert.True(streamerDispose > dependentStage);
|
||||
}
|
||||
|
||||
private static LandblockBuild EmptyBuild(uint landblockId, LandblockBuildOrigin origin) =>
|
||||
new(
|
||||
new LoadedLandblock(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue