Skip to content

Commit 7ea76a0

Browse files
committed
Add some 2v2 module tests, mock time and delays
1 parent 5347954 commit 7ea76a0

12 files changed

Lines changed: 432 additions & 86 deletions

File tree

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using System.Threading;
2+
using System.Threading.Tasks;
3+
4+
namespace BF2WebAdmin.Common;
5+
6+
public interface IDelayProvider
7+
{
8+
ValueTask DelayAsync(int timeMs, CancellationToken ct);
9+
}
10+
11+
public class DelayProvider : IDelayProvider
12+
{
13+
public async ValueTask DelayAsync(int timeMs, CancellationToken ct) => await Task.Delay(timeMs, ct);
14+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using System;
2+
using System.Diagnostics;
3+
using System.Threading;
4+
using System.Threading.Tasks;
5+
using Microsoft.Extensions.Logging;
6+
using Nihlen.Common.Telemetry;
7+
8+
namespace BF2WebAdmin.Common;
9+
10+
public interface ITaskRunner
11+
{
12+
void RunBackgroundTask(string description, Func<Task> func, CancellationToken ct);
13+
}
14+
15+
public class TaskRunner : ITaskRunner
16+
{
17+
private readonly ILogger _logger;
18+
19+
public TaskRunner(ILogger logger)
20+
{
21+
_logger = logger;
22+
}
23+
24+
public void RunBackgroundTask(string description, Func<Task> func, CancellationToken ct)
25+
{
26+
_ = Task.Run(async () =>
27+
{
28+
using var activity = Telemetry.ActivitySource.StartActivity("BackgroundTask");
29+
activity?.SetTag("bf2wa.task-description", description);
30+
31+
try
32+
{
33+
await func();
34+
}
35+
catch (Exception ex)
36+
{
37+
_logger.LogError(ex, "Failed to complete background task: {Description}", description);
38+
activity?.SetStatus(ActivityStatusCode.Error, $"Background task failed: {ex.Message}");
39+
}
40+
}, ct);
41+
}
42+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using System;
2+
3+
namespace BF2WebAdmin.Common;
4+
5+
public interface ITimeProvider
6+
{
7+
DateTime UtcNow { get; }
8+
DateTimeOffset OffsetUtcNow { get; }
9+
}
10+
11+
public class TimeProvider : ITimeProvider
12+
{
13+
public DateTime UtcNow => DateTime.UtcNow;
14+
public DateTimeOffset OffsetUtcNow => DateTimeOffset.UtcNow;
15+
}

src/BF2WebAdmin.Server/Abstractions/BaseModule.cs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -88,22 +88,22 @@ protected async Task<string> SendRconCommandAsync(string command)
8888
return await rcon.SendAsync(command);
8989
}
9090

91-
protected void RunBackgroundTask(string description, Func<Task> func)
92-
{
93-
_ = Task.Run(async () =>
94-
{
95-
using var activity = Telemetry.ActivitySource.StartActivity("BackgroundTask");
96-
activity?.SetTag("bf2wa.task-description", description);
97-
98-
try
99-
{
100-
await func();
101-
}
102-
catch (Exception ex)
103-
{
104-
Logger.LogError(ex, "Failed to complete background task: {Description}", description);
105-
activity?.SetStatus(ActivityStatusCode.Error, $"Background task failed: {ex.Message}");
106-
}
107-
}, ModuleCancellationToken);
108-
}
91+
// protected void RunBackgroundTask(string description, Func<Task> func)
92+
// {
93+
// _ = Task.Run(async () =>
94+
// {
95+
// using var activity = Telemetry.ActivitySource.StartActivity("BackgroundTask");
96+
// activity?.SetTag("bf2wa.task-description", description);
97+
//
98+
// try
99+
// {
100+
// await func();
101+
// }
102+
// catch (Exception ex)
103+
// {
104+
// Logger.LogError(ex, "Failed to complete background task: {Description}", description);
105+
// activity?.SetStatus(ActivityStatusCode.Error, $"Background task failed: {ex.Message}");
106+
// }
107+
// }, ModuleCancellationToken);
108+
// }
109109
}

