1*67f94e5aSSiger Yang_T = require('lua_lldb_test').create_test('TestComprehensive') 2*67f94e5aSSiger Yang 3*67f94e5aSSiger Yangfunction _T:Test0_CreateTarget() 4*67f94e5aSSiger Yang self.target = self:create_target() 5*67f94e5aSSiger Yang assertTrue(self.target:IsValid()) 6*67f94e5aSSiger Yangend 7*67f94e5aSSiger Yang 8*67f94e5aSSiger Yangfunction _T:Test1_Breakpoint() 9*67f94e5aSSiger Yang self.main_bp = self.target:BreakpointCreateByName('main', 'a.out') 10*67f94e5aSSiger Yang self.loop_bp = self.target:BreakpointCreateByLocation('main.c', 28) 11*67f94e5aSSiger Yang assertTrue(self.main_bp:IsValid() and self.main_bp:GetNumLocations() == 1) 12*67f94e5aSSiger Yang assertTrue(self.loop_bp:IsValid() and self.loop_bp:GetNumLocations() == 1) 13*67f94e5aSSiger Yangend 14*67f94e5aSSiger Yang 15*67f94e5aSSiger Yangfunction _T:Test2_Launch() 16*67f94e5aSSiger Yang local error = lldb.SBError() 17*67f94e5aSSiger Yang self.args = { 'arg' } 18*67f94e5aSSiger Yang self.process = self.target:Launch( 19*67f94e5aSSiger Yang self.debugger:GetListener(), 20*67f94e5aSSiger Yang self.args, 21*67f94e5aSSiger Yang nil, 22*67f94e5aSSiger Yang nil, 23*67f94e5aSSiger Yang self.output, 24*67f94e5aSSiger Yang nil, 25*67f94e5aSSiger Yang nil, 26*67f94e5aSSiger Yang 0, 27*67f94e5aSSiger Yang false, 28*67f94e5aSSiger Yang error 29*67f94e5aSSiger Yang ) 30*67f94e5aSSiger Yang assertTrue(error:Success()) 31*67f94e5aSSiger Yang assertTrue(self.process:IsValid()) 32*67f94e5aSSiger Yangend 33*67f94e5aSSiger Yang 34*67f94e5aSSiger Yangfunction _T:Test3_BreakpointFindVariables() 35*67f94e5aSSiger Yang -- checking "argc" value 36*67f94e5aSSiger Yang local thread = get_stopped_thread(self.process, lldb.eStopReasonBreakpoint) 37*67f94e5aSSiger Yang assertNotNil(thread) 38*67f94e5aSSiger Yang assertTrue(thread:IsValid()) 39*67f94e5aSSiger Yang local frame = thread:GetFrameAtIndex(0) 40*67f94e5aSSiger Yang assertTrue(frame:IsValid()) 41*67f94e5aSSiger Yang local error = lldb.SBError() 42*67f94e5aSSiger Yang local var_argc = frame:FindVariable('argc') 43*67f94e5aSSiger Yang assertTrue(var_argc:IsValid()) 44*67f94e5aSSiger Yang local var_argc_value = var_argc:GetValueAsSigned(error, 0) 45*67f94e5aSSiger Yang assertTrue(error:Success()) 46*67f94e5aSSiger Yang assertEquals(var_argc_value, 2) 47*67f94e5aSSiger Yang 48*67f94e5aSSiger Yang -- checking "inited" value 49*67f94e5aSSiger Yang local continue = self.process:Continue() 50*67f94e5aSSiger Yang assertTrue(continue:Success()) 51*67f94e5aSSiger Yang thread = get_stopped_thread(self.process, lldb.eStopReasonBreakpoint) 52*67f94e5aSSiger Yang assertNotNil(thread) 53*67f94e5aSSiger Yang assertTrue(thread:IsValid()) 54*67f94e5aSSiger Yang frame = thread:GetFrameAtIndex(0) 55*67f94e5aSSiger Yang assertTrue(frame:IsValid()) 56*67f94e5aSSiger Yang error = lldb.SBError() 57*67f94e5aSSiger Yang local var_inited = frame:FindVariable('inited') 58*67f94e5aSSiger Yang assertTrue(var_inited:IsValid()) 59*67f94e5aSSiger Yang self.var_inited = var_inited 60*67f94e5aSSiger Yang local var_inited_value = var_inited:GetValueAsUnsigned(error, 0) 61*67f94e5aSSiger Yang assertTrue(error:Success()) 62*67f94e5aSSiger Yang assertEquals(var_inited_value, 0xDEADBEEF) 63*67f94e5aSSiger Yangend 64*67f94e5aSSiger Yang 65*67f94e5aSSiger Yangfunction _T:Test3_RawData() 66*67f94e5aSSiger Yang local error = lldb.SBError() 67*67f94e5aSSiger Yang local address = self.var_inited:GetAddress() 68*67f94e5aSSiger Yang assertTrue(address:IsValid()) 69*67f94e5aSSiger Yang local size = self.var_inited:GetByteSize() 70*67f94e5aSSiger Yang local raw_data = self.process:ReadMemory(address:GetOffset(), size, error) 71*67f94e5aSSiger Yang assertTrue(error:Success()) 72*67f94e5aSSiger Yang local data_le = lldb.SBData.CreateDataFromUInt32Array(lldb.eByteOrderLittle, 1, {0xDEADBEEF}) 73*67f94e5aSSiger Yang local data_be = lldb.SBData.CreateDataFromUInt32Array(lldb.eByteOrderBig, 1, {0xDEADBEEF}) 74*67f94e5aSSiger Yang assertTrue(data_le:GetUnsignedInt32(error, 0) == 0xDEADBEEF or data_be:GetUnsignedInt32(error, 0) == 0xDEADBEEF) 75*67f94e5aSSiger Yang assertTrue(raw_data == "\xEF\xBE\xAD\xDE" or raw_data == "\xDE\xAD\xBE\xEF") 76*67f94e5aSSiger Yangend 77*67f94e5aSSiger Yang 78*67f94e5aSSiger Yangfunction _T:Test4_ProcessExit() 79*67f94e5aSSiger Yang self.loop_bp:SetAutoContinue(true) 80*67f94e5aSSiger Yang local continue = self.process:Continue() 81*67f94e5aSSiger Yang assertTrue(continue:Success()) 82*67f94e5aSSiger Yang assertTrue(self.process:GetExitStatus() == 0) 83*67f94e5aSSiger Yangend 84*67f94e5aSSiger Yang 85*67f94e5aSSiger Yangfunction _T:Test5_FileOutput() 86*67f94e5aSSiger Yang local f = io.open(self.output, 'r') 87*67f94e5aSSiger Yang assertEquals( 88*67f94e5aSSiger Yang read_file_non_empty_lines(f), 89*67f94e5aSSiger Yang { 90*67f94e5aSSiger Yang self.exe, 91*67f94e5aSSiger Yang table.unpack(self.args), 92*67f94e5aSSiger Yang 'I am a function.', 93*67f94e5aSSiger Yang 'sum = 5050' 94*67f94e5aSSiger Yang } 95*67f94e5aSSiger Yang ) 96*67f94e5aSSiger Yang f:close() 97*67f94e5aSSiger Yangend 98*67f94e5aSSiger Yang 99*67f94e5aSSiger Yangos.exit(_T:run()) 100