import tempfile
import gdbremote_testcase
from lldbsuite.test.lldbtest import *
from lldbsuite.test.decorators import *
from lldbgdbserverutils import *


class GdbRemoteCompletionTestCase(gdbremote_testcase.GdbRemoteTestCaseBase):
    SHARED_BUILD_TESTCASE = False

    def init_lldb_server(self):
        self.debug_monitor_exe = get_lldb_server_exe()
        if not self.debug_monitor_exe:
            self.skipTest("lldb-server exe not found")
        port_file = tempfile.NamedTemporaryFile().name
        commandline_args = ["platform", "--listen", "*:0", "--socket-file", port_file]
        server = self.spawnSubprocess(
            get_lldb_server_exe(), commandline_args, install_remote=False
        )
        self.assertIsNotNone(server)
        self.stub_hostname = "localhost"
        self.port = int(lldbutil.wait_for_file_on_target(self, port_file))
        self.sock = self.create_socket()
        self._server = Server(self.sock, server)

        self.do_handshake()

    def generate_hex_path(self, target):
        return str(os.path.join(self.getBuildDir(), target)).encode().hex()

    @skipIfRemote
    @add_test_categories(["llgs"])
    def test_autocomplete_path(self):
        self.build()
        self.init_lldb_server()

        # Test file-included completion when flag is set to 0.
        self.test_sequence.add_log_lines(
            [
                "read packet: $qPathComplete:0,{}#00".format(
                    self.generate_hex_path("main")
                ),
                "send packet: $M{},{}#00".format(
                    self.generate_hex_path("main.d"), self.generate_hex_path("main.o")
                ),
            ],
            True,
        )

        # Test directory-only completion when flag is set to 1.
        os.makedirs(os.path.join(self.getBuildDir(), "test"))
        self.test_sequence.add_log_lines(
            [
                "read packet: $qPathComplete:1,{}#00".format(
                    self.generate_hex_path("tes")
                ),
                "send packet: $M{}{}#00".format(
                    self.generate_hex_path("test"), os.path.sep.encode().hex()
                ),  # "test/" or "test\".
            ],
            True,
        )

        self.expect_gdbremote_sequence()
