import os
import tempfile
import unittest

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

# To be safe and portable, Unix domain socket paths should be kept at or below
# 108 characters on Linux, and around 104 characters on macOS:
MAX_SOCKET_PATH_LENGTH = 104


class MCPUnixSocketCommandTestCase(TestBase):
    @requirePOSIX
    @requireSocketPermission
    @skipIfRemote
    @no_debug_info_test
    def test_unix_socket(self):
        """
        Test if we can start an MCP protocol-server accepting unix sockets
        """

        temp_directory = tempfile.TemporaryDirectory()
        socket_file = os.path.join(temp_directory.name, "mcp.sock")

        if len(socket_file) >= MAX_SOCKET_PATH_LENGTH:
            self.skipTest(
                f"Socket path {socket_file} exceeds the {MAX_SOCKET_PATH_LENGTH} character limit"
            )

        self.expect(
            f"protocol-server start MCP accept://{socket_file}",
            startstr="MCP server started with connection listeners:",
            substrs=[f"unix-connect://{socket_file}"],
        )

        self.expect(
            "protocol-server get MCP",
            startstr="MCP server connection listeners:",
            substrs=[f"unix-connect://{socket_file}"],
        )

        self.runCmd("protocol-server stop MCP", check=False)
        self.expect(
            "protocol-server get MCP",
            error=True,
            substrs=["MCP server is not running"],
        )
