Skip to content

Commit

Permalink
Prevent round end test from leaking (#9342)
Browse files Browse the repository at this point in the history
  • Loading branch information
wrexbe authored Jul 2, 2022
1 parent 5d3b6aa commit 6e0e350
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 49 deletions.
92 changes: 51 additions & 41 deletions Content.IntegrationTests/PoolManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
using NUnit.Framework;
using Robust.Client;
using Robust.Server;
using Robust.Server.GameStates;
using Robust.Server.Player;
using Robust.Shared.Configuration;
using Robust.Shared.ContentPack;
using Robust.Shared.Exceptions;
Expand Down Expand Up @@ -213,52 +215,61 @@ public static async Task<PairTracker> GetServerClient(PoolSettings poolSettings

private static async Task<PairTracker> GetServerClientPair(PoolSettings poolSettings, string testMethodName)
{
var poolRetrieveTimeWatch = new Stopwatch();
poolRetrieveTimeWatch.Start();
await TestContext.Out.WriteLineAsync("Getting server/client");
Pair pair;
if (poolSettings.MustBeNew)
{
await TestContext.Out.WriteLineAsync($"Creating, because must be new pair");
pair = await CreateServerClientPair(poolSettings);
}
else
Pair pair = null;
try
{
pair = GrabOptimalPair(poolSettings);
if (pair != null)
var poolRetrieveTimeWatch = new Stopwatch();
poolRetrieveTimeWatch.Start();
await TestContext.Out.WriteLineAsync("Getting server/client");
if (poolSettings.MustBeNew)
{
var canSkip = pair.Settings.CanFastRecycle(poolSettings);

if (!canSkip)
await TestContext.Out.WriteLineAsync($"Creating, because must be new pair");
pair = await CreateServerClientPair(poolSettings);
}
else
{
pair = GrabOptimalPair(poolSettings);
if (pair != null)
{
await TestContext.Out.WriteLineAsync($"Cleaning existing pair");
await CleanPooledPair(poolSettings, pair);
var canSkip = pair.Settings.CanFastRecycle(poolSettings);

if (!canSkip)
{
await TestContext.Out.WriteLineAsync($"Cleaning existing pair");
await CleanPooledPair(poolSettings, pair);
}
else
{
await TestContext.Out.WriteLineAsync($"Skip cleanup pair");
}
}
else
{
await TestContext.Out.WriteLineAsync($"Skip cleanup pair");
await TestContext.Out.WriteLineAsync($"Creating, because pool empty");
pair = await CreateServerClientPair(poolSettings);
}
}
else

var poolRetrieveTime = poolRetrieveTimeWatch.Elapsed;
await TestContext.Out.WriteLineAsync(
$"Got server/client (id:{pair.PairId},uses:{pair.TestHistory.Count}) in {poolRetrieveTime.TotalMilliseconds} ms");
pair.Settings = poolSettings;
pair.TestHistory.Add(testMethodName);
var usageWatch = new Stopwatch();
usageWatch.Start();
return new PairTracker()
{
await TestContext.Out.WriteLineAsync($"Creating, because pool empty");
pair = await CreateServerClientPair(poolSettings);
}
Pair = pair,
UsageWatch = usageWatch
};
}

var poolRetrieveTime = poolRetrieveTimeWatch.Elapsed;
await TestContext.Out.WriteLineAsync($"Got server/client (id:{pair.PairId},uses:{pair.TestHistory.Count}) in {poolRetrieveTime.TotalMilliseconds} ms");
pair.Settings = poolSettings;

TestContext.Out.WriteLine($"Test History|\n{string.Join('\n', pair.TestHistory)}\n|Test History End");
pair.TestHistory.Add(testMethodName);
var usageWatch = new Stopwatch();
usageWatch.Start();
return new PairTracker()
finally
{
Pair = pair,
UsageWatch = usageWatch
};
if (pair != null)
{
TestContext.Out.WriteLine($"Test History|\n{string.Join('\n', pair.TestHistory)}\n|Test History End");
}
}
}

