1ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice"""
2b94250fd6ca03a311353b592b6bd1b2b2f1c32f0Johnny ChenTest lldb process launch flags.
3ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice"""
4ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice
5ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Ticeimport os, time
6ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Ticeimport unittest2
7ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Ticeimport lldb
8ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Ticefrom lldbtest import *
9ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice
10803c97980675a9bcbb33802c3be65afff65cc301Johnny Chenclass ProcessLaunchTestCase(TestBase):
11ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice
12e2ac6dec08024429fcc8ef1646a435a732e5e94dJohnny Chen    mydir = os.path.join("functionalities", "process_launch")
13ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice
145ac8e153b1f434a200998862dd6d34b2bf119fbdDaniel Malea    def setUp(self):
155ac8e153b1f434a200998862dd6d34b2bf119fbdDaniel Malea        # Call super's setUp().
165ac8e153b1f434a200998862dd6d34b2bf119fbdDaniel Malea        TestBase.setUp(self)
175ac8e153b1f434a200998862dd6d34b2bf119fbdDaniel Malea        # disable "There is a running process, kill it and restart?" prompt
185ac8e153b1f434a200998862dd6d34b2bf119fbdDaniel Malea        self.runCmd("settings set auto-confirm true")
195ac8e153b1f434a200998862dd6d34b2bf119fbdDaniel Malea        self.addTearDownHook(lambda: self.runCmd("settings clear auto-confirm"))
205ac8e153b1f434a200998862dd6d34b2bf119fbdDaniel Malea
21ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
22a3ed7d834b0e0c6924ac95629e740682bbcd15baJohnny Chen    @dsym_test
23803c97980675a9bcbb33802c3be65afff65cc301Johnny Chen    def test_io_with_dsym (self):
247d71b1a274b3ba7bcc441326d661b2d69977d243Johnny Chen        """Test that process launch I/O redirection flags work properly."""
25ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        self.buildDsym ()
26ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        self.process_io_test ()
27ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice
28a3ed7d834b0e0c6924ac95629e740682bbcd15baJohnny Chen    @dwarf_test
29803c97980675a9bcbb33802c3be65afff65cc301Johnny Chen    def test_io_with_dwarf (self):
307d71b1a274b3ba7bcc441326d661b2d69977d243Johnny Chen        """Test that process launch I/O redirection flags work properly."""
31ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        self.buildDwarf ()
32ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        self.process_io_test ()
33ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice
34ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice    def process_io_test (self):
35b48dfa3f838a98bee8986b695ac154e7c6de55daCaroline Tice        """Test that process launch I/O redirection flags work properly."""
36ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        exe = os.path.join (os.getcwd(), "a.out")
37ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        self.expect("file " + exe,
38ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice                    patterns = [ "Current executable set to .*a.out" ])
39ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice
40ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice
41ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        in_file = os.path.join (os.getcwd(), "input-file.txt")
42ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        out_file = os.path.join (os.getcwd(), "output-test.out")
43ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        err_file = os.path.join (os.getcwd(), "output-test.err")
44ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice
45ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice
46ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        # Make sure the output files do not exist before launching the process
47ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        try:
48ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice            os.remove (out_file)
49ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        except OSError:
5025d88371101ab855df0acbbe487e92f7a4b4a3eaJohnny Chen            pass
51ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice
52ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        try:
53ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice            os.remove (err_file)
54ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        except OSError:
5525d88371101ab855df0acbbe487e92f7a4b4a3eaJohnny Chen            pass
56ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice
57ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        launch_command = "process launch -i " + in_file + " -o " + out_file + " -e " + err_file
58a9dd2a05aa06f9f459ae71b4bde8d1029993d147Filipe Cabecinhas
59ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        self.expect (launch_command,
60ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice                     patterns = [ "Process .* launched: .*a.out" ])
61ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice
62ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice
63ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        success = True
64ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        err_msg = ""
65ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice
66ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        # Check to see if the 'stdout' file was created
67ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        try:
68ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice            out_f = open (out_file)
69ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        except IOError:
70ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice            success = False
71ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice            err_msg = err_msg + "   ERROR: stdout file was not created.\n"
72ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        else:
73ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice            # Check to see if the 'stdout' file contains the right output
74ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice            line = out_f.readline ();
75ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice            if line != "This should go to stdout.\n":
76ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice                success = False
77ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice                err_msg = err_msg + "    ERROR: stdout file does not contain correct output.\n"
78ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice                out_f.close();
79a9dd2a05aa06f9f459ae71b4bde8d1029993d147Filipe Cabecinhas
80ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        # Try to delete the 'stdout' file
81ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        try:
82ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice            os.remove (out_file)
83ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        except OSError:
8425d88371101ab855df0acbbe487e92f7a4b4a3eaJohnny Chen            pass
85ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice
86ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        # Check to see if the 'stderr' file was created
87ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        try:
88ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice            err_f = open (err_file)
89ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        except IOError:
90ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice            success = False
91ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice            err_msg = err_msg + "     ERROR:  stderr file was not created.\n"
92ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        else:
93ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice            # Check to see if the 'stderr' file contains the right output
94ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice            line = err_f.readline ()
95ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice            if line != "This should go to stderr.\n":
96ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice                success = False
97ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice                err_msg = err_msg + "    ERROR: stderr file does not contain correct output.\n\
98ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice"
99ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice                err_f.close()
100ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice
101ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        # Try to delete the 'stderr' file
102ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        try:
103ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice            os.remove (err_file)
104ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        except OSError:
10525d88371101ab855df0acbbe487e92f7a4b4a3eaJohnny Chen            pass
106ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice
107ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice        if not success:
108ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice            self.fail (err_msg)
109ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice
110da9ab6f9e8ad1751e6f9aab402d2abf914948638Johnny Chen    d = {'CXX_SOURCES' : 'print_cwd.cpp'}
111a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen
112a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
113a3ed7d834b0e0c6924ac95629e740682bbcd15baJohnny Chen    @dsym_test
114a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen    def test_set_working_dir_with_dsym (self):
1157d71b1a274b3ba7bcc441326d661b2d69977d243Johnny Chen        """Test that '-w dir' sets the working dir when running the inferior."""
116da9ab6f9e8ad1751e6f9aab402d2abf914948638Johnny Chen        self.buildDsym(dictionary=self.d)
117da9ab6f9e8ad1751e6f9aab402d2abf914948638Johnny Chen        self.setTearDownCleanup(self.d)
118a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen        self.my_working_dir_test()
119a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen
1204514d505ac2ca9c2a05136fa3b586a867412b8adEd Maste    @skipIfFreeBSD # llvm.org/pr16684
121a3ed7d834b0e0c6924ac95629e740682bbcd15baJohnny Chen    @dwarf_test
122a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen    def test_set_working_dir_with_dwarf (self):
1237d71b1a274b3ba7bcc441326d661b2d69977d243Johnny Chen        """Test that '-w dir' sets the working dir when running the inferior."""
124da9ab6f9e8ad1751e6f9aab402d2abf914948638Johnny Chen        self.buildDwarf(dictionary=self.d)
125da9ab6f9e8ad1751e6f9aab402d2abf914948638Johnny Chen        self.setTearDownCleanup(self.d)
126a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen        self.my_working_dir_test()
127a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen
128a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen    # rdar://problem/9056462
129a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen    # The process launch flag '-w' for setting the current working directory not working?
130a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen    def my_working_dir_test (self):
131a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen        """Test that '-w dir' sets the working dir when running the inferior."""
132a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen        exe = os.path.join (os.getcwd(), "a.out")
133a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen        self.runCmd("file " + exe)
134a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen
135a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen        mywd = 'my_working_dir'
136a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen        out_file_name = "my_working_dir_test.out"
1374c6a752b2c729e624c2f2b53d786c48432f4cfa7Johnny Chen        err_file_name = "my_working_dir_test.err"
138a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen
139a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen        my_working_dir_path = os.path.join(os.getcwd(), mywd)
140a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen        out_file_path = os.path.join(my_working_dir_path, out_file_name)
1414c6a752b2c729e624c2f2b53d786c48432f4cfa7Johnny Chen        err_file_path = os.path.join(my_working_dir_path, err_file_name)
142a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen
143a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen        # Make sure the output files do not exist before launching the process
144a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen        try:
145a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen            os.remove (out_file_path)
1464c6a752b2c729e624c2f2b53d786c48432f4cfa7Johnny Chen            os.remove (err_file_path)
147a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen        except OSError:
148a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen            pass
149a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen
150a9dd2a05aa06f9f459ae71b4bde8d1029993d147Filipe Cabecinhas        # Check that we get an error when we have a nonexisting path
151a9dd2a05aa06f9f459ae71b4bde8d1029993d147Filipe Cabecinhas        launch_command = "process launch -w %s -o %s -e %s" % (my_working_dir_path + 'z',
152a9dd2a05aa06f9f459ae71b4bde8d1029993d147Filipe Cabecinhas                                                               out_file_path,
153a9dd2a05aa06f9f459ae71b4bde8d1029993d147Filipe Cabecinhas                                                               err_file_path)
154a9dd2a05aa06f9f459ae71b4bde8d1029993d147Filipe Cabecinhas
155a9dd2a05aa06f9f459ae71b4bde8d1029993d147Filipe Cabecinhas        self.expect(launch_command, error=True,
1561e44fddf7f0c75b275bea0d5a55b4be01240c01aDaniel Malea                patterns = ["error:.* No such file or directory: %sz" % my_working_dir_path])
157a9dd2a05aa06f9f459ae71b4bde8d1029993d147Filipe Cabecinhas
158a9dd2a05aa06f9f459ae71b4bde8d1029993d147Filipe Cabecinhas        # Really launch the process
159d4d4e09b0dddc7cbfc95bd77c251c092e9ae1f1aJohnny Chen        launch_command = "process launch -w %s -o %s -e %s" % (my_working_dir_path,
160d4d4e09b0dddc7cbfc95bd77c251c092e9ae1f1aJohnny Chen                                                               out_file_path,
161d4d4e09b0dddc7cbfc95bd77c251c092e9ae1f1aJohnny Chen                                                               err_file_path)
162a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen
163a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen        self.expect(launch_command,
164a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen                    patterns = [ "Process .* launched: .*a.out" ])
165a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen
166a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen        success = True
167a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen        err_msg = ""
168a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen
169a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen        # Check to see if the 'stdout' file was created
170a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen        try:
171a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen            out_f = open(out_file_path)
172a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen        except IOError:
173a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen            success = False
174a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen            err_msg = err_msg + "ERROR: stdout file was not created.\n"
175a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen        else:
176a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen            # Check to see if the 'stdout' file contains the right output
177a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen            line = out_f.readline();
1788c2fd48f058d7a5778b0e24fc5a1f316bb1de254Johnny Chen            if self.TraceOn():
1798c2fd48f058d7a5778b0e24fc5a1f316bb1de254Johnny Chen                print "line:", line
180a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen            if not re.search(mywd, line):
181a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen                success = False
182a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen                err_msg = err_msg + "The current working directory was not set correctly.\n"
183a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen                out_f.close();
184a9dd2a05aa06f9f459ae71b4bde8d1029993d147Filipe Cabecinhas
1854c6a752b2c729e624c2f2b53d786c48432f4cfa7Johnny Chen        # Try to delete the 'stdout' and 'stderr' files
186a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen        try:
187a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen            os.remove(out_file_path)
1884c6a752b2c729e624c2f2b53d786c48432f4cfa7Johnny Chen            os.remove(err_file_path)
189a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen            pass
190a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen        except OSError:
191a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen            pass
192a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen
193a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen        if not success:
194a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen            self.fail(err_msg)
195a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen
196a29321a5e6ff1da27d54e8a32a853f3680f00a18Johnny Chen
197ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Ticeif __name__ == '__main__':
198ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice    import atexit
199ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice    lldb.SBDebugger.Initialize()
200ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice    atexit.register(lambda: lldb.SBDebugger.Terminate())
201ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice    unittest2.main()
202ebf1ece5e348b78dd9ceca812977a20321fe4e96Caroline Tice
203