#                                                                 -*- python -*-
# RUN: cd %S/../../../../../examples/python && cat %s | %lldb 2>&1 > %t.out
# RUN: cat %t.out | FileCheck %S/Inputs/Assertion.check
script
import crashlog
import json

parser = crashlog.JSONCrashLogParser("", "", False)

process_info_json = json.loads('{"pid" : 287, "procName" : "mediaserverd", "procPath" : "\/usr\/sbin\/mediaserverd"}')
parser.parse_process_info(process_info_json)

assert parser.crashlog.process_id == 287
assert parser.crashlog.process_identifier == "mediaserverd"
assert parser.crashlog.process_path == "/usr/sbin/mediaserverd"

crash_reason_json = json.loads('{"type" : "EXC_BAD_ACCESS", "signal" : "SIGSEGV", "subtype" : "KERN_INVALID_ADDRESS"}')
assert parser.parse_crash_reason(crash_reason_json) == "EXC_BAD_ACCESS (SIGSEGV) (KERN_INVALID_ADDRESS)"

crash_reason_json = json.loads('{"type" : "EXC_BAD_ACCESS", "signal" : "SIGSEGV"}')
assert parser.parse_crash_reason(crash_reason_json) == "EXC_BAD_ACCESS (SIGSEGV)"

crash_reason_json = json.loads('{"type" : "EXC_BAD_ACCESS", "signal" : "SIGSEGV", "codes" : "0x0000000000000000, 0x0000000000000000"}')
assert parser.parse_crash_reason(crash_reason_json) == "EXC_BAD_ACCESS (SIGSEGV) (0x0000000000000000, 0x0000000000000000)"

thread_state_json = json.loads('{"x":[268451845,117442566],"lr":7309751904,"cpsr":1073741824,"fp":6093236784,"sp":6093236704,"esr":1442840704,"pc":7309755088}')
registers = parser.parse_thread_registers(thread_state_json)
assert registers['x0'] == 268451845
assert registers['x1'] == 117442566
assert registers['lr'] == 7309751904
assert registers['cpsr'] ==1073741824
assert registers['fp'] == 6093236784
assert registers['sp'] == 6093236704
assert registers['esr'] == 1442840704
assert registers['pc'] == 7309755088

parser.data = json.loads('{"usedImages":[["f4d85377-f215-3da3-921e-3fe870e622e9",7309737984,"P"]],"legacyInfo":{"imageExtraInfo":[{"size":204800,"arch":"arm64e","path":"/usr/lib/system/libsystem_kernel.dylib","name":"libsystem_kernel.dylib"}]}}')
thread_json = json.loads('[{"triggered":true,"id":3835,"queue":"com.apple.bwgraph.devicevendor","frames":[[0,101472],[0,408892]]}]')
parser.parse_threads(thread_json)
assert len(parser.crashlog.threads) == 1
assert parser.crashlog.threads[0].queue == "com.apple.bwgraph.devicevendor"
assert len(parser.crashlog.threads[0].frames) == 2
assert parser.crashlog.threads[0].frames[0].pc == 7309839456
assert parser.crashlog.threads[0].frames[0].description == 101472
exit()