private static Pair GrabOptimalPair(PoolSettings poolSettings)
Expand Down Expand Up @@ -314,15 +325,17 @@ await pair.Client.WaitPost(() =>
{
cNetMgr.ClientConnect(null!, 0, null!);
});
await ReallyBeIdle(pair,11);
}
await ReallyBeIdle(pair,11);

await TestContext.Out.WriteLineAsync($"Recycling: {methodWatch.Elapsed.TotalMilliseconds} ms: Disconnecting client, and restarting server");

await pair.Client.WaitPost(() =>
{
cNetMgr.ClientDisconnect("Test pooling cleanup disconnect");
});
await ReallyBeIdle(pair, 5);

await ReallyBeIdle(pair, 10);

if (!string.IsNullOrWhiteSpace(pair.Settings.ExtraPrototypes))
{
Expand Down Expand Up @@ -413,10 +426,7 @@ public static async Task<TestMapData> CreateTestMap(PairTracker pairTracker)
var server = pairTracker.Pair.Server;
var settings = pairTracker.Pair.Settings;
if (settings.NoServer) throw new Exception("Cannot setup test map without server");
var mapData = new TestMapData
{

};
var mapData = new TestMapData();
await server.WaitPost(() =>
{
var mapManager = IoCManager.Resolve<IMapManager>();
Expand Down
28 changes: 20 additions & 8 deletions Content.IntegrationTests/Tests/RoundEndTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using Robust.Shared.Configuration;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Network;

namespace Content.IntegrationTests.Tests
{
Expand All @@ -17,10 +18,8 @@ public sealed class RoundEndTest : IEntityEventSubscriber
[Test]
public async Task Test()
{
await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings()
{
NoClient = true,
});
await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings { NoClient = true });

var server = pairTracker.Pair.Server;

var config = server.ResolveDependency<IConfigurationManager>();
Expand All @@ -32,14 +31,13 @@ public async Task Test()

await server.WaitAssertion(() =>
{
ticker.RestartRound();
config.SetCVar(CCVars.GameLobbyEnabled, true);
config.SetCVar(CCVars.EmergencyShuttleTransitTime, 1f);
config.SetCVar(CCVars.EmergencyShuttleDockTime, 1f);

roundEndSystem.DefaultCooldownDuration = TimeSpan.FromMilliseconds(250);
roundEndSystem.DefaultCountdownDuration = TimeSpan.FromMilliseconds(500);
roundEndSystem.DefaultRestartRoundDuration = TimeSpan.FromMilliseconds(250);
roundEndSystem.DefaultCooldownDuration = TimeSpan.FromMilliseconds(100);
roundEndSystem.DefaultCountdownDuration = TimeSpan.FromMilliseconds(300);
roundEndSystem.DefaultRestartRoundDuration = TimeSpan.FromMilliseconds(100);
});

await server.WaitAssertion(() =>
Expand Down Expand Up @@ -114,6 +112,20 @@ async Task WaitForEvent()
if (timeout.IsCompleted) throw new TimeoutException("Event took too long to trigger");
}

// Need to clean self up
await server.WaitAssertion(() =>
{
config.SetCVar(CCVars.GameLobbyEnabled, false);
config.SetCVar(CCVars.EmergencyShuttleTransitTime, CCVars.EmergencyShuttleTransitTime.DefaultValue);
config.SetCVar(CCVars.EmergencyShuttleDockTime, CCVars.EmergencyShuttleDockTime.DefaultValue);

roundEndSystem.DefaultCooldownDuration = TimeSpan.FromSeconds(30);
roundEndSystem.DefaultCountdownDuration = TimeSpan.FromMinutes(4);
roundEndSystem.DefaultRestartRoundDuration = TimeSpan.FromMinutes(1);
EntitySystem.Get<GameTicker>().RestartRound();
});
await PoolManager.ReallyBeIdle(pairTracker.Pair, 10);

await pairTracker.CleanReturnAsync();
}
}
Expand Down

0 comments on commit 6e0e350

Please sign in to comment.