import os
import shutil

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


class TestClangModuleUpdate(TestBase):
    SHARED_BUILD_TESTCASE = False

    @add_test_categories(["gmodules"])
    @skipIfDarwin  # rdar://76540904
    def test_expr(self):
        with open(self.getBuildArtifact("module.modulemap"), "w") as f:
            f.write(
                """
                    module Foo { header "f.h" }
                    """
            )
        with open(self.getBuildArtifact("f.h"), "w") as f:
            f.write(
                """
                    struct Q { int i; };
                    void f() {}
                    """
            )

        mod_cache = self.getBuildArtifact("private-module-cache")
        if os.path.isdir(mod_cache):
            shutil.rmtree(mod_cache)
        d = {"OBJC_SOURCES": "first.m"}
        self.build(dictionary=d)
        self.assertTrue(os.path.isdir(mod_cache), "module cache exists")

        logfile = self.getBuildArtifact("modules.log")
        self.runCmd("log enable -f %s lldb module" % logfile)
        target, process, _, bkpt = lldbutil.run_to_name_breakpoint(self, "main")
        self.assertIn("int i", str(target.FindTypes("Q").GetTypeAtIndex(0)))
        self.expect("image list -g", patterns=[r"first\.o", r"Foo.*\.pcm"])

        # Update the module.
        with open(self.getBuildArtifact("f.h"), "w") as f:
            f.write(
                """
                    struct S { int i; };
                    struct S getS() { struct S r = {1}; return r; }
                    void f() {}
                    """
            )

        # Rebuild.
        d = {"OBJC_SOURCES": "second.m"}
        self.build(dictionary=d)

        # Reattach.
        process.Kill()
        target, process, _, _ = lldbutil.run_to_breakpoint_do_run(self, target, bkpt)
        self.assertIn("int i", str(target.FindTypes("S").GetTypeAtIndex(0)))
        self.expect("image list -g", patterns=[r"second\.o", r"Foo.*\.pcm"])

        # Check log file.
        found = False
        with open(logfile, "r") as f:
            for line in f:
                if "module changed" in line and "Foo" in line:
                    found = True
        self.assertTrue(found)
