[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