[SATYR PATCHv3 7/7] tests for json deserialization of stacktraces
Martin Milata
mmilata at redhat.com
Mon Aug 26 14:47:47 UTC 2013
Signed-off-by: Martin Milata <mmilata at redhat.com>
---
tests/python/core.py | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++
tests/python/java.py | 80 ++++++++++++++++++++++++++++++++++++++++++++++++
tests/python/koops.py | 80 ++++++++++++++++++++++++++++++++++++++++++++++++
tests/python/python.py | 50 ++++++++++++++++++++++++++++++
4 files changed, 292 insertions(+)
diff --git a/tests/python/core.py b/tests/python/core.py
index cf09ba0..e4593b4 100755
--- a/tests/python/core.py
+++ b/tests/python/core.py
@@ -55,6 +55,88 @@ class TestCoreStacktrace(BindingsTestCase):
def test_crash_thread(self):
self.assertTrue(self.trace.crash_thread is self.trace.threads[1])
+ def test_from_json(self):
+ trace = satyr.CoreStacktrace.from_json('{}')
+ self.assertEqual(trace.threads, [])
+
+ json_text = '''
+ {
+ "signal": 9,
+ "executable": "C:\\\\porn.bat",
+ "stacktrace": [
+ {
+ "frames": [
+ {
+ "address": 60100,
+ "build_id": "aaaaaaaaaaaaaaaaaaaaaaaaAAAAAAAAAAA",
+ "build_id_offset": 5,
+ "function_name": "destroy_universe",
+ "file_name": "del.exe",
+ "fingerprint": "1234123412341234123412341234",
+ "fingerprint_hashed": true,
+ },
+ {},
+ {
+ "address": 2,
+ "fingerprint": "a b c d",
+ "fingerprint_hashed": false,
+ }
+ ]
+ },
+ {
+ "crash_thread": true,
+ "bogus": "value",
+ "frames": [
+ {
+ "address": 1,
+ "build_id": "b",
+ "build_id_offset": 5,
+ }
+ ]
+ }
+ ]
+ }
+'''
+ trace = satyr.CoreStacktrace.from_json(json_text)
+ self.assertEqual(trace.signal, 9)
+ self.assertEqual(trace.executable, 'C:\\porn.bat')
+
+ self.assertEqual(len(trace.threads), 2)
+ self.assertEqual(len(trace.threads[0].frames), 3)
+ self.assertEqual(len(trace.threads[1].frames), 1)
+
+ self.assertEqual(trace.threads[0].frames[0].address, 60100)
+ self.assertEqual(trace.threads[0].frames[0].build_id, 'aaaaaaaaaaaaaaaaaaaaaaaaAAAAAAAAAAA')
+ self.assertEqual(trace.threads[0].frames[0].build_id_offset, 5)
+ self.assertEqual(trace.threads[0].frames[0].function_name, 'destroy_universe')
+ self.assertEqual(trace.threads[0].frames[0].file_name, 'del.exe')
+ self.assertEqual(trace.threads[0].frames[0].fingerprint, '1234123412341234123412341234')
+ self.assertTrue(trace.threads[0].frames[0].fingerprint_hashed)
+
+ self.assertEqual(trace.threads[0].frames[1].address, 18446744073709551615L) # !!! FIXME
+ self.assertEqual(trace.threads[0].frames[1].build_id, None)
+ self.assertEqual(trace.threads[0].frames[1].build_id_offset, 18446744073709551615L) # !!!
+ self.assertEqual(trace.threads[0].frames[1].function_name, None)
+ self.assertEqual(trace.threads[0].frames[1].file_name, None)
+ self.assertEqual(trace.threads[0].frames[1].fingerprint, None)
+ self.assertTrue(trace.threads[0].frames[1].fingerprint_hashed)
+
+ self.assertEqual(trace.threads[0].frames[2].address, 2)
+ self.assertEqual(trace.threads[0].frames[2].build_id, None)
+ self.assertEqual(trace.threads[0].frames[2].build_id_offset, 18446744073709551615L) # !!!
+ self.assertEqual(trace.threads[0].frames[2].function_name, None)
+ self.assertEqual(trace.threads[0].frames[2].file_name, None)
+ self.assertEqual(trace.threads[0].frames[2].fingerprint, 'a b c d')
+ self.assertFalse(trace.threads[0].frames[2].fingerprint_hashed)
+
+ self.assertEqual(trace.threads[1].frames[0].address, 1)
+ self.assertEqual(trace.threads[1].frames[0].build_id, 'b')
+ self.assertEqual(trace.threads[1].frames[0].build_id_offset, 5)
+ self.assertEqual(trace.threads[1].frames[0].function_name, None)
+ self.assertEqual(trace.threads[1].frames[0].file_name, None)
+ self.assertEqual(trace.threads[1].frames[0].fingerprint, None)
+ self.assertTrue(trace.threads[1].frames[0].fingerprint_hashed)
+
class TestCoreThread(BindingsTestCase):
def setUp(self):
self.thread = satyr.CoreStacktrace(contents).threads[0]
diff --git a/tests/python/java.py b/tests/python/java.py
index 6a9a227..175273a 100755
--- a/tests/python/java.py
+++ b/tests/python/java.py
@@ -52,6 +52,86 @@ class TestJavaStacktrace(BindingsTestCase):
def test_bthash(self):
self.assertEqual(self.trace.get_bthash(), '184370433901aa9f14bfc85c29576e24ebca2c2e')
+ def test_from_json(self):
+ trace = satyr.JavaStacktrace.from_json('{}')
+ self.assertEqual(trace.threads, [])
+
+ json_text = '''
+ {
+ "threads": [
+ {
+ "name": "ProbablySomeThreadOrSomethingImpl",
+ "frames": [
+ {
+ "name": "julia",
+ "file_name": "/u/b/f",
+ "file_line": 9000,
+ "class_path": "i don't know",
+ "is_native": false,
+ "is_exception": false,
+ "message": "Hi!"
+ },
+ {},
+ {
+ "name": "helen",
+ "is_exception": true
+ }
+ ],
+ "what is": "this",
+ },
+ {
+ "name": "TheOtherThread",
+ "frames": [
+ {
+ "name": "tiffany",
+ "file_name": "blahz",
+ "is_native": true,
+ }
+ ]
+ }
+ ]
+ }
+'''
+ trace = satyr.JavaStacktrace.from_json(json_text)
+ self.assertEqual(len(trace.threads), 2)
+ self.assertEqual(len(trace.threads[0].frames), 3)
+ self.assertEqual(len(trace.threads[1].frames), 1)
+
+ self.assertEqual(trace.threads[0].name, 'ProbablySomeThreadOrSomethingImpl')
+ self.assertEqual(trace.threads[1].name, 'TheOtherThread')
+
+ self.assertEqual(trace.threads[0].frames[0].name, 'julia')
+ self.assertEqual(trace.threads[0].frames[0].file_name, '/u/b/f')
+ self.assertEqual(trace.threads[0].frames[0].file_line, 9000)
+ self.assertEqual(trace.threads[0].frames[0].class_path, 'i don\'t know')
+ self.assertFalse(trace.threads[0].frames[0].is_native)
+ self.assertFalse(trace.threads[0].frames[0].is_exception)
+ self.assertEqual(trace.threads[0].frames[0].message, 'Hi!')
+
+ self.assertEqual(trace.threads[0].frames[1].name, None)
+ self.assertEqual(trace.threads[0].frames[1].file_name, None)
+ self.assertEqual(trace.threads[0].frames[1].file_line, 0)
+ self.assertEqual(trace.threads[0].frames[1].class_path, None)
+ self.assertFalse(trace.threads[0].frames[1].is_native)
+ self.assertFalse(trace.threads[0].frames[1].is_exception)
+ self.assertEqual(trace.threads[0].frames[1].message, None)
+
+ self.assertEqual(trace.threads[0].frames[2].name, 'helen')
+ self.assertEqual(trace.threads[0].frames[2].file_name, None)
+ self.assertEqual(trace.threads[0].frames[2].file_line, 0)
+ self.assertEqual(trace.threads[0].frames[2].class_path, None)
+ self.assertFalse(trace.threads[0].frames[2].is_native)
+ self.assertTrue(trace.threads[0].frames[2].is_exception)
+ self.assertEqual(trace.threads[0].frames[2].message, None)
+
+ self.assertEqual(trace.threads[1].frames[0].name, 'tiffany')
+ self.assertEqual(trace.threads[1].frames[0].file_name, 'blahz')
+ self.assertEqual(trace.threads[1].frames[0].file_line, 0)
+ self.assertEqual(trace.threads[1].frames[0].class_path, None)
+ self.assertTrue(trace.threads[1].frames[0].is_native)
+ self.assertFalse(trace.threads[1].frames[0].is_exception)
+ self.assertEqual(trace.threads[1].frames[0].message, None)
+
class TestJavaThread(BindingsTestCase):
def setUp(self):
self.thread = satyr.JavaStacktrace(contents).threads[0]
diff --git a/tests/python/koops.py b/tests/python/koops.py
index 260cb6e..7609a98 100755
--- a/tests/python/koops.py
+++ b/tests/python/koops.py
@@ -73,6 +73,86 @@ class TestKerneloops(BindingsTestCase):
def test_crash_thread(self):
self.assertTrue(self.koops.crash_thread is self.koops)
+ def test_from_json(self):
+ trace = satyr.Kerneloops.from_json('{}')
+ self.assertEqual(trace.frames, [])
+
+ json_text = '''
+ {
+ "version": "3.11.666",
+ "taint_flags": ["warning", "died_recently"],
+ "modules": ["not", "much", "modules", "loaded"],
+ "frames": [
+ {
+ "address": 28,
+ "reliable": true,
+ "function_name": "f",
+ "function_offset": 5,
+ "function_length": 6,
+ "module_name": "modularmodule",
+ "from_address": 27,
+ "from_function_name": "h",
+ "from_function_offset": 3,
+ "from_function_length": 9,
+ "from_module_name": "nonmodularmodule",
+ "byl": "jsem tady"
+ },
+ {
+ },
+ {
+ "address": 23,
+ "reliable": false,
+ "function_name": "g",
+ "module_name": "much",
+ }
+ ]
+ }
+'''
+ trace = satyr.Kerneloops.from_json(json_text)
+ print dir(trace)
+ self.assertEqual(trace.version, '3.11.666')
+ self.assertTrue(trace.taint_flags['warning'])
+ self.assertTrue(trace.taint_flags['died_recently'])
+ self.assertFalse(trace.taint_flags['module_out_of_tree'])
+ self.assertEqual(trace.modules, ['not', 'much', 'modules', 'loaded'])
+ self.assertEqual(len(trace.frames), 3)
+
+ self.assertEqual(trace.frames[0].address, 28)
+ self.assertTrue(trace.frames[0].reliable)
+ self.assertEqual(trace.frames[0].function_name, 'f')
+ self.assertEqual(trace.frames[0].function_offset, 5)
+ self.assertEqual(trace.frames[0].function_length, 6)
+ self.assertEqual(trace.frames[0].module_name, 'modularmodule')
+ self.assertEqual(trace.frames[0].from_address, 27)
+ self.assertEqual(trace.frames[0].from_function_name, 'h')
+ self.assertEqual(trace.frames[0].from_function_offset, 3)
+ self.assertEqual(trace.frames[0].from_function_length, 9)
+ self.assertEqual(trace.frames[0].from_module_name, 'nonmodularmodule')
+
+ self.assertEqual(trace.frames[1].address, 0)
+ self.assertFalse(trace.frames[1].reliable)
+ self.assertEqual(trace.frames[1].function_name, None)
+ self.assertEqual(trace.frames[1].function_offset, 0)
+ self.assertEqual(trace.frames[1].function_length, 0)
+ self.assertEqual(trace.frames[1].module_name, None)
+ self.assertEqual(trace.frames[1].from_address, 0)
+ self.assertEqual(trace.frames[1].from_function_name, None)
+ self.assertEqual(trace.frames[1].from_function_offset, 0)
+ self.assertEqual(trace.frames[1].from_function_length, 0)
+ self.assertEqual(trace.frames[1].from_module_name, None)
+
+ self.assertEqual(trace.frames[2].address, 23)
+ self.assertFalse(trace.frames[2].reliable)
+ self.assertEqual(trace.frames[2].function_name, 'g')
+ self.assertEqual(trace.frames[2].function_offset, 0)
+ self.assertEqual(trace.frames[2].function_length, 0)
+ self.assertEqual(trace.frames[2].module_name, 'much')
+ self.assertEqual(trace.frames[2].from_address, 0)
+ self.assertEqual(trace.frames[2].from_function_name, None)
+ self.assertEqual(trace.frames[2].from_function_offset, 0)
+ self.assertEqual(trace.frames[2].from_function_length, 0)
+ self.assertEqual(trace.frames[2].from_module_name, None)
+
class TestKoopsFrame(BindingsTestCase):
def setUp(self):
self.frame = satyr.Kerneloops(contents).frames[0]
diff --git a/tests/python/python.py b/tests/python/python.py
index 13c3bd7..a20d3b3 100755
--- a/tests/python/python.py
+++ b/tests/python/python.py
@@ -90,6 +90,56 @@ class TestPythonStacktrace(BindingsTestCase):
def test_crash_thread(self):
self.assertTrue(self.trace.crash_thread is self.trace)
+ def test_from_json(self):
+ trace = satyr.PythonStacktrace.from_json('{}')
+ self.assertEqual(trace.frames, [])
+
+ json_text = '''
+ {
+ "exception_name": "NotImplementedError",
+ "stacktrace": [
+ {
+ "file_name": "/usr/share/foobar/mod/file.py",
+ "function_name": "do_nothing",
+ "file_line": 42,
+ "line_contents": "#this does nothing"
+ },
+ {
+ "special_file": "stdin",
+ "special_function": "module",
+ "file_line": 451
+ },
+ {
+ "unknown_key": 19876543
+ }
+ ]
+ }
+'''
+ trace = satyr.PythonStacktrace.from_json(json_text)
+ self.assertEqual(trace.exception_name, 'NotImplementedError')
+ self.assertEqual(len(trace.frames), 3)
+
+ self.assertEqual(trace.frames[0].file_name, '/usr/share/foobar/mod/file.py')
+ self.assertEqual(trace.frames[0].function_name, 'do_nothing')
+ self.assertEqual(trace.frames[0].file_line, 42)
+ self.assertEqual(trace.frames[0].line_contents, '#this does nothing')
+ self.assertFalse(trace.frames[0].special_file)
+ self.assertFalse(trace.frames[0].special_function)
+
+ self.assertEqual(trace.frames[1].file_name, 'stdin')
+ self.assertEqual(trace.frames[1].function_name, 'module')
+ self.assertEqual(trace.frames[1].file_line, 451)
+ self.assertEqual(trace.frames[1].line_contents, None)
+ self.assertTrue(trace.frames[1].special_file)
+ self.assertTrue(trace.frames[1].special_function)
+
+ self.assertEqual(trace.frames[2].file_name, None)
+ self.assertEqual(trace.frames[2].function_name, None)
+ self.assertEqual(trace.frames[2].file_line, 0)
+ self.assertEqual(trace.frames[2].line_contents, None)
+ self.assertFalse(trace.frames[2].special_file)
+ self.assertFalse(trace.frames[2].special_function)
+
class TestPythonFrame(BindingsTestCase):
def setUp(self):
self.frame = satyr.PythonStacktrace(contents).frames[-1]
--
1.8.3.1
More information about the Crash-catcher
mailing list