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    @add_test_categories(['pyapi'])
248d31dd23SJonas Devlieghere    @skipIfReproducer # SBData::SetData is not instrumented.
2599451b44SJordan Rupprecht    def test_byte_order_and_address_byte_size(self):
2699451b44SJordan Rupprecht        """Test the SBData::SetData() to ensure the byte order and address
2799451b44SJordan Rupprecht        byte size are obeyed"""
2899451b44SJordan Rupprecht        addr_data = b'\x11\x22\x33\x44\x55\x66\x77\x88'
2999451b44SJordan Rupprecht        error = lldb.SBError()
3099451b44SJordan Rupprecht        data = lldb.SBData()
3199451b44SJordan Rupprecht        data.SetData(error, addr_data, lldb.eByteOrderBig, 4)
3299451b44SJordan Rupprecht        addr = data.GetAddress(error, 0)
33619e2e09SDave Lee        self.assertEqual(addr, 0x11223344);
3499451b44SJordan Rupprecht        data.SetData(error, addr_data, lldb.eByteOrderBig, 8)
3599451b44SJordan Rupprecht        addr = data.GetAddress(error, 0)
36619e2e09SDave Lee        self.assertEqual(addr, 0x1122334455667788);
3799451b44SJordan Rupprecht        data.SetData(error, addr_data, lldb.eByteOrderLittle, 4)
3899451b44SJordan Rupprecht        addr = data.GetAddress(error, 0)
39619e2e09SDave Lee        self.assertEqual(addr, 0x44332211);
4099451b44SJordan Rupprecht        data.SetData(error, addr_data, lldb.eByteOrderLittle, 8)
4199451b44SJordan Rupprecht        addr = data.GetAddress(error, 0)
42619e2e09SDave Lee        self.assertEqual(addr, 0x8877665544332211);
4399451b44SJordan Rupprecht
4499451b44SJordan Rupprecht    @add_test_categories(['pyapi'])
458d31dd23SJonas Devlieghere    @skipIfReproducer # SBData::SetData is not instrumented.
4699451b44SJordan Rupprecht    def test_with_run_command(self):
4799451b44SJordan Rupprecht        """Test the SBData APIs."""
4899451b44SJordan Rupprecht        self.build()
4999451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
5099451b44SJordan Rupprecht
5199451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
5299451b44SJordan Rupprecht            self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)
5399451b44SJordan Rupprecht
5499451b44SJordan Rupprecht        self.runCmd("run", RUN_SUCCEEDED)
5599451b44SJordan Rupprecht
5699451b44SJordan Rupprecht        # The stop reason of the thread should be breakpoint.
5799451b44SJordan Rupprecht        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
5899451b44SJordan Rupprecht                    substrs=['stopped',
5999451b44SJordan Rupprecht                             'stop reason = breakpoint'])
6099451b44SJordan Rupprecht
6199451b44SJordan Rupprecht        target = self.dbg.GetSelectedTarget()
6299451b44SJordan Rupprecht
6399451b44SJordan Rupprecht        process = target.GetProcess()
6499451b44SJordan Rupprecht
6599451b44SJordan Rupprecht        thread = lldbutil.get_stopped_thread(
6699451b44SJordan Rupprecht            process, lldb.eStopReasonBreakpoint)
6799451b44SJordan Rupprecht        self.assertIsNotNone(thread)
6899451b44SJordan Rupprecht
6999451b44SJordan Rupprecht        frame = thread.GetSelectedFrame()
7099451b44SJordan Rupprecht        foobar = frame.FindVariable('foobar')
7199451b44SJordan Rupprecht        self.assertTrue(foobar.IsValid())
7299451b44SJordan Rupprecht        data = foobar.GetPointeeData(0, 2)
7399451b44SJordan Rupprecht        offset = 0
7499451b44SJordan Rupprecht        error = lldb.SBError()
7599451b44SJordan Rupprecht
7699451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 1)
7799451b44SJordan Rupprecht        offset += 4
7899451b44SJordan Rupprecht        low = data.GetSignedInt16(error, offset)
7999451b44SJordan Rupprecht        self.assertTrue(error.Success())
8099451b44SJordan Rupprecht        offset += 2
8199451b44SJordan Rupprecht        high = data.GetSignedInt16(error, offset)
8299451b44SJordan Rupprecht        self.assertTrue(error.Success())
8399451b44SJordan Rupprecht        offset += 2
8499451b44SJordan Rupprecht        self.assertTrue(
8599451b44SJordan Rupprecht            (low == 9 and high == 0) or (
8699451b44SJordan Rupprecht                low == 0 and high == 9),
8799451b44SJordan Rupprecht            'foo[0].b == 9')
8899451b44SJordan Rupprecht        self.assertTrue(
8999451b44SJordan Rupprecht            fabs(
9099451b44SJordan Rupprecht                data.GetFloat(
9199451b44SJordan Rupprecht                    error,
9299451b44SJordan Rupprecht                    offset) -
9399451b44SJordan Rupprecht                3.14) < 1,
9499451b44SJordan Rupprecht            'foo[0].c == 3.14')
9599451b44SJordan Rupprecht        self.assertTrue(error.Success())
9699451b44SJordan Rupprecht        offset += 4
9799451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 8)
9899451b44SJordan Rupprecht        offset += 4
9999451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 5)
10099451b44SJordan Rupprecht        offset += 4
10199451b44SJordan Rupprecht
10299451b44SJordan Rupprecht        self.runCmd("n")
10399451b44SJordan Rupprecht
10499451b44SJordan Rupprecht        offset = 16
10599451b44SJordan Rupprecht
10699451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 5)
10799451b44SJordan Rupprecht
10899451b44SJordan Rupprecht        data = foobar.GetPointeeData(1, 1)
10999451b44SJordan Rupprecht
11099451b44SJordan Rupprecht        offset = 0
11199451b44SJordan Rupprecht
11299451b44SJordan Rupprecht        self.assert_data(data.GetSignedInt32, offset, 8)
11399451b44SJordan Rupprecht        offset += 4
11499451b44SJordan Rupprecht        self.assert_data(data.GetSignedInt32, offset, 7)
11599451b44SJordan Rupprecht        offset += 8
11699451b44SJordan Rupprecht        self.assertTrue(
11799451b44SJordan Rupprecht            data.GetUnsignedInt32(
11899451b44SJordan Rupprecht                error,
11999451b44SJordan Rupprecht                offset) == 0,
12099451b44SJordan Rupprecht            'do not read beyond end')
12199451b44SJordan Rupprecht        self.assertTrue(not error.Success())
12299451b44SJordan Rupprecht        error.Clear()  # clear the error for the next test
12399451b44SJordan Rupprecht
12499451b44SJordan Rupprecht        star_foobar = foobar.Dereference()
12599451b44SJordan Rupprecht        self.assertTrue(star_foobar.IsValid())
12699451b44SJordan Rupprecht
12799451b44SJordan Rupprecht        data = star_foobar.GetData()
12899451b44SJordan Rupprecht
12999451b44SJordan Rupprecht        offset = 0
13099451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 1)
13199451b44SJordan Rupprecht        offset += 4
13299451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 9)
13399451b44SJordan Rupprecht
13499451b44SJordan Rupprecht        foobar_addr = star_foobar.GetLoadAddress()
13599451b44SJordan Rupprecht        foobar_addr += 12
13699451b44SJordan Rupprecht
13799451b44SJordan Rupprecht        # http://llvm.org/bugs/show_bug.cgi?id=11579
13899451b44SJordan Rupprecht        # lldb::SBValue::CreateValueFromAddress does not verify SBType::GetPointerType succeeds
13999451b44SJordan Rupprecht        # This should not crash LLDB.
14099451b44SJordan Rupprecht        nothing = foobar.CreateValueFromAddress(
14199451b44SJordan Rupprecht            "nothing", foobar_addr, star_foobar.GetType().GetBasicType(
14299451b44SJordan Rupprecht                lldb.eBasicTypeInvalid))
14399451b44SJordan Rupprecht
14499451b44SJordan Rupprecht        new_foobar = foobar.CreateValueFromAddress(
14599451b44SJordan Rupprecht            "f00", foobar_addr, star_foobar.GetType())
14699451b44SJordan Rupprecht        self.assertTrue(new_foobar.IsValid())
14799451b44SJordan Rupprecht        data = new_foobar.GetData()
14899451b44SJordan Rupprecht
149619e2e09SDave Lee        self.assertEqual(data.uint32[0], 8, 'then foo[1].a == 8')
150619e2e09SDave Lee        self.assertEqual(data.uint32[1], 7, 'then foo[1].b == 7')
15199451b44SJordan Rupprecht        # exploiting that sizeof(uint32) == sizeof(float)
15299451b44SJordan Rupprecht        self.assertTrue(fabs(data.float[2] - 3.14) < 1, 'foo[1].c == 3.14')
15399451b44SJordan Rupprecht
15499451b44SJordan Rupprecht        self.runCmd("n")
15599451b44SJordan Rupprecht
15699451b44SJordan Rupprecht        offset = 0
15799451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 8)
15899451b44SJordan Rupprecht        offset += 4
15999451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 7)
16099451b44SJordan Rupprecht        offset += 4
16199451b44SJordan Rupprecht        self.assertTrue(
16299451b44SJordan Rupprecht            fabs(
16399451b44SJordan Rupprecht                data.GetFloat(
16499451b44SJordan Rupprecht                    error,
16599451b44SJordan Rupprecht                    offset) -
16699451b44SJordan Rupprecht                3.14) < 1,
16799451b44SJordan Rupprecht            'foo[1].c == 3.14')
16899451b44SJordan Rupprecht        self.assertTrue(error.Success())
16999451b44SJordan Rupprecht
17099451b44SJordan Rupprecht        data = new_foobar.GetData()
17199451b44SJordan Rupprecht
17299451b44SJordan Rupprecht        offset = 0
17399451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 8)
17499451b44SJordan Rupprecht        offset += 4
17599451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 7)
17699451b44SJordan Rupprecht        offset += 4
17799451b44SJordan Rupprecht        self.assertTrue(
17899451b44SJordan Rupprecht            fabs(
17999451b44SJordan Rupprecht                data.GetFloat(
18099451b44SJordan Rupprecht                    error,
18199451b44SJordan Rupprecht                    offset) -
18299451b44SJordan Rupprecht                6.28) < 1,
18399451b44SJordan Rupprecht            'foo[1].c == 6.28')
18499451b44SJordan Rupprecht        self.assertTrue(error.Success())
18599451b44SJordan Rupprecht
18699451b44SJordan Rupprecht        self.runCmd("n")
18799451b44SJordan Rupprecht
18899451b44SJordan Rupprecht        barfoo = frame.FindVariable('barfoo')
18999451b44SJordan Rupprecht
19099451b44SJordan Rupprecht        data = barfoo.GetData()
19199451b44SJordan Rupprecht        offset = 0
19299451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 1)
19399451b44SJordan Rupprecht        offset += 4
19499451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 2)
19599451b44SJordan Rupprecht        offset += 4
19699451b44SJordan Rupprecht        self.assertTrue(
19799451b44SJordan Rupprecht            fabs(
19899451b44SJordan Rupprecht                data.GetFloat(
19999451b44SJordan Rupprecht                    error,
20099451b44SJordan Rupprecht                    offset) -
20199451b44SJordan Rupprecht                3) < 1,
20299451b44SJordan Rupprecht            'barfoo[0].c == 3')
20399451b44SJordan Rupprecht        self.assertTrue(error.Success())
20499451b44SJordan Rupprecht        offset += 4
20599451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 4)
20699451b44SJordan Rupprecht        offset += 4
20799451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 5)
20899451b44SJordan Rupprecht        offset += 4
20999451b44SJordan Rupprecht        self.assertTrue(
21099451b44SJordan Rupprecht            fabs(
21199451b44SJordan Rupprecht                data.GetFloat(
21299451b44SJordan Rupprecht                    error,
21399451b44SJordan Rupprecht                    offset) -
21499451b44SJordan Rupprecht                6) < 1,
21599451b44SJordan Rupprecht            'barfoo[1].c == 6')
21699451b44SJordan Rupprecht        self.assertTrue(error.Success())
21799451b44SJordan Rupprecht
21899451b44SJordan Rupprecht        new_object = barfoo.CreateValueFromData(
21999451b44SJordan Rupprecht            "new_object", data, barfoo.GetType().GetBasicType(
22099451b44SJordan Rupprecht                lldb.eBasicTypeInt))
221619e2e09SDave Lee        self.assertEqual(new_object.GetValue(), "1", 'new_object == 1')
22299451b44SJordan Rupprecht
22399451b44SJordan Rupprecht        if data.GetByteOrder() == lldb.eByteOrderBig:
22499451b44SJordan Rupprecht            data.SetData(
22599451b44SJordan Rupprecht                error,
22699451b44SJordan Rupprecht                '\0\0\0A',
22799451b44SJordan Rupprecht                data.GetByteOrder(),
22899451b44SJordan Rupprecht                data.GetAddressByteSize())
22999451b44SJordan Rupprecht        else:
23099451b44SJordan Rupprecht            data.SetData(
23199451b44SJordan Rupprecht                error,
23299451b44SJordan Rupprecht                'A\0\0\0',
23399451b44SJordan Rupprecht                data.GetByteOrder(),
23499451b44SJordan Rupprecht                data.GetAddressByteSize())
23599451b44SJordan Rupprecht        self.assertTrue(error.Success())
23699451b44SJordan Rupprecht
23799451b44SJordan Rupprecht        data2 = lldb.SBData()
23899451b44SJordan Rupprecht        data2.SetData(
23999451b44SJordan Rupprecht            error,
24099451b44SJordan Rupprecht            'BCD',
24199451b44SJordan Rupprecht            data.GetByteOrder(),
24299451b44SJordan Rupprecht            data.GetAddressByteSize())
24399451b44SJordan Rupprecht        self.assertTrue(error.Success())
24499451b44SJordan Rupprecht
24599451b44SJordan Rupprecht        data.Append(data2)
24699451b44SJordan Rupprecht
24799451b44SJordan Rupprecht        # this breaks on EBCDIC
24899451b44SJordan Rupprecht        offset = 0
24999451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 65)
25099451b44SJordan Rupprecht        offset += 4
25199451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt8, offset, 66)
25299451b44SJordan Rupprecht        offset += 1
25399451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt8, offset, 67)
25499451b44SJordan Rupprecht        offset += 1
25599451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt8, offset, 68)
25699451b44SJordan Rupprecht        offset += 1
25799451b44SJordan Rupprecht
25899451b44SJordan Rupprecht        # check the new API calls introduced per LLVM llvm.org/prenhancement request
25999451b44SJordan Rupprecht        # 11619 (Allow creating SBData values from arrays or primitives in
26099451b44SJordan Rupprecht        # Python)
26199451b44SJordan Rupprecht
26299451b44SJordan Rupprecht        hello_str = "hello!"
26399451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromCString(
26499451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), hello_str)
265619e2e09SDave Lee        self.assertEqual(len(data2.uint8), len(hello_str))
266619e2e09SDave Lee        self.assertEqual(data2.uint8[0], 104, 'h == 104')
267619e2e09SDave Lee        self.assertEqual(data2.uint8[1], 101, 'e == 101')
268619e2e09SDave Lee        self.assertEqual(data2.uint8[2], 108, 'l == 108')
26999451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 3, 108)  # l
270619e2e09SDave Lee        self.assertEqual(data2.uint8[4], 111, 'o == 111')
27199451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 5, 33)  # !
27299451b44SJordan Rupprecht
27399451b44SJordan Rupprecht        uint_lists = [[1, 2, 3, 4, 5], [int(i) for i in [1, 2, 3, 4, 5]]]
27499451b44SJordan Rupprecht        int_lists = [[2, -2], [int(i) for i in [2, -2]]]
27599451b44SJordan Rupprecht
27699451b44SJordan Rupprecht        for l in uint_lists:
27799451b44SJordan Rupprecht            data2 = lldb.SBData.CreateDataFromUInt64Array(
27899451b44SJordan Rupprecht                process.GetByteOrder(), process.GetAddressByteSize(), l)
27999451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt64, 0, 1)
28099451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt64, 8, 2)
28199451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt64, 16, 3)
28299451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt64, 24, 4)
28399451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt64, 32, 5)
28499451b44SJordan Rupprecht
28599451b44SJordan Rupprecht            self.assertTrue(
28699451b44SJordan Rupprecht                data2.uint64s == [
28799451b44SJordan Rupprecht                    1,
28899451b44SJordan Rupprecht                    2,
28999451b44SJordan Rupprecht                    3,
29099451b44SJordan Rupprecht                    4,
29199451b44SJordan Rupprecht                    5],
29299451b44SJordan Rupprecht                'read_data_helper failure: data2 == [1,2,3,4,5]')
29399451b44SJordan Rupprecht
29499451b44SJordan Rupprecht        for l in int_lists:
29599451b44SJordan Rupprecht            data2 = lldb.SBData.CreateDataFromSInt32Array(
29699451b44SJordan Rupprecht                process.GetByteOrder(), process.GetAddressByteSize(), l)
29799451b44SJordan Rupprecht            self.assertTrue(
29899451b44SJordan Rupprecht                data2.sint32[
29999451b44SJordan Rupprecht                    0:2] == [
30099451b44SJordan Rupprecht                    2, -2], 'signed32 data2 = [2,-2]')
30199451b44SJordan Rupprecht
30299451b44SJordan Rupprecht        data2.Append(
30399451b44SJordan Rupprecht            lldb.SBData.CreateDataFromSInt64Array(
30499451b44SJordan Rupprecht                process.GetByteOrder(),
30599451b44SJordan Rupprecht                process.GetAddressByteSize(),
30699451b44SJordan Rupprecht                int_lists[0]))
30799451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt32, 0, 2)
30899451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt32, 4, -2)
30999451b44SJordan Rupprecht        self.assertTrue(
31099451b44SJordan Rupprecht            data2.sint64[
31199451b44SJordan Rupprecht                1:3] == [
31299451b44SJordan Rupprecht                2, -2], 'signed64 data2 = [2,-2]')
31399451b44SJordan Rupprecht
31499451b44SJordan Rupprecht        for l in int_lists:
31599451b44SJordan Rupprecht            data2 = lldb.SBData.CreateDataFromSInt64Array(
31699451b44SJordan Rupprecht                process.GetByteOrder(), process.GetAddressByteSize(), l)
31799451b44SJordan Rupprecht            self.assert_data(data2.GetSignedInt64, 0, 2)
31899451b44SJordan Rupprecht            self.assert_data(data2.GetSignedInt64, 8, -2)
31999451b44SJordan Rupprecht            self.assertTrue(
32099451b44SJordan Rupprecht                data2.sint64[
32199451b44SJordan Rupprecht                    0:2] == [
32299451b44SJordan Rupprecht                    2, -2], 'signed64 data2 = [2,-2]')
32399451b44SJordan Rupprecht
32499451b44SJordan Rupprecht        for l in uint_lists:
32599451b44SJordan Rupprecht            data2 = lldb.SBData.CreateDataFromUInt32Array(
32699451b44SJordan Rupprecht                process.GetByteOrder(), process.GetAddressByteSize(), l)
32799451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt32, 0, 1)
32899451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt32, 4, 2)
32999451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt32, 8, 3)
33099451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt32, 12, 4)
33199451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt32, 16, 5)
33299451b44SJordan Rupprecht
33399451b44SJordan Rupprecht        bool_list = [True, True, False, False, True, False]
33499451b44SJordan Rupprecht
33599451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromSInt32Array(
33699451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), bool_list)
33799451b44SJordan Rupprecht        self.assertTrue(
33899451b44SJordan Rupprecht            data2.sint32[
33999451b44SJordan Rupprecht                0:6] == [
34099451b44SJordan Rupprecht                1,
34199451b44SJordan Rupprecht                1,
34299451b44SJordan Rupprecht                0,
34399451b44SJordan Rupprecht                0,
34499451b44SJordan Rupprecht                1,
34599451b44SJordan Rupprecht                0],
34699451b44SJordan Rupprecht            'signed32 data2 = [1, 1, 0, 0, 1, 0]')
34799451b44SJordan Rupprecht
34899451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromUInt32Array(
34999451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), bool_list)
35099451b44SJordan Rupprecht        self.assertTrue(
35199451b44SJordan Rupprecht            data2.uint32[
35299451b44SJordan Rupprecht                0:6] == [
35399451b44SJordan Rupprecht                1,
35499451b44SJordan Rupprecht                1,
35599451b44SJordan Rupprecht                0,
35699451b44SJordan Rupprecht                0,
35799451b44SJordan Rupprecht                1,
35899451b44SJordan Rupprecht                0],
35999451b44SJordan Rupprecht            'unsigned32 data2 = [1, 1, 0, 0, 1, 0]')
36099451b44SJordan Rupprecht
36199451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromSInt64Array(
36299451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), bool_list)
36399451b44SJordan Rupprecht        self.assertTrue(
36499451b44SJordan Rupprecht            data2.sint64[
36599451b44SJordan Rupprecht                0:6] == [
36699451b44SJordan Rupprecht                1,
36799451b44SJordan Rupprecht                1,
36899451b44SJordan Rupprecht                0,
36999451b44SJordan Rupprecht                0,
37099451b44SJordan Rupprecht                1,
37199451b44SJordan Rupprecht                0],
37299451b44SJordan Rupprecht            'signed64 data2 = [1, 1, 0, 0, 1, 0]')
37399451b44SJordan Rupprecht
37499451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromUInt64Array(
37599451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), bool_list)
37699451b44SJordan Rupprecht        self.assertTrue(
37799451b44SJordan Rupprecht            data2.uint64[
37899451b44SJordan Rupprecht                0:6] == [
37999451b44SJordan Rupprecht                1,
38099451b44SJordan Rupprecht                1,
38199451b44SJordan Rupprecht                0,
38299451b44SJordan Rupprecht                0,
38399451b44SJordan Rupprecht                1,
38499451b44SJordan Rupprecht                0],
38599451b44SJordan Rupprecht            'signed64 data2 = [1, 1, 0, 0, 1, 0]')
38699451b44SJordan Rupprecht
38799451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromDoubleArray(
38899451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), [
38999451b44SJordan Rupprecht                3.14, 6.28, 2.71])
39099451b44SJordan Rupprecht        self.assertTrue(
39199451b44SJordan Rupprecht            fabs(
39299451b44SJordan Rupprecht                data2.GetDouble(
39399451b44SJordan Rupprecht                    error,
39499451b44SJordan Rupprecht                    0) -
39599451b44SJordan Rupprecht                3.14) < 0.5,
39699451b44SJordan Rupprecht            'double data2[0] = 3.14')
39799451b44SJordan Rupprecht        self.assertTrue(error.Success())
39899451b44SJordan Rupprecht        self.assertTrue(
39999451b44SJordan Rupprecht            fabs(
40099451b44SJordan Rupprecht                data2.GetDouble(
40199451b44SJordan Rupprecht                    error,
40299451b44SJordan Rupprecht                    8) -
40399451b44SJordan Rupprecht                6.28) < 0.5,
40499451b44SJordan Rupprecht            'double data2[1] = 6.28')
40599451b44SJordan Rupprecht        self.assertTrue(error.Success())
40699451b44SJordan Rupprecht        self.assertTrue(
40799451b44SJordan Rupprecht            fabs(
40899451b44SJordan Rupprecht                data2.GetDouble(
40999451b44SJordan Rupprecht                    error,
41099451b44SJordan Rupprecht                    16) -
41199451b44SJordan Rupprecht                2.71) < 0.5,
41299451b44SJordan Rupprecht            'double data2[2] = 2.71')
41399451b44SJordan Rupprecht        self.assertTrue(error.Success())
41499451b44SJordan Rupprecht
41599451b44SJordan Rupprecht        data2 = lldb.SBData()
41699451b44SJordan Rupprecht
41799451b44SJordan Rupprecht        data2.SetDataFromCString(hello_str)
418619e2e09SDave Lee        self.assertEqual(len(data2.uint8), len(hello_str))
41999451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 0, 104)
42099451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 1, 101)
42199451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 2, 108)
42299451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 3, 108)
42399451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 4, 111)
42499451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 5, 33)
42599451b44SJordan Rupprecht
42699451b44SJordan Rupprecht        data2.SetDataFromUInt64Array([1, 2, 3, 4, 5])
42799451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt64, 0, 1)
42899451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt64, 8, 2)
42999451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt64, 16, 3)
43099451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt64, 24, 4)
43199451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt64, 32, 5)
43299451b44SJordan Rupprecht
433*0ed758b2SDave Lee        self.assertEqual(
434*0ed758b2SDave Lee            data2.uint64[0], 1,
43599451b44SJordan Rupprecht            'read_data_helper failure: set data2[0] = 1')
436*0ed758b2SDave Lee        self.assertEqual(
437*0ed758b2SDave Lee            data2.uint64[1], 2,
43899451b44SJordan Rupprecht            'read_data_helper failure: set data2[1] = 2')
439*0ed758b2SDave Lee        self.assertEqual(
440*0ed758b2SDave Lee            data2.uint64[2], 3,
44199451b44SJordan Rupprecht            'read_data_helper failure: set data2[2] = 3')
442*0ed758b2SDave Lee        self.assertEqual(
443*0ed758b2SDave Lee            data2.uint64[3], 4,
44499451b44SJordan Rupprecht            'read_data_helper failure: set data2[3] = 4')
445*0ed758b2SDave Lee        self.assertEqual(
446*0ed758b2SDave Lee            data2.uint64[4], 5,
44799451b44SJordan Rupprecht            'read_data_helper failure: set data2[4] = 5')
44899451b44SJordan Rupprecht
44999451b44SJordan Rupprecht        self.assertTrue(
45099451b44SJordan Rupprecht            data2.uint64[
45199451b44SJordan Rupprecht                0:2] == [
45299451b44SJordan Rupprecht                1,
45399451b44SJordan Rupprecht                2],
45499451b44SJordan Rupprecht            'read_data_helper failure: set data2[0:2] = [1,2]')
45599451b44SJordan Rupprecht
45699451b44SJordan Rupprecht        data2.SetDataFromSInt32Array([2, -2])
45799451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt32, 0, 2)
45899451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt32, 4, -2)
45999451b44SJordan Rupprecht
46099451b44SJordan Rupprecht        data2.SetDataFromSInt64Array([2, -2])
46199451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt64, 0, 2)
46299451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt64, 8, -2)
46399451b44SJordan Rupprecht
46499451b44SJordan Rupprecht        data2.SetDataFromUInt32Array([1, 2, 3, 4, 5])
46599451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt32, 0, 1)
46699451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt32, 4, 2)
46799451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt32, 8, 3)
46899451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt32, 12, 4)
46999451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt32, 16, 5)
47099451b44SJordan Rupprecht
471*0ed758b2SDave Lee        self.assertEqual(
472*0ed758b2SDave Lee            data2.uint32[0], 1,
47399451b44SJordan Rupprecht            'read_data_helper failure: set 32-bit data2[0] = 1')
474*0ed758b2SDave Lee        self.assertEqual(
475*0ed758b2SDave Lee            data2.uint32[1], 2,
47699451b44SJordan Rupprecht            'read_data_helper failure: set 32-bit data2[1] = 2')
477*0ed758b2SDave Lee        self.assertEqual(
478*0ed758b2SDave Lee            data2.uint32[2], 3,
47999451b44SJordan Rupprecht            'read_data_helper failure: set 32-bit data2[2] = 3')
480*0ed758b2SDave Lee        self.assertEqual(
481*0ed758b2SDave Lee            data2.uint32[3], 4,
48299451b44SJordan Rupprecht            'read_data_helper failure: set 32-bit data2[3] = 4')
483*0ed758b2SDave Lee        self.assertEqual(
484*0ed758b2SDave Lee            data2.uint32[4], 5,
48599451b44SJordan Rupprecht            'read_data_helper failure: set 32-bit data2[4] = 5')
48699451b44SJordan Rupprecht
48799451b44SJordan Rupprecht        data2.SetDataFromDoubleArray([3.14, 6.28, 2.71])
48899451b44SJordan Rupprecht        self.assertTrue(fabs(data2.GetDouble(error, 0) - 3.14)
48999451b44SJordan Rupprecht                        < 0.5, 'set double data2[0] = 3.14')
49099451b44SJordan Rupprecht        self.assertTrue(fabs(data2.GetDouble(error, 8) - 6.28)
49199451b44SJordan Rupprecht                        < 0.5, 'set double data2[1] = 6.28')
49299451b44SJordan Rupprecht        self.assertTrue(fabs(data2.GetDouble(error, 16) - 2.71)
49399451b44SJordan Rupprecht                        < 0.5, 'set double data2[2] = 2.71')
49499451b44SJordan Rupprecht
49599451b44SJordan Rupprecht        self.assertTrue(
49699451b44SJordan Rupprecht            fabs(
49799451b44SJordan Rupprecht                data2.double[0] -
49899451b44SJordan Rupprecht                3.14) < 0.5,
49999451b44SJordan Rupprecht            'read_data_helper failure: set double data2[0] = 3.14')
50099451b44SJordan Rupprecht        self.assertTrue(
50199451b44SJordan Rupprecht            fabs(
50299451b44SJordan Rupprecht                data2.double[1] -
50399451b44SJordan Rupprecht                6.28) < 0.5,
50499451b44SJordan Rupprecht            'read_data_helper failure: set double data2[1] = 6.28')
50599451b44SJordan Rupprecht        self.assertTrue(
50699451b44SJordan Rupprecht            fabs(
50799451b44SJordan Rupprecht                data2.double[2] -
50899451b44SJordan Rupprecht                2.71) < 0.5,
50999451b44SJordan Rupprecht            'read_data_helper failure: set double data2[2] = 2.71')
51099451b44SJordan Rupprecht
51199451b44SJordan Rupprecht    def assert_data(self, func, arg, expected):
51299451b44SJordan Rupprecht        """ Asserts func(SBError error, arg) == expected. """
51399451b44SJordan Rupprecht        error = lldb.SBError()
51499451b44SJordan Rupprecht        result = func(error, arg)
51599451b44SJordan Rupprecht        if not error.Success():
51699451b44SJordan Rupprecht            stream = lldb.SBStream()
51799451b44SJordan Rupprecht            error.GetDescription(stream)
51899451b44SJordan Rupprecht            self.assertTrue(
51999451b44SJordan Rupprecht                error.Success(), "%s(error, %s) did not succeed: %s" %
52099451b44SJordan Rupprecht                (func.__name__, arg, stream.GetData()))
52199451b44SJordan Rupprecht        self.assertTrue(
52299451b44SJordan Rupprecht            expected == result, "%s(error, %s) == %s != %s" %
52399451b44SJordan Rupprecht            (func.__name__, arg, result, expected))
524