"""
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")

    @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()

    @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,
                startstr = "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()

