fix(speedtest): clear the last speed when a speed test starts (#10449)

A speed test only stored a speed above zero, so a node that was skipped
because its delay test failed, or whose download failed, kept the speed
of the previous run. The list showed the skip or error text until it was
sorted or refreshed; then the old speed came back and the node sorted as
if it had been measured. Clear the stored speed when a speed or mixed
test starts.
This commit is contained in:
Lukas
2026-11-01 13:53:45 +01:00
committed by GitHub
parent e1c9633535
commit 926790b071
2 changed files with 29 additions and 0 deletions
@@ -0,0 +1,26 @@
namespace ServiceLib.Tests.Services;
public class SpeedtestServiceResultTests
{
[Test]
[Arguments(ESpeedActionType.Speedtest, 0)]
[Arguments(ESpeedActionType.Mixedtest, 0)]
[Arguments(ESpeedActionType.Realping, 12.5)]
public async Task StartingATest_ShouldClearTheLastSpeedOfSpeedTests(ESpeedActionType actionType, double expected)
{
var indexId = Guid.NewGuid().ToString();
ProfileExManager.Instance.SetTestSpeed(indexId, 12.5m);
await SetTestResult([new() { IndexId = indexId }], actionType, ResUI.Speedtesting);
var profileEx = (await ProfileExManager.Instance.GetProfileExs()).First(t => t.IndexId == indexId);
await profileEx.Speed.Should().BeEqualTo((decimal)expected);
}
private static Task SetTestResult(List<ServerTestItem> items, ESpeedActionType actionType, string message)
{
var service = new SpeedtestService(new Config { SpeedTestItem = new() }, _ => Task.CompletedTask);
var method = typeof(SpeedtestService).GetMethod("SetTestResultAsync", BindingFlags.Instance | BindingFlags.NonPublic)!;
return (Task)method.Invoke(service, [items, actionType, message])!;
}
}
@@ -188,10 +188,13 @@ public class SpeedtestService(Config config, Func<SpeedTestResult, Task> updateF
break;
case ESpeedActionType.Speedtest:
// A skipped or failed test must not leave the last speed behind for sorting.
ProfileExManager.Instance.SetTestSpeed(it.IndexId, 0);
await UpdateFunc(it.IndexId, "", message);
break;
case ESpeedActionType.Mixedtest:
ProfileExManager.Instance.SetTestSpeed(it.IndexId, 0);
await UpdateFunc(it.IndexId, message, message);
break;
}