From 84e7f38118911b9cc1ce238ee2e804151197119e Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 28 Apr 2020 15:16:02 -0400 Subject: [PATCH] More test stuff --- tests/DMAPI/LongRunning/Test.dm | 13 +++ .../Instance/FunctionalTest.cs | 103 ++++++++++++++++-- 2 files changed, 104 insertions(+), 12 deletions(-) diff --git a/tests/DMAPI/LongRunning/Test.dm b/tests/DMAPI/LongRunning/Test.dm index 641e5a2b6e..cf3ca66b0a 100644 --- a/tests/DMAPI/LongRunning/Test.dm +++ b/tests/DMAPI/LongRunning/Test.dm @@ -18,3 +18,16 @@ /world/Reboot(reason) TgsReboot() + +/datum/tgs_chat_command/reboot + name = "echo" + help_text = "echos input parameters" + +/datum/tgs_chat_command/reboot/Run(datum/tgs_chat_user/sender, params) + set waitfor = FALSE + RebootAsync() + return "Echo: [sender.channel.connection_name]|[sender.channel.friendly_name]|[sender.friendly_name]: [params]. Rebooting..." + +/proc/RebootAsync() + sleep(30) + world.Reboot() diff --git a/tests/Tgstation.Server.Tests/Instance/FunctionalTest.cs b/tests/Tgstation.Server.Tests/Instance/FunctionalTest.cs index 11128ad00d..ddddb1dacf 100644 --- a/tests/Tgstation.Server.Tests/Instance/FunctionalTest.cs +++ b/tests/Tgstation.Server.Tests/Instance/FunctionalTest.cs @@ -1,11 +1,18 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +using Microsoft.Extensions.Logging; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; using System; +using System.Collections.Generic; using System.IO; +using System.Linq; using System.Threading; using System.Threading.Tasks; using Tgstation.Server.Api.Models; using Tgstation.Server.Client.Components; +using Tgstation.Server.Host.Components.Chat.Providers; using Tgstation.Server.Host.Components.Interop; +using Tgstation.Server.Host.Core; +using Tgstation.Server.Host.System; namespace Tgstation.Server.Tests.Instance { @@ -22,21 +29,12 @@ namespace Tgstation.Server.Tests.Instance public async Task Run(CancellationToken cancellationToken) { await RunBasicTest(cancellationToken); + await RunLongRunningTestThenUpdate(cancellationToken); } async Task RunBasicTest(CancellationToken cancellationToken) { - await instanceClient.DreamMaker.Update(new DreamMaker - { - ApiValidationSecurityLevel = DreamDaemonSecurity.Ultrasafe, - ProjectName = "tests/DMAPI/BasicOperation/basic_operation_test" - }, cancellationToken); - - var compileJobJob = await instanceClient.DreamMaker.Compile(cancellationToken); - - await WaitForJob(compileJobJob, 90, false, cancellationToken); - - var daemonStatus = await instanceClient.DreamDaemon.Read(cancellationToken); + var daemonStatus = await DeployTestDme("BasicOperation/basic_operation_test", DreamDaemonSecurity.Ultrasafe, cancellationToken); Assert.IsNotNull(daemonStatus.ActiveCompileJob); Assert.AreEqual(DMApiConstants.Version, daemonStatus.ActiveCompileJob.DMApiVersion); @@ -51,6 +49,87 @@ namespace Tgstation.Server.Tests.Instance await CheckDMApiFail(daemonStatus.ActiveCompileJob, cancellationToken); } + async Task RunLongRunningTestThenUpdate(CancellationToken cancellationToken) + { + const string DmeName = "BasicOperation/basic_operation_test"; + + var daemonStatus = await DeployTestDme(DmeName, DreamDaemonSecurity.Trusted, cancellationToken); + + var initialCompileJob = daemonStatus.ActiveCompileJob; + Assert.IsNotNull(daemonStatus.ActiveCompileJob); + Assert.AreEqual(DMApiConstants.Version, daemonStatus.ActiveCompileJob.DMApiVersion); + Assert.AreEqual(DreamDaemonSecurity.Ultrasafe, daemonStatus.ActiveCompileJob.MinimumSecurityLevel); + + var startJob = await instanceClient.DreamDaemon.Start(cancellationToken).ConfigureAwait(false); + + await WaitForJob(startJob, 10, false, cancellationToken); + + daemonStatus = await DeployTestDme(DmeName, DreamDaemonSecurity.Trusted, cancellationToken); + + Assert.AreEqual(initialCompileJob.Id, daemonStatus.ActiveCompileJob.Id); + Assert.AreNotEqual(initialCompileJob.Id, daemonStatus.StagedCompileJob.Id); + + await SendCommandHack("reboot", false, cancellationToken); + + await GracefulWatchdogShutdown(30, cancellationToken); + } + + async Task SendCommandHack(string message, bool useTgsGlobal, CancellationToken cancellationToken) + { + // tricky part, we need to get tgs to reboot. + // We have a chat command to do this + // But oh god i should be drawn and quartered for how i'm invoking it here + // this assumes a purely open channel stored in the TGS4_TEST_IRC_CONNECTION_STRING + + var connectionString = Environment.GetEnvironmentVariable("TGS4_TEST_IRC_CONNECTION_STRING"); + var builder = new IrcConnectionStringBuilder(connectionString); + + using var provider = new IrcProvider( + new AssemblyInformationProvider(), + new AsyncDelayer(), + Mock.Of>(), + builder.Address, + builder.Port.Value, + builder.Nickname + "_hack_other_user", + null, + null, + 10, + builder.UseSsl.Value); + + await provider.Connect(cancellationToken); + + var channels = await provider.MapChannels( + new List + { + new ChatChannel + { + IrcChannel = Environment.GetEnvironmentVariable("TGS4_IRC_CHAT_CHANNEL"), + Tag = "ohgodohfuck", + IsAdminChannel = false, + IsUpdatesChannel = false, + IsWatchdogChannel = false + } + }, + cancellationToken); + + await provider.SendMessage(channels.First().RealId, $"!{(useTgsGlobal ? "tgs" : builder.Nickname)} {message}", cancellationToken); + } + + async Task DeployTestDme(string dmeName, DreamDaemonSecurity deploymentSecurity, CancellationToken cancellationToken) + { + await instanceClient.DreamMaker.Update(new DreamMaker + { + ApiValidationSecurityLevel = deploymentSecurity, + ProjectName = $"tests/DMAPI/{dmeName}" + }, cancellationToken); + + var compileJobJob = await instanceClient.DreamMaker.Compile(cancellationToken); + + await WaitForJob(compileJobJob, 90, false, cancellationToken); + + return await instanceClient.DreamDaemon.Read(cancellationToken); + } + async Task GracefulWatchdogShutdown(uint timeout, CancellationToken cancellationToken) { await instanceClient.DreamDaemon.Update(new DreamDaemon