1e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton"""
2e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg ClaytonTest some lldb command abbreviations.
3e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton"""
4e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Claytonimport commands
5e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Claytonimport lldb
6e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Claytonimport os
7e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Claytonimport time
8e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Claytonimport unittest2
9e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Claytonfrom lldbtest import *
10e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Claytonimport lldbutil
11e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
12e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Claytondef execute_command (command):
136f742d291c17607c98df40c9c46c0f65706ad49cGreg Clayton    #print '%% %s' % (command)
14e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton    (exit_status, output) = commands.getstatusoutput (command)
156f742d291c17607c98df40c9c46c0f65706ad49cGreg Clayton    #if output:
166f742d291c17607c98df40c9c46c0f65706ad49cGreg Clayton    #    print output
176f742d291c17607c98df40c9c46c0f65706ad49cGreg Clayton    #print 'status = %u' % (exit_status)
18e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton    return exit_status
19e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
20e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Claytonclass ExecTestCase(TestBase):
21e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
22e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton    mydir = os.path.join("functionalities", "exec")
23e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
24e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
25e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
26e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton    @dsym_test
27e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton    def test_with_dsym (self):
28e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton        if self.getArchitecture() == 'x86_64':
29e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            source = os.path.join (os.getcwd(), "main.cpp")
30e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            o_file = os.path.join (os.getcwd(), "main.o")
31e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            execute_command ("'%s' -g -O0 -arch i386 -arch x86_64 '%s' -c -o '%s'" % (os.environ["CC"], source, o_file))
32e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            execute_command ("'%s' -g -O0 -arch i386 -arch x86_64 '%s'" % (os.environ["CC"], o_file))
33e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton        else:
34e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            self.buildDsym()
35e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton        self.do_test ()
36e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
37e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
38e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
39e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton    @dwarf_test
40e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton    def test_with_dwarf (self):
41e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton        if self.getArchitecture() == 'x86_64':
42e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            source = os.path.join (os.getcwd(), "main.cpp")
43e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            o_file = os.path.join (os.getcwd(), "main.o")
44e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            dsym_path = os.path.join (os.getcwd(), "a.out.dSYM")
45e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            execute_command ("'%s' -g -O0 -arch i386 -arch x86_64 '%s' -c -o '%s'" % (os.environ["CC"], source, o_file))
46e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            execute_command ("'%s' -g -O0 -arch i386 -arch x86_64 '%s'" % (os.environ["CC"], o_file))
47e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            execute_command ("rm -rf '%s'" % (dsym_path))
48e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton        else:
49e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            self.buildDwarf()
50e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton        self.do_test ()
51e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
52e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton    def do_test (self):
53e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton        exe = os.path.join (os.getcwd(), "a.out")
54e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
55e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton        # Create the target
56e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton        target = self.dbg.CreateTarget(exe)
57e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
58e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton        # Create any breakpoints we need
59e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton        breakpoint = target.BreakpointCreateBySourceRegex ('Set breakpoint 1 here', lldb.SBFileSpec ("main.cpp", False))
60e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton        self.assertTrue(breakpoint, VALID_BREAKPOINT)
61e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
62e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton        # Launch the process
63e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton        process = target.LaunchSimple(None, None, os.getcwd())
64e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton        self.assertTrue(process, PROCESS_IS_VALID)
65e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
66e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton        for i in range(6):
67e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            # The stop reason of the thread should be breakpoint.
68e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            self.assertTrue(process.GetState() == lldb.eStateStopped,
69e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton                            STOPPED_DUE_TO_BREAKPOINT)
70e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
71e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            thread = process.GetThreadAtIndex (0)
72e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
73e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            self.assertTrue (thread.IsValid(),
74e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton                             "Process stopped at 'main' should have a valid thread");
75e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
76e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            stop_reason = thread.GetStopReason()
77e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
78e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            self.assertTrue (stop_reason == lldb.eStopReasonBreakpoint,
79e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton                             "Thread in process stopped in 'main' should have a stop reason of eStopReasonBreakpoint");
80e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
81e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            # Run and we should stop due to exec
82e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            process.Continue()
83e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
84e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            self.assertTrue(process.GetState() == lldb.eStateStopped,
85e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton                            "Process should be stopped at __dyld_start")
86e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
87e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            thread = process.GetThreadAtIndex (0)
88e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
89e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            self.assertTrue (thread.IsValid(),
90e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton                             "Process stopped at exec should have a valid thread");
91e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
92e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            stop_reason = thread.GetStopReason()
93e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
94e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton            self.assertTrue (stop_reason == lldb.eStopReasonExec,
95e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton                             "Thread in process stopped on exec should have a stop reason of eStopReasonExec");
96e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
97e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton             # Run and we should stop at breakpoint in main after exec
986f742d291c17607c98df40c9c46c0f65706ad49cGreg Clayton            process.Continue()
99e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
100e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Claytonif __name__ == '__main__':
101e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton    import atexit
102e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton    lldb.SBDebugger.Initialize()
103e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton    atexit.register(lambda: lldb.SBDebugger.Terminate())
104e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton    unittest2.main()
105e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton
106