From ffa8433405ea64ec7c09416d18df57f672d350ed Mon Sep 17 00:00:00 2001 From: Dominion Date: Sun, 2 Apr 2023 19:19:35 -0400 Subject: [PATCH] Additional tests meant to catch a WindowsWatchdog issue but they don't yet --- .../Instance/WatchdogTest.cs | 4 +- .../Tgstation.Server.Tests/IntegrationTest.cs | 62 ++++++++++++++++--- tests/Tgstation.Server.Tests/TestingServer.cs | 1 + 3 files changed, 58 insertions(+), 9 deletions(-) diff --git a/tests/Tgstation.Server.Tests/Instance/WatchdogTest.cs b/tests/Tgstation.Server.Tests/Instance/WatchdogTest.cs index 6fd138d17d..495861ee07 100644 --- a/tests/Tgstation.Server.Tests/Instance/WatchdogTest.cs +++ b/tests/Tgstation.Server.Tests/Instance/WatchdogTest.cs @@ -40,7 +40,7 @@ namespace Tgstation.Server.Tests.Instance // Increase startup timeout, disable heartbeats var initialSettings = await instanceClient.DreamDaemon.Update(new DreamDaemonRequest { - StartupTimeout = 60, + StartupTimeout = 10, HeartbeatSeconds = 0, Port = IntegrationTest.DDPort }, cancellationToken); @@ -502,7 +502,7 @@ namespace Tgstation.Server.Tests.Instance return ddProc != null; } - async Task TellWorldToReboot(CancellationToken cancellationToken) + public async Task TellWorldToReboot(CancellationToken cancellationToken) { var daemonStatus = await instanceClient.DreamDaemon.Read(cancellationToken); var initialCompileJob = daemonStatus.ActiveCompileJob; diff --git a/tests/Tgstation.Server.Tests/IntegrationTest.cs b/tests/Tgstation.Server.Tests/IntegrationTest.cs index 872cd9a6ad..2df4ee73b8 100644 --- a/tests/Tgstation.Server.Tests/IntegrationTest.cs +++ b/tests/Tgstation.Server.Tests/IntegrationTest.cs @@ -26,6 +26,7 @@ using Tgstation.Server.Api.Models.Request; using Tgstation.Server.Api.Models.Response; using Tgstation.Server.Api.Rights; using Tgstation.Server.Client; +using Tgstation.Server.Client.Components; using Tgstation.Server.Host.Components.Events; using Tgstation.Server.Host.Components.Repository; using Tgstation.Server.Host.Configuration; @@ -952,12 +953,8 @@ namespace Tgstation.Server.Tests preStartupTime = DateTimeOffset.UtcNow; - // chat bot start, dd autostart, and entity delete tests - serverTask = server.Run(cancellationToken); - using (var adminClient = await CreateAdminClient(server.Url, cancellationToken)) + async Task WaitForInitialJobs(IInstanceClient instanceClient) { - var instanceClient = adminClient.Instances.CreateClient(instance); - var jobs = await instanceClient.Jobs.ListActive(null, cancellationToken); if (!jobs.Any()) { @@ -970,20 +967,71 @@ namespace Tgstation.Server.Tests jobs = getTasks .Select(x => x.Result) .Where(x => x.StartedAt.Value > preStartupTime) - .ToList(); + .ToList(); } var jrt = new JobsRequiredTest(instanceClient.Jobs); foreach (var job in jobs) { Assert.IsTrue(job.StartedAt.Value >= preStartupTime); - await jrt.WaitForJob(job, 140, job.Description.Contains("Reconnect chat bot") ? (bool?)null : (bool?)false, null, cancellationToken); + await jrt.WaitForJob(job, 140, job.Description.Contains("Reconnect chat bot") ? null : false, null, cancellationToken); } + } + + // chat bot start, dd autostart, and reboot with different initial job test + preStartupTime = DateTimeOffset.UtcNow; + serverTask = server.Run(cancellationToken); + long expectedCompileJobId; + DreamDaemonResponse currentDD; + using (var adminClient = await CreateAdminClient(server.Url, cancellationToken)) + { + var instanceClient = adminClient.Instances.CreateClient(instance); + await WaitForInitialJobs(instanceClient); var dd = await instanceClient.DreamDaemon.Read(cancellationToken); Assert.AreEqual(WatchdogStatus.Online, dd.Status.Value); + var compileJob = await instanceClient.DreamMaker.Compile(cancellationToken); + var wdt = new WatchdogTest(instanceClient); + await wdt.WaitForJob(compileJob, 30, false, null, cancellationToken); + + currentDD = await instanceClient.DreamDaemon.Read(cancellationToken); + Assert.AreEqual(currentDD.StagedCompileJob.Job.Id, compileJob.Id); + + await wdt.TellWorldToReboot(cancellationToken); + expectedCompileJobId = compileJob.Id.Value; + + currentDD = await instanceClient.DreamDaemon.Read(cancellationToken); + Assert.AreEqual(currentDD.ActiveCompileJob.Job.Id, expectedCompileJobId); + expectedCompileJobId = currentDD.ActiveCompileJob.Id.Value; + + compileJob = await instanceClient.DreamMaker.Compile(cancellationToken); + await wdt.WaitForJob(compileJob, 30, false, null, cancellationToken); + + currentDD = await instanceClient.DreamDaemon.Read(cancellationToken); + Assert.AreEqual(currentDD.StagedCompileJob.Job.Id, compileJob.Id); + + await adminClient.Administration.Restart(cancellationToken); + } + + await Task.WhenAny(serverTask, Task.Delay(TimeSpan.FromMinutes(1), cancellationToken)); + Assert.IsTrue(serverTask.IsCompleted); + + // post/entity deletion tests + serverTask = server.Run(cancellationToken); + using (var adminClient = await CreateAdminClient(server.Url, cancellationToken)) + { + var instanceClient = adminClient.Instances.CreateClient(instance); + await WaitForInitialJobs(instanceClient); + + await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); + + var lastStaged = currentDD.StagedCompileJob; + currentDD = await instanceClient.DreamDaemon.Read(cancellationToken); + Assert.AreEqual(currentDD.ActiveCompileJob.Id, expectedCompileJobId); + Assert.AreEqual(currentDD.StagedCompileJob?.Id, lastStaged.Id); + var repoTest = new RepositoryTest(instanceClient.Repository, instanceClient.Jobs).RunPostTest(cancellationToken); await new ChatTest(instanceClient.ChatBots, adminClient.Instances, instance).RunPostTest(cancellationToken); await repoTest; diff --git a/tests/Tgstation.Server.Tests/TestingServer.cs b/tests/Tgstation.Server.Tests/TestingServer.cs index 3490255754..f1a6286693 100644 --- a/tests/Tgstation.Server.Tests/TestingServer.cs +++ b/tests/Tgstation.Server.Tests/TestingServer.cs @@ -126,6 +126,7 @@ namespace Tgstation.Server.Tests public void Dispose() { + return; for (int i = 0; i < 5; ++i) try {