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);
                        }
                    }
                }
            }
        }
Example #4
0
 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);
                        }
                    }
                }
            }
        }
Example #6
0
        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()
            });
        }
Example #7
0
        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);
        }
Example #9
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 DeduplicationBenchmarks() {
     _events = ErrorDataReader.GetEvents().ToList();
     _client = new ExceptionlessClient();
     _errorPlugin = new ErrorPlugin();
     _duplicateCheckerPlugin = new DuplicateCheckerPlugin();
 }
Example #11
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 "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 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 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());
        }
        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);
        }