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


class GdbRemoteCompletionTestCase(gdbremote_testcase.GdbRemoteTestCaseBase):
    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()

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