167f94e5aSSiger Yang_T = require('lua_lldb_test').create_test('TestComprehensive') 267f94e5aSSiger Yang 367f94e5aSSiger Yangfunction _T:Test0_CreateTarget() 467f94e5aSSiger Yang self.target = self:create_target() 567f94e5aSSiger Yang assertTrue(self.target:IsValid()) 667f94e5aSSiger Yangend 767f94e5aSSiger Yang 867f94e5aSSiger Yangfunction _T:Test1_Breakpoint() 967f94e5aSSiger Yang self.main_bp = self.target:BreakpointCreateByName('main', 'a.out') 1067f94e5aSSiger Yang self.loop_bp = self.target:BreakpointCreateByLocation('main.c', 28) 1167f94e5aSSiger Yang assertTrue(self.main_bp:IsValid() and self.main_bp:GetNumLocations() == 1) 1267f94e5aSSiger Yang assertTrue(self.loop_bp:IsValid() and self.loop_bp:GetNumLocations() == 1) 1367f94e5aSSiger Yangend 1467f94e5aSSiger Yang 1567f94e5aSSiger Yangfunction _T:Test2_Launch() 1667f94e5aSSiger Yang local error = lldb.SBError() 1767f94e5aSSiger Yang self.args = { 'arg' } 1867f94e5aSSiger Yang self.process = self.target:Launch( 1967f94e5aSSiger Yang self.debugger:GetListener(), 2067f94e5aSSiger Yang self.args, 2167f94e5aSSiger Yang nil, 2267f94e5aSSiger Yang nil, 2367f94e5aSSiger Yang self.output, 2467f94e5aSSiger Yang nil, 2567f94e5aSSiger Yang nil, 2667f94e5aSSiger Yang 0, 2767f94e5aSSiger Yang false, 2867f94e5aSSiger Yang error 2967f94e5aSSiger Yang ) 3067f94e5aSSiger Yang assertTrue(error:Success()) 3167f94e5aSSiger Yang assertTrue(self.process:IsValid()) 3267f94e5aSSiger Yangend 3367f94e5aSSiger Yang 3467f94e5aSSiger Yangfunction _T:Test3_BreakpointFindVariables() 3567f94e5aSSiger Yang -- checking "argc" value 3667f94e5aSSiger Yang local thread = get_stopped_thread(self.process, lldb.eStopReasonBreakpoint) 3767f94e5aSSiger Yang assertNotNil(thread) 3867f94e5aSSiger Yang assertTrue(thread:IsValid()) 3967f94e5aSSiger Yang local frame = thread:GetFrameAtIndex(0) 4067f94e5aSSiger Yang assertTrue(frame:IsValid()) 4167f94e5aSSiger Yang local error = lldb.SBError() 4267f94e5aSSiger Yang local var_argc = frame:FindVariable('argc') 4367f94e5aSSiger Yang assertTrue(var_argc:IsValid()) 4467f94e5aSSiger Yang local var_argc_value = var_argc:GetValueAsSigned(error, 0) 4567f94e5aSSiger Yang assertTrue(error:Success()) 46*80fcecb1SJonas Devlieghere assertEqual(var_argc_value, 2) 4767f94e5aSSiger Yang 4867f94e5aSSiger Yang -- checking "inited" value 4967f94e5aSSiger Yang local continue = self.process:Continue() 5067f94e5aSSiger Yang assertTrue(continue:Success()) 5167f94e5aSSiger Yang thread = get_stopped_thread(self.process, lldb.eStopReasonBreakpoint) 5267f94e5aSSiger Yang assertNotNil(thread) 5367f94e5aSSiger Yang assertTrue(thread:IsValid()) 5467f94e5aSSiger Yang frame = thread:GetFrameAtIndex(0) 5567f94e5aSSiger Yang assertTrue(frame:IsValid()) 5667f94e5aSSiger Yang error = lldb.SBError() 5767f94e5aSSiger Yang local var_inited = frame:FindVariable('inited') 5867f94e5aSSiger Yang assertTrue(var_inited:IsValid()) 5967f94e5aSSiger Yang self.var_inited = var_inited 6067f94e5aSSiger Yang local var_inited_value = var_inited:GetValueAsUnsigned(error, 0) 6167f94e5aSSiger Yang assertTrue(error:Success()) 62*80fcecb1SJonas Devlieghere assertEqual(var_inited_value, 0xDEADBEEF) 6367f94e5aSSiger Yangend 6467f94e5aSSiger Yang 6567f94e5aSSiger Yangfunction _T:Test3_RawData() 6667f94e5aSSiger Yang local error = lldb.SBError() 6767f94e5aSSiger Yang local address = self.var_inited:GetAddress() 6867f94e5aSSiger Yang assertTrue(address:IsValid()) 6967f94e5aSSiger Yang local size = self.var_inited:GetByteSize() 7067f94e5aSSiger Yang local raw_data = self.process:ReadMemory(address:GetOffset(), size, error) 7167f94e5aSSiger Yang assertTrue(error:Success()) 7267f94e5aSSiger Yang local data_le = lldb.SBData.CreateDataFromUInt32Array(lldb.eByteOrderLittle, 1, {0xDEADBEEF}) 7367f94e5aSSiger Yang local data_be = lldb.SBData.CreateDataFromUInt32Array(lldb.eByteOrderBig, 1, {0xDEADBEEF}) 7467f94e5aSSiger Yang assertTrue(data_le:GetUnsignedInt32(error, 0) == 0xDEADBEEF or data_be:GetUnsignedInt32(error, 0) == 0xDEADBEEF) 7567f94e5aSSiger Yang assertTrue(raw_data == "\xEF\xBE\xAD\xDE" or raw_data == "\xDE\xAD\xBE\xEF") 7667f94e5aSSiger Yangend 7767f94e5aSSiger Yang 7867f94e5aSSiger Yangfunction _T:Test4_ProcessExit() 7967f94e5aSSiger Yang self.loop_bp:SetAutoContinue(true) 8067f94e5aSSiger Yang local continue = self.process:Continue() 8167f94e5aSSiger Yang assertTrue(continue:Success()) 8267f94e5aSSiger Yang assertTrue(self.process:GetExitStatus() == 0) 8367f94e5aSSiger Yangend 8467f94e5aSSiger Yang 8567f94e5aSSiger Yangfunction _T:Test5_FileOutput() 8667f94e5aSSiger Yang local f = io.open(self.output, 'r') 87*80fcecb1SJonas Devlieghere assertEqual( 8867f94e5aSSiger Yang read_file_non_empty_lines(f), 8967f94e5aSSiger Yang { 9067f94e5aSSiger Yang self.exe, 9167f94e5aSSiger Yang table.unpack(self.args), 9267f94e5aSSiger Yang 'I am a function.', 9367f94e5aSSiger Yang 'sum = 5050' 9467f94e5aSSiger Yang } 9567f94e5aSSiger Yang ) 9667f94e5aSSiger Yang f:close() 9767f94e5aSSiger Yangend 9867f94e5aSSiger Yang 9967f94e5aSSiger Yangos.exit(_T:run()) 100