| _T = require('lua_lldb_test').create_test('TestComprehensive') | |
| function _T:Test0_CreateTarget() | |
| self.target = self:create_target() | |
| assertTrue(self.target:IsValid()) | |
| end | |
| function _T:Test1_Breakpoint() | |
| self.main_bp = self.target:BreakpointCreateByName('main', 'a.out') | |
| self.loop_bp = self.target:BreakpointCreateByLocation('main.c', 28) | |
| assertTrue(self.main_bp:IsValid() and self.main_bp:GetNumLocations() == 1) | |
| assertTrue(self.loop_bp:IsValid() and self.loop_bp:GetNumLocations() == 1) | |
| end | |
| function _T:Test2_Launch() | |
| local error = lldb.SBError() | |
| self.args = { 'arg' } | |
| self.process = self.target:Launch( | |
| self.debugger:GetListener(), | |
| self.args, | |
| nil, | |
| nil, | |
| self.output, | |
| nil, | |
| nil, | |
| 0, | |
| false, | |
| error | |
| ) | |
| assertTrue(error:Success()) | |
| assertTrue(self.process:IsValid()) | |
| end | |
| function _T:Test3_BreakpointFindVariables() | |
| -- checking "argc" value | |
| local thread = get_stopped_thread(self.process, lldb.eStopReasonBreakpoint) | |
| assertNotNil(thread) | |
| assertTrue(thread:IsValid()) | |
| local frame = thread:GetFrameAtIndex(0) | |
| assertTrue(frame:IsValid()) | |
| local error = lldb.SBError() | |
| local var_argc = frame:FindVariable('argc') | |
| assertTrue(var_argc:IsValid()) | |
| local var_argc_value = var_argc:GetValueAsSigned(error, 0) | |
| assertTrue(error:Success()) | |
| assertEqual(var_argc_value, 2) | |
| -- checking "inited" value | |
| local continue = self.process:Continue() | |
| assertTrue(continue:Success()) | |
| thread = get_stopped_thread(self.process, lldb.eStopReasonBreakpoint) | |
| assertNotNil(thread) | |
| assertTrue(thread:IsValid()) | |
| frame = thread:GetFrameAtIndex(0) | |
| assertTrue(frame:IsValid()) | |
| error = lldb.SBError() | |
| local var_inited = frame:FindVariable('inited') | |
| assertTrue(var_inited:IsValid()) | |
| self.var_inited = var_inited | |
| local var_inited_value = var_inited:GetValueAsUnsigned(error, 0) | |
| assertTrue(error:Success()) | |
| assertEqual(var_inited_value, 0xDEADBEEF) | |
| end | |
| function _T:Test3_RawData() | |
| local error = lldb.SBError() | |
| local address = self.var_inited:GetAddress() | |
| assertTrue(address:IsValid()) | |
| local size = self.var_inited:GetByteSize() | |
| local raw_data = self.process:ReadMemory(address:GetOffset(), size, error) | |
| assertTrue(error:Success()) | |
| local data_le = lldb.SBData.CreateDataFromUInt32Array(lldb.eByteOrderLittle, 1, {0xDEADBEEF}) | |
| local data_be = lldb.SBData.CreateDataFromUInt32Array(lldb.eByteOrderBig, 1, {0xDEADBEEF}) | |
| assertTrue(data_le:GetUnsignedInt32(error, 0) == 0xDEADBEEF or data_be:GetUnsignedInt32(error, 0) == 0xDEADBEEF) | |
| assertTrue(raw_data == "\xEF\xBE\xAD\xDE" or raw_data == "\xDE\xAD\xBE\xEF") | |
| end | |
| function _T:Test4_ProcessExit() | |
| self.loop_bp:SetAutoContinue(true) | |
| local continue = self.process:Continue() | |
| assertTrue(continue:Success()) | |
| assertTrue(self.process:GetExitStatus() == 0) | |
| end | |
| function _T:Test5_FileOutput() | |
| local f = io.open(self.output, 'r') | |
| assertEqual( | |
| read_file_non_empty_lines(f), | |
| { | |
| self.exe, | |
| table.unpack(self.args), | |
| 'I am a function.', | |
| 'sum = 5050' | |
| } | |
| ) | |
| f:close() | |
| end | |
| os.exit(_T:run()) |