This commit is contained in:
Jordan Brown
2020-04-28 00:45:24 -04:00
parent 4e8966d157
commit 65472b5df0
3 changed files with 97 additions and 1 deletions
@@ -230,7 +230,15 @@ namespace Tgstation.Server.Host.Components.Deployment
/// <returns>A <see cref="Task"/> representing the running operation</returns>
async Task<int> 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()))
@@ -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);
}
}
}
@@ -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);
}
}