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