1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
using SafeNSound.Sdk;
namespace SafeNSound.FakeUser;
public class UserStore(SafeNSoundAuthentication authService, SafeNSoundConfiguration config) : IHostedService {
public List<ClientContainer> Admins { get; } = Enumerable.Range(0, 1).Select(_ => new ClientContainer()).ToList();
public List<ClientContainer> Monitors { get; } = Enumerable.Range(0, 5).Select(_ => new ClientContainer()).ToList();
public List<ClientContainer> Users { get; } = Enumerable.Range(0, 15).Select(_ => new ClientContainer()).ToList();
public List<ClientContainer> AllUsers => [.. Users, .. Monitors, .. Admins];
public ClientContainer GetRandomUser() {
ClientContainer user;
do {
user = Users[new Random().Next(Users.Count)];
} while (user.Client == null);
return user;
}
public ClientContainer GetRandomMonitor() {
ClientContainer user;
do {
user = Monitors[new Random().Next(Monitors.Count)];
} while (user.Client == null);
return user;
}
public ClientContainer GetRandomAdmin() {
ClientContainer user;
do {
user = Admins[new Random().Next(Admins.Count)];
} while (user.Client == null);
return user;
}
public ClientContainer GetRandomUserOfAnyType() {
ClientContainer user;
do {
user = AllUsers[new Random().Next(AllUsers.Count)];
} while (user.Client == null);
return user;
}
public async Task StartAsync(CancellationToken cancellationToken) {
Admins.ForEach(x => x.Auth.UserType = "admin");
Monitors.ForEach(x => x.Auth.UserType = "monitor");
var ss = new SemaphoreSlim(256, 256);
var tasks = ((ClientContainer[]) [..Users, ..Monitors, ..Admins]).Select(async container => {
await ss.WaitAsync();
await authService.Register(container.Auth);
container.Client = new SafeNSoundClient(config, (await authService.Login(container.Auth)).AccessToken);
container.WhoAmI = await container.Client.WhoAmI();
await container.Client.UpdateDevice(container.WhoAmI.DeviceId, new() {
Name = "FakeUser-" + container.Auth.Username,
});
if (container.Auth.UserType == "admin") {
await container.Client.MonitorAllUsers();
}
ss.Release();
}).ToList();
await Task.WhenAll(tasks);
var users = Users.ToArray();
tasks = Monitors.Select(async container => {
var items = Random.Shared.GetItems(users, Users.Count / Monitors.Count).DistinctBy(x=>x.WhoAmI!.UserId);
foreach (var user in items) {
await container.Client!.AddAssignedUser(user.WhoAmI!.UserId);
}
}).ToList();
await Task.WhenAll(tasks);
}
public async Task StopAsync(CancellationToken cancellationToken) {
await Task.WhenAll(Users.Select(Cleanup).ToList());
await Task.WhenAll(Monitors.Select(Cleanup).ToList());
await Task.WhenAll(Admins.Select(Cleanup).ToList());
}
private async Task Cleanup(ClientContainer container) {
if (container.Client == null) return;
try {
_ = await container.Client.GetDevices();
if(Random.Shared.Next(100)>50)
await container.Client.DeleteDevice(container.WhoAmI!.DeviceId);
else await container.Client.LogOut();
await container.Client.DeleteAccount(container.Auth);
}
catch {
Console.WriteLine("Failed to delete account for user: " + container.Auth.Username);
}
}
public class ClientContainer {
public RegisterDto Auth { get; set; } = new() {
Email = $"{Guid.NewGuid()}@example.com",
Username = $"user-{Guid.NewGuid()}",
Password = Guid.NewGuid().ToString(),
UserType = "user"
};
public SafeNSoundClient? Client { get; set; }
public WhoAmI? WhoAmI { get; set; }
}
}
|