"""
Test lldb process launch flags.
"""
import os, time
import unittest2
import lldb
from lldbtest import *
class ProcessLaunchTestCase(TestBase):
mydir = os.path.join("functionalities", "process_launch")
def setUp(self):
# Call super's setUp().
TestBase.setUp(self)
# disable "There is a running process, kill it and restart?" prompt
self.runCmd("settings set auto-confirm true")
self.addTearDownHook(lambda: self.runCmd("settings clear auto-confirm"))
@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
@dsym_test
def test_io_with_dsym (self):
"""Test that process launch I/O redirection flags work properly."""
self.buildDsym ()
self.process_io_test ()
@dwarf_test
def test_io_with_dwarf (self):
"""Test that process launch I/O redirection flags work properly."""
self.buildDwarf ()
self.process_io_test ()
def process_io_test (self):
"""Test that process launch I/O redirection flags work properly."""
exe = os.path.join (os.getcwd(), "a.out")
self.expect("file " + exe,
patterns = [ "Current executable set to .*a.out" ])
in_file = os.path.join (os.getcwd(), "input-file.txt")
out_file = os.path.join (os.getcwd(), "output-test.out")
err_file = os.path.join (os.getcwd(), "output-test.err")
# Make sure the output files do not exist before launching the process
try:
os.remove (out_file)
except OSError:
pass
try:
os.remove (err_file)
except OSError:
pass
launch_command = "process launch -i " + in_file + " -o " + out_file + " -e " + err_file
self.expect (launch_command,
patterns = [ "Process .* launched: .*a.out" ])
success = True
err_msg = ""
# Check to see if the 'stdout' file was created
try:
out_f = open (out_file)
except IOError:
success = False
err_msg = err_msg + " ERROR: stdout file was not created.\n"
else:
# Check to see if the 'stdout' file contains the right output
line = out_f.readline ();
if line != "This should go to stdout.\n":
success = False
err_msg = err_msg + " ERROR: stdout file does not contain correct output.\n"
out_f.close();
# Try to delete the 'stdout' file
try:
os.remove (out_file)
except OSError:
pass
# Check to see if the 'stderr' file was created
try:
err_f = open (err_file)
except IOError:
success = False
err_msg = err_msg + " ERROR: stderr file was not created.\n"
else:
# Check to see if the 'stderr' file contains the right output
line = err_f.readline ()
if line != "This should go to stderr.\n":
success = False
err_msg = err_msg + " ERROR: stderr file does not contain correct output.\n\
"
err_f.close()
# Try to delete the 'stderr' file
try:
os.remove (err_file)
except OSError:
pass
if not success:
self.fail (err_msg)
d = {'CXX_SOURCES' : 'print_cwd.cpp'}
@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
@dsym_test
def test_set_working_dir_with_dsym (self):
"""Test that '-w dir' sets the working dir when running the inferior."""
self.buildDsym(dictionary=self.d)
self.setTearDownCleanup(self.d)
self.my_working_dir_test()
@skipIfFreeBSD # llvm.org/pr16684
@dwarf_test
def test_set_working_dir_with_dwarf (self):
"""Test that '-w dir' sets the working dir when running the inferior."""
self.buildDwarf(dictionary=self.d)
self.setTearDownCleanup(self.d)
self.my_working_dir_test()
# rdar://problem/9056462
# The process launch flag '-w' for setting the current working directory not working?
def my_working_dir_test (self):
"""Test that '-w dir' sets the working dir when running the inferior."""
exe = os.path.join (os.getcwd(), "a.out")
self.runCmd("file " + exe)
mywd = 'my_working_dir'
out_file_name = "my_working_dir_test.out"
err_file_name = "my_working_dir_test.err"
my_working_dir_path = os.path.join(os.getcwd(), mywd)
out_file_path = os.path.join(my_working_dir_path, out_file_name)
err_file_path = os.path.join(my_working_dir_path, err_file_name)
# Make sure the output files do not exist before launching the process
try:
os.remove (out_file_path)
os.remove (err_file_path)
except OSError:
pass
# Check that we get an error when we have a nonexisting path
launch_command = "process launch -w %s -o %s -e %s" % (my_working_dir_path + 'z',
out_file_path,
err_file_path)
self.expect(launch_command, error=True,
patterns = ["error:.* No such file or directory: %sz" % my_working_dir_path])
# Really launch the process
launch_command = "process launch -w %s -o %s -e %s" % (my_working_dir_path,
out_file_path,
err_file_path)
self.expect(launch_command,
patterns = [ "Process .* launched: .*a.out" ])
success = True
err_msg = ""
# Check to see if the 'stdout' file was created
try:
out_f = open(out_file_path)
except IOError:
success = False
err_msg = err_msg + "ERROR: stdout file was not created.\n"
else:
# Check to see if the 'stdout' file contains the right output
line = out_f.readline();
if self.TraceOn():
print "line:", line
if not re.search(mywd, line):
success = False
err_msg = err_msg + "The current working directory was not set correctly.\n"
out_f.close();
# Try to delete the 'stdout' and 'stderr' files
try:
os.remove(out_file_path)
os.remove(err_file_path)
pass
except OSError:
pass
if not success:
self.fail(err_msg)
if __name__ == '__main__':
import atexit
lldb.SBDebugger.Initialize()
atexit.register(lambda: lldb.SBDebugger.Terminate())
unittest2.main()