public async Task Test_ConcurrentCallsToUpdateStatHistoryDoesNotCauseException() { var server = serviceProvider.GetRequiredService <IW4MServer>(); var configHandler = A.Fake <IConfigurationHandler <StatsConfiguration> >(); var mgr = new StatManager(serviceProvider.GetRequiredService <IManager>(), serviceProvider.GetRequiredService <IDatabaseContextFactory>(), configHandler); var target = ClientGenerators.CreateDatabaseClient(); target.CurrentServer = server; A.CallTo(() => configHandler.Configuration()) .Returns(new StatsConfiguration() { TopPlayersMinPlayTime = 0 }); var dbFactory = serviceProvider.GetRequiredService <IDatabaseContextFactory>(); var db = dbFactory.CreateContext(true); db.Set <EFServer>().Add(new EFServer() { EndPoint = server.EndPoint.ToString() }); db.Clients.Add(target); db.SaveChanges(); mgr.AddServer(server); await mgr.AddPlayer(target); var stats = target.GetAdditionalProperty <EFClientStatistics>("ClientStats"); await mgr.UpdateStatHistory(target, stats); }
public async Task OnEventAsync(Event E, Server S) { switch (E.Type) { case Event.GType.Start: Manager.AddServer(S); break; case Event.GType.Stop: break; case Event.GType.Connect: Manager.AddPlayer(E.Origin); break; case Event.GType.Disconnect: await Manager.RemovePlayer(E.Origin); break; case Event.GType.Say: if (E.Data != string.Empty && E.Data.Trim().Length > 0 && E.Data.Trim()[0] != '!') await Manager.AddMessageAsync(E.Origin.ClientId, E.Owner.GetHashCode(), E.Data); break; case Event.GType.MapChange: break; case Event.GType.MapEnd: await Manager.Sync(S); break; case Event.GType.Broadcast: break; case Event.GType.Tell: break; case Event.GType.Kick: break; case Event.GType.Ban: break; case Event.GType.Remote: break; case Event.GType.Unknown: break; case Event.GType.Report: break; case Event.GType.Flag: break; case Event.GType.Script: break; case Event.GType.Kill: string[] killInfo = (E.Data != null) ? E.Data.Split(';') : new string[0]; if (killInfo.Length >= 9 && killInfo[0].Contains("ScriptKill") && E.Owner.CustomCallback) await Manager.AddScriptKill(E.Origin, E.Target, S.GetHashCode(), S.CurrentMap.Name, killInfo[7], killInfo[8], killInfo[5], killInfo[6], killInfo[3], killInfo[4]); else if (!E.Owner.CustomCallback) await Manager.AddStandardKill(E.Origin, E.Target); break; case Event.GType.Death: break; } }