From 0e71221b48268c3989f4b21248b607baa4217832 Mon Sep 17 00:00:00 2001 From: ipax77 Date: Sun, 7 Dec 2025 07:55:25 +0100 Subject: [PATCH 1/2] decode tests --- src/dsstats.decode/DecodeService.cs | 2 +- src/dsstats.ratings/Program.cs | 4 +- src/dsstats.ratings/RatingService.Combo.cs | 2 + .../dsstats.decode.tests/MSTestSettings.cs | 1 + src/tests/dsstats.decode.tests/ParseTests.cs | 53 +++++++++++++ .../dsstats.decode.tests.csproj | 24 ++++++ .../dsstats.decode.tests.sln | 79 +++++++++++++++++++ 7 files changed, 163 insertions(+), 2 deletions(-) create mode 100644 src/tests/dsstats.decode.tests/MSTestSettings.cs create mode 100644 src/tests/dsstats.decode.tests/ParseTests.cs create mode 100644 src/tests/dsstats.decode.tests/dsstats.decode.tests.csproj create mode 100644 src/tests/dsstats.decode.tests/dsstats.decode.tests.sln diff --git a/src/dsstats.decode/DecodeService.cs b/src/dsstats.decode/DecodeService.cs index 0753f9b1e..e57e66073 100644 --- a/src/dsstats.decode/DecodeService.cs +++ b/src/dsstats.decode/DecodeService.cs @@ -336,7 +336,7 @@ private void Error(DecodeParallelResult result) } } - private ReplayMetadata GetMetaData(Sc2Replay replay) + public static ReplayMetadata GetMetaData(Sc2Replay replay) { List players = []; diff --git a/src/dsstats.ratings/Program.cs b/src/dsstats.ratings/Program.cs index cf872c30e..37d46266e 100644 --- a/src/dsstats.ratings/Program.cs +++ b/src/dsstats.ratings/Program.cs @@ -43,9 +43,11 @@ static void Main(string[] args) { options.UseMySql(mySqlConnectionString, ServerVersion.AutoDetect(mySqlConnectionString), p => { - p.CommandTimeout(600); + p.CommandTimeout(30); p.UseQuerySplittingBehavior(QuerySplittingBehavior.SingleQuery); }); + options.EnableDetailedErrors(); + options.EnableSensitiveDataLogging(); }); services.AddAutoMapper(typeof(AutoMapperProfile)); diff --git a/src/dsstats.ratings/RatingService.Combo.cs b/src/dsstats.ratings/RatingService.Combo.cs index 258cf52a5..6b063f0fd 100644 --- a/src/dsstats.ratings/RatingService.Combo.cs +++ b/src/dsstats.ratings/RatingService.Combo.cs @@ -19,6 +19,8 @@ private async Task ProduceComboRatings(bool recalc) var context = scope.ServiceProvider.GetRequiredService(); var ratingSaveService = scope.ServiceProvider.GetRequiredService(); var comboRatings = scope.ServiceProvider.GetRequiredService(); + + context.Database.SetCommandTimeout(840); await CleanupComboPreRatings(context); diff --git a/src/tests/dsstats.decode.tests/MSTestSettings.cs b/src/tests/dsstats.decode.tests/MSTestSettings.cs new file mode 100644 index 000000000..aaf278c84 --- /dev/null +++ b/src/tests/dsstats.decode.tests/MSTestSettings.cs @@ -0,0 +1 @@ +[assembly: Parallelize(Scope = ExecutionScope.MethodLevel)] diff --git a/src/tests/dsstats.decode.tests/ParseTests.cs b/src/tests/dsstats.decode.tests/ParseTests.cs new file mode 100644 index 000000000..c6a7a1abd --- /dev/null +++ b/src/tests/dsstats.decode.tests/ParseTests.cs @@ -0,0 +1,53 @@ +using pax.dsstats.parser; +using s2protocol.NET; + +namespace dsstats.decode.tests; + +[TestClass] +public sealed class ParseTests +{ + [TestMethod] + public async Task CanDecodeReplay() + { + var path = "/data/ds/testreplays/Direct Strike TE (4545).SC2Replay"; + var decoder = new ReplayDecoder(); + var options = new ReplayDecoderOptions() + { + Initdata = true, + Details = true, + Metadata = true, + TrackerEvents = true, + }; + var sc2Replay = await decoder.DecodeAsync(path, options); + Assert.IsNotNull(sc2Replay); + var dsReplay = Parse.GetDsReplay(sc2Replay); + Assert.IsNotNull(dsReplay); + using var md5 = System.Security.Cryptography.MD5.Create(); + var replay = Parse.GetReplayDto(dsReplay, md5); + Assert.IsNotNull(replay); + } + + [TestMethod] + public async Task CanDecodeReplay2() + { + List paths = ["/data/ds/testreplays/Direct Strike TE (4545).SC2Replay"]; + var decoder = new ReplayDecoder(); + var options = new ReplayDecoderOptions() + { + Initdata = true, + Details = true, + Metadata = true, + TrackerEvents = true, + }; + await foreach (var result in decoder.DecodeParallelWithErrorReport(paths, 1, options)) + { + Assert.IsNotNull(result.Sc2Replay); + var metaData = dsstats.decode.DecodeService.GetMetaData(result.Sc2Replay); + var dsReplay = Parse.GetDsReplay(result.Sc2Replay); + Assert.IsNotNull(dsReplay); + using var md5 = System.Security.Cryptography.MD5.Create(); + var replay = Parse.GetReplayDto(dsReplay, md5); + Assert.IsNotNull(replay); + } + } +} diff --git a/src/tests/dsstats.decode.tests/dsstats.decode.tests.csproj b/src/tests/dsstats.decode.tests/dsstats.decode.tests.csproj new file mode 100644 index 000000000..842785792 --- /dev/null +++ b/src/tests/dsstats.decode.tests/dsstats.decode.tests.csproj @@ -0,0 +1,24 @@ + + + + net8.0 + latest + enable + enable + + + + + + + + + + + + + + + + + diff --git a/src/tests/dsstats.decode.tests/dsstats.decode.tests.sln b/src/tests/dsstats.decode.tests/dsstats.decode.tests.sln new file mode 100644 index 000000000..4e7066839 --- /dev/null +++ b/src/tests/dsstats.decode.tests/dsstats.decode.tests.sln @@ -0,0 +1,79 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dsstats.shared", "..\..\dsstats.shared\dsstats.shared.csproj", "{3DFF95A8-63F3-4ADC-8233-825D8119E250}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pax.dsstats.parser", "..\..\dsstats.maui\pax.dsstats.parser\pax.dsstats.parser.csproj", "{8275C892-6B1D-4535-92A2-888DEEA52C00}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dsstats.decode.tests", "dsstats.decode.tests.csproj", "{390C7CD2-C11E-4116-9D27-818FB33ED0FE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dsstats.decode", "..\..\dsstats.decode\dsstats.decode.csproj", "{C7C57907-67BD-9A5D-6CAC-F386EEB7B009}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3DFF95A8-63F3-4ADC-8233-825D8119E250}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3DFF95A8-63F3-4ADC-8233-825D8119E250}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3DFF95A8-63F3-4ADC-8233-825D8119E250}.Debug|x64.ActiveCfg = Debug|Any CPU + {3DFF95A8-63F3-4ADC-8233-825D8119E250}.Debug|x64.Build.0 = Debug|Any CPU + {3DFF95A8-63F3-4ADC-8233-825D8119E250}.Debug|x86.ActiveCfg = Debug|Any CPU + {3DFF95A8-63F3-4ADC-8233-825D8119E250}.Debug|x86.Build.0 = Debug|Any CPU + {3DFF95A8-63F3-4ADC-8233-825D8119E250}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3DFF95A8-63F3-4ADC-8233-825D8119E250}.Release|Any CPU.Build.0 = Release|Any CPU + {3DFF95A8-63F3-4ADC-8233-825D8119E250}.Release|x64.ActiveCfg = Release|Any CPU + {3DFF95A8-63F3-4ADC-8233-825D8119E250}.Release|x64.Build.0 = Release|Any CPU + {3DFF95A8-63F3-4ADC-8233-825D8119E250}.Release|x86.ActiveCfg = Release|Any CPU + {3DFF95A8-63F3-4ADC-8233-825D8119E250}.Release|x86.Build.0 = Release|Any CPU + {8275C892-6B1D-4535-92A2-888DEEA52C00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8275C892-6B1D-4535-92A2-888DEEA52C00}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8275C892-6B1D-4535-92A2-888DEEA52C00}.Debug|x64.ActiveCfg = Debug|Any CPU + {8275C892-6B1D-4535-92A2-888DEEA52C00}.Debug|x64.Build.0 = Debug|Any CPU + {8275C892-6B1D-4535-92A2-888DEEA52C00}.Debug|x86.ActiveCfg = Debug|Any CPU + {8275C892-6B1D-4535-92A2-888DEEA52C00}.Debug|x86.Build.0 = Debug|Any CPU + {8275C892-6B1D-4535-92A2-888DEEA52C00}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8275C892-6B1D-4535-92A2-888DEEA52C00}.Release|Any CPU.Build.0 = Release|Any CPU + {8275C892-6B1D-4535-92A2-888DEEA52C00}.Release|x64.ActiveCfg = Release|Any CPU + {8275C892-6B1D-4535-92A2-888DEEA52C00}.Release|x64.Build.0 = Release|Any CPU + {8275C892-6B1D-4535-92A2-888DEEA52C00}.Release|x86.ActiveCfg = Release|Any CPU + {8275C892-6B1D-4535-92A2-888DEEA52C00}.Release|x86.Build.0 = Release|Any CPU + {390C7CD2-C11E-4116-9D27-818FB33ED0FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {390C7CD2-C11E-4116-9D27-818FB33ED0FE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {390C7CD2-C11E-4116-9D27-818FB33ED0FE}.Debug|x64.ActiveCfg = Debug|Any CPU + {390C7CD2-C11E-4116-9D27-818FB33ED0FE}.Debug|x64.Build.0 = Debug|Any CPU + {390C7CD2-C11E-4116-9D27-818FB33ED0FE}.Debug|x86.ActiveCfg = Debug|Any CPU + {390C7CD2-C11E-4116-9D27-818FB33ED0FE}.Debug|x86.Build.0 = Debug|Any CPU + {390C7CD2-C11E-4116-9D27-818FB33ED0FE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {390C7CD2-C11E-4116-9D27-818FB33ED0FE}.Release|Any CPU.Build.0 = Release|Any CPU + {390C7CD2-C11E-4116-9D27-818FB33ED0FE}.Release|x64.ActiveCfg = Release|Any CPU + {390C7CD2-C11E-4116-9D27-818FB33ED0FE}.Release|x64.Build.0 = Release|Any CPU + {390C7CD2-C11E-4116-9D27-818FB33ED0FE}.Release|x86.ActiveCfg = Release|Any CPU + {390C7CD2-C11E-4116-9D27-818FB33ED0FE}.Release|x86.Build.0 = Release|Any CPU + {C7C57907-67BD-9A5D-6CAC-F386EEB7B009}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C7C57907-67BD-9A5D-6CAC-F386EEB7B009}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C7C57907-67BD-9A5D-6CAC-F386EEB7B009}.Debug|x64.ActiveCfg = Debug|Any CPU + {C7C57907-67BD-9A5D-6CAC-F386EEB7B009}.Debug|x64.Build.0 = Debug|Any CPU + {C7C57907-67BD-9A5D-6CAC-F386EEB7B009}.Debug|x86.ActiveCfg = Debug|Any CPU + {C7C57907-67BD-9A5D-6CAC-F386EEB7B009}.Debug|x86.Build.0 = Debug|Any CPU + {C7C57907-67BD-9A5D-6CAC-F386EEB7B009}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C7C57907-67BD-9A5D-6CAC-F386EEB7B009}.Release|Any CPU.Build.0 = Release|Any CPU + {C7C57907-67BD-9A5D-6CAC-F386EEB7B009}.Release|x64.ActiveCfg = Release|Any CPU + {C7C57907-67BD-9A5D-6CAC-F386EEB7B009}.Release|x64.Build.0 = Release|Any CPU + {C7C57907-67BD-9A5D-6CAC-F386EEB7B009}.Release|x86.ActiveCfg = Release|Any CPU + {C7C57907-67BD-9A5D-6CAC-F386EEB7B009}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {F01C0578-C065-48AE-81A1-994AF5C2E043} + EndGlobalSection +EndGlobal From 7c6c19ad7f56fa24a1741cae988f03b2d72e227c Mon Sep 17 00:00:00 2001 From: ipax77 Date: Sun, 7 Dec 2025 08:20:13 +0100 Subject: [PATCH 2/2] cleanup DecodeService --- src/dsstats.decode/DecodeService.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/dsstats.decode/DecodeService.cs b/src/dsstats.decode/DecodeService.cs index e57e66073..d8c14054c 100644 --- a/src/dsstats.decode/DecodeService.cs +++ b/src/dsstats.decode/DecodeService.cs @@ -146,8 +146,10 @@ public async Task Decode() try { - var replayPaths = Directory.GetFiles(decodeSettings.Value.ReplayFolders.ToDo, "*SC2Replay"); - replayPaths = replayPaths.Except(excludeReplays).ToArray(); + var replayPaths = Directory.GetFiles(decodeSettings.Value.ReplayFolders.ToDo, "*SC2Replay") + .Where(f => !File.Exists(f + ".tmp")) + .Where(f => !excludeReplays.Contains(f)) + .ToArray(); if (replayPaths.Length == 0) { @@ -251,8 +253,10 @@ public async Task DecodeRaw() try { - var replayPaths = Directory.GetFiles(Path.Combine(decodeSettings.Value.ReplayFolders.ToDoRaw), "*SC2Replay"); - replayPaths = replayPaths.Except(excludeReplays).ToArray(); + var replayPaths = Directory.GetFiles(Path.Combine(decodeSettings.Value.ReplayFolders.ToDoRaw), "*SC2Replay") + .Where(f => !File.Exists(f + ".tmp")) + .Where(f => !excludeReplays.Contains(f)) + .ToArray(); if (replayPaths.Length == 0) {