"""
Test lldb-mi startup options.
"""

from __future__ import print_function

import lldbmi_testcase
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil

import os

class MiStartupOptionsTestCase(lldbmi_testcase.MiTestCaseBase):

    mydir = TestBase.compute_mydir(__file__)

    @skipIfRemote   # We do not currently support remote debugging via the MI.
    @skipIfWindows  # llvm.org/pr24452: Get lldb-mi tests working on Windows
    @skipIfFreeBSD  # llvm.org/pr22411: Failure presumably due to known thread races
    @skipIfDarwin
    def test_lldbmi_executable_option_file(self):
        """Test that 'lldb-mi --interpreter %s' loads executable file."""

        self.spawnLldbMi(args="%s" % self.myexe)

        # Test that the executable is loaded when file was specified
        self.expect("-file-exec-and-symbols \"%s\"" % self.myexe)
        self.expect("\^done")

        # Test that lldb-mi is ready when executable was loaded
        self.expect(self.child_prompt, exactly=True)

        # Run to main
        self.runCmd("-break-insert -f main")
        self.expect("\^done,bkpt={number=\"1\"")
        self.runCmd("-exec-run")
        self.expect("\^running")
        self.expect("\*stopped,reason=\"breakpoint-hit\"")

        # Continue
        self.runCmd("-exec-continue")
        self.expect("\^running")
        self.expect("\*stopped,reason=\"exited-normally\"")

    @skipIfWindows  # llvm.org/pr24452: Get lldb-mi tests working on Windows
    @skipIfFreeBSD  # llvm.org/pr22411: Failure presumably due to known thread races
    @skipIfDarwin
    def test_lldbmi_executable_option_unknown_file(self):
        """Test that 'lldb-mi --interpreter %s' fails on unknown executable file."""

        # Prepare path to executable
        path = "unknown_file"

        self.spawnLldbMi(args="%s" % path)

        # Test that the executable isn't loaded when unknown file was specified
        self.expect("-file-exec-and-symbols \"%s\"" % path)
        self.expect(
            "\^error,msg=\"Command 'file-exec-and-symbols'. Target binary '%s' is invalid. error: unable to find executable for '%s'\"" %
            (path, path))

        # Test that lldb-mi is ready when executable was loaded
        self.expect(self.child_prompt, exactly=True)

    @skipIfRemote   # We do not currently support remote debugging via the MI.
    @skipIfWindows  # llvm.org/pr24452: Get lldb-mi tests working on Windows
    @skipIfFreeBSD  # llvm.org/pr22411: Failure presumably due to known thread races
    @skipIfDarwin
    def test_lldbmi_executable_option_absolute_path(self):
        """Test that 'lldb-mi --interpreter %s' loads executable which is specified via absolute path."""

        # Prepare path to executable
        self.spawnLldbMi(args="%s" % self.myexe)

        # Test that the executable is loaded when file was specified using
        # absolute path
        self.expect("-file-exec-and-symbols \"%s\"" % self.myexe)
        self.expect("\^done")

        # Test that lldb-mi is ready when executable was loaded
        self.expect(self.child_prompt, exactly=True)

        # Run
        self.runCmd("-exec-run")
        self.expect("\^running")
        self.expect("\*stopped,reason=\"exited-normally\"")

    @skipIfRemote   # We do not currently support remote debugging via the MI.
    @skipIfWindows  # llvm.org/pr24452: Get lldb-mi tests working on Windows
    @skipIfFreeBSD  # llvm.org/pr22411: Failure presumably due to known thread races
    @skipIfDarwin
    def test_lldbmi_executable_option_relative_path(self):
        """Test that 'lldb-mi --interpreter %s' loads executable which is specified via relative path."""

        # Prepare path to executable
        path = os.path.relpath(self.myexe, self.getBuildDir())
        self.spawnLldbMi(args="%s" % path)

        # Test that the executable is loaded when file was specified using
        # relative path
        self.expect("-file-exec-and-symbols \"%s\"" % path)
        self.expect("\^done")

        # Test that lldb-mi is ready when executable was loaded
        self.expect(self.child_prompt, exactly=True)

        # Run
        self.runCmd("-exec-run")
        self.expect("\^running")
        self.expect("\*stopped,reason=\"exited-normally\"")

    @skipIfWindows  # llvm.org/pr24452: Get lldb-mi tests working on Windows
    @skipIfFreeBSD  # llvm.org/pr22411: Failure presumably due to known thread races
    @skipIfDarwin
    def test_lldbmi_executable_option_unknown_path(self):
        """Test that 'lldb-mi --interpreter %s' fails on executable file which is specified via unknown path."""

        # Prepare path to executable
        path = "unknown_dir" + self.myexe

        self.spawnLldbMi(args="%s" % path)

        # Test that the executable isn't loaded when file was specified using
        # unknown path
        self.expect("-file-exec-and-symbols \"%s\"" % path)
        self.expect(
            "\^error,msg=\"Command 'file-exec-and-symbols'. Target binary '%s' is invalid. error: unable to find executable for '%s'\"" %
            (path, path))

        # Test that lldb-mi is ready when executable was loaded
        self.expect(self.child_prompt, exactly=True)

    def copyScript(self, sourceFile):
        """copy the script to builddir and replace a.out with the full path"""
        destFile = os.path.join(os.path.dirname(self.myexe),
                                sourceFile+'.script')
        with open(sourceFile, 'r') as src:
            with open(destFile, 'w+') as dest:
                dest.write(src.read().replace("a.out", self.myexe))
        return destFile

    @skipIfRemote   # We do not currently support remote debugging via the MI.
    @skipIfWindows  # llvm.org/pr24452: Get lldb-mi tests working on Windows
    @skipIfFreeBSD  # llvm.org/pr22411: Failure presumably due to known thread races
    @skipIfLinux  # llvm.org/pr22841: lldb-mi tests fail on all Linux buildbots
    @skipIfDarwin
    def test_lldbmi_source_option_start_script(self):
        """Test that 'lldb-mi --interpreter' can execute user's commands after initial commands were executed."""

        # Prepared source file
        sourceFile = self.copyScript("start_script")
        self.spawnLldbMi(args="--source %s" % sourceFile)

        # After '-file-exec-and-symbols a.out'
        self.expect("-file-exec-and-symbols %s" % self.myexe)
        self.expect("\^done")

        # After '-break-insert -f main'
        self.expect("-break-insert -f main")
        self.expect("\^done,bkpt={number=\"1\"")

        # After '-exec-run'
        self.expect("-exec-run")
        self.expect("\^running")
        self.expect("\*stopped,reason=\"breakpoint-hit\"")

        # After '-break-insert main.cpp:BP_return'
        line = line_number('main.cpp', '//BP_return')
        self.expect("-break-insert main.cpp:%d" % line)
        self.expect("\^done,bkpt={number=\"2\"")

        # After '-exec-continue'
        self.expect("-exec-continue")
        self.expect("\^running")
        self.expect("\*stopped,reason=\"breakpoint-hit\"")

        # Test that lldb-mi is ready after execution of --source start_script
        self.expect(self.child_prompt, exactly=True)

        # Try to evaluate 'a' expression
        self.runCmd("-data-evaluate-expression a")
        self.expect("\^done,value=\"10\"")
        self.expect(self.child_prompt, exactly=True)
        os.unlink(sourceFile)

    @skipIfRemote   # We do not currently support remote debugging via the MI.
    @skipIfWindows  # llvm.org/pr24452: Get lldb-mi tests working on Windows
    @skipIfFreeBSD  # llvm.org/pr22411: Failure presumably due to known thread races
    @skipIfLinux  # llvm.org/pr22841: lldb-mi tests fail on all Linux buildbots
    @skipIfDarwin
    def test_lldbmi_source_option_start_script_exit(self):
        """Test that 'lldb-mi --interpreter' can execute a prepared file which passed via --source option."""

        # Prepared source file
        sourceFile = self.copyScript("start_script_exit")
        self.spawnLldbMi(args="--source %s" % sourceFile)

        # After '-file-exec-and-symbols a.out'
        self.expect("-file-exec-and-symbols %s" % self.myexe)
        self.expect("\^done")

        # After '-break-insert -f main'
        self.expect("-break-insert -f main")
        self.expect("\^done,bkpt={number=\"1\"")

        # After '-exec-run'
        self.expect("-exec-run")
        self.expect("\^running")
        self.expect("\*stopped,reason=\"breakpoint-hit\"")

        # After '-break-insert main.cpp:BP_return'
        line = line_number('main.cpp', '//BP_return')
        self.expect("-break-insert main.cpp:%d" % line)
        self.expect("\^done,bkpt={number=\"2\"")

        # After '-exec-continue'
        self.expect("-exec-continue")
        self.expect("\^running")
        self.expect("\*stopped,reason=\"breakpoint-hit\"")

        # After '-data-evaluate-expression a'
        self.expect("-data-evaluate-expression a")
        self.expect("\^done,value=\"10\"")

        # After '-gdb-exit'
        self.expect("-gdb-exit")
        self.expect("\^exit")
        self.expect("\*stopped,reason=\"exited-normally\"")
        os.unlink(sourceFile)

    @skipIfWindows  # llvm.org/pr24452: Get lldb-mi tests working on Windows
    @skipIfFreeBSD  # llvm.org/pr22411: Failure presumably due to known thread races
    @skipIfDarwin
    def test_lldbmi_source_option_start_script_error(self):
        """Test that 'lldb-mi --interpreter' stops execution of initial commands in case of error."""

        # Prepared source file
        sourceFile = self.copyScript("start_script_error")
        self.spawnLldbMi(args="--source %s" % sourceFile)

        # After '-file-exec-and-symbols a.out'
        self.expect("-file-exec-and-symbols %s" % self.myexe)
        self.expect("\^done")

        # After '-break-ins -f main'
        self.expect("-break-ins -f main")
        self.expect("\^error")

        # Test that lldb-mi is ready after execution of --source start_script
        self.expect(self.child_prompt, exactly=True)
        os.unlink(sourceFile)

    @skipIfRemote   # We do not currently support remote debugging via the MI.
    @skipIfWindows  # llvm.org/pr24452: Get lldb-mi tests working on Windows
    @skipIfFreeBSD  # llvm.org/pr22411: Failure presumably due to known thread races
    @skipIfDarwin
    def test_lldbmi_log_option(self):
        """Test that 'lldb-mi --log' creates a log file in the current directory."""

        logDirectory = self.getBuildDir()
        self.spawnLldbMi(args="%s --log" % self.myexe)

        # Test that the executable is loaded when file was specified
        self.expect("-file-exec-and-symbols \"%s\"" % self.myexe)
        self.expect("\^done")

        # Test that lldb-mi is ready when executable was loaded
        self.expect(self.child_prompt, exactly=True)

        # Run
        self.runCmd("-exec-run")
        self.expect("\^running")
        self.expect("\*stopped,reason=\"exited-normally\"")

        # Check log file is created
        import glob
        import os
        logFile = glob.glob(logDirectory + "/lldb-mi-*.log")

        if not logFile:
            self.fail("log file not found")

        # Delete log
        for f in logFile:
            os.remove(f)

    @skipIfRemote   # We do not currently support remote debugging via the MI.
    @skipIfWindows  # llvm.org/pr24452: Get lldb-mi tests working on Windows
    @skipIfFreeBSD  # llvm.org/pr22411: Failure presumably due to known thread races
    @skipIfDarwin
    def test_lldbmi_log_directory_option(self):
        """Test that 'lldb-mi --log --log-dir' creates a log file in the directory specified by --log-dir."""

        # Create log in temp directory
        import tempfile
        logDirectory = tempfile.gettempdir()

        self.spawnLldbMi(
            args="%s --log --log-dir=%s" %
            (self.myexe, logDirectory))

        # Test that the executable is loaded when file was specified
        self.expect("-file-exec-and-symbols \"%s\"" % self.myexe)
        self.expect("\^done")

        # Test that lldb-mi is ready when executable was loaded
        self.expect(self.child_prompt, exactly=True)

        # Run
        self.runCmd("-exec-run")
        self.expect("\^running")
        self.expect("\*stopped,reason=\"exited-normally\"")

        # Check log file is created
        import glob
        import os
        logFile = glob.glob(logDirectory + "/lldb-mi-*.log")

        if not logFile:
            self.fail("log file not found")

        # Delete log
        for f in logFile:
            os.remove(f)
