Chat message regression test

This commit is contained in:
Dominion
2023-04-10 12:44:47 -04:00
parent d85a56e43f
commit b35261d4dc
5 changed files with 114 additions and 25 deletions
+28 -14
View File
@@ -34,6 +34,11 @@ namespace Tgstation.Server.Host
updatePath != null;
#endif
/// <summary>
/// The <see cref="IHost"/> of the running server.
/// </summary>
internal IHost Host { get; private set; }
/// <summary>
/// The <see cref="IHostBuilder"/> for the <see cref="Server"/>.
/// </summary>
@@ -119,26 +124,35 @@ namespace Tgstation.Server.Host
fsWatcher.EnableRaisingEvents = true;
}
using var host = hostBuilder.Build();
try
{
swarmService = host.Services.GetRequiredService<ISwarmService>();
logger = host.Services.GetRequiredService<ILogger<Server>>();
using (cancellationToken.Register(() => logger.LogInformation("Server termination requested!")))
using (Host = hostBuilder.Build())
{
var generalConfigurationOptions = host.Services.GetRequiredService<IOptions<GeneralConfiguration>>();
generalConfiguration = generalConfigurationOptions.Value;
await host.RunAsync(cancellationTokenSource.Token);
try
{
swarmService = Host.Services.GetRequiredService<ISwarmService>();
logger = Host.Services.GetRequiredService<ILogger<Server>>();
using (cancellationToken.Register(() => logger.LogInformation("Server termination requested!")))
{
var generalConfigurationOptions = Host.Services.GetRequiredService<IOptions<GeneralConfiguration>>();
generalConfiguration = generalConfigurationOptions.Value;
await Host.RunAsync(cancellationTokenSource.Token);
}
}
catch (OperationCanceledException ex)
{
logger?.LogDebug(ex, "Server run cancelled!");
}
catch (Exception ex)
{
CheckExceptionPropagation(ex);
throw;
}
}
}
catch (OperationCanceledException ex)
finally
{
logger?.LogDebug(ex, "Server run cancelled!");
}
catch (Exception ex)
{
CheckExceptionPropagation(ex);
throw;
Host = null;
}
}
@@ -4,6 +4,7 @@ using System.Threading.Tasks;
using Tgstation.Server.Client;
using Tgstation.Server.Client.Components;
using Tgstation.Server.Host.Components;
namespace Tgstation.Server.Tests.Instance
{
@@ -11,11 +12,13 @@ namespace Tgstation.Server.Tests.Instance
{
readonly IInstanceClient instanceClient;
readonly IInstanceManagerClient instanceManagerClient;
readonly IInstanceManager instanceManager;
public InstanceTest(IInstanceClient instanceClient, IInstanceManagerClient instanceManagerClient)
public InstanceTest(IInstanceClient instanceClient, IInstanceManagerClient instanceManagerClient, IInstanceManager instanceManager)
{
this.instanceClient = instanceClient ?? throw new ArgumentNullException(nameof(instanceClient));
this.instanceManagerClient = instanceManagerClient ?? throw new ArgumentNullException(nameof(instanceManagerClient));
this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
}
public async Task RunTests(CancellationToken cancellationToken)
@@ -35,7 +38,7 @@ namespace Tgstation.Server.Tests.Instance
await configTest.Run(cancellationToken);
await chatTests;
await repoTests;
await new WatchdogTest(instanceClient).Run(cancellationToken);
await new WatchdogTest(instanceClient, instanceManager).Run(cancellationToken);
}
}
}
@@ -1,8 +1,11 @@
using Byond.TopicSender;
using Microsoft.Extensions.Logging;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using System;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
@@ -17,7 +20,9 @@ using Tgstation.Server.Api.Models.Request;
using Tgstation.Server.Api.Models.Response;
using Tgstation.Server.Client;
using Tgstation.Server.Client.Components;
using Tgstation.Server.Host.Components;
using Tgstation.Server.Host.Components.Interop;
using Tgstation.Server.Host.Components.Watchdog;
using Tgstation.Server.Host.Extensions;
using Tgstation.Server.Host.IO;
using Tgstation.Server.Host.System;
@@ -27,13 +32,15 @@ namespace Tgstation.Server.Tests.Instance
sealed class WatchdogTest : JobsRequiredTest
{
readonly IInstanceClient instanceClient;
readonly IInstanceManager instanceManager;
bool ranTimeoutTest = false;
public WatchdogTest(IInstanceClient instanceClient)
public WatchdogTest(IInstanceClient instanceClient, IInstanceManager instanceManager)
: base(instanceClient.Jobs)
{
this.instanceClient = instanceClient ?? throw new ArgumentNullException(nameof(instanceClient));
this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
}
public async Task Run(CancellationToken cancellationToken)
@@ -66,6 +73,9 @@ namespace Tgstation.Server.Tests.Instance
await TestDMApiFreeDeploy(cancellationToken);
await RunLongRunningTestThenUpdate(cancellationToken);
await GhettoChatCommandTest(cancellationToken);
await RunLongRunningTestThenUpdateWithNewDme(cancellationToken);
await RunLongRunningTestThenUpdateWithByondVersionSwitch(cancellationToken);
@@ -318,6 +328,63 @@ namespace Tgstation.Server.Tests.Instance
return await instanceClient.DreamDaemon.Start(cancellationToken);
}
async Task GhettoChatCommandTest(CancellationToken cancellationToken)
{
var startJob = await StartDD(cancellationToken);
await WaitForJob(startJob, 40, false, null, cancellationToken);
// oh god, oh fuck, blackbox testing
using var instanceReference = instanceManager.GetInstanceReference(instanceClient.Metadata);
var startTime = DateTimeOffset.UtcNow - TimeSpan.FromSeconds(5);
var response = await ((BasicWatchdog)instanceReference.Watchdog).HandleChatCommand(
"embeds_test",
String.Empty,
new Host.Components.Chat.ChatUser
{
Channel = new Host.Components.Chat.ChannelRepresentation
{
IsAdminChannel = true,
ConnectionName = "test_connection",
EmbedsSupported = true,
FriendlyName = "Test Connection",
Id = "test_channel_id",
IsPrivateChannel = false,
},
FriendlyName = "Test Sender",
Id = "test_user_id",
Mention = "test_user_mention",
RealId = 1234,
},
cancellationToken);
var endTime = DateTimeOffset.UtcNow + TimeSpan.FromSeconds(5);
Assert.IsNotNull(response);
Assert.AreEqual("Embed support test2", response.Text);
Assert.AreEqual("desc", response.Embed.Description);
Assert.AreEqual("title", response.Embed.Title);
Assert.AreEqual("#0000FF", response.Embed.Colour);
Assert.AreEqual("Dominion", response.Embed.Author?.Name);
Assert.AreEqual("https://github.com/Cyberboss", response.Embed.Author.Url);
Assert.IsTrue(DateTimeOffset.TryParse(response.Embed.Timestamp, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal, out var timestamp));
Assert.IsTrue(startTime < timestamp && endTime > timestamp);
Assert.AreEqual("https://github.com/tgstation/tgstation-server", response.Embed.Url);
Assert.AreEqual(3, response.Embed.Fields?.Count);
Assert.AreEqual("field1", response.Embed.Fields.ElementAt(0).Name);
Assert.AreEqual("value1", response.Embed.Fields.ElementAt(0).Value);
Assert.IsNull(response.Embed.Fields.ElementAt(0).IsInline);
Assert.AreEqual("field2", response.Embed.Fields.ElementAt(1).Name);
Assert.AreEqual("value2", response.Embed.Fields.ElementAt(1).Value);
Assert.IsTrue(response.Embed.Fields.ElementAt(1).IsInline);
Assert.AreEqual("field3", response.Embed.Fields.ElementAt(2).Name);
Assert.AreEqual("value3", response.Embed.Fields.ElementAt(2).Value);
Assert.IsTrue(response.Embed.Fields.ElementAt(2).IsInline);
Assert.AreEqual("Footer text", response.Embed.Footer?.Text);
await instanceClient.DreamDaemon.Shutdown(cancellationToken);
}
async Task RunLongRunningTestThenUpdate(CancellationToken cancellationToken)
{
global::System.Console.WriteLine("TEST: WATCHDOG LONG RUNNING WITH UPDATE TEST");
@@ -27,6 +27,8 @@ using Tgstation.Server.Api.Models.Response;
using Tgstation.Server.Api.Rights;
using Tgstation.Server.Client;
using Tgstation.Server.Client.Components;
using Tgstation.Server.Host;
using Tgstation.Server.Host.Components;
using Tgstation.Server.Host.Components.Events;
using Tgstation.Server.Host.Components.Repository;
using Tgstation.Server.Host.Configuration;
@@ -827,6 +829,8 @@ namespace Tgstation.Server.Tests
TerminateAllDDs();
IInstanceManager GetInstanceManager() => ((Host.Server)server.RealServer).Host.Services.GetRequiredService<IInstanceManager>();
// main run
var serverTask = server.Run(cancellationToken);
@@ -874,7 +878,7 @@ namespace Tgstation.Server.Tests
Assert.IsTrue(Directory.Exists(instanceClient.Metadata.Path));
var instanceTests = FailFast(new InstanceTest(instanceClient, adminClient.Instances).RunTests(cancellationToken));
var instanceTests = FailFast(new InstanceTest(instanceClient, adminClient.Instances, GetInstanceManager()).RunTests(cancellationToken));
await Task.WhenAll(rootTest, adminTest, instanceTests, usersTest);
@@ -994,7 +998,7 @@ namespace Tgstation.Server.Tests
Assert.AreEqual(WatchdogStatus.Online, dd.Status.Value);
var compileJob = await instanceClient.DreamMaker.Compile(cancellationToken);
var wdt = new WatchdogTest(instanceClient);
var wdt = new WatchdogTest(instanceClient, GetInstanceManager());
await wdt.WaitForJob(compileJob, 30, false, null, cancellationToken);
dd = await instanceClient.DreamDaemon.Read(cancellationToken);
@@ -1041,7 +1045,7 @@ namespace Tgstation.Server.Tests
Assert.AreEqual(WatchdogStatus.Online, currentDD.Status);
Assert.AreEqual(expectedStaged, currentDD.StagedCompileJob.Job.Id.Value);
var wdt = new WatchdogTest(instanceClient);
var wdt = new WatchdogTest(instanceClient, GetInstanceManager());
currentDD = await wdt.TellWorldToReboot(cancellationToken);
Assert.AreEqual(expectedStaged, currentDD.ActiveCompileJob.Job.Id.Value);
Assert.IsNull(currentDD.StagedCompileJob);
@@ -27,11 +27,11 @@ namespace Tgstation.Server.Tests
public bool DumpOpenApiSpecpath { get; }
public bool RestartRequested => realServer.RestartRequested;
public bool RestartRequested => RealServer.RestartRequested;
string[] args;
IServer realServer;
public IServer RealServer { get; private set; }
public TestingServer(SwarmConfiguration swarmConfiguration, bool enableOAuth, ushort port = 5010)
{
@@ -154,8 +154,8 @@ namespace Tgstation.Server.Tests
public async Task Run(CancellationToken cancellationToken)
{
Console.WriteLine("TEST SERVER START");
var firstRun = realServer == null;
realServer = await Application
var firstRun = RealServer == null;
RealServer = await Application
.CreateDefaultServerFactory()
.CreateServer(
args,
@@ -169,7 +169,8 @@ namespace Tgstation.Server.Tests
args = tmp.ToArray();
}
await realServer.Run(cancellationToken);
await RealServer.Run(cancellationToken);
RealServer = null;
Console.WriteLine("TEST SERVER END");
}
}