mirror of
https://github.com/tgstation/tgstation-server.git
synced 2026-08-28 23:52:36 +01:00
WIP
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user