199451b44SJordan Rupprecht"""Test the SBData APIs."""
299451b44SJordan Rupprecht
399451b44SJordan Rupprecht
499451b44SJordan Rupprecht
599451b44SJordan Rupprechtfrom math import fabs
699451b44SJordan Rupprechtimport lldb
799451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
899451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
999451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1099451b44SJordan Rupprecht
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprechtclass SBDataAPICase(TestBase):
1399451b44SJordan Rupprecht
1499451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
1599451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
1699451b44SJordan Rupprecht
1799451b44SJordan Rupprecht    def setUp(self):
1899451b44SJordan Rupprecht        # Call super's setUp().
1999451b44SJordan Rupprecht        TestBase.setUp(self)
2099451b44SJordan Rupprecht        # Find the line number to break on inside main.cpp.
2199451b44SJordan Rupprecht        self.line = line_number('main.cpp', '// set breakpoint here')
2299451b44SJordan Rupprecht
2399451b44SJordan Rupprecht    def test_byte_order_and_address_byte_size(self):
2499451b44SJordan Rupprecht        """Test the SBData::SetData() to ensure the byte order and address
2599451b44SJordan Rupprecht        byte size are obeyed"""
2699451b44SJordan Rupprecht        addr_data = b'\x11\x22\x33\x44\x55\x66\x77\x88'
2799451b44SJordan Rupprecht        error = lldb.SBError()
2899451b44SJordan Rupprecht        data = lldb.SBData()
2999451b44SJordan Rupprecht        data.SetData(error, addr_data, lldb.eByteOrderBig, 4)
3099451b44SJordan Rupprecht        addr = data.GetAddress(error, 0)
31619e2e09SDave Lee        self.assertEqual(addr, 0x11223344);
3299451b44SJordan Rupprecht        data.SetData(error, addr_data, lldb.eByteOrderBig, 8)
3399451b44SJordan Rupprecht        addr = data.GetAddress(error, 0)
34619e2e09SDave Lee        self.assertEqual(addr, 0x1122334455667788);
3599451b44SJordan Rupprecht        data.SetData(error, addr_data, lldb.eByteOrderLittle, 4)
3699451b44SJordan Rupprecht        addr = data.GetAddress(error, 0)
37619e2e09SDave Lee        self.assertEqual(addr, 0x44332211);
3899451b44SJordan Rupprecht        data.SetData(error, addr_data, lldb.eByteOrderLittle, 8)
3999451b44SJordan Rupprecht        addr = data.GetAddress(error, 0)
40619e2e09SDave Lee        self.assertEqual(addr, 0x8877665544332211);
4199451b44SJordan Rupprecht
4272e25978SMed Ismail Bennani    def test_byte_order_and_address_byte_size_with_ownership(self):
4372e25978SMed Ismail Bennani        """Test the SBData::SetDataWithOwnership() to ensure the byte order
4472e25978SMed Ismail Bennani        and address byte size are obeyed even when source date is released"""
4572e25978SMed Ismail Bennani        addr_data = b'\x11\x22\x33\x44\x55\x66\x77\x88'
4672e25978SMed Ismail Bennani        error = lldb.SBError()
4772e25978SMed Ismail Bennani        data = lldb.SBData()
4872e25978SMed Ismail Bennani        data.SetDataWithOwnership(error, addr_data, lldb.eByteOrderBig, 8)
4972e25978SMed Ismail Bennani        del addr_data
5072e25978SMed Ismail Bennani        addr = data.GetAddress(error, 0)
5172e25978SMed Ismail Bennani        self.assertEqual(addr, 0x1122334455667788);
5272e25978SMed Ismail Bennani
5399451b44SJordan Rupprecht    def test_with_run_command(self):
5499451b44SJordan Rupprecht        """Test the SBData APIs."""
5599451b44SJordan Rupprecht        self.build()
5699451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
5799451b44SJordan Rupprecht
5899451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
5999451b44SJordan Rupprecht            self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)
6099451b44SJordan Rupprecht
6199451b44SJordan Rupprecht        self.runCmd("run", RUN_SUCCEEDED)
6299451b44SJordan Rupprecht
6399451b44SJordan Rupprecht        # The stop reason of the thread should be breakpoint.
6499451b44SJordan Rupprecht        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
6599451b44SJordan Rupprecht                    substrs=['stopped',
6699451b44SJordan Rupprecht                             'stop reason = breakpoint'])
6799451b44SJordan Rupprecht
6899451b44SJordan Rupprecht        target = self.dbg.GetSelectedTarget()
6999451b44SJordan Rupprecht
7099451b44SJordan Rupprecht        process = target.GetProcess()
7199451b44SJordan Rupprecht
7299451b44SJordan Rupprecht        thread = lldbutil.get_stopped_thread(
7399451b44SJordan Rupprecht            process, lldb.eStopReasonBreakpoint)
7499451b44SJordan Rupprecht        self.assertIsNotNone(thread)
7599451b44SJordan Rupprecht
7699451b44SJordan Rupprecht        frame = thread.GetSelectedFrame()
7799451b44SJordan Rupprecht        foobar = frame.FindVariable('foobar')
7899451b44SJordan Rupprecht        self.assertTrue(foobar.IsValid())
7999451b44SJordan Rupprecht        data = foobar.GetPointeeData(0, 2)
8099451b44SJordan Rupprecht        offset = 0
8199451b44SJordan Rupprecht        error = lldb.SBError()
8299451b44SJordan Rupprecht
8399451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 1)
8499451b44SJordan Rupprecht        offset += 4
8599451b44SJordan Rupprecht        low = data.GetSignedInt16(error, offset)
86*779bbbf2SDave Lee        self.assertSuccess(error)
8799451b44SJordan Rupprecht        offset += 2
8899451b44SJordan Rupprecht        high = data.GetSignedInt16(error, offset)
89*779bbbf2SDave Lee        self.assertSuccess(error)
9099451b44SJordan Rupprecht        offset += 2
9199451b44SJordan Rupprecht        self.assertTrue(
9299451b44SJordan Rupprecht            (low == 9 and high == 0) or (
9399451b44SJordan Rupprecht                low == 0 and high == 9),
9499451b44SJordan Rupprecht            'foo[0].b == 9')
9599451b44SJordan Rupprecht        self.assertTrue(
9699451b44SJordan Rupprecht            fabs(
9799451b44SJordan Rupprecht                data.GetFloat(
9899451b44SJordan Rupprecht                    error,
9999451b44SJordan Rupprecht                    offset) -
10099451b44SJordan Rupprecht                3.14) < 1,
10199451b44SJordan Rupprecht            'foo[0].c == 3.14')
102*779bbbf2SDave Lee        self.assertSuccess(error)
10399451b44SJordan Rupprecht        offset += 4
10499451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 8)
10599451b44SJordan Rupprecht        offset += 4
10699451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 5)
10799451b44SJordan Rupprecht        offset += 4
10899451b44SJordan Rupprecht
10999451b44SJordan Rupprecht        self.runCmd("n")
11099451b44SJordan Rupprecht
11199451b44SJordan Rupprecht        offset = 16
11299451b44SJordan Rupprecht
11399451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 5)
11499451b44SJordan Rupprecht
11599451b44SJordan Rupprecht        data = foobar.GetPointeeData(1, 1)
11699451b44SJordan Rupprecht
11799451b44SJordan Rupprecht        offset = 0
11899451b44SJordan Rupprecht
11999451b44SJordan Rupprecht        self.assert_data(data.GetSignedInt32, offset, 8)
12099451b44SJordan Rupprecht        offset += 4
12199451b44SJordan Rupprecht        self.assert_data(data.GetSignedInt32, offset, 7)
12299451b44SJordan Rupprecht        offset += 8
12399451b44SJordan Rupprecht        self.assertTrue(
12499451b44SJordan Rupprecht            data.GetUnsignedInt32(
12599451b44SJordan Rupprecht                error,
12699451b44SJordan Rupprecht                offset) == 0,
12799451b44SJordan Rupprecht            'do not read beyond end')
12899451b44SJordan Rupprecht        self.assertTrue(not error.Success())
12999451b44SJordan Rupprecht        error.Clear()  # clear the error for the next test
13099451b44SJordan Rupprecht
13199451b44SJordan Rupprecht        star_foobar = foobar.Dereference()
13299451b44SJordan Rupprecht        self.assertTrue(star_foobar.IsValid())
13399451b44SJordan Rupprecht
13499451b44SJordan Rupprecht        data = star_foobar.GetData()
13599451b44SJordan Rupprecht
13699451b44SJordan Rupprecht        offset = 0
13799451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 1)
13899451b44SJordan Rupprecht        offset += 4
13999451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 9)
14099451b44SJordan Rupprecht
14199451b44SJordan Rupprecht        foobar_addr = star_foobar.GetLoadAddress()
14299451b44SJordan Rupprecht        foobar_addr += 12
14399451b44SJordan Rupprecht
14499451b44SJordan Rupprecht        # http://llvm.org/bugs/show_bug.cgi?id=11579
14599451b44SJordan Rupprecht        # lldb::SBValue::CreateValueFromAddress does not verify SBType::GetPointerType succeeds
14699451b44SJordan Rupprecht        # This should not crash LLDB.
14799451b44SJordan Rupprecht        nothing = foobar.CreateValueFromAddress(
14899451b44SJordan Rupprecht            "nothing", foobar_addr, star_foobar.GetType().GetBasicType(
14999451b44SJordan Rupprecht                lldb.eBasicTypeInvalid))
15099451b44SJordan Rupprecht
15199451b44SJordan Rupprecht        new_foobar = foobar.CreateValueFromAddress(
15299451b44SJordan Rupprecht            "f00", foobar_addr, star_foobar.GetType())
15399451b44SJordan Rupprecht        self.assertTrue(new_foobar.IsValid())
15499451b44SJordan Rupprecht        data = new_foobar.GetData()
15599451b44SJordan Rupprecht
156619e2e09SDave Lee        self.assertEqual(data.uint32[0], 8, 'then foo[1].a == 8')
157619e2e09SDave Lee        self.assertEqual(data.uint32[1], 7, 'then foo[1].b == 7')
15899451b44SJordan Rupprecht        # exploiting that sizeof(uint32) == sizeof(float)
15999451b44SJordan Rupprecht        self.assertTrue(fabs(data.float[2] - 3.14) < 1, 'foo[1].c == 3.14')
16099451b44SJordan Rupprecht
16199451b44SJordan Rupprecht        self.runCmd("n")
16299451b44SJordan Rupprecht
16399451b44SJordan Rupprecht        offset = 0
16499451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 8)
16599451b44SJordan Rupprecht        offset += 4
16699451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 7)
16799451b44SJordan Rupprecht        offset += 4
16899451b44SJordan Rupprecht        self.assertTrue(
16999451b44SJordan Rupprecht            fabs(
17099451b44SJordan Rupprecht                data.GetFloat(
17199451b44SJordan Rupprecht                    error,
17299451b44SJordan Rupprecht                    offset) -
17399451b44SJordan Rupprecht                3.14) < 1,
17499451b44SJordan Rupprecht            'foo[1].c == 3.14')
175*779bbbf2SDave Lee        self.assertSuccess(error)
17699451b44SJordan Rupprecht
17799451b44SJordan Rupprecht        data = new_foobar.GetData()
17899451b44SJordan Rupprecht
17999451b44SJordan Rupprecht        offset = 0
18099451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 8)
18199451b44SJordan Rupprecht        offset += 4
18299451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 7)
18399451b44SJordan Rupprecht        offset += 4
18499451b44SJordan Rupprecht        self.assertTrue(
18599451b44SJordan Rupprecht            fabs(
18699451b44SJordan Rupprecht                data.GetFloat(
18799451b44SJordan Rupprecht                    error,
18899451b44SJordan Rupprecht                    offset) -
18999451b44SJordan Rupprecht                6.28) < 1,
19099451b44SJordan Rupprecht            'foo[1].c == 6.28')
191*779bbbf2SDave Lee        self.assertSuccess(error)
19299451b44SJordan Rupprecht
19399451b44SJordan Rupprecht        self.runCmd("n")
19499451b44SJordan Rupprecht
19599451b44SJordan Rupprecht        barfoo = frame.FindVariable('barfoo')
19699451b44SJordan Rupprecht
19799451b44SJordan Rupprecht        data = barfoo.GetData()
19899451b44SJordan Rupprecht        offset = 0
19999451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 1)
20099451b44SJordan Rupprecht        offset += 4
20199451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 2)
20299451b44SJordan Rupprecht        offset += 4
20399451b44SJordan Rupprecht        self.assertTrue(
20499451b44SJordan Rupprecht            fabs(
20599451b44SJordan Rupprecht                data.GetFloat(
20699451b44SJordan Rupprecht                    error,
20799451b44SJordan Rupprecht                    offset) -
20899451b44SJordan Rupprecht                3) < 1,
20999451b44SJordan Rupprecht            'barfoo[0].c == 3')
210*779bbbf2SDave Lee        self.assertSuccess(error)
21199451b44SJordan Rupprecht        offset += 4
21299451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 4)
21399451b44SJordan Rupprecht        offset += 4
21499451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 5)
21599451b44SJordan Rupprecht        offset += 4
21699451b44SJordan Rupprecht        self.assertTrue(
21799451b44SJordan Rupprecht            fabs(
21899451b44SJordan Rupprecht                data.GetFloat(
21999451b44SJordan Rupprecht                    error,
22099451b44SJordan Rupprecht                    offset) -
22199451b44SJordan Rupprecht                6) < 1,
22299451b44SJordan Rupprecht            'barfoo[1].c == 6')
223*779bbbf2SDave Lee        self.assertSuccess(error)
22499451b44SJordan Rupprecht
22599451b44SJordan Rupprecht        new_object = barfoo.CreateValueFromData(
22699451b44SJordan Rupprecht            "new_object", data, barfoo.GetType().GetBasicType(
22799451b44SJordan Rupprecht                lldb.eBasicTypeInt))
228619e2e09SDave Lee        self.assertEqual(new_object.GetValue(), "1", 'new_object == 1')
22999451b44SJordan Rupprecht
23099451b44SJordan Rupprecht        if data.GetByteOrder() == lldb.eByteOrderBig:
23199451b44SJordan Rupprecht            data.SetData(
23299451b44SJordan Rupprecht                error,
23399451b44SJordan Rupprecht                '\0\0\0A',
23499451b44SJordan Rupprecht                data.GetByteOrder(),
23599451b44SJordan Rupprecht                data.GetAddressByteSize())
23699451b44SJordan Rupprecht        else:
23799451b44SJordan Rupprecht            data.SetData(
23899451b44SJordan Rupprecht                error,
23999451b44SJordan Rupprecht                'A\0\0\0',
24099451b44SJordan Rupprecht                data.GetByteOrder(),
24199451b44SJordan Rupprecht                data.GetAddressByteSize())
242*779bbbf2SDave Lee        self.assertSuccess(error)
24399451b44SJordan Rupprecht
24499451b44SJordan Rupprecht        data2 = lldb.SBData()
24599451b44SJordan Rupprecht        data2.SetData(
24699451b44SJordan Rupprecht            error,
24799451b44SJordan Rupprecht            'BCD',
24899451b44SJordan Rupprecht            data.GetByteOrder(),
24999451b44SJordan Rupprecht            data.GetAddressByteSize())
250*779bbbf2SDave Lee        self.assertSuccess(error)
25199451b44SJordan Rupprecht
25299451b44SJordan Rupprecht        data.Append(data2)
25399451b44SJordan Rupprecht
25499451b44SJordan Rupprecht        # this breaks on EBCDIC
25599451b44SJordan Rupprecht        offset = 0
25699451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 65)
25799451b44SJordan Rupprecht        offset += 4
25899451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt8, offset, 66)
25999451b44SJordan Rupprecht        offset += 1
26099451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt8, offset, 67)
26199451b44SJordan Rupprecht        offset += 1
26299451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt8, offset, 68)
26399451b44SJordan Rupprecht        offset += 1
26499451b44SJordan Rupprecht
26599451b44SJordan Rupprecht        # check the new API calls introduced per LLVM llvm.org/prenhancement request
26699451b44SJordan Rupprecht        # 11619 (Allow creating SBData values from arrays or primitives in
26799451b44SJordan Rupprecht        # Python)
26899451b44SJordan Rupprecht
26999451b44SJordan Rupprecht        hello_str = "hello!"
27099451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromCString(
27199451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), hello_str)
272619e2e09SDave Lee        self.assertEqual(len(data2.uint8), len(hello_str))
273619e2e09SDave Lee        self.assertEqual(data2.uint8[0], 104, 'h == 104')
274619e2e09SDave Lee        self.assertEqual(data2.uint8[1], 101, 'e == 101')
275619e2e09SDave Lee        self.assertEqual(data2.uint8[2], 108, 'l == 108')
27699451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 3, 108)  # l
277619e2e09SDave Lee        self.assertEqual(data2.uint8[4], 111, 'o == 111')
27899451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 5, 33)  # !
27999451b44SJordan Rupprecht
28099451b44SJordan Rupprecht        uint_lists = [[1, 2, 3, 4, 5], [int(i) for i in [1, 2, 3, 4, 5]]]
28199451b44SJordan Rupprecht        int_lists = [[2, -2], [int(i) for i in [2, -2]]]
28299451b44SJordan Rupprecht
28399451b44SJordan Rupprecht        for l in uint_lists:
28499451b44SJordan Rupprecht            data2 = lldb.SBData.CreateDataFromUInt64Array(
28599451b44SJordan Rupprecht                process.GetByteOrder(), process.GetAddressByteSize(), l)
28699451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt64, 0, 1)
28799451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt64, 8, 2)
28899451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt64, 16, 3)
28999451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt64, 24, 4)
29099451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt64, 32, 5)
29199451b44SJordan Rupprecht
29299451b44SJordan Rupprecht            self.assertTrue(
29399451b44SJordan Rupprecht                data2.uint64s == [
29499451b44SJordan Rupprecht                    1,
29599451b44SJordan Rupprecht                    2,
29699451b44SJordan Rupprecht                    3,
29799451b44SJordan Rupprecht                    4,
29899451b44SJordan Rupprecht                    5],
29999451b44SJordan Rupprecht                'read_data_helper failure: data2 == [1,2,3,4,5]')
30099451b44SJordan Rupprecht
30199451b44SJordan Rupprecht        for l in int_lists:
30299451b44SJordan Rupprecht            data2 = lldb.SBData.CreateDataFromSInt32Array(
30399451b44SJordan Rupprecht                process.GetByteOrder(), process.GetAddressByteSize(), l)
30499451b44SJordan Rupprecht            self.assertTrue(
30599451b44SJordan Rupprecht                data2.sint32[
30699451b44SJordan Rupprecht                    0:2] == [
30799451b44SJordan Rupprecht                    2, -2], 'signed32 data2 = [2,-2]')
30899451b44SJordan Rupprecht
30999451b44SJordan Rupprecht        data2.Append(
31099451b44SJordan Rupprecht            lldb.SBData.CreateDataFromSInt64Array(
31199451b44SJordan Rupprecht                process.GetByteOrder(),
31299451b44SJordan Rupprecht                process.GetAddressByteSize(),
31399451b44SJordan Rupprecht                int_lists[0]))
31499451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt32, 0, 2)
31599451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt32, 4, -2)
31699451b44SJordan Rupprecht        self.assertTrue(
31799451b44SJordan Rupprecht            data2.sint64[
31899451b44SJordan Rupprecht                1:3] == [
31999451b44SJordan Rupprecht                2, -2], 'signed64 data2 = [2,-2]')
32099451b44SJordan Rupprecht
32199451b44SJordan Rupprecht        for l in int_lists:
32299451b44SJordan Rupprecht            data2 = lldb.SBData.CreateDataFromSInt64Array(
32399451b44SJordan Rupprecht                process.GetByteOrder(), process.GetAddressByteSize(), l)
32499451b44SJordan Rupprecht            self.assert_data(data2.GetSignedInt64, 0, 2)
32599451b44SJordan Rupprecht            self.assert_data(data2.GetSignedInt64, 8, -2)
32699451b44SJordan Rupprecht            self.assertTrue(
32799451b44SJordan Rupprecht                data2.sint64[
32899451b44SJordan Rupprecht                    0:2] == [
32999451b44SJordan Rupprecht                    2, -2], 'signed64 data2 = [2,-2]')
33099451b44SJordan Rupprecht
33199451b44SJordan Rupprecht        for l in uint_lists:
33299451b44SJordan Rupprecht            data2 = lldb.SBData.CreateDataFromUInt32Array(
33399451b44SJordan Rupprecht                process.GetByteOrder(), process.GetAddressByteSize(), l)
33499451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt32, 0, 1)
33599451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt32, 4, 2)
33699451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt32, 8, 3)
33799451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt32, 12, 4)
33899451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt32, 16, 5)
33999451b44SJordan Rupprecht
34099451b44SJordan Rupprecht        bool_list = [True, True, False, False, True, False]
34199451b44SJordan Rupprecht
34299451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromSInt32Array(
34399451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), bool_list)
34499451b44SJordan Rupprecht        self.assertTrue(
34599451b44SJordan Rupprecht            data2.sint32[
34699451b44SJordan Rupprecht                0:6] == [
34799451b44SJordan Rupprecht                1,
34899451b44SJordan Rupprecht                1,
34999451b44SJordan Rupprecht                0,
35099451b44SJordan Rupprecht                0,
35199451b44SJordan Rupprecht                1,
35299451b44SJordan Rupprecht                0],
35399451b44SJordan Rupprecht            'signed32 data2 = [1, 1, 0, 0, 1, 0]')
35499451b44SJordan Rupprecht
35599451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromUInt32Array(
35699451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), bool_list)
35799451b44SJordan Rupprecht        self.assertTrue(
35899451b44SJordan Rupprecht            data2.uint32[
35999451b44SJordan Rupprecht                0:6] == [
36099451b44SJordan Rupprecht                1,
36199451b44SJordan Rupprecht                1,
36299451b44SJordan Rupprecht                0,
36399451b44SJordan Rupprecht                0,
36499451b44SJordan Rupprecht                1,
36599451b44SJordan Rupprecht                0],
36699451b44SJordan Rupprecht            'unsigned32 data2 = [1, 1, 0, 0, 1, 0]')
36799451b44SJordan Rupprecht
36899451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromSInt64Array(
36999451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), bool_list)
37099451b44SJordan Rupprecht        self.assertTrue(
37199451b44SJordan Rupprecht            data2.sint64[
37299451b44SJordan Rupprecht                0:6] == [
37399451b44SJordan Rupprecht                1,
37499451b44SJordan Rupprecht                1,
37599451b44SJordan Rupprecht                0,
37699451b44SJordan Rupprecht                0,
37799451b44SJordan Rupprecht                1,
37899451b44SJordan Rupprecht                0],
37999451b44SJordan Rupprecht            'signed64 data2 = [1, 1, 0, 0, 1, 0]')
38099451b44SJordan Rupprecht
38199451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromUInt64Array(
38299451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), bool_list)
38399451b44SJordan Rupprecht        self.assertTrue(
38499451b44SJordan Rupprecht            data2.uint64[
38599451b44SJordan Rupprecht                0:6] == [
38699451b44SJordan Rupprecht                1,
38799451b44SJordan Rupprecht                1,
38899451b44SJordan Rupprecht                0,
38999451b44SJordan Rupprecht                0,
39099451b44SJordan Rupprecht                1,
39199451b44SJordan Rupprecht                0],
39299451b44SJordan Rupprecht            'signed64 data2 = [1, 1, 0, 0, 1, 0]')
39399451b44SJordan Rupprecht
39499451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromDoubleArray(
39599451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), [
39699451b44SJordan Rupprecht                3.14, 6.28, 2.71])
39799451b44SJordan Rupprecht        self.assertTrue(
39899451b44SJordan Rupprecht            fabs(
39999451b44SJordan Rupprecht                data2.GetDouble(
40099451b44SJordan Rupprecht                    error,
40199451b44SJordan Rupprecht                    0) -
40299451b44SJordan Rupprecht                3.14) < 0.5,
40399451b44SJordan Rupprecht            'double data2[0] = 3.14')
404*779bbbf2SDave Lee        self.assertSuccess(error)
40599451b44SJordan Rupprecht        self.assertTrue(
40699451b44SJordan Rupprecht            fabs(
40799451b44SJordan Rupprecht                data2.GetDouble(
40899451b44SJordan Rupprecht                    error,
40999451b44SJordan Rupprecht                    8) -
41099451b44SJordan Rupprecht                6.28) < 0.5,
41199451b44SJordan Rupprecht            'double data2[1] = 6.28')
412*779bbbf2SDave Lee        self.assertSuccess(error)
41399451b44SJordan Rupprecht        self.assertTrue(
41499451b44SJordan Rupprecht            fabs(
41599451b44SJordan Rupprecht                data2.GetDouble(
41699451b44SJordan Rupprecht                    error,
41799451b44SJordan Rupprecht                    16) -
41899451b44SJordan Rupprecht                2.71) < 0.5,
41999451b44SJordan Rupprecht            'double data2[2] = 2.71')
420*779bbbf2SDave Lee        self.assertSuccess(error)
42199451b44SJordan Rupprecht
42299451b44SJordan Rupprecht        data2 = lldb.SBData()
42399451b44SJordan Rupprecht
42499451b44SJordan Rupprecht        data2.SetDataFromCString(hello_str)
425619e2e09SDave Lee        self.assertEqual(len(data2.uint8), len(hello_str))
42699451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 0, 104)
42799451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 1, 101)
42899451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 2, 108)
42999451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 3, 108)
43099451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 4, 111)
43199451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 5, 33)
43299451b44SJordan Rupprecht
43399451b44SJordan Rupprecht        data2.SetDataFromUInt64Array([1, 2, 3, 4, 5])
43499451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt64, 0, 1)
43599451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt64, 8, 2)
43699451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt64, 16, 3)
43799451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt64, 24, 4)
43899451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt64, 32, 5)
43999451b44SJordan Rupprecht
4400ed758b2SDave Lee        self.assertEqual(
4410ed758b2SDave Lee            data2.uint64[0], 1,
44299451b44SJordan Rupprecht            'read_data_helper failure: set data2[0] = 1')
4430ed758b2SDave Lee        self.assertEqual(
4440ed758b2SDave Lee            data2.uint64[1], 2,
44599451b44SJordan Rupprecht            'read_data_helper failure: set data2[1] = 2')
4460ed758b2SDave Lee        self.assertEqual(
4470ed758b2SDave Lee            data2.uint64[2], 3,
44899451b44SJordan Rupprecht            'read_data_helper failure: set data2[2] = 3')
4490ed758b2SDave Lee        self.assertEqual(
4500ed758b2SDave Lee            data2.uint64[3], 4,
45199451b44SJordan Rupprecht            'read_data_helper failure: set data2[3] = 4')
4520ed758b2SDave Lee        self.assertEqual(
4530ed758b2SDave Lee            data2.uint64[4], 5,
45499451b44SJordan Rupprecht            'read_data_helper failure: set data2[4] = 5')
45599451b44SJordan Rupprecht
45699451b44SJordan Rupprecht        self.assertTrue(
45799451b44SJordan Rupprecht            data2.uint64[
45899451b44SJordan Rupprecht                0:2] == [
45999451b44SJordan Rupprecht                1,
46099451b44SJordan Rupprecht                2],
46199451b44SJordan Rupprecht            'read_data_helper failure: set data2[0:2] = [1,2]')
46299451b44SJordan Rupprecht
46399451b44SJordan Rupprecht        data2.SetDataFromSInt32Array([2, -2])
46499451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt32, 0, 2)
46599451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt32, 4, -2)
46699451b44SJordan Rupprecht
46799451b44SJordan Rupprecht        data2.SetDataFromSInt64Array([2, -2])
46899451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt64, 0, 2)
46999451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt64, 8, -2)
47099451b44SJordan Rupprecht
47199451b44SJordan Rupprecht        data2.SetDataFromUInt32Array([1, 2, 3, 4, 5])
47299451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt32, 0, 1)
47399451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt32, 4, 2)
47499451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt32, 8, 3)
47599451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt32, 12, 4)
47699451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt32, 16, 5)
47799451b44SJordan Rupprecht
4780ed758b2SDave Lee        self.assertEqual(
4790ed758b2SDave Lee            data2.uint32[0], 1,
48099451b44SJordan Rupprecht            'read_data_helper failure: set 32-bit data2[0] = 1')
4810ed758b2SDave Lee        self.assertEqual(
4820ed758b2SDave Lee            data2.uint32[1], 2,
48399451b44SJordan Rupprecht            'read_data_helper failure: set 32-bit data2[1] = 2')
4840ed758b2SDave Lee        self.assertEqual(
4850ed758b2SDave Lee            data2.uint32[2], 3,
48699451b44SJordan Rupprecht            'read_data_helper failure: set 32-bit data2[2] = 3')
4870ed758b2SDave Lee        self.assertEqual(
4880ed758b2SDave Lee            data2.uint32[3], 4,
48999451b44SJordan Rupprecht            'read_data_helper failure: set 32-bit data2[3] = 4')
4900ed758b2SDave Lee        self.assertEqual(
4910ed758b2SDave Lee            data2.uint32[4], 5,
49299451b44SJordan Rupprecht            'read_data_helper failure: set 32-bit data2[4] = 5')
49399451b44SJordan Rupprecht
49499451b44SJordan Rupprecht        data2.SetDataFromDoubleArray([3.14, 6.28, 2.71])
49599451b44SJordan Rupprecht        self.assertTrue(fabs(data2.GetDouble(error, 0) - 3.14)
49699451b44SJordan Rupprecht                        < 0.5, 'set double data2[0] = 3.14')
49799451b44SJordan Rupprecht        self.assertTrue(fabs(data2.GetDouble(error, 8) - 6.28)
49899451b44SJordan Rupprecht                        < 0.5, 'set double data2[1] = 6.28')
49999451b44SJordan Rupprecht        self.assertTrue(fabs(data2.GetDouble(error, 16) - 2.71)
50099451b44SJordan Rupprecht                        < 0.5, 'set double data2[2] = 2.71')
50199451b44SJordan Rupprecht
50299451b44SJordan Rupprecht        self.assertTrue(
50399451b44SJordan Rupprecht            fabs(
50499451b44SJordan Rupprecht                data2.double[0] -
50599451b44SJordan Rupprecht                3.14) < 0.5,
50699451b44SJordan Rupprecht            'read_data_helper failure: set double data2[0] = 3.14')
50799451b44SJordan Rupprecht        self.assertTrue(
50899451b44SJordan Rupprecht            fabs(
50999451b44SJordan Rupprecht                data2.double[1] -
51099451b44SJordan Rupprecht                6.28) < 0.5,
51199451b44SJordan Rupprecht            'read_data_helper failure: set double data2[1] = 6.28')
51299451b44SJordan Rupprecht        self.assertTrue(
51399451b44SJordan Rupprecht            fabs(
51499451b44SJordan Rupprecht                data2.double[2] -
51599451b44SJordan Rupprecht                2.71) < 0.5,
51699451b44SJordan Rupprecht            'read_data_helper failure: set double data2[2] = 2.71')
51799451b44SJordan Rupprecht
51899451b44SJordan Rupprecht    def assert_data(self, func, arg, expected):
51999451b44SJordan Rupprecht        """ Asserts func(SBError error, arg) == expected. """
52099451b44SJordan Rupprecht        error = lldb.SBError()
52199451b44SJordan Rupprecht        result = func(error, arg)
52299451b44SJordan Rupprecht        if not error.Success():
52399451b44SJordan Rupprecht            stream = lldb.SBStream()
52499451b44SJordan Rupprecht            error.GetDescription(stream)
52599451b44SJordan Rupprecht            self.assertTrue(
52699451b44SJordan Rupprecht                error.Success(), "%s(error, %s) did not succeed: %s" %
52799451b44SJordan Rupprecht                (func.__name__, arg, stream.GetData()))
52899451b44SJordan Rupprecht        self.assertTrue(
52999451b44SJordan Rupprecht            expected == result, "%s(error, %s) == %s != %s" %
53099451b44SJordan Rupprecht            (func.__name__, arg, result, expected))
531