"""
Test some target commands: create, list, select, variable.
"""

import os
import stat
import tempfile

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


class targetCommandTestCase(TestBase):
    def setUp(self):
        # Call super's setUp().
        TestBase.setUp(self)
        # Find the line numbers for our breakpoints.
        self.line_b = line_number("b.c", "// Set break point at this line.")
        self.line_c = line_number("c.c", "// Set break point at this line.")

    def buildB(self):
        db = {"C_SOURCES": "b.c", "EXE": self.getBuildArtifact("b.out")}
        self.build(dictionary=db)
        self.addTearDownCleanup(dictionary=db)

    def buildAll(self):
        da = {"C_SOURCES": "a.c", "EXE": self.getBuildArtifact("a.out")}
        self.build(dictionary=da)
        self.addTearDownCleanup(dictionary=da)

        self.buildB()

        dc = {"C_SOURCES": "c.c", "EXE": self.getBuildArtifact("c.out")}
        self.build(dictionary=dc)
        self.addTearDownCleanup(dictionary=dc)

    def test_target_command(self):
        """Test some target commands: create, list, select."""
        self.buildAll()
        self.do_target_command()

    @skipIfDarwin  # Chained Fixups
    def test_target_variable_command(self):
        """Test 'target variable' command before and after starting the inferior."""
        d = {"C_SOURCES": "globals.c", "EXE": self.getBuildArtifact("globals")}
        self.build(dictionary=d)
        self.addTearDownCleanup(dictionary=d)

        self.do_target_variable_command("globals")

    @skipIfDarwin  # Chained Fixups
    def test_target_variable_command_no_fail(self):
        """Test 'target variable' command before and after starting the inferior."""
        d = {"C_SOURCES": "globals.c", "EXE": self.getBuildArtifact("globals")}
        self.build(dictionary=d)
        self.addTearDownCleanup(dictionary=d)

        self.do_target_variable_command_no_fail("globals")

    def do_target_command(self):
        """Exercise 'target create', 'target list', 'target select' commands."""
        exe_a = self.getBuildArtifact("a.out")
        exe_b = self.getBuildArtifact("b.out")
        exe_c = self.getBuildArtifact("c.out")

        self.runCmd("target list")
        output = self.res.GetOutput()
        if output.startswith("No targets"):
            # We start from index 0.
            base = 0
        else:
            # Find the largest index of the existing list.
            import re

            pattern = re.compile(r"target #(\d+):")
            for line in reversed(output.split(os.linesep)):
                match = pattern.search(line)
                if match:
                    # We will start from (index + 1) ....
                    base = int(match.group(1), 10) + 1
                    self.trace("base is:", base)
                    break

        self.runCmd("target create " + exe_a, CURRENT_EXECUTABLE_SET)
        self.runCmd("run", RUN_SUCCEEDED)

        self.runCmd("target create " + exe_b, CURRENT_EXECUTABLE_SET)
        lldbutil.run_break_set_by_file_and_line(
            self, "b.c", self.line_b, num_expected_locations=1, loc_exact=True
        )
        self.runCmd("run", RUN_SUCCEEDED)

        self.runCmd("target create " + exe_c, CURRENT_EXECUTABLE_SET)
        lldbutil.run_break_set_by_file_and_line(
            self, "c.c", self.line_c, num_expected_locations=1, loc_exact=True
        )
        self.runCmd("run", RUN_SUCCEEDED)

        self.runCmd("target list")

        self.runCmd("target select %d" % base)
        self.runCmd("thread backtrace")

        self.runCmd("target select %d" % (base + 2))
        self.expect(
            "thread backtrace",
            STOPPED_DUE_TO_BREAKPOINT,
            substrs=["stop reason = breakpoint", "c.c:%d" % self.line_c],
        )

        self.runCmd("target select %d" % (base + 1))
        self.expect(
            "thread backtrace",
            STOPPED_DUE_TO_BREAKPOINT,
            substrs=["stop reason = breakpoint", "b.c:%d" % self.line_b],
        )

        self.runCmd("target list")

    @no_debug_info_test
    def test_target_create_invalid_arch(self):
        exe = self.getBuildArtifact("a.out")
        self.expect(
            "target create {} --arch doesntexist".format(exe),
            error=True,
            patterns=["error: invalid triple 'doesntexist'"],
        )

    @no_debug_info_test
    def test_target_create_platform(self):
        self.buildB()
        exe = self.getBuildArtifact("b.out")
        self.expect("target create {} --platform host".format(exe))

    @no_debug_info_test
    def test_target_create_unsupported_platform(self):
        yaml = os.path.join(self.getSourceDir(), "bogus.yaml")
        exe = self.getBuildArtifact("bogus")
        self.yaml2obj(yaml, exe)
        self.expect(
            "target create {}".format(exe),
            error=True,
            patterns=["error: no matching platforms found for this file"],
        )

    @no_debug_info_test
    def test_target_create_invalid_platform(self):
        self.buildB()
        exe = self.getBuildArtifact("b.out")
        self.expect(
            "target create {} --platform doesntexist".format(exe),
            error=True,
            patterns=[
                'error: unable to find a plug-in for the platform named "doesntexist"'
            ],
        )

    def do_target_variable_command(self, exe_name):
        """Exercise 'target variable' command before and after starting the inferior."""
        self.runCmd("file " + self.getBuildArtifact(exe_name), CURRENT_EXECUTABLE_SET)

        self.expect(
            "target variable my_global_char",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["my_global_char", "'X'"],
        )
        self.expect(
            "target variable my_global_str",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["my_global_str", '"abc"'],
        )
        self.expect(
            "target variable my_static_int",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["my_static_int", "228"],
        )
        self.expect(
            "target variable my_global_str_ptr", matching=False, substrs=['"abc"']
        )
        self.expect(
            "target variable *my_global_str_ptr", matching=True, substrs=['"abc"']
        )
        self.expect(
            "target variable *my_global_str",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["a"],
        )

        self.runCmd("b main")
        self.runCmd("run")

        self.expect(
            "target variable my_global_str",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["my_global_str", '"abc"'],
        )
        self.expect(
            "target variable my_static_int",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["my_static_int", "228"],
        )
        self.expect(
            "target variable my_global_str_ptr", matching=False, substrs=['"abc"']
        )
        self.expect(
            "target variable *my_global_str_ptr", matching=True, substrs=['"abc"']
        )
        self.expect(
            "target variable *my_global_str",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["a"],
        )
        self.expect(
            "target variable my_global_char",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["my_global_char", "'X'"],
        )

        self.runCmd("c")

        self.expect(
            "target variable my_global_str",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["my_global_str", '"abc"'],
        )
        self.expect(
            "target variable my_static_int",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["my_static_int", "228"],
        )
        self.expect(
            "target variable my_global_str_ptr", matching=False, substrs=['"abc"']
        )
        self.expect(
            "target variable *my_global_str_ptr", matching=True, substrs=['"abc"']
        )
        self.expect(
            "target variable *my_global_str",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["a"],
        )
        self.expect(
            "target variable my_global_char",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["my_global_char", "'X'"],
        )

    def do_target_variable_command_no_fail(self, exe_name):
        """Exercise 'target variable' command before and after starting the inferior."""
        self.runCmd("file " + self.getBuildArtifact(exe_name), CURRENT_EXECUTABLE_SET)

        self.expect(
            "target variable my_global_char",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["my_global_char", "'X'"],
        )
        self.expect(
            "target variable my_global_str",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["my_global_str", '"abc"'],
        )
        self.expect(
            "target variable my_static_int",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["my_static_int", "228"],
        )
        self.expect(
            "target variable my_global_str_ptr", matching=False, substrs=['"abc"']
        )
        self.expect(
            "target variable *my_global_str_ptr", matching=True, substrs=['"abc"']
        )
        self.expect(
            "target variable *my_global_str",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["a"],
        )

        self.runCmd("b main")
        self.runCmd("run")

        # New feature: you don't need to specify the variable(s) to 'target vaiable'.
        # It will find all the global and static variables in the current
        # compile unit.
        self.expect(
            "target variable",
            ordered=False,
            substrs=[
                "my_global_char",
                "my_static_int",
                "my_global_str",
                "my_global_str_ptr",
            ],
        )

        self.expect(
            "target variable my_global_str",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["my_global_str", '"abc"'],
        )
        self.expect(
            "target variable my_static_int",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["my_static_int", "228"],
        )
        self.expect(
            "target variable my_global_str_ptr", matching=False, substrs=['"abc"']
        )
        self.expect(
            "target variable *my_global_str_ptr", matching=True, substrs=['"abc"']
        )
        self.expect(
            "target variable *my_global_str",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["a"],
        )
        self.expect(
            "target variable my_global_char",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["my_global_char", "'X'"],
        )

    @no_debug_info_test
    def test_target_stop_hook_disable_enable(self):
        self.buildB()
        self.runCmd("file " + self.getBuildArtifact("b.out"), CURRENT_EXECUTABLE_SET)

        self.expect(
            "target stop-hook disable 1",
            error=True,
            substrs=['unknown stop hook id: "1"'],
        )
        self.expect(
            "target stop-hook disable blub",
            error=True,
            substrs=['invalid stop hook id: "blub"'],
        )
        self.expect(
            "target stop-hook enable 1",
            error=True,
            substrs=['unknown stop hook id: "1"'],
        )
        self.expect(
            "target stop-hook enable blub",
            error=True,
            substrs=['invalid stop hook id: "blub"'],
        )

    @no_debug_info_test
    def test_target_stop_hook_delete(self):
        self.buildB()
        self.runCmd("file " + self.getBuildArtifact("b.out"), CURRENT_EXECUTABLE_SET)

        self.expect(
            "target stop-hook delete 1",
            error=True,
            substrs=['unknown stop hook id: "1"'],
        )
        self.expect(
            "target stop-hook delete blub",
            error=True,
            substrs=['invalid stop hook id: "blub"'],
        )

    @no_debug_info_test
    def test_target_list_args(self):
        self.expect(
            "target list blub",
            error=True,
            substrs=["'target list' doesn't take any arguments"],
        )

    @no_debug_info_test
    def test_target_select_no_index(self):
        self.expect(
            "target select",
            error=True,
            substrs=["'target select' takes a single argument: a target index"],
        )

    @no_debug_info_test
    def test_target_select_invalid_index(self):
        self.runCmd("target delete --all")
        self.expect(
            "target select 0",
            error=True,
            substrs=["index 0 is out of range since there are no active targets"],
        )
        self.buildB()
        self.runCmd("file " + self.getBuildArtifact("b.out"), CURRENT_EXECUTABLE_SET)
        self.expect(
            "target select 1",
            error=True,
            substrs=["index 1 is out of range, valid target indexes are 0 - 0"],
        )

    @no_debug_info_test
    def test_target_create_multiple_args(self):
        self.expect(
            "target create a b",
            error=True,
            substrs=["'target create' takes exactly one executable path"],
        )

    @skipIfWindowsAndNonEnglish
    @no_debug_info_test
    def test_target_create_nonexistent_core_file(self):
        self.expect(
            "target create -c doesntexist",
            error=True,
            patterns=[
                "Cannot open 'doesntexist'",
                ": (No such file or directory|The system cannot find the file specified)",
            ],
        )

    # Write only files don't seem to be supported on Windows.
    @skipIf(hostoslist=["windows"])
    @no_debug_info_test
    def test_target_create_unreadable_core_file(self):
        tf = tempfile.NamedTemporaryFile()
        os.chmod(tf.name, stat.S_IWRITE)
        self.expect(
            "target create -c '" + tf.name + "'",
            error=True,
            substrs=["Cannot open '", "': Permission denied"],
        )

    @skipIfWindowsAndNonEnglish
    @no_debug_info_test
    def test_target_create_nonexistent_sym_file(self):
        self.expect(
            "target create -s doesntexist doesntexisteither",
            error=True,
            patterns=[
                "Cannot open '",
                ": (No such file or directory|The system cannot find the file specified)",
            ],
        )

    @skipIf(hostoslist=["windows"])
    @no_debug_info_test
    def test_target_create_invalid_core_file(self):
        invalid_core_path = os.path.join(self.getSourceDir(), "invalid_core_file")
        self.expect(
            "target create -c '" + invalid_core_path + "'",
            error=True,
            substrs=["Unknown core file format '"],
        )

    # Write only files don't seem to be supported on Windows.
    @skipIf(hostoslist=["windows"])
    @no_debug_info_test
    def test_target_create_unreadable_sym_file(self):
        tf = tempfile.NamedTemporaryFile()
        os.chmod(tf.name, stat.S_IWRITE)
        self.expect(
            "target create -s '" + tf.name + "' no_exe",
            error=True,
            substrs=["Cannot open '", "': Permission denied"],
        )

    @no_debug_info_test
    def test_target_delete_all(self):
        self.buildAll()
        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
        self.runCmd("file " + self.getBuildArtifact("b.out"), CURRENT_EXECUTABLE_SET)
        self.expect("target delete --all")
        self.expect("target list", substrs=["No targets."])

    @no_debug_info_test
    def test_target_delete_by_index(self):
        self.buildAll()
        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
        self.runCmd("file " + self.getBuildArtifact("b.out"), CURRENT_EXECUTABLE_SET)
        self.runCmd("file " + self.getBuildArtifact("c.out"), CURRENT_EXECUTABLE_SET)
        self.expect(
            "target delete 3",
            error=True,
            substrs=["target index 3 is out of range, valid target indexes are 0 - 2"],
        )

        self.runCmd("target delete 1")
        self.expect("target list", matching=False, substrs=["b.out"])
        self.runCmd("target delete 1")
        self.expect("target list", matching=False, substrs=["c.out"])

        self.expect(
            "target delete 1",
            error=True,
            substrs=["target index 1 is out of range, the only valid index is 0"],
        )

        self.runCmd("target delete 0")
        self.expect("target list", matching=False, substrs=["a.out"])

        self.expect("target delete 0", error=True, substrs=["no targets to delete"])
        self.expect("target delete 1", error=True, substrs=["no targets to delete"])

    @no_debug_info_test
    def test_target_delete_by_index_multiple(self):
        self.buildAll()
        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
        self.runCmd("file " + self.getBuildArtifact("b.out"), CURRENT_EXECUTABLE_SET)
        self.runCmd("file " + self.getBuildArtifact("c.out"), CURRENT_EXECUTABLE_SET)

        self.expect(
            "target delete 0 1 2 3",
            error=True,
            substrs=["target index 3 is out of range, valid target indexes are 0 - 2"],
        )
        self.expect("target list", substrs=["a.out", "b.out", "c.out"])

        self.runCmd("target delete 0 1 2")
        self.expect("target list", matching=False, substrs=["a.out", "c.out"])

    @no_debug_info_test
    def test_target_delete_selected(self):
        self.buildAll()
        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
        self.runCmd("file " + self.getBuildArtifact("b.out"), CURRENT_EXECUTABLE_SET)
        self.runCmd("file " + self.getBuildArtifact("c.out"), CURRENT_EXECUTABLE_SET)
        self.runCmd("target select 1")
        self.runCmd("target delete")
        self.expect("target list", matching=False, substrs=["b.out"])
        self.runCmd("target delete")
        self.runCmd("target delete")
        self.expect("target list", substrs=["No targets."])
        self.expect(
            "target delete", error=True, substrs=["no target is currently selected"]
        )

    @no_debug_info_test
    def test_target_modules_search_paths_clear(self):
        self.buildB()
        self.runCmd("file " + self.getBuildArtifact("b.out"), CURRENT_EXECUTABLE_SET)
        self.runCmd("target modules search-paths add foo bar")
        self.runCmd("target modules search-paths add foz baz")
        self.runCmd("target modules search-paths clear")
        self.expect("target list", matching=False, substrs=["bar", "baz"])

    @no_debug_info_test
    def test_target_modules_search_paths_query(self):
        self.buildB()
        self.runCmd("file " + self.getBuildArtifact("b.out"), CURRENT_EXECUTABLE_SET)
        self.runCmd("target modules search-paths add foo bar")
        self.expect("target modules search-paths query foo", substrs=["bar"])
        # Query something that doesn't exist.
        self.expect("target modules search-paths query faz", substrs=["faz"])

        # Invalid arguments.
        self.expect(
            "target modules search-paths query faz baz",
            error=True,
            substrs=["query requires one argument"],
        )

    @no_debug_info_test
    @expectedFailureAll(
        oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56079"
    )
    def test_target_modules_type(self):
        self.buildB()
        self.runCmd("file " + self.getBuildArtifact("b.out"), CURRENT_EXECUTABLE_SET)
        self.expect(
            "target modules lookup --type int",
            substrs=["1 match found", 'name = "int"'],
        )
