"""
Test target commands: target.auto-install-main-executable.
"""

import socket
import time
import lldbgdbserverutils

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


class TestAutoInstallMainExecutable(TestBase):
    NO_DEBUG_INFO_TESTCASE = True
    SHARED_BUILD_TESTCASE = False

    @skipIfRemote
    @skipIfWindows  # This test is flaky on Windows
    def test_target_auto_install_main_executable(self):
        if lldbgdbserverutils.get_lldb_server_exe() is None:
            self.skipTest("lldb-server not found")
        self.build()

        hostname = socket.getaddrinfo("localhost", 0, proto=socket.IPPROTO_TCP)[0][4][0]
        listen_url = "[%s]:0" % hostname

        port_file = self.getBuildArtifact("port")
        commandline_args = [
            "platform",
            "--listen",
            listen_url,
            "--socket-file",
            port_file,
        ]
        self.spawnSubprocess(lldbgdbserverutils.get_lldb_server_exe(), commandline_args)

        socket_id = lldbutil.wait_for_file_on_target(self, port_file)

        new_platform = lldb.SBPlatform("remote-" + self.getPlatform())
        self.dbg.SetSelectedPlatform(new_platform)

        connect_url = "connect://[%s]:%s" % (hostname, socket_id)
        connect_opts = lldb.SBPlatformConnectOptions(connect_url)
        self.assertSuccess(new_platform.ConnectRemote(connect_opts))

        wd = self.getBuildArtifact("wd")
        os.mkdir(wd)
        new_platform.SetWorkingDirectory(wd)

        # Manually install the modified binary.
        src_device = lldb.SBFileSpec(self.getBuildArtifact("a.device.out"))
        dest = lldb.SBFileSpec(os.path.join(wd, "a.out"))
        self.assertSuccess(new_platform.Put(src_device, dest))

        # Test the default setting.
        self.expect(
            "settings show target.auto-install-main-executable",
            substrs=["target.auto-install-main-executable (boolean) = true"],
            msg="Default settings for target.auto-install-main-executable failed.",
        )

        # Disable the auto install.
        self.runCmd("settings set target.auto-install-main-executable false")
        self.expect(
            "settings show target.auto-install-main-executable",
            substrs=["target.auto-install-main-executable (boolean) = false"],
        )

        # Create the target with the original file.
        self.runCmd(
            "target create --remote-file %s %s "
            % (dest.fullpath, self.getBuildArtifact("a.out"))
        )

        self.expect("process launch", substrs=["exited with status = 74"])
