def test_parenthesized_msg(): """Parse an exception with a exception message in parentheses.""" java_exc = javautil.parse_java_stack_trace(EXC_MSG_WITH_PARENS) assert java_exc.exception_class == "Exception" assert (java_exc.exception_message == 'Error(\n\nGeneral Error: "No subscriptions created yet.")') assert java_exc.stack == ["at org.File.function(RustError.kt:4)"] assert java_exc.additional == []
def test_parse_unindented_caused_by(): """Parse an exception with an unindented "Caused by" section.""" java_exc = javautil.parse_java_stack_trace(EXC_WITH_UNINDENTED_CAUSED_BY) assert java_exc.exception_class == "Exception" assert java_exc.exception_message == "msg" assert java_exc.stack == ["at org.File.function(File.java:100)"] assert java_exc.additional == [ "Caused by: Exception2: msg2; no stack trace available" ]
def test_parse_suppressed(): """Parse an exception with a "Suppressed" section""" java_exc = javautil.parse_java_stack_trace(EXC_WITH_SUPPRESSED) assert java_exc.exception_class == 'Exception' assert java_exc.exception_message == 'msg' assert java_exc.stack == ['at org.File.function(File.java:100)'] assert java_exc.additional == [ 'Suppressed: Exception2: msg2', '\tat org.File.function(File.java:101)' ]
def test_parse_caused_by(): """Parse an exception with a "Caused by" section with no stack""" java_exc = javautil.parse_java_stack_trace(EXC_WITH_CAUSED_BY) assert java_exc.exception_class == 'Exception' assert java_exc.exception_message == 'msg' assert java_exc.stack == ['at org.File.function(File.java:100)'] assert java_exc.additional == [ 'Caused by: Exception2: msg2; no stack trace available' ]
def test_parse_basic(): """Parse a basic exception with a class, message, and some stack lines""" java_exc = javautil.parse_java_stack_trace(EXC) assert java_exc.exception_class == 'Exception' assert java_exc.exception_message == 'msg' assert java_exc.stack == [ 'at org.File.function(File.java:100)', 'at org.File.function2(File.java:200)' ] assert java_exc.additional == []
def test_parse_suppressed(): """Parse an exception with a "Suppressed" section""" java_exc = javautil.parse_java_stack_trace(EXC_WITH_SUPPRESSED) assert java_exc.exception_class == "Exception" assert java_exc.exception_message == "msg" assert java_exc.stack == ["at org.File.function(File.java:100)"] assert java_exc.additional == [ "\tSuppressed: Exception2: msg2", "\t\tat org.File.function(File.java:101)", ]
def test_parse_basic(): """Parse a basic exception with a class, message, and some stack lines""" java_exc = javautil.parse_java_stack_trace(EXC) assert java_exc.exception_class == "Exception" assert java_exc.exception_message == "msg" assert java_exc.stack == [ "at org.File.function(File.java:100)", "at org.File.function2(File.java:200)", ] assert java_exc.additional == []
def test_parse_caused_by(): """Parse an exception with a "Caused by" section with no stack""" java_exc = javautil.parse_java_stack_trace(EXC_WITH_CAUSED_BY) assert java_exc.exception_class == 'Exception' assert java_exc.exception_message == 'msg' assert java_exc.stack == [ 'at org.File.function(File.java:100)' ] assert java_exc.additional == [ 'Caused by: Exception2: msg2; no stack trace available' ]
def test_parse_suppressed(): """Parse an exception with a "Suppressed" section""" java_exc = javautil.parse_java_stack_trace(EXC_WITH_SUPPRESSED) assert java_exc.exception_class == 'Exception' assert java_exc.exception_message == 'msg' assert java_exc.stack == [ 'at org.File.function(File.java:100)' ] assert java_exc.additional == [ 'Suppressed: Exception2: msg2', '\tat org.File.function(File.java:101)' ]
def action(self, raw_crash, raw_dumps, processed_crash, processor_meta): # This can contain PII in the exception message processed_crash['java_stack_trace_full'] = raw_crash['JavaStackTrace'] try: java_exception = javautil.parse_java_stack_trace(raw_crash['JavaStackTrace']) java_stack_trace = java_exception.to_public_string() except javautil.MalformedJavaStackTrace: processor_meta.processor_notes.append('JavaProcessRule: malformed java stack trace') java_stack_trace = 'malformed' processed_crash['java_stack_trace'] = java_stack_trace
def action(self, raw_crash, raw_dumps, processed_crash, processor_meta): # This can contain PII in the exception message processed_crash['java_stack_trace_full'] = raw_crash['JavaStackTrace'] try: java_exception = javautil.parse_java_stack_trace(raw_crash['JavaStackTrace']) java_stack_trace = java_exception.to_public_string() except javautil.MalformedJavaStackTrace: processor_meta.processor_notes.append('JavaProcessRule: malformed java stack trace') java_stack_trace = 'malformed' processed_crash['java_stack_trace'] = java_stack_trace
def test_no_message(): """Parse a basic exception with a class, message, and some stack lines""" java_exc = javautil.parse_java_stack_trace(EXC_NO_MESSAGE) assert java_exc.exception_class == 'Exception' assert java_exc.exception_message == '' assert java_exc.stack == [ 'at org.File.function(File.java:100)', 'at org.File.function2(File.java:200)' ] assert java_exc.additional == [] assert java_exc.to_public_string() == ( 'Exception\n' '\tat org.File.function(File.java:100)\n' '\tat org.File.function2(File.java:200)')
def test_no_message(): """Parse a basic exception with a class, message, and some stack lines""" java_exc = javautil.parse_java_stack_trace(EXC_NO_MESSAGE) assert java_exc.exception_class == 'Exception' assert java_exc.exception_message == '' assert java_exc.stack == [ 'at org.File.function(File.java:100)', 'at org.File.function2(File.java:200)' ] assert java_exc.additional == [] assert java_exc.to_public_string() == ( 'Exception\n' '\tat org.File.function(File.java:100)\n' '\tat org.File.function2(File.java:200)' )
def test_parse_multi_line_msg(): """Parse an exception where the exception message is multiple lines""" java_exc = javautil.parse_java_stack_trace(EXC_WITH_MULTILINE_MSG) assert java_exc.exception_class == 'android.database.sqlite.SQLiteDatabaseLockedException' assert ( java_exc.exception_message == 'database is locked (code 5)\n' '#################################################################\n' 'Error Code : 5 (SQLITE_BUSY)\n' 'Caused By : The database file is locked.\n' '\t(database is locked (code 5))\n' '#################################################################') assert java_exc.stack == [ 'at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(Native Method)', # noqa 'at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:904)' # noqa ] assert java_exc.additional == []
def action(self, raw_crash, raw_dumps, processed_crash, processor_meta): # This can contain PII in the exception message processed_crash["java_stack_trace_raw"] = raw_crash["JavaStackTrace"] try: java_exception = javautil.parse_java_stack_trace( raw_crash["JavaStackTrace"] ) java_stack_trace = java_exception.to_public_string() except javautil.MalformedJavaStackTrace: processor_meta["processor_notes"].append( "JavaProcessRule: malformed java stack trace" ) java_stack_trace = "malformed" processed_crash["java_stack_trace"] = java_stack_trace
def test_parse_multi_line_msg(): """Parse an exception where the exception message is multiple lines""" java_exc = javautil.parse_java_stack_trace(EXC_WITH_MULTILINE_MSG) assert java_exc.exception_class == 'android.database.sqlite.SQLiteDatabaseLockedException' assert ( java_exc.exception_message == 'database is locked (code 5)\n' '#################################################################\n' 'Error Code : 5 (SQLITE_BUSY)\n' 'Caused By : The database file is locked.\n' '\t(database is locked (code 5))\n' '#################################################################' ) assert java_exc.stack == [ 'at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(Native Method)', # noqa 'at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:904)' # noqa ] assert java_exc.additional == []
def action(self, raw_crash, raw_dumps, processed_crash, processor_meta): # This can contain PII in the exception message processed_crash["java_stack_trace_raw"] = raw_crash["JavaStackTrace"] # FIXME(willkg): Remove java_stack_trace_full after January 2020. processed_crash["java_stack_trace_full"] = raw_crash["JavaStackTrace"] try: java_exception = javautil.parse_java_stack_trace( raw_crash["JavaStackTrace"] ) java_stack_trace = java_exception.to_public_string() except javautil.MalformedJavaStackTrace: processor_meta.processor_notes.append( "JavaProcessRule: malformed java stack trace" ) java_stack_trace = "malformed" processed_crash["java_stack_trace"] = java_stack_trace
def action(self, raw_crash, raw_dumps, processed_crash, processor_meta): if "JavaStackTrace" in raw_crash: # The java_stack_trace_raw version can contain PII in the exception message # and should be treated as protected data processed_crash["java_stack_trace_raw"] = raw_crash[ "JavaStackTrace"] # The java_stack_trace is a sanitizzed version of java_stack_trace_raw try: parsed_java_stack_trace = javautil.parse_java_stack_trace( raw_crash["JavaStackTrace"]) java_stack_trace = parsed_java_stack_trace.to_public_string() except javautil.MalformedJavaStackTrace: processor_meta["processor_notes"].append( "JavaProcessRule: malformed JavaStackTrace") java_stack_trace = "malformed" processed_crash["java_stack_trace"] = java_stack_trace if "JavaException" in raw_crash: try: # The java_exception is a structured form of the stack trace java_exception = json.loads(raw_crash["JavaException"]) javautil.validate_java_exception(java_exception) # The java_exception_raw value can have PII and should be treated # as protected data processed_crash["java_exception_raw"] = java_exception # The java_exception is a sanitized version processed_crash[ "java_exception"] = javautil.sanitize_java_exception( java_exception) except (javautil.MalformedJavaException, json.JSONDecodeError): processor_meta["processor_notes"].append( "JavaProcessRule: malformed JavaException")
def test_malformed(text): with pytest.raises(javautil.MalformedJavaStackTrace): javautil.parse_java_stack_trace(text)
def test_malformed(text): with pytest.raises(javautil.MalformedJavaStackTrace): javautil.parse_java_stack_trace(text)