src/BF2WebAdmin.Server/ModManager.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,10 @@ private void ConfigureDependencies()
191191
serviceCollection.AddSingleton<IHubContext<ServerHub, IServerHubClient>>(sp => _globalServices.GetRequiredService<IHubContext<ServerHub, IServerHubClient>>());
192192
serviceCollection.AddSingleton<MassTransit.IBus>(sp => _globalServices.GetService<MassTransit.IBus>());
193193
serviceCollection.AddSingleton<IGameStreamService, RabbitMqGameStreamService>();
194+
serviceCollection.AddSingleton<ILogger>(_ => _logger);
195+
serviceCollection.AddSingleton<ITaskRunner, TaskRunner>();
196+
serviceCollection.AddSingleton<IDelayProvider, DelayProvider>();
197+
serviceCollection.AddSingleton<ITimeProvider, TimeProvider>();
194198
//serviceCollection.AddSingleton<IGameStreamService>(sp => _globalServices.GetRequiredService<RabbitMqGameStreamService>());
195199
//serviceCollection.AddSingleton<IGameStreamService>(sp => _globalServices.GetRequiredService<RedisGameStreamService>());
196200

src/BF2WebAdmin.Server/Modules/BF2/DiscordModule.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Diagnostics.Metrics;
33
using System.Text;
44
using System.Threading.Channels;
5+
using BF2WebAdmin.Common;
56
using BF2WebAdmin.Common.Entities.Game;
67
using BF2WebAdmin.Server.Abstractions;
78
using BF2WebAdmin.Server.Commands;
@@ -42,6 +43,7 @@ public class DiscordModule : BaseModule,
4243

4344
private readonly IGameServer _game;
4445
private readonly IGameStreamService _gameStreamService;
46+
private readonly ITaskRunner _taskRunner;
4547
private readonly IDictionary<int, bool> _newPlayers = new Dictionary<int, bool>();
4648
private readonly Channel<(ISocketMessageChannel Channel, string? Text, Embed? Embed)> _discordMessageChannel;
4749
private IEnumerable<SocketTextChannel> _adminChannels;
@@ -229,10 +231,11 @@ public class DiscordModule : BaseModule,
229231

230232
private ServerInfo.DiscordBotConfig Config => _game.ServerInfo.DiscordBot;
231233

232-
public DiscordModule(IGameServer server, IGameStreamService gameStreamService, ILogger<DiscordModule> logger, CancellationTokenSource cts) : base(server, logger, cts)
234+
public DiscordModule(IGameServer server, IGameStreamService gameStreamService, ITaskRunner taskRunner, ILogger<DiscordModule> logger, CancellationTokenSource cts) : base(server, logger, cts)
233235
{
234236
_game = server;
235237
_gameStreamService = gameStreamService;
238+
_taskRunner = taskRunner;
236239

237240
if (string.IsNullOrWhiteSpace(server.ServerInfo.DiscordBot?.Token))
238241
return;
@@ -251,7 +254,7 @@ public DiscordModule(IGameServer server, IGameStreamService gameStreamService, I
251254
}
252255

253256
// TODO: Start async in an event callback - proper?
254-
RunBackgroundTask("Discord Bot", StartBotAsync);
257+
_taskRunner.RunBackgroundTask("Discord Bot", StartBotAsync, ModuleCancellationToken);
255258
}
256259

257260
private async Task StartBotAsync()
@@ -418,7 +421,7 @@ private static string GetTeamFlag(string teamName)
418421

419422
private async Task UpdateActivityNameAsync()
420423
{
421-
RunBackgroundTask("Update Discord bot activity name", async () =>
424+
_taskRunner.RunBackgroundTask("Update Discord bot activity name", async () =>
422425
{
423426
if (_game.SocketState == SocketState.Disconnected)
424427
{
@@ -435,7 +438,7 @@ private async Task UpdateActivityNameAsync()
435438
var name = $"{_game.Players.Count()}/{_game.MaxPlayers} - {_game.Map?.Name ?? "Unknown"}";
436439
await _discord.SetActivityAsync(_streamUrl is null ? new Game(name) : new StreamingGame(name, _streamUrl));
437440
}
438-
});
441+
}, ModuleCancellationToken);
439442
}
440443

441444
// Used to prevent FakeGameServer spam when fast forwarding

0 commit comments

Comments
 (0)