1ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan"""
2ab8e00e51475b9148626bfdf99549b7ffc3d046dSean CallananSet the contents of variables and registers using raw data
3ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan"""
4ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
5ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callananimport os, time
6ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callananimport unittest2
7ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callananimport lldb
8ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callananfrom lldbtest import *
9ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callananimport lldbutil
10ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
11ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
12ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callananclass SetDataTestCase(TestBase):
13ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
14ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    mydir = os.path.join("functionalities", "set-data")
15ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
16ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    @dsym_test
17ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    def test_set_data_dsym(self):
18ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        """Test setting the contents of variables and registers using raw data."""
19ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        self.buildDsym()
20ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        self.setData()
21ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
22ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    def setData(self):
23ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        """Test setting objc breakpoints using '_regexp-break' and 'breakpoint set'."""
24ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        exe = os.path.join(os.getcwd(), "a.out")
25ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
26ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
27ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        self.runCmd("br s -p First");
28ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        self.runCmd("br s -p Second");
29ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
30ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        self.runCmd("run", RUN_SUCCEEDED)
31ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
32ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        self.expect("p myFoo.x", VARIABLES_DISPLAYED_CORRECTLY,
33ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            substrs = ['2'])
34ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
35ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        process = self.dbg.GetSelectedTarget().GetProcess()
36ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        frame = process.GetSelectedThread().GetFrameAtIndex(0)
37ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
38ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        x = frame.FindVariable("myFoo").GetChildMemberWithName("x")
39ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
40ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        my_data = lldb.SBData.CreateDataFromSInt32Array(lldb.eByteOrderLittle, 8, [4])
41ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        err = lldb.SBError()
42ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
43ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        self.assertTrue (x.SetData(my_data, err))
44ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
45ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        self.runCmd("continue")
46ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
47ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        self.expect("p myFoo.x", VARIABLES_DISPLAYED_CORRECTLY,
48ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            substrs = ['4'])
49ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
50ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        frame = process.GetSelectedThread().GetFrameAtIndex(0)
51ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
52ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        x = frame.FindVariable("string")
53ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
54ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        if process.GetAddressByteSize() == 8:
55ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            my_data = lldb.SBData.CreateDataFromUInt64Array(process.GetByteOrder(), 8, [0])
56ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        else:
57ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            my_data = lldb.SBData.CreateDataFromUInt32Array(process.GetByteOrder(), 4, [0])
58ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
59ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        err = lldb.SBError()
60ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
61ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        self.assertTrue (x.SetData(my_data, err))
62ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
63ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        self.expect("fr var -d run-target string", VARIABLES_DISPLAYED_CORRECTLY,
64ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            substrs = ['NSString *', 'nil'])
65ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
66ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callananif __name__ == '__main__':
67ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    import atexit
68ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    lldb.SBDebugger.Initialize()
69ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    atexit.register(lambda: lldb.SBDebugger.Terminate())
70ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    unittest2.main()
71