1*99451b44SJordan Rupprecht"""Test the SBData APIs."""
2*99451b44SJordan Rupprecht
3*99451b44SJordan Rupprecht
4*99451b44SJordan Rupprecht
5*99451b44SJordan Rupprechtfrom math import fabs
6*99451b44SJordan Rupprechtimport lldb
7*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
8*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
9*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
10*99451b44SJordan Rupprecht
11*99451b44SJordan Rupprecht
12*99451b44SJordan Rupprechtclass SBDataAPICase(TestBase):
13*99451b44SJordan Rupprecht
14*99451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
15*99451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
16*99451b44SJordan Rupprecht
17*99451b44SJordan Rupprecht    def setUp(self):
18*99451b44SJordan Rupprecht        # Call super's setUp().
19*99451b44SJordan Rupprecht        TestBase.setUp(self)
20*99451b44SJordan Rupprecht        # Find the line number to break on inside main.cpp.
21*99451b44SJordan Rupprecht        self.line = line_number('main.cpp', '// set breakpoint here')
22*99451b44SJordan Rupprecht
23*99451b44SJordan Rupprecht    @add_test_categories(['pyapi'])
24*99451b44SJordan Rupprecht    def test_byte_order_and_address_byte_size(self):
25*99451b44SJordan Rupprecht        """Test the SBData::SetData() to ensure the byte order and address
26*99451b44SJordan Rupprecht        byte size are obeyed"""
27*99451b44SJordan Rupprecht        addr_data = b'\x11\x22\x33\x44\x55\x66\x77\x88'
28*99451b44SJordan Rupprecht        error = lldb.SBError()
29*99451b44SJordan Rupprecht        data = lldb.SBData()
30*99451b44SJordan Rupprecht        data.SetData(error, addr_data, lldb.eByteOrderBig, 4)
31*99451b44SJordan Rupprecht        addr = data.GetAddress(error, 0)
32*99451b44SJordan Rupprecht        self.assertTrue(addr == 0x11223344);
33*99451b44SJordan Rupprecht        data.SetData(error, addr_data, lldb.eByteOrderBig, 8)
34*99451b44SJordan Rupprecht        addr = data.GetAddress(error, 0)
35*99451b44SJordan Rupprecht        self.assertTrue(addr == 0x1122334455667788);
36*99451b44SJordan Rupprecht        data.SetData(error, addr_data, lldb.eByteOrderLittle, 4)
37*99451b44SJordan Rupprecht        addr = data.GetAddress(error, 0)
38*99451b44SJordan Rupprecht        self.assertTrue(addr == 0x44332211);
39*99451b44SJordan Rupprecht        data.SetData(error, addr_data, lldb.eByteOrderLittle, 8)
40*99451b44SJordan Rupprecht        addr = data.GetAddress(error, 0)
41*99451b44SJordan Rupprecht        self.assertTrue(addr == 0x8877665544332211);
42*99451b44SJordan Rupprecht
43*99451b44SJordan Rupprecht    @add_test_categories(['pyapi'])
44*99451b44SJordan Rupprecht    def test_with_run_command(self):
45*99451b44SJordan Rupprecht        """Test the SBData APIs."""
46*99451b44SJordan Rupprecht        self.build()
47*99451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
48*99451b44SJordan Rupprecht
49*99451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
50*99451b44SJordan Rupprecht            self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)
51*99451b44SJordan Rupprecht
52*99451b44SJordan Rupprecht        self.runCmd("run", RUN_SUCCEEDED)
53*99451b44SJordan Rupprecht
54*99451b44SJordan Rupprecht        # The stop reason of the thread should be breakpoint.
55*99451b44SJordan Rupprecht        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
56*99451b44SJordan Rupprecht                    substrs=['stopped',
57*99451b44SJordan Rupprecht                             'stop reason = breakpoint'])
58*99451b44SJordan Rupprecht
59*99451b44SJordan Rupprecht        target = self.dbg.GetSelectedTarget()
60*99451b44SJordan Rupprecht
61*99451b44SJordan Rupprecht        process = target.GetProcess()
62*99451b44SJordan Rupprecht
63*99451b44SJordan Rupprecht        thread = lldbutil.get_stopped_thread(
64*99451b44SJordan Rupprecht            process, lldb.eStopReasonBreakpoint)
65*99451b44SJordan Rupprecht        self.assertIsNotNone(thread)
66*99451b44SJordan Rupprecht
67*99451b44SJordan Rupprecht        frame = thread.GetSelectedFrame()
68*99451b44SJordan Rupprecht        foobar = frame.FindVariable('foobar')
69*99451b44SJordan Rupprecht        self.assertTrue(foobar.IsValid())
70*99451b44SJordan Rupprecht        data = foobar.GetPointeeData(0, 2)
71*99451b44SJordan Rupprecht        offset = 0
72*99451b44SJordan Rupprecht        error = lldb.SBError()
73*99451b44SJordan Rupprecht
74*99451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 1)
75*99451b44SJordan Rupprecht        offset += 4
76*99451b44SJordan Rupprecht        low = data.GetSignedInt16(error, offset)
77*99451b44SJordan Rupprecht        self.assertTrue(error.Success())
78*99451b44SJordan Rupprecht        offset += 2
79*99451b44SJordan Rupprecht        high = data.GetSignedInt16(error, offset)
80*99451b44SJordan Rupprecht        self.assertTrue(error.Success())
81*99451b44SJordan Rupprecht        offset += 2
82*99451b44SJordan Rupprecht        self.assertTrue(
83*99451b44SJordan Rupprecht            (low == 9 and high == 0) or (
84*99451b44SJordan Rupprecht                low == 0 and high == 9),
85*99451b44SJordan Rupprecht            'foo[0].b == 9')
86*99451b44SJordan Rupprecht        self.assertTrue(
87*99451b44SJordan Rupprecht            fabs(
88*99451b44SJordan Rupprecht                data.GetFloat(
89*99451b44SJordan Rupprecht                    error,
90*99451b44SJordan Rupprecht                    offset) -
91*99451b44SJordan Rupprecht                3.14) < 1,
92*99451b44SJordan Rupprecht            'foo[0].c == 3.14')
93*99451b44SJordan Rupprecht        self.assertTrue(error.Success())
94*99451b44SJordan Rupprecht        offset += 4
95*99451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 8)
96*99451b44SJordan Rupprecht        offset += 4
97*99451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 5)
98*99451b44SJordan Rupprecht        offset += 4
99*99451b44SJordan Rupprecht
100*99451b44SJordan Rupprecht        self.runCmd("n")
101*99451b44SJordan Rupprecht
102*99451b44SJordan Rupprecht        offset = 16
103*99451b44SJordan Rupprecht
104*99451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 5)
105*99451b44SJordan Rupprecht
106*99451b44SJordan Rupprecht        data = foobar.GetPointeeData(1, 1)
107*99451b44SJordan Rupprecht
108*99451b44SJordan Rupprecht        offset = 0
109*99451b44SJordan Rupprecht
110*99451b44SJordan Rupprecht        self.assert_data(data.GetSignedInt32, offset, 8)
111*99451b44SJordan Rupprecht        offset += 4
112*99451b44SJordan Rupprecht        self.assert_data(data.GetSignedInt32, offset, 7)
113*99451b44SJordan Rupprecht        offset += 8
114*99451b44SJordan Rupprecht        self.assertTrue(
115*99451b44SJordan Rupprecht            data.GetUnsignedInt32(
116*99451b44SJordan Rupprecht                error,
117*99451b44SJordan Rupprecht                offset) == 0,
118*99451b44SJordan Rupprecht            'do not read beyond end')
119*99451b44SJordan Rupprecht        self.assertTrue(not error.Success())
120*99451b44SJordan Rupprecht        error.Clear()  # clear the error for the next test
121*99451b44SJordan Rupprecht
122*99451b44SJordan Rupprecht        star_foobar = foobar.Dereference()
123*99451b44SJordan Rupprecht        self.assertTrue(star_foobar.IsValid())
124*99451b44SJordan Rupprecht
125*99451b44SJordan Rupprecht        data = star_foobar.GetData()
126*99451b44SJordan Rupprecht
127*99451b44SJordan Rupprecht        offset = 0
128*99451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 1)
129*99451b44SJordan Rupprecht        offset += 4
130*99451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 9)
131*99451b44SJordan Rupprecht
132*99451b44SJordan Rupprecht        foobar_addr = star_foobar.GetLoadAddress()
133*99451b44SJordan Rupprecht        foobar_addr += 12
134*99451b44SJordan Rupprecht
135*99451b44SJordan Rupprecht        # http://llvm.org/bugs/show_bug.cgi?id=11579
136*99451b44SJordan Rupprecht        # lldb::SBValue::CreateValueFromAddress does not verify SBType::GetPointerType succeeds
137*99451b44SJordan Rupprecht        # This should not crash LLDB.
138*99451b44SJordan Rupprecht        nothing = foobar.CreateValueFromAddress(
139*99451b44SJordan Rupprecht            "nothing", foobar_addr, star_foobar.GetType().GetBasicType(
140*99451b44SJordan Rupprecht                lldb.eBasicTypeInvalid))
141*99451b44SJordan Rupprecht
142*99451b44SJordan Rupprecht        new_foobar = foobar.CreateValueFromAddress(
143*99451b44SJordan Rupprecht            "f00", foobar_addr, star_foobar.GetType())
144*99451b44SJordan Rupprecht        self.assertTrue(new_foobar.IsValid())
145*99451b44SJordan Rupprecht        data = new_foobar.GetData()
146*99451b44SJordan Rupprecht
147*99451b44SJordan Rupprecht        self.assertTrue(data.uint32[0] == 8, 'then foo[1].a == 8')
148*99451b44SJordan Rupprecht        self.assertTrue(data.uint32[1] == 7, 'then foo[1].b == 7')
149*99451b44SJordan Rupprecht        # exploiting that sizeof(uint32) == sizeof(float)
150*99451b44SJordan Rupprecht        self.assertTrue(fabs(data.float[2] - 3.14) < 1, 'foo[1].c == 3.14')
151*99451b44SJordan Rupprecht
152*99451b44SJordan Rupprecht        self.runCmd("n")
153*99451b44SJordan Rupprecht
154*99451b44SJordan Rupprecht        offset = 0
155*99451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 8)
156*99451b44SJordan Rupprecht        offset += 4
157*99451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 7)
158*99451b44SJordan Rupprecht        offset += 4
159*99451b44SJordan Rupprecht        self.assertTrue(
160*99451b44SJordan Rupprecht            fabs(
161*99451b44SJordan Rupprecht                data.GetFloat(
162*99451b44SJordan Rupprecht                    error,
163*99451b44SJordan Rupprecht                    offset) -
164*99451b44SJordan Rupprecht                3.14) < 1,
165*99451b44SJordan Rupprecht            'foo[1].c == 3.14')
166*99451b44SJordan Rupprecht        self.assertTrue(error.Success())
167*99451b44SJordan Rupprecht
168*99451b44SJordan Rupprecht        data = new_foobar.GetData()
169*99451b44SJordan Rupprecht
170*99451b44SJordan Rupprecht        offset = 0
171*99451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 8)
172*99451b44SJordan Rupprecht        offset += 4
173*99451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 7)
174*99451b44SJordan Rupprecht        offset += 4
175*99451b44SJordan Rupprecht        self.assertTrue(
176*99451b44SJordan Rupprecht            fabs(
177*99451b44SJordan Rupprecht                data.GetFloat(
178*99451b44SJordan Rupprecht                    error,
179*99451b44SJordan Rupprecht                    offset) -
180*99451b44SJordan Rupprecht                6.28) < 1,
181*99451b44SJordan Rupprecht            'foo[1].c == 6.28')
182*99451b44SJordan Rupprecht        self.assertTrue(error.Success())
183*99451b44SJordan Rupprecht
184*99451b44SJordan Rupprecht        self.runCmd("n")
185*99451b44SJordan Rupprecht
186*99451b44SJordan Rupprecht        barfoo = frame.FindVariable('barfoo')
187*99451b44SJordan Rupprecht
188*99451b44SJordan Rupprecht        data = barfoo.GetData()
189*99451b44SJordan Rupprecht        offset = 0
190*99451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 1)
191*99451b44SJordan Rupprecht        offset += 4
192*99451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 2)
193*99451b44SJordan Rupprecht        offset += 4
194*99451b44SJordan Rupprecht        self.assertTrue(
195*99451b44SJordan Rupprecht            fabs(
196*99451b44SJordan Rupprecht                data.GetFloat(
197*99451b44SJordan Rupprecht                    error,
198*99451b44SJordan Rupprecht                    offset) -
199*99451b44SJordan Rupprecht                3) < 1,
200*99451b44SJordan Rupprecht            'barfoo[0].c == 3')
201*99451b44SJordan Rupprecht        self.assertTrue(error.Success())
202*99451b44SJordan Rupprecht        offset += 4
203*99451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 4)
204*99451b44SJordan Rupprecht        offset += 4
205*99451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 5)
206*99451b44SJordan Rupprecht        offset += 4
207*99451b44SJordan Rupprecht        self.assertTrue(
208*99451b44SJordan Rupprecht            fabs(
209*99451b44SJordan Rupprecht                data.GetFloat(
210*99451b44SJordan Rupprecht                    error,
211*99451b44SJordan Rupprecht                    offset) -
212*99451b44SJordan Rupprecht                6) < 1,
213*99451b44SJordan Rupprecht            'barfoo[1].c == 6')
214*99451b44SJordan Rupprecht        self.assertTrue(error.Success())
215*99451b44SJordan Rupprecht
216*99451b44SJordan Rupprecht        new_object = barfoo.CreateValueFromData(
217*99451b44SJordan Rupprecht            "new_object", data, barfoo.GetType().GetBasicType(
218*99451b44SJordan Rupprecht                lldb.eBasicTypeInt))
219*99451b44SJordan Rupprecht        self.assertTrue(new_object.GetValue() == "1", 'new_object == 1')
220*99451b44SJordan Rupprecht
221*99451b44SJordan Rupprecht        if data.GetByteOrder() == lldb.eByteOrderBig:
222*99451b44SJordan Rupprecht            data.SetData(
223*99451b44SJordan Rupprecht                error,
224*99451b44SJordan Rupprecht                '\0\0\0A',
225*99451b44SJordan Rupprecht                data.GetByteOrder(),
226*99451b44SJordan Rupprecht                data.GetAddressByteSize())
227*99451b44SJordan Rupprecht        else:
228*99451b44SJordan Rupprecht            data.SetData(
229*99451b44SJordan Rupprecht                error,
230*99451b44SJordan Rupprecht                'A\0\0\0',
231*99451b44SJordan Rupprecht                data.GetByteOrder(),
232*99451b44SJordan Rupprecht                data.GetAddressByteSize())
233*99451b44SJordan Rupprecht        self.assertTrue(error.Success())
234*99451b44SJordan Rupprecht
235*99451b44SJordan Rupprecht        data2 = lldb.SBData()
236*99451b44SJordan Rupprecht        data2.SetData(
237*99451b44SJordan Rupprecht            error,
238*99451b44SJordan Rupprecht            'BCD',
239*99451b44SJordan Rupprecht            data.GetByteOrder(),
240*99451b44SJordan Rupprecht            data.GetAddressByteSize())
241*99451b44SJordan Rupprecht        self.assertTrue(error.Success())
242*99451b44SJordan Rupprecht
243*99451b44SJordan Rupprecht        data.Append(data2)
244*99451b44SJordan Rupprecht
245*99451b44SJordan Rupprecht        # this breaks on EBCDIC
246*99451b44SJordan Rupprecht        offset = 0
247*99451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 65)
248*99451b44SJordan Rupprecht        offset += 4
249*99451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt8, offset, 66)
250*99451b44SJordan Rupprecht        offset += 1
251*99451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt8, offset, 67)
252*99451b44SJordan Rupprecht        offset += 1
253*99451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt8, offset, 68)
254*99451b44SJordan Rupprecht        offset += 1
255*99451b44SJordan Rupprecht
256*99451b44SJordan Rupprecht        # check the new API calls introduced per LLVM llvm.org/prenhancement request
257*99451b44SJordan Rupprecht        # 11619 (Allow creating SBData values from arrays or primitives in
258*99451b44SJordan Rupprecht        # Python)
259*99451b44SJordan Rupprecht
260*99451b44SJordan Rupprecht        hello_str = "hello!"
261*99451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromCString(
262*99451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), hello_str)
263*99451b44SJordan Rupprecht        self.assertTrue(len(data2.uint8) == len(hello_str))
264*99451b44SJordan Rupprecht        self.assertTrue(data2.uint8[0] == 104, 'h == 104')
265*99451b44SJordan Rupprecht        self.assertTrue(data2.uint8[1] == 101, 'e == 101')
266*99451b44SJordan Rupprecht        self.assertTrue(data2.uint8[2] == 108, 'l == 108')
267*99451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 3, 108)  # l
268*99451b44SJordan Rupprecht        self.assertTrue(data2.uint8[4] == 111, 'o == 111')
269*99451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 5, 33)  # !
270*99451b44SJordan Rupprecht
271*99451b44SJordan Rupprecht        uint_lists = [[1, 2, 3, 4, 5], [int(i) for i in [1, 2, 3, 4, 5]]]
272*99451b44SJordan Rupprecht        int_lists = [[2, -2], [int(i) for i in [2, -2]]]
273*99451b44SJordan Rupprecht
274*99451b44SJordan Rupprecht        for l in uint_lists:
275*99451b44SJordan Rupprecht            data2 = lldb.SBData.CreateDataFromUInt64Array(
276*99451b44SJordan Rupprecht                process.GetByteOrder(), process.GetAddressByteSize(), l)
277*99451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt64, 0, 1)
278*99451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt64, 8, 2)
279*99451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt64, 16, 3)
280*99451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt64, 24, 4)
281*99451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt64, 32, 5)
282*99451b44SJordan Rupprecht
283*99451b44SJordan Rupprecht            self.assertTrue(
284*99451b44SJordan Rupprecht                data2.uint64s == [
285*99451b44SJordan Rupprecht                    1,
286*99451b44SJordan Rupprecht                    2,
287*99451b44SJordan Rupprecht                    3,
288*99451b44SJordan Rupprecht                    4,
289*99451b44SJordan Rupprecht                    5],
290*99451b44SJordan Rupprecht                'read_data_helper failure: data2 == [1,2,3,4,5]')
291*99451b44SJordan Rupprecht
292*99451b44SJordan Rupprecht        for l in int_lists:
293*99451b44SJordan Rupprecht            data2 = lldb.SBData.CreateDataFromSInt32Array(
294*99451b44SJordan Rupprecht                process.GetByteOrder(), process.GetAddressByteSize(), l)
295*99451b44SJordan Rupprecht            self.assertTrue(
296*99451b44SJordan Rupprecht                data2.sint32[
297*99451b44SJordan Rupprecht                    0:2] == [
298*99451b44SJordan Rupprecht                    2, -2], 'signed32 data2 = [2,-2]')
299*99451b44SJordan Rupprecht
300*99451b44SJordan Rupprecht        data2.Append(
301*99451b44SJordan Rupprecht            lldb.SBData.CreateDataFromSInt64Array(
302*99451b44SJordan Rupprecht                process.GetByteOrder(),
303*99451b44SJordan Rupprecht                process.GetAddressByteSize(),
304*99451b44SJordan Rupprecht                int_lists[0]))
305*99451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt32, 0, 2)
306*99451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt32, 4, -2)
307*99451b44SJordan Rupprecht        self.assertTrue(
308*99451b44SJordan Rupprecht            data2.sint64[
309*99451b44SJordan Rupprecht                1:3] == [
310*99451b44SJordan Rupprecht                2, -2], 'signed64 data2 = [2,-2]')
311*99451b44SJordan Rupprecht
312*99451b44SJordan Rupprecht        for l in int_lists:
313*99451b44SJordan Rupprecht            data2 = lldb.SBData.CreateDataFromSInt64Array(
314*99451b44SJordan Rupprecht                process.GetByteOrder(), process.GetAddressByteSize(), l)
315*99451b44SJordan Rupprecht            self.assert_data(data2.GetSignedInt64, 0, 2)
316*99451b44SJordan Rupprecht            self.assert_data(data2.GetSignedInt64, 8, -2)
317*99451b44SJordan Rupprecht            self.assertTrue(
318*99451b44SJordan Rupprecht                data2.sint64[
319*99451b44SJordan Rupprecht                    0:2] == [
320*99451b44SJordan Rupprecht                    2, -2], 'signed64 data2 = [2,-2]')
321*99451b44SJordan Rupprecht
322*99451b44SJordan Rupprecht        for l in uint_lists:
323*99451b44SJordan Rupprecht            data2 = lldb.SBData.CreateDataFromUInt32Array(
324*99451b44SJordan Rupprecht                process.GetByteOrder(), process.GetAddressByteSize(), l)
325*99451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt32, 0, 1)
326*99451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt32, 4, 2)
327*99451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt32, 8, 3)
328*99451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt32, 12, 4)
329*99451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt32, 16, 5)
330*99451b44SJordan Rupprecht
331*99451b44SJordan Rupprecht        bool_list = [True, True, False, False, True, False]
332*99451b44SJordan Rupprecht
333*99451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromSInt32Array(
334*99451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), bool_list)
335*99451b44SJordan Rupprecht        self.assertTrue(
336*99451b44SJordan Rupprecht            data2.sint32[
337*99451b44SJordan Rupprecht                0:6] == [
338*99451b44SJordan Rupprecht                1,
339*99451b44SJordan Rupprecht                1,
340*99451b44SJordan Rupprecht                0,
341*99451b44SJordan Rupprecht                0,
342*99451b44SJordan Rupprecht                1,
343*99451b44SJordan Rupprecht                0],
344*99451b44SJordan Rupprecht            'signed32 data2 = [1, 1, 0, 0, 1, 0]')
345*99451b44SJordan Rupprecht
346*99451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromUInt32Array(
347*99451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), bool_list)
348*99451b44SJordan Rupprecht        self.assertTrue(
349*99451b44SJordan Rupprecht            data2.uint32[
350*99451b44SJordan Rupprecht                0:6] == [
351*99451b44SJordan Rupprecht                1,
352*99451b44SJordan Rupprecht                1,
353*99451b44SJordan Rupprecht                0,
354*99451b44SJordan Rupprecht                0,
355*99451b44SJordan Rupprecht                1,
356*99451b44SJordan Rupprecht                0],
357*99451b44SJordan Rupprecht            'unsigned32 data2 = [1, 1, 0, 0, 1, 0]')
358*99451b44SJordan Rupprecht
359*99451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromSInt64Array(
360*99451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), bool_list)
361*99451b44SJordan Rupprecht        self.assertTrue(
362*99451b44SJordan Rupprecht            data2.sint64[
363*99451b44SJordan Rupprecht                0:6] == [
364*99451b44SJordan Rupprecht                1,
365*99451b44SJordan Rupprecht                1,
366*99451b44SJordan Rupprecht                0,
367*99451b44SJordan Rupprecht                0,
368*99451b44SJordan Rupprecht                1,
369*99451b44SJordan Rupprecht                0],
370*99451b44SJordan Rupprecht            'signed64 data2 = [1, 1, 0, 0, 1, 0]')
371*99451b44SJordan Rupprecht
372*99451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromUInt64Array(
373*99451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), bool_list)
374*99451b44SJordan Rupprecht        self.assertTrue(
375*99451b44SJordan Rupprecht            data2.uint64[
376*99451b44SJordan Rupprecht                0:6] == [
377*99451b44SJordan Rupprecht                1,
378*99451b44SJordan Rupprecht                1,
379*99451b44SJordan Rupprecht                0,
380*99451b44SJordan Rupprecht                0,
381*99451b44SJordan Rupprecht                1,
382*99451b44SJordan Rupprecht                0],
383*99451b44SJordan Rupprecht            'signed64 data2 = [1, 1, 0, 0, 1, 0]')
384*99451b44SJordan Rupprecht
385*99451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromDoubleArray(
386*99451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), [
387*99451b44SJordan Rupprecht                3.14, 6.28, 2.71])
388*99451b44SJordan Rupprecht        self.assertTrue(
389*99451b44SJordan Rupprecht            fabs(
390*99451b44SJordan Rupprecht                data2.GetDouble(
391*99451b44SJordan Rupprecht                    error,
392*99451b44SJordan Rupprecht                    0) -
393*99451b44SJordan Rupprecht                3.14) < 0.5,
394*99451b44SJordan Rupprecht            'double data2[0] = 3.14')
395*99451b44SJordan Rupprecht        self.assertTrue(error.Success())
396*99451b44SJordan Rupprecht        self.assertTrue(
397*99451b44SJordan Rupprecht            fabs(
398*99451b44SJordan Rupprecht                data2.GetDouble(
399*99451b44SJordan Rupprecht                    error,
400*99451b44SJordan Rupprecht                    8) -
401*99451b44SJordan Rupprecht                6.28) < 0.5,
402*99451b44SJordan Rupprecht            'double data2[1] = 6.28')
403*99451b44SJordan Rupprecht        self.assertTrue(error.Success())
404*99451b44SJordan Rupprecht        self.assertTrue(
405*99451b44SJordan Rupprecht            fabs(
406*99451b44SJordan Rupprecht                data2.GetDouble(
407*99451b44SJordan Rupprecht                    error,
408*99451b44SJordan Rupprecht                    16) -
409*99451b44SJordan Rupprecht                2.71) < 0.5,
410*99451b44SJordan Rupprecht            'double data2[2] = 2.71')
411*99451b44SJordan Rupprecht        self.assertTrue(error.Success())
412*99451b44SJordan Rupprecht
413*99451b44SJordan Rupprecht        data2 = lldb.SBData()
414*99451b44SJordan Rupprecht
415*99451b44SJordan Rupprecht        data2.SetDataFromCString(hello_str)
416*99451b44SJordan Rupprecht        self.assertTrue(len(data2.uint8) == len(hello_str))
417*99451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 0, 104)
418*99451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 1, 101)
419*99451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 2, 108)
420*99451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 3, 108)
421*99451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 4, 111)
422*99451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 5, 33)
423*99451b44SJordan Rupprecht
424*99451b44SJordan Rupprecht        data2.SetDataFromUInt64Array([1, 2, 3, 4, 5])
425*99451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt64, 0, 1)
426*99451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt64, 8, 2)
427*99451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt64, 16, 3)
428*99451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt64, 24, 4)
429*99451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt64, 32, 5)
430*99451b44SJordan Rupprecht
431*99451b44SJordan Rupprecht        self.assertTrue(
432*99451b44SJordan Rupprecht            data2.uint64[0] == 1,
433*99451b44SJordan Rupprecht            'read_data_helper failure: set data2[0] = 1')
434*99451b44SJordan Rupprecht        self.assertTrue(
435*99451b44SJordan Rupprecht            data2.uint64[1] == 2,
436*99451b44SJordan Rupprecht            'read_data_helper failure: set data2[1] = 2')
437*99451b44SJordan Rupprecht        self.assertTrue(
438*99451b44SJordan Rupprecht            data2.uint64[2] == 3,
439*99451b44SJordan Rupprecht            'read_data_helper failure: set data2[2] = 3')
440*99451b44SJordan Rupprecht        self.assertTrue(
441*99451b44SJordan Rupprecht            data2.uint64[3] == 4,
442*99451b44SJordan Rupprecht            'read_data_helper failure: set data2[3] = 4')
443*99451b44SJordan Rupprecht        self.assertTrue(
444*99451b44SJordan Rupprecht            data2.uint64[4] == 5,
445*99451b44SJordan Rupprecht            'read_data_helper failure: set data2[4] = 5')
446*99451b44SJordan Rupprecht
447*99451b44SJordan Rupprecht        self.assertTrue(
448*99451b44SJordan Rupprecht            data2.uint64[
449*99451b44SJordan Rupprecht                0:2] == [
450*99451b44SJordan Rupprecht                1,
451*99451b44SJordan Rupprecht                2],
452*99451b44SJordan Rupprecht            'read_data_helper failure: set data2[0:2] = [1,2]')
453*99451b44SJordan Rupprecht
454*99451b44SJordan Rupprecht        data2.SetDataFromSInt32Array([2, -2])
455*99451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt32, 0, 2)
456*99451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt32, 4, -2)
457*99451b44SJordan Rupprecht
458*99451b44SJordan Rupprecht        data2.SetDataFromSInt64Array([2, -2])
459*99451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt64, 0, 2)
460*99451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt64, 8, -2)
461*99451b44SJordan Rupprecht
462*99451b44SJordan Rupprecht        data2.SetDataFromUInt32Array([1, 2, 3, 4, 5])
463*99451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt32, 0, 1)
464*99451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt32, 4, 2)
465*99451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt32, 8, 3)
466*99451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt32, 12, 4)
467*99451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt32, 16, 5)
468*99451b44SJordan Rupprecht
469*99451b44SJordan Rupprecht        self.assertTrue(
470*99451b44SJordan Rupprecht            data2.uint32[0] == 1,
471*99451b44SJordan Rupprecht            'read_data_helper failure: set 32-bit data2[0] = 1')
472*99451b44SJordan Rupprecht        self.assertTrue(
473*99451b44SJordan Rupprecht            data2.uint32[1] == 2,
474*99451b44SJordan Rupprecht            'read_data_helper failure: set 32-bit data2[1] = 2')
475*99451b44SJordan Rupprecht        self.assertTrue(
476*99451b44SJordan Rupprecht            data2.uint32[2] == 3,
477*99451b44SJordan Rupprecht            'read_data_helper failure: set 32-bit data2[2] = 3')
478*99451b44SJordan Rupprecht        self.assertTrue(
479*99451b44SJordan Rupprecht            data2.uint32[3] == 4,
480*99451b44SJordan Rupprecht            'read_data_helper failure: set 32-bit data2[3] = 4')
481*99451b44SJordan Rupprecht        self.assertTrue(
482*99451b44SJordan Rupprecht            data2.uint32[4] == 5,
483*99451b44SJordan Rupprecht            'read_data_helper failure: set 32-bit data2[4] = 5')
484*99451b44SJordan Rupprecht
485*99451b44SJordan Rupprecht        data2.SetDataFromDoubleArray([3.14, 6.28, 2.71])
486*99451b44SJordan Rupprecht        self.assertTrue(fabs(data2.GetDouble(error, 0) - 3.14)
487*99451b44SJordan Rupprecht                        < 0.5, 'set double data2[0] = 3.14')
488*99451b44SJordan Rupprecht        self.assertTrue(fabs(data2.GetDouble(error, 8) - 6.28)
489*99451b44SJordan Rupprecht                        < 0.5, 'set double data2[1] = 6.28')
490*99451b44SJordan Rupprecht        self.assertTrue(fabs(data2.GetDouble(error, 16) - 2.71)
491*99451b44SJordan Rupprecht                        < 0.5, 'set double data2[2] = 2.71')
492*99451b44SJordan Rupprecht
493*99451b44SJordan Rupprecht        self.assertTrue(
494*99451b44SJordan Rupprecht            fabs(
495*99451b44SJordan Rupprecht                data2.double[0] -
496*99451b44SJordan Rupprecht                3.14) < 0.5,
497*99451b44SJordan Rupprecht            'read_data_helper failure: set double data2[0] = 3.14')
498*99451b44SJordan Rupprecht        self.assertTrue(
499*99451b44SJordan Rupprecht            fabs(
500*99451b44SJordan Rupprecht                data2.double[1] -
501*99451b44SJordan Rupprecht                6.28) < 0.5,
502*99451b44SJordan Rupprecht            'read_data_helper failure: set double data2[1] = 6.28')
503*99451b44SJordan Rupprecht        self.assertTrue(
504*99451b44SJordan Rupprecht            fabs(
505*99451b44SJordan Rupprecht                data2.double[2] -
506*99451b44SJordan Rupprecht                2.71) < 0.5,
507*99451b44SJordan Rupprecht            'read_data_helper failure: set double data2[2] = 2.71')
508*99451b44SJordan Rupprecht
509*99451b44SJordan Rupprecht    def assert_data(self, func, arg, expected):
510*99451b44SJordan Rupprecht        """ Asserts func(SBError error, arg) == expected. """
511*99451b44SJordan Rupprecht        error = lldb.SBError()
512*99451b44SJordan Rupprecht        result = func(error, arg)
513*99451b44SJordan Rupprecht        if not error.Success():
514*99451b44SJordan Rupprecht            stream = lldb.SBStream()
515*99451b44SJordan Rupprecht            error.GetDescription(stream)
516*99451b44SJordan Rupprecht            self.assertTrue(
517*99451b44SJordan Rupprecht                error.Success(), "%s(error, %s) did not succeed: %s" %
518*99451b44SJordan Rupprecht                (func.__name__, arg, stream.GetData()))
519*99451b44SJordan Rupprecht        self.assertTrue(
520*99451b44SJordan Rupprecht            expected == result, "%s(error, %s) == %s != %s" %
521*99451b44SJordan Rupprecht            (func.__name__, arg, result, expected))
522