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