public void ShouldSendUnderTheLimit() { Dictionary <LogType, int> maximumTypePerTimePeriod = new Dictionary <LogType, int> { { LogType.Error, 5 } }; var configuration = new TestConfiguration("foo") { MaximumTypePerTimePeriod = maximumTypePerTimePeriod }; var counter = new MaximumLogTypeCounter(configuration); var message1 = new UnityLogMessage("", "", LogType.Error); var message2 = new UnityLogMessage("", "", LogType.Error); var message3 = new UnityLogMessage("", "", LogType.Error); var message4 = new UnityLogMessage("", "", LogType.Error); var message5 = new UnityLogMessage("", "", LogType.Error); Assert.True(counter.ShouldSend(message1)); Assert.True(counter.ShouldSend(message2)); Assert.True(counter.ShouldSend(message3)); Assert.True(counter.ShouldSend(message4)); Assert.True(counter.ShouldSend(message5)); }
public void FlushesCorrectly() { Dictionary <LogType, int> maximumTypePerTimePeriod = new Dictionary <LogType, int> { { LogType.Error, 1 } }; var configuration = new TestConfiguration("foo") { MaximumTypePerTimePeriod = maximumTypePerTimePeriod, MaximumLogsTimePeriod = TimeSpan.FromSeconds(2), }; var counter = new MaximumLogTypeCounter(configuration); var message = new UnityLogMessage("", "", LogType.Error); counter.ShouldSend(message); Thread.Sleep(configuration.MaximumLogsTimePeriod); message = new UnityLogMessage("", "", LogType.Error); Assert.True(counter.ShouldSend(message)); }
public static Exception FromUnityLogMessage(UnityLogMessage logMessage, System.Diagnostics.StackFrame[] stackFrames, Severity severity, bool forceUnhandled) { var match = Regex.Match(logMessage.Condition, ErrorClassMessagePattern, RegexOptions.Singleline); var lines = new StackTrace(logMessage.StackTrace).ToArray(); var handledState = forceUnhandled ? HandledState.ForUnhandledException() : HandledState.ForUnityLogMessage(severity); if (match.Success) { var errorClass = match.Groups["errorClass"].Value; var message = match.Groups["message"].Value.Trim(); if (errorClass == AndroidJavaErrorClass) { match = Regex.Match(message, ErrorClassMessagePattern, RegexOptions.Singleline); if (match.Success) { errorClass = match.Groups["errorClass"].Value; message = match.Groups["message"].Value.Trim(); lines = new StackTrace(logMessage.StackTrace, StackTraceFormat.AndroidJava).ToArray(); } handledState = HandledState.ForUnhandledException(); } return(new Exception(errorClass, message, lines, handledState)); } else { // include the type somehow in there return(new Exception($"UnityLog{logMessage.Type}", logMessage.Condition, lines, handledState)); } }
public void SendsSingleMessage() { var counter = new UniqueLogThrottle(new TestConfiguration("foo")); var message = new UnityLogMessage("", "", LogType.Error); Assert.True(counter.ShouldSend(message)); }
public void ShouldNotSendDuplicateMessages() { var counter = new UniqueLogThrottle(new TestConfiguration("foo")); var message1 = new UnityLogMessage("", "", LogType.Error); var message2 = new UnityLogMessage("", "", LogType.Error); counter.ShouldSend(message1); Assert.False(counter.ShouldSend(message2)); }
public void ParseDuplicateAndroidExceptionFromLogMessage() { string condition = "AndroidJavaException: java.lang.Error"; string stacktrace = @"java.lang.Error: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0102192a9accb1876a libunity.0033c25b(Unknown:-2) libunity.003606e3(Unknown:-2) libbugsnag-ndk.bsg_handle_signal(bsg_handle_signal:472) app_process64.000d1b11(Unknown:-2)"; var logType = UnityEngine.LogType.Error; var log = new UnityLogMessage(condition, stacktrace, logType); Assert.False(Exception.ShouldSend(log)); }
public void FlushesCorrectly() { var configuration = new TestConfiguration("foo"); var counter = new UniqueLogThrottle(configuration); var message = new UnityLogMessage("", "", LogType.Error); counter.ShouldSend(message); Thread.Sleep(configuration.UniqueLogsTimePeriod); message = new UnityLogMessage("", "", LogType.Error); Assert.True(counter.ShouldSend(message)); }
public void DontTrackCertainLogType() { Dictionary <LogType, int> maximumTypePerTimePeriod = new Dictionary <LogType, int>(); var configuration = new TestConfiguration("foo") { MaximumTypePerTimePeriod = maximumTypePerTimePeriod }; var counter = new MaximumLogTypeCounter(configuration); var message = new UnityLogMessage("", "", LogType.Error); Assert.True(counter.ShouldSend(message)); }
public void ParseExceptionFromLogMessage() { string condition = "IndexOutOfRangeException: Array index is out of range."; string stacktrace = @"ReporterBehavior.AssertionFailure () [0x00000] in <filename unknown>:0 UnityEngine.Events.InvokableCall.Invoke () [0x00000] in <filename unknown>:0 UnityEngine.Events.UnityEvent.Invoke () [0x00000] in <filename unknown>:0 UnityEngine.UI.Button.Press () [0x00000] in <filename unknown>:0 UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) [0x00000] in <filename unknown>:0 UnityEngine.EventSystems.ExecuteEvents.Execute (IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) [0x00000] in <filename unknown>:0 UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor) [0x00000] in <filename unknown>:0"; var logType = UnityEngine.LogType.Error; var log = new UnityLogMessage(condition, stacktrace, logType); Assert.True(Exception.ShouldSend(log)); var exception = Exception.FromUnityLogMessage(log, new System.Diagnostics.StackFrame[] {}, Severity.Info); var stack = exception.StackTrace.ToList(); Assert.AreEqual(7, stack.Count); Assert.AreEqual("IndexOutOfRangeException", exception.ErrorClass); Assert.AreEqual("Array index is out of range.", exception.ErrorMessage); Assert.AreEqual("ReporterBehavior.AssertionFailure()", stack[0].Method); Assert.AreEqual("<filename unknown>", stack[0].File); Assert.AreEqual(0, stack[0].LineNumber); Assert.AreEqual("UnityEngine.Events.InvokableCall.Invoke()", stack[1].Method); Assert.AreEqual("<filename unknown>", stack[1].File); Assert.AreEqual(0, stack[1].LineNumber); Assert.AreEqual("UnityEngine.Events.UnityEvent.Invoke()", stack[2].Method); Assert.AreEqual("<filename unknown>", stack[2].File); Assert.AreEqual(0, stack[2].LineNumber); Assert.AreEqual("UnityEngine.UI.Button.Press()", stack[3].Method); Assert.AreEqual("<filename unknown>", stack[3].File); Assert.AreEqual(0, stack[3].LineNumber); Assert.AreEqual("UnityEngine.UI.Button.OnPointerClick(UnityEngine.EventSystems.PointerEventData eventData)", stack[4].Method); Assert.AreEqual("<filename unknown>", stack[4].File); Assert.AreEqual(0, stack[4].LineNumber); Assert.AreEqual("UnityEngine.EventSystems.ExecuteEvents.Execute(IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData)", stack[5].Method); Assert.AreEqual("<filename unknown>", stack[5].File); Assert.AreEqual(0, stack[5].LineNumber); Assert.AreEqual("UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler](UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor)", stack[6].Method); Assert.AreEqual("<filename unknown>", stack[6].File); Assert.AreEqual(0, stack[6].LineNumber); }
public void ShouldNotSendOverLimitMessages() { Dictionary <LogType, int> maximumTypePerTimePeriod = new Dictionary <LogType, int> { { LogType.Error, 1 } }; var configuration = new TestConfiguration("foo") { MaximumTypePerTimePeriod = maximumTypePerTimePeriod }; var counter = new MaximumLogTypeCounter(configuration); var message1 = new UnityLogMessage("", "", LogType.Error); var message2 = new UnityLogMessage("", "", LogType.Error); counter.ShouldSend(message1); Assert.False(counter.ShouldSend(message2)); }
public void ParseAndroidExceptionFromLogMessage() { string condition = "AndroidJavaException: java.lang.IllegalArgumentException"; string stacktrace = @"java.lang.IllegalArgumentException com.example.bugsnagcrashplugin.CrashHelper.UnhandledCrash(CrashHelper.java:11) com.unity3d.player.UnityPlayer.nativeRender(Native Method)"; var logType = UnityEngine.LogType.Error; var log = new UnityLogMessage(condition, stacktrace, logType); Assert.True(Exception.ShouldSend(log)); var exception = Exception.FromUnityLogMessage(log, new System.Diagnostics.StackFrame[] {}, Severity.Warning); var stack = exception.StackTrace.ToList(); Assert.AreEqual("java.lang.IllegalArgumentException", exception.ErrorClass); Assert.True(System.String.IsNullOrEmpty(exception.ErrorMessage)); Assert.AreEqual(2, stack.Count); Assert.AreEqual("com.example.bugsnagcrashplugin.CrashHelper.UnhandledCrash()", stack[0].Method); Assert.AreEqual("CrashHelper.java", stack[0].File); Assert.AreEqual(11, stack[0].LineNumber); Assert.AreEqual("com.unity3d.player.UnityPlayer.nativeRender()", stack[1].Method); Assert.AreEqual("Native Method", stack[1].File); Assert.AreEqual(null, stack[1].LineNumber); }
public static Exception FromUnityLogMessage(UnityLogMessage logMessage, System.Diagnostics.StackFrame[] stackFrames, Severity severity) { return(FromUnityLogMessage(logMessage, stackFrames, severity, false)); }
public void ParseAndroidExceptionFromLogMessage() { string condition = "AndroidJavaException: java.lang.ArrayIndexOutOfBoundsException: length=2; index=2"; string stacktrace = @"java.lang.ArrayIndexOutOfBoundsException: length=2; index=2 com.example.bugsnagcrashplugin.CrashHelper.UnhandledCrash(CrashHelper.java:11) com.unity3d.player.UnityPlayer.nativeRender(Native Method) com.unity3d.player.UnityPlayer.c(Unknown Source:0) com.unity3d.player.UnityPlayer$e$2.queueIdle(Unknown Source:72) android.os.MessageQueue.next(MessageQueue.java:395) android.os.Looper.loop(Looper.java:160) com.unity3d.player.UnityPlayer$e.run(Unknown Source:32) UnityEngine.AndroidJNISafe.CheckException() UnityEngine.AndroidJNISafe.CallStaticVoidMethod(IntPtr clazz, IntPtr methodID, UnityEngine.jvalue[] args) UnityEngine.AndroidJavaObject._CallStatic(System.String methodName, System.Object[] args) UnityEngine.EventSystems.ExecuteEvents.Execute(IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functorUnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler]() UnityEngine.EventSystems.EventSystem:Update()"; var logType = UnityEngine.LogType.Error; var log = new UnityLogMessage(condition, stacktrace, logType); var exception = Exception.FromUnityLogMessage(log, new System.Diagnostics.StackFrame[] {}, Severity.Warning); var stack = exception.StackTrace.ToList(); Assert.AreEqual(13, stack.Count); Assert.AreEqual("java.lang.ArrayIndexOutOfBoundsException", exception.ErrorClass); Assert.AreEqual("length=2; index=2", exception.ErrorMessage); Assert.AreEqual("com.example.bugsnagcrashplugin.CrashHelper.UnhandledCrash()", stack[0].Method); Assert.AreEqual("CrashHelper.java", stack[0].File); Assert.AreEqual(11, stack[0].LineNumber); Assert.AreEqual("com.unity3d.player.UnityPlayer.nativeRender()", stack[1].Method); Assert.AreEqual("Native Method", stack[1].File); Assert.AreEqual(null, stack[1].LineNumber); Assert.AreEqual("com.unity3d.player.UnityPlayer.c()", stack[2].Method); Assert.AreEqual("Unknown Source", stack[2].File); Assert.AreEqual(0, stack[2].LineNumber); Assert.AreEqual("com.unity3d.player.UnityPlayer$e$2.queueIdle()", stack[3].Method); Assert.AreEqual("Unknown Source", stack[3].File); Assert.AreEqual(72, stack[3].LineNumber); Assert.AreEqual("android.os.MessageQueue.next()", stack[4].Method); Assert.AreEqual("MessageQueue.java", stack[4].File); Assert.AreEqual(395, stack[4].LineNumber); Assert.AreEqual("android.os.Looper.loop()", stack[5].Method); Assert.AreEqual("Looper.java", stack[5].File); Assert.AreEqual(160, stack[5].LineNumber); Assert.AreEqual("com.unity3d.player.UnityPlayer$e.run()", stack[6].Method); Assert.AreEqual("Unknown Source", stack[6].File); Assert.AreEqual(32, stack[6].LineNumber); Assert.AreEqual("UnityEngine.AndroidJNISafe.CheckException()", stack[7].Method); Assert.AreEqual(null, stack[7].File); Assert.AreEqual(null, stack[7].LineNumber); Assert.AreEqual("UnityEngine.AndroidJNISafe.CallStaticVoidMethod(IntPtr clazz, IntPtr methodID, UnityEngine.jvalue[] args)", stack[8].Method); Assert.AreEqual(null, stack[8].File); Assert.AreEqual(null, stack[8].LineNumber); Assert.AreEqual("UnityEngine.AndroidJavaObject._CallStatic(System.String methodName, System.Object[] args)", stack[9].Method); Assert.AreEqual(null, stack[9].File); Assert.AreEqual(null, stack[9].LineNumber); Assert.AreEqual("UnityEngine.EventSystems.ExecuteEvents.Execute(IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData)", stack[10].Method); Assert.AreEqual(null, stack[10].File); Assert.AreEqual(null, stack[10].LineNumber); Assert.AreEqual("UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functorUnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler]()", stack[11].Method); Assert.AreEqual(null, stack[11].File); Assert.AreEqual(null, stack[11].LineNumber); Assert.AreEqual("UnityEngine.EventSystems.EventSystem:Update()", stack[12].Method); Assert.AreEqual(null, stack[12].File); Assert.AreEqual(null, stack[12].LineNumber); }