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);
}
}