From 079ab2075272393a00522c9154b63aa2b1db09d4 Mon Sep 17 00:00:00 2001 From: Dominion Date: Sat, 22 Apr 2023 10:05:53 -0400 Subject: [PATCH] Swarm test framework cleanup --- .../Swarm/SwarmRpcMapper.cs | 66 +++++++++---------- .../Swarm/TestSwarmProtocol.cs | 3 +- .../Swarm/TestableSwarmNode.cs | 3 +- 3 files changed, 34 insertions(+), 38 deletions(-) diff --git a/tests/Tgstation.Server.Host.Tests/Swarm/SwarmRpcMapper.cs b/tests/Tgstation.Server.Host.Tests/Swarm/SwarmRpcMapper.cs index 4892d18b82..985c868e19 100644 --- a/tests/Tgstation.Server.Host.Tests/Swarm/SwarmRpcMapper.cs +++ b/tests/Tgstation.Server.Host.Tests/Swarm/SwarmRpcMapper.cs @@ -9,6 +9,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.AspNetCore.Mvc.Routing; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -19,10 +20,8 @@ using Newtonsoft.Json; using Tgstation.Server.Common; using Tgstation.Server.Host.Configuration; using Tgstation.Server.Host.Controllers; -using Tgstation.Server.Host.Core; -using Tgstation.Server.Host.Swarm; -namespace Tgstation.Server.Host.Tests.Swarm +namespace Tgstation.Server.Host.Swarm.Tests { sealed class SwarmRpcMapper : IRequestSwarmRegistrationParser, IDisposable { @@ -127,42 +126,47 @@ namespace Tgstation.Server.Host.Tests.Swarm if (controllerMethod == default) Assert.Fail($"SwarmController has no method with attribute {targetAttribute}!"); - // We're not testing OnActionExecutingAsync, that's covered by integration. - var hasRegistrationHeader = request.Headers.TryGetValues(SwarmConstants.RegistrationIdHeader, out var values) && values.Count() == 1; - if (hasRegistrationHeader) - node.RpcMapper.incomingRegistrationIds.Push(Guid.Parse(values.First())); - IActionResult result; + var hasRegistrationHeader = request.Headers.TryGetValues(SwarmConstants.RegistrationIdHeader, out var values) && values.Count() == 1; try { var response = new HttpResponseMessage(); try { - var args = new List(); - if (isDataRequest && request.Content != null) + // We're not testing OnActionExecutingAsync, that's covered by integration. + if (hasRegistrationHeader) { - var dataType = controllerMethod.GetParameters().First().ParameterType; - var json = await request.Content.ReadAsStringAsync(cancellationToken); - var parameter = JsonConvert.DeserializeObject(json, dataType, SwarmService.SerializerSettings); - args.Add(parameter); - } + node.RpcMapper.incomingRegistrationIds.Push(Guid.Parse(values.First())); + var args = new List(); + if (isDataRequest && request.Content != null) + { + var dataType = controllerMethod.GetParameters().First().ParameterType; + var json = await request.Content.ReadAsStringAsync(cancellationToken); + var parameter = JsonConvert.DeserializeObject(json, dataType, SwarmService.SerializerSettings); + args.Add(parameter); + } - if (AsyncRequests) - await Task.Yield(); + if (AsyncRequests) + await Task.Yield(); - if (controllerMethod.ReturnType != typeof(IActionResult)) - { - Assert.AreEqual(typeof(Task), controllerMethod.ReturnType); - args.Add(cancellationToken); - var invocationTask = (Task)controllerMethod.Invoke(controller, args.ToArray()); - result = await invocationTask; + if (controllerMethod.ReturnType != typeof(IActionResult)) + { + Assert.AreEqual(typeof(Task), controllerMethod.ReturnType); + args.Add(cancellationToken); + var invocationTask = (Task)controllerMethod.Invoke(controller, args.ToArray()); + result = await invocationTask; + } + else + { + result = (IActionResult)controllerMethod.Invoke(controller, args.ToArray()); + + // simulate worst case, request completed but was aborted before server replied + cancellationToken.ThrowIfCancellationRequested(); + } } else { - result = (IActionResult)controllerMethod.Invoke(controller, args.ToArray()); - - // simulate worst case, request completed but was aborted before server replied - cancellationToken.ThrowIfCancellationRequested(); + result = controller.BadRequest(); } } catch (Exception ex) @@ -177,13 +181,7 @@ namespace Tgstation.Server.Host.Tests.Swarm // Fobid, NoContent, Conflict, StatusCode if (result is ForbidResult forbidResult) response.StatusCode = HttpStatusCode.Forbidden; - else if (result is NoContentResult noContentResult) - response.StatusCode = (HttpStatusCode)noContentResult.StatusCode; - else if (result is ConflictResult conflictResult) - response.StatusCode = (HttpStatusCode)conflictResult.StatusCode; - else if (result is ObjectResult objectResult) - response.StatusCode = (HttpStatusCode)objectResult.StatusCode; - else if (result is StatusCodeResult statusCodeResult) + else if (result is IStatusCodeActionResult statusCodeResult) response.StatusCode = (HttpStatusCode)statusCodeResult.StatusCode; else { diff --git a/tests/Tgstation.Server.Host.Tests/Swarm/TestSwarmProtocol.cs b/tests/Tgstation.Server.Host.Tests/Swarm/TestSwarmProtocol.cs index 799c676de9..7f7cc84e81 100644 --- a/tests/Tgstation.Server.Host.Tests/Swarm/TestSwarmProtocol.cs +++ b/tests/Tgstation.Server.Host.Tests/Swarm/TestSwarmProtocol.cs @@ -6,9 +6,8 @@ using Microsoft.Extensions.Logging; using Microsoft.VisualStudio.TestTools.UnitTesting; using Tgstation.Server.Host.Configuration; -using Tgstation.Server.Host.Swarm; -namespace Tgstation.Server.Host.Tests.Swarm +namespace Tgstation.Server.Host.Swarm.Tests { [TestClass] public sealed class TestSwarmProtocol : IDisposable diff --git a/tests/Tgstation.Server.Host.Tests/Swarm/TestableSwarmNode.cs b/tests/Tgstation.Server.Host.Tests/Swarm/TestableSwarmNode.cs index fe7ed56bee..060d1d49ac 100644 --- a/tests/Tgstation.Server.Host.Tests/Swarm/TestableSwarmNode.cs +++ b/tests/Tgstation.Server.Host.Tests/Swarm/TestableSwarmNode.cs @@ -16,10 +16,9 @@ using Tgstation.Server.Host.Configuration; using Tgstation.Server.Host.Controllers; using Tgstation.Server.Host.Core; using Tgstation.Server.Host.Database; -using Tgstation.Server.Host.Swarm; using Tgstation.Server.Host.System; -namespace Tgstation.Server.Host.Tests.Swarm +namespace Tgstation.Server.Host.Swarm.Tests { sealed class TestableSwarmNode : IAsyncDisposable {