]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Fix replay recording temporary paths not supporting subdirectories (#19887)
authorLeon Friedrich <60421075+ElectroJr@users.noreply.github.com>
Sat, 16 Sep 2023 11:46:12 +0000 (23:46 +1200)
committerGitHub <noreply@github.com>
Sat, 16 Sep 2023 11:46:12 +0000 (21:46 +1000)
Content.IntegrationTests/Tests/Replays/ReplayTests.cs [new file with mode: 0644]
Content.Server/GameTicking/GameTicker.Replays.cs
Content.Shared/CCVar/CCVars.cs

diff --git a/Content.IntegrationTests/Tests/Replays/ReplayTests.cs b/Content.IntegrationTests/Tests/Replays/ReplayTests.cs
new file mode 100644 (file)
index 0000000..7e2d3da
--- /dev/null
@@ -0,0 +1,56 @@
+using Content.Server.GameTicking;
+using Content.Shared.CCVar;
+using Robust.Shared;
+using Robust.Shared.Replays;
+
+namespace Content.IntegrationTests.Tests.Replays;
+
+[TestFixture]
+public sealed class ReplayTests
+{
+    /// <summary>
+    /// Simple test that just makes sure that automatic replay recording on round restarts works without any issues.
+    /// </summary>
+    [Test]
+    public async Task AutoRecordReplayTest()
+    {
+        var settings = new PoolSettings {DummyTicker = false};
+        await using var pair = await PoolManager.GetServerClient(settings);
+        var server = pair.Server;
+
+        Assert.That(server.CfgMan.GetCVar(CVars.ReplayServerRecordingEnabled), Is.False);
+        var recordMan = server.ResolveDependency<IReplayRecordingManager>();
+        Assert.That(recordMan.IsRecording, Is.False);
+
+        // Setup cvars.
+        var autoRec = server.CfgMan.GetCVar(CCVars.ReplayAutoRecord);
+        var autoRecName = server.CfgMan.GetCVar(CCVars.ReplayAutoRecordName);
+        var tempDir = server.CfgMan.GetCVar(CCVars.ReplayAutoRecordTempDir);
+        server.CfgMan.SetCVar(CVars.ReplayServerRecordingEnabled, true);
+        server.CfgMan.SetCVar(CCVars.ReplayAutoRecord, true);
+        server.CfgMan.SetCVar(CCVars.ReplayAutoRecordTempDir, "/a/b/");
+        server.CfgMan.SetCVar(CCVars.ReplayAutoRecordName, $"c/d/{autoRecName}");
+
+        // Restart the round a few times
+        var ticker = server.System<GameTicker>();
+        await server.WaitPost(() => ticker.RestartRound());
+        await pair.RunTicksSync(25);
+        Assert.That(recordMan.IsRecording, Is.True);
+        await server.WaitPost(() => ticker.RestartRound());
+        await pair.RunTicksSync(25);
+        Assert.That(recordMan.IsRecording, Is.True);
+
+        // Reset cvars
+        server.CfgMan.SetCVar(CVars.ReplayServerRecordingEnabled, false);
+        server.CfgMan.SetCVar(CCVars.ReplayAutoRecord, autoRec);
+        server.CfgMan.SetCVar(CCVars.ReplayAutoRecordTempDir, tempDir);
+        server.CfgMan.SetCVar(CCVars.ReplayAutoRecordName, autoRecName);
+
+        // Restart the round again to disable the current recording.
+        await server.WaitPost(() => ticker.RestartRound());
+        await pair.RunTicksSync(25);
+        Assert.That(recordMan.IsRecording, Is.False);
+
+        await pair.CleanReturnAsync();
+    }
+}
index 3254fb840dee09109536840d55d82bb16ec9ef9e..42e2de02287b6c7861825bba555f3abed395ee2c 100644 (file)
@@ -72,13 +72,14 @@ public sealed partial class GameTicker
         if (data.State is not ReplayRecordState state)
             return;
 
-        if (state.MoveToPath != null)
-        {
-            _sawmillReplays.Info($"Moving replay into final position: {state.MoveToPath}");
+        if (state.MoveToPath == null)
+            return;
 
-            _taskManager.BlockWaitOnTask(_replays.WaitWriteTasks());
-            data.Directory.Rename(data.Path, state.MoveToPath.Value);
-        }
+        _sawmillReplays.Info($"Moving replay into final position: {state.MoveToPath}");
+        _taskManager.BlockWaitOnTask(_replays.WaitWriteTasks());
+        DebugTools.Assert(!_replays.IsWriting());
+        data.Directory.CreateDir(state.MoveToPath.Value.Directory);
+        data.Directory.Rename(data.Path, state.MoveToPath.Value);
     }
 
     private ResPath GetAutoReplayPath()
index 19464a4fc3dd9a9e64095be9afe8471e02f6a235..a0cde055bad2f2f8ff8d1f1cff8899f0a89bb341 100644 (file)
@@ -1776,6 +1776,7 @@ namespace Content.Shared.CCVar
         /// <summary>
         /// Path that, if provided, automatic replays are initially recorded in.
         /// When the recording is done, the file is moved into its final destination.
+        /// Unless this path is rooted, it will be relative to <see cref="CVars.ReplayDirectory"/>.
         /// </summary>
         public static readonly CVarDef<string> ReplayAutoRecordTempDir =
             CVarDef.Create("replay.auto_record_temp_dir", "", CVar.SERVERONLY);