public void VerifyDeduplicationMultithreaded() { var client = CreateClient(); var errorPlugin = new ErrorPlugin(); var contexts = new ConcurrentBag <EventPluginContext>(); using (var duplicateCheckerPlugin = new DuplicateCheckerPlugin(TimeSpan.FromMilliseconds(100))) { var result = Parallel.For(0, 10, index => { var builder = GetException().ToExceptionless(); var context = new EventPluginContext(client, builder.Target, builder.PluginContextData); contexts.Add(context); errorPlugin.Run(context); duplicateCheckerPlugin.Run(context); }); while (!result.IsCompleted) { Thread.Sleep(1); } } Thread.Sleep(150); Assert.Equal(1, contexts.Count(c => !c.Cancel)); Assert.Equal(9, contexts.Count(c => c.Cancel)); Assert.Equal(9, contexts.Sum(c => c.Event.Count.GetValueOrDefault())); }
public void VerifyDeduplication() { var client = CreateClient(); var errorPlugin = new ErrorPlugin(); EventPluginContext mergedContext = null; using (var duplicateCheckerPlugin = new DuplicateCheckerPlugin(TimeSpan.FromMilliseconds(40))) { for (int index = 0; index < 10; index++) { var builder = GetException().ToExceptionless(); var context = new EventPluginContext(client, builder.Target, builder.PluginContextData); errorPlugin.Run(context); duplicateCheckerPlugin.Run(context); if (index == 0) { Assert.False(context.Cancel); Assert.Null(context.Event.Count); } else { Assert.True(context.Cancel); if (index == 1) { mergedContext = context; } } } } Thread.Sleep(100); Assert.Equal(9, mergedContext.Event.Count.GetValueOrDefault()); }
public void VerifyDeduplicationFromFiles() { var client = CreateClient(); var errorPlugin = new ErrorPlugin(); foreach (var ev in ErrorDataReader.GetEvents()) { using (var duplicateCheckerPlugin = new DuplicateCheckerPlugin(TimeSpan.FromMilliseconds(20))) { for (int index = 0; index < 2; index++) { var contextData = new ContextData(); var context = new EventPluginContext(client, ev, contextData); errorPlugin.Run(context); duplicateCheckerPlugin.Run(context); if (index == 0) { Assert.False(context.Cancel); Assert.Null(context.Event.Count); } else { Assert.True(context.Cancel); Thread.Sleep(50); Assert.Equal(1, context.Event.Count); } } } } }
public DeduplicationBenchmarks() { _events = ErrorDataReader.GetEvents().ToList(); _client = new ExceptionlessClient(); _errorPlugin = new ErrorPlugin(); _duplicateCheckerPlugin = new DuplicateCheckerPlugin(); }
public void VerifyDeduplicationFromFiles() { var client = CreateClient(); var errorPlugin = new ErrorPlugin(); foreach (var ev in ErrorDataReader.GetEvents()) { using (var duplicateCheckerPlugin = new DuplicateCheckerPlugin(TimeSpan.FromSeconds(1))) { for (int index = 0; index < 2; index++) { var contextData = new ContextData(); var context = new EventPluginContext(client, ev, contextData); errorPlugin.Run(context); duplicateCheckerPlugin.Run(context); if (index == 0) { Assert.False(context.Cancel); Assert.Null(context.Event.Count); } else { Assert.True(context.Cancel); // There is only two executions, so dispose to trigger submitting. duplicateCheckerPlugin.Dispose(); Assert.Equal(1, context.Event.Count); } } } } }
private static IPluginInstance GetErrorPlugin(IPluginHost sink, string msg) { string errorMsg; IGamePlugin plugin = new ErrorPlugin(msg); plugin.SetupInstance(sink, null, out errorMsg); return(new PluginInstance { Plugin = plugin, Version = new EnvironmentVersion() }); }
public IPluginInstance GetGamePlugin(IPluginHost sink, string pluginName) { IGamePlugin plugin; if (pluginName == "ErrorPlugin") { plugin = new ErrorPlugin("Error plugin is used"); } else { plugin = new TestPlugin(); } string errorMsg; plugin.SetupInstance(sink, null, out errorMsg); return(new PluginInstance { Plugin = plugin, Version = GetEnvironmentVersion() }); }
public void ErrorPlugin_CanHandleExceptionWithOverriddenStackTrace() { var client = CreateClient(); var plugin = new ErrorPlugin(); var context = new EventPluginContext(client, new Event()); context.ContextData.SetException(GetExceptionWithOverriddenStackTrace()); plugin.Run(context); Assert.False(context.Cancel); var error = context.Event.GetError(); Assert.True(error.StackTrace.Count > 0); context.ContextData.SetException(new ExceptionWithOverriddenStackTrace("test")); plugin.Run(context); Assert.False(context.Cancel); error = context.Event.GetError(); Assert.True(error.StackTrace.Count > 0); }
public IGamePlugin Create(IPluginHost sink, string pluginName, Dictionary <string, string> config, out string errorMsg) { var prefix = sink.GameId.Contains("_") ? sink.GameId.Substring(0, sink.GameId.IndexOf('_')) : string.Empty; IGamePlugin plugin; switch (pluginName) { case "TypesTestPlugin": plugin = new TypesTestPlugin(); break; case "SetPropertiesCheckPlugin": plugin = new SetPropertiesCheckPlugin(); break; case "JoinFailuresCheckPlugin": plugin = new JoinFailuresCheckPlugin(); break; case "RaiseEventChecksPlugin": plugin = new RaiseEventChecksPlugin(); break; case "BasicTestsPlugin": plugin = new BasicTestsPlugin(); break; case "SameInstancePlugin": if (pluginInstase == null) { pluginInstase = new SameInstancePlugin(); } plugin = pluginInstase; break; case "SaveLoadStateTestPlugin": plugin = new SaveLoadStateTestPlugin(); break; case "ScheduleBroadcastTestPlugin": plugin = new ScheduleBroadcastTestPlugin(); break; case "ScheduleSetPropertiesTestPlugin": plugin = new ScheduleSetPropertiesTestPlugin(); break; case "Webhooks": plugin = new WebHooksPlugin(); plugin.SetupInstance(sink, config, out errorMsg); return(plugin); case "MasterClientIdPlugin": plugin = new MasterClientIdPlugin(); break; case "CustomTypeCheckPlugin": plugin = new CustomTypeCheckPlugin(); break; case "SyncAsyncHttpTestPlugin": plugin = new SyncAsyncHttpTestPlugin(); break; case "SyncAsyncHttpTestPluginOldHttp": plugin = new SyncAsyncHttpTestPluginOldHttp(); break; case "CustomTypeMapperPlugin": plugin = new CustomTypeMapperPlugin(); break; case "JoinExceptionsPlugin": plugin = new JoinExceptionsPlugin(); break; case "CheckSecurePlugin": { plugin = new SecureCheckPlugin("CheckSecurePlugin"); config = new Dictionary <string, string> { { "BaseUrl", "https://wt-e4c18d407aa73a40e4182aaf00a2a2eb-0.run.webtask.io/realtime-webhooks-1.2" }, { "PathJoin", "JoinGameSecure" }, { "PathEvent", "RaiseEventSecure" }, { "PathCreate", "CreateGameSecure" }, { "PathGameProperties", "SetPropertiesSecure" }, }; break; } case "StrictModeFailurePlugin": plugin = new StrictModeFailurePlugin(); break; case "StrictModeFailurePluginOldHttp": plugin = new StrictModeFailurePluginOldHttp(); break; case "SetStateAfterContinueTestPlugin": plugin = new SetStateAfterContinueTestPlugin(); break; case "ErrorPlugin": plugin = new ErrorPlugin("Error plugin is used"); break; case "StripedGameStatePlugin": plugin = new StripedGameStatePlugin(); break; case "NullRefPlugin": errorMsg = "NullRefPlugin is called"; return(null); case "ExceptionPlugin": errorMsg = "Exception plugin is called"; throw new Exception("From exception:" + errorMsg); case "BanTestPlugin": plugin = new BanTestPlugin(); break; case "ChangeGamePropertiesOnJoinPlugin": plugin = new ChangeGamePropertiesOnJoinPlugin(); break; case "RemovingActorPlugin": plugin = new RemovingActorPlugin(); break; case "BroadcastEventPlugin": plugin = new BroadcastEventPlugin(); break; case "LongOnClosePlugin": plugin = new LongOnClosePlugin(); break; case "LongOnClosePluginWithPersistence": plugin = new LongOnClosePluginWithPersistence(); break; case "WrongUrlTestPlugin": plugin = new WrongUrlTestPlugin(); break; case "OnLeaveExceptionsPlugin": plugin = new OnLeaveExceptionsPlugin(); break; case "CacheOpPlugin": plugin = new CacheOpPlugin(); break; case "AllMethosCallHttpTestPlugin": plugin = new AllMethosCallHttpTestPlugin(); break; case "OneTimeTimerTestPlugin": plugin = new OneTimeTimerTestPlugin(); break; case "OnRaiseEventTimerTestPlugin": plugin = new OnRaiseEventTimerTestPlugin(); break; case "ActorPropertiesBroadcastDuringJoin": plugin = new ActorPropertiesBroadcastDuringJoin(); break; case "ApiConsistenceTestPlugin": plugin = new ApiConsistenceTestPlugin(); break; case "CorrectOnLeaveTestPlugin": plugin = new CorrectOnLeaveTestPlugin(); break; case "SetPropertiesToInActiveActorTestPlugin": plugin = new SetPropertiesToInActiveActorTestPlugin(); break; case "SetPlayerTTLAndEmptyRoomTTLPlugin": plugin = new SetPlayerTTLAndEmptyRoomTTLPlugin(); break; case "TBWebhooks": plugin = new TBWebHooksPlugin(); config = new Dictionary <string, string> { { "BaseUrl", "https://wt-e4c18d407aa73a40e4182aaf00a2a2eb-0.run.webtask.io/realtime-webhooks-1.2" }, { "PathJoin", "GameJoin" }, { "PathEvent", "RaiseEvent" }, { "PathCreate", "GameCreate" }, { "PathClose", "GameClose" }, { "PathLoad", "GameLoad" }, { "IsPersistent", "True" }, }; break; case "TBWebhooksOldHttp": plugin = new TBWebHooksPluginOldHttp(); config = new Dictionary <string, string> { { "BaseUrl", "https://wt-e4c18d407aa73a40e4182aaf00a2a2eb-0.run.webtask.io/realtime-webhooks-1.2" }, { "PathJoin", "GameJoin" }, { "PathEvent", "RaiseEvent" }, { "PathCreate", "GameCreate" }, { "PathClose", "GameClose" }, { "PathLoad", "GameLoad" }, { "IsPersistent", "True" }, }; break; case "HttpResponseHeadersPlugin": plugin = new HttpResponseHeadersPlugin(); break; case "HttpMethodTestPlugin": plugin = new HttpMethodTestPlugin(); break; case "HttpRequestNullCallInfoPlugin": plugin = new HttpRequestNullCallInfoPlugin(); break; case "OneTimeTimerNullCallInfoPlugin": plugin = new OneTimeTimerNullCallInfoPlugin(); break; default: switch (prefix) { case "ForwardPlugin1": plugin = new WebHooksPlugin(); config = new Dictionary <string, string> { { "BaseUrl", "X" } }; break; case "ForwardPlugin2": if (string.IsNullOrEmpty(pluginName)) { plugin = new PluginBase(); } else { plugin = new WebHooksPlugin(); config = new Dictionary <string, string> { { "BaseUrl", "https://wt-e4c18d407aa73a40e4182aaf00a2a2eb-0.run.webtask.io/" }, { "PathClose", "GameClose" }, { "PathCreate", "GameCreate" }, }; } break; default: if (string.IsNullOrEmpty(pluginName)) { plugin = new PluginBase(); } else { plugin = new ErrorPlugin(string.Format("PluginFactory: Can not find plugin with name:'{0}'", pluginName)); } break; } break; } if (plugin.SetupInstance(sink, config, out errorMsg)) { return(plugin); } return(null); }
public IGamePlugin Create(IPluginHost sink, string pluginName, Dictionary <string, string> config, out string errorMsg) { var prefix = sink.GameId.Contains("_") ? sink.GameId.Substring(0, sink.GameId.IndexOf('_')) : string.Empty; IGamePlugin plugin; switch (pluginName) { case "SetPropertiesCheckPlugin": plugin = new SetPropertiesCheckPlugin(); break; case "JoinFailuresCheckPlugin": plugin = new JoinFailuresCheckPlugin(); break; case "RaiseEventChecksPlugin": plugin = new RaiseEventChecksPlugin(); break; case "BasicTestsPlugin": plugin = new BasicTestsPlugin(); break; case "SameInstancePlugin": if (pluginInstase == null) { pluginInstase = new SameInstancePlugin(); } plugin = pluginInstase; break; case "SaveLoadStateTestPlugin": plugin = new SaveLoadStateTestPlugin(); break; case "ScheduleBroadcastTestPlugin": plugin = new ScheduleBroadcastTestPlugin(); break; case "ScheduleSetPropertiesTestPlugin": plugin = new ScheduleSetPropertiesTestPlugin(); break; case "Webhooks": plugin = new WebHooksPlugin(); plugin.SetupInstance(sink, config, out errorMsg); return(plugin); case "MasterClientIdPlugin": plugin = new MasterClientIdPlugin(); break; case "CustomTypeCheckPlugin": plugin = new CustomTypeCheckPlugin(); break; case "SyncAsyncHttpTestPlugin": plugin = new SyncAsyncHttpTestPlugin(); break; case "CustomTypeMapperPlugin": plugin = new CustomTypeMapperPlugin(); break; case "JoinExceptionsPlugin": plugin = new JoinExceptionsPlugin(); break; case "CheckSecurePlugin": { plugin = new SecureCheckPlugin("CheckSecurePlugin"); config = new Dictionary <string, string> { { "BaseUrl", "http://photon-forward.webscript.io" }, { "PathJoin", "JoinGameSecure" }, { "PathEvent", "RaiseEventSecure" }, { "PathCreate", "CreateGameSecure" }, { "PathGameProperties", "SetPropertiesSecure" }, }; break; } case "StrictModeFailurePlugin": plugin = new StrictModeFailurePlugin(); break; case "SetStateAfterContinueTestPlugin": plugin = new SetStateAfterContinueTestPlugin(); break; case "ErrorPlugin": plugin = new ErrorPlugin("Error plugin is used"); break; case "StripedGameStatePlugin": plugin = new StripedGameStatePlugin(); break; case "NullRefPlugin": errorMsg = "NullRefPlugin is called"; return(null); case "ExceptionPlugin": errorMsg = "Exception plugin is called"; throw new Exception("From exception:" + errorMsg); case "BanTestPlugin": plugin = new BanTestPlugin(); break; case "ChangeGamePropertiesOnJoinPlugin": plugin = new ChangeGamePropertiesOnJoinPlugin(); break; case "RemovingActorPlugin": plugin = new RemovingActorPlugin(); break; case "BroadcastEventPlugin": plugin = new BroadcastEventPlugin(); break; case "LongOnClosePlugin": plugin = new LongOnClosePlugin(); break; case "LongOnClosePluginWithPersistence": plugin = new LongOnClosePluginWithPersistence(); break; case "WrongUrlTestPlugin": plugin = new WrongUrlTestPlugin(); break; default: switch (prefix) { case "ForwardPlugin1": plugin = new WebHooksPlugin(); config = new Dictionary <string, string> { { "BaseUrl", "X" } }; break; case "ForwardPlugin2": if (string.IsNullOrEmpty(pluginName)) { plugin = new PluginBase(); } else { plugin = new WebHooksPlugin(); sink = new PluginHostWrapper(sink); config = new Dictionary <string, string> { { "BaseUrl", "http://photon-photon-pluginsdk-v1.webscript.io" }, { "PathClose", "GameClose" }, { "PathCreate", "GameCreate" }, }; } break; default: plugin = new PluginBase(); break; } break; } if (plugin.SetupInstance(sink, config, out errorMsg)) { return(plugin); } return(null); }
public void VerifyDeduplicationMultithreaded() { var client = CreateClient(); var errorPlugin = new ErrorPlugin(); List<EventPluginContext> contexts = new List<EventPluginContext>(); using (var duplicateCheckerPlugin = new DuplicateCheckerPlugin(TimeSpan.FromMilliseconds(100))) { var result = Parallel.For(0, 10, index => { var builder = GetException().ToExceptionless(); var context = new EventPluginContext(client, builder.Target, builder.PluginContextData); contexts.Add(context); errorPlugin.Run(context); duplicateCheckerPlugin.Run(context); }); while (!result.IsCompleted) Thread.Sleep(1); } Thread.Sleep(150); Assert.Equal(1, contexts.Count(c => !c.Cancel)); Assert.Equal(9, contexts.Count(c => c.Cancel)); Assert.Equal(9, contexts.Sum(c => c.Event.Count.GetValueOrDefault())); }
public void VerifyDeduplication() { var client = CreateClient(); var errorPlugin = new ErrorPlugin(); EventPluginContext mergedContext = null; using (var duplicateCheckerPlugin = new DuplicateCheckerPlugin(TimeSpan.FromMilliseconds(40))) { for (int index = 0; index < 10; index++) { var builder = GetException().ToExceptionless(); var context = new EventPluginContext(client, builder.Target, builder.PluginContextData); errorPlugin.Run(context); duplicateCheckerPlugin.Run(context); if (index == 0) { Assert.False(context.Cancel); Assert.Null(context.Event.Count); } else { Assert.True(context.Cancel); if (index == 1) mergedContext = context; } } } Thread.Sleep(100); Assert.Equal(9, mergedContext.Event.Count.GetValueOrDefault()); }