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

class GdbRemoteCompletionTestCase(gdbremote_testcase.GdbRemoteTestCaseBase):
    mydir = TestBase.compute_mydir(__file__)

    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.add_no_ack_remote_stream()

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