From 65472b5df037b6c5fad21eeb675fe388eafdaba3 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 28 Apr 2020 00:45:24 -0400 Subject: [PATCH] WIP --- .../Components/Deployment/DreamMaker.cs | 10 ++- .../Instance/FunctionalTest.cs | 86 +++++++++++++++++++ .../Instance/InstanceTest.cs | 2 + 3 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 tests/Tgstation.Server.Tests/Instance/FunctionalTest.cs diff --git a/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs b/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs index 679a42b394..1e696bce5f 100644 --- a/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs +++ b/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs @@ -230,7 +230,15 @@ namespace Tgstation.Server.Host.Components.Deployment /// A representing the running operation async Task RunDreamMaker(string dreamMakerPath, Models.CompileJob job, CancellationToken cancellationToken) { - using (var dm = processExecutor.LaunchProcess(dreamMakerPath, ioManager.ResolvePath(ioManager.ConcatPath(job.DirectoryName.ToString(), ADirectoryName)), String.Format(CultureInfo.InvariantCulture, "-clean {0}.{1}", job.DmeName, DmeExtension), true, true)) + using (var dm = processExecutor.LaunchProcess( + dreamMakerPath, + ioManager.ResolvePath( + ioManager.ConcatPath( + job.DirectoryName.ToString(), + ADirectoryName)), + $"-clean {job.DmeName}.{DmeExtension}", + true, + true)) { int exitCode; using (cancellationToken.Register(() => dm.Terminate())) diff --git a/tests/Tgstation.Server.Tests/Instance/FunctionalTest.cs b/tests/Tgstation.Server.Tests/Instance/FunctionalTest.cs new file mode 100644 index 0000000000..0a9ab300f6 --- /dev/null +++ b/tests/Tgstation.Server.Tests/Instance/FunctionalTest.cs @@ -0,0 +1,86 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using Tgstation.Server.Api.Models; +using Tgstation.Server.Client.Components; +using Tgstation.Server.Host.Components.Interop; + +namespace Tgstation.Server.Tests.Instance +{ + sealed class FunctionalTest : JobsRequiredTest + { + readonly IInstanceClient instanceClient; + + public FunctionalTest(IInstanceClient instanceClient) + : base(instanceClient.Jobs) + { + this.instanceClient = instanceClient ?? throw new ArgumentNullException(nameof(instanceClient)); + } + + public async Task Run(CancellationToken cancellationToken) + { + await RunBasicTest(cancellationToken); + } + + async Task RunBasicTest(CancellationToken cancellationToken) + { + await instanceClient.DreamMaker.Update(new DreamMaker + { + ApiValidationSecurityLevel = DreamDaemonSecurity.Trusted, + ProjectName = "tests/DMAPI/BasicOperation/basic_operation_test" + }, cancellationToken); + + var compileJobJob = await instanceClient.DreamMaker.Compile(cancellationToken); + + await WaitForJob(compileJobJob, 90, false, cancellationToken); + + await Task.Delay(3000); + + var daemonStatus = await instanceClient.DreamDaemon.Read(cancellationToken); + + Assert.IsNotNull(daemonStatus.ActiveCompileJob); + Assert.AreEqual(DMApiConstants.Version, daemonStatus.ActiveCompileJob.DMApiVersion); + Assert.AreEqual(DreamDaemonSecurity.Safe, daemonStatus.ActiveCompileJob.MinimumSecurityLevel); + + var startJob = await instanceClient.DreamDaemon.Start(cancellationToken).ConfigureAwait(false); + + await WaitForJob(startJob, 10, false, cancellationToken); + + await GracefulWatchdogShutdown(30, cancellationToken); + + await CheckDMApiFail(daemonStatus.ActiveCompileJob, cancellationToken); + } + + async Task GracefulWatchdogShutdown(uint timeout, CancellationToken cancellationToken) + { + await instanceClient.DreamDaemon.Update(new DreamDaemon + { + SoftShutdown = true + }, cancellationToken); + + do + { + await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false); + var ddStatus = await instanceClient.DreamDaemon.Read(cancellationToken); + if (!ddStatus.Running.Value) + break; + + if (--timeout == 0) + Assert.Fail("DreamDaemon didn't shutdown within the timeout!"); + } + while (timeout > 0); + } + + async Task CheckDMApiFail(CompileJob compileJob, CancellationToken cancellationToken) + { + var failFile = Path.Combine(instanceClient.Metadata.Path, "Game", compileJob.DirectoryName.Value.ToString(), Path.GetDirectoryName(compileJob.DmeName), "test_fail_reason.txt"); + if (!File.Exists(failFile)) + return; + + var text = await File.ReadAllTextAsync(failFile, cancellationToken); + Assert.Fail(text); + } + } +} diff --git a/tests/Tgstation.Server.Tests/Instance/InstanceTest.cs b/tests/Tgstation.Server.Tests/Instance/InstanceTest.cs index dc670f209d..1446e9a94c 100644 --- a/tests/Tgstation.Server.Tests/Instance/InstanceTest.cs +++ b/tests/Tgstation.Server.Tests/Instance/InstanceTest.cs @@ -32,6 +32,8 @@ namespace Tgstation.Server.Tests.Instance await chatTests.ConfigureAwait(false); await repoTests; + await new FunctionalTest(instanceClient).Run(cancellationToken); + await repoTest.RunPostWatchdog(cancellationToken); } }