"""
Tests large source files are not locked on Windows when source cache is disabled
"""

import lldb
import os
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
from shutil import copy

class SettingsUseSourceCacheTestCase(TestBase):
    NO_DEBUG_INFO_TESTCASE = True

    def test_set_use_source_cache_false(self):
        """Test that after 'set use-source-cache false', files are not locked."""
        self.set_use_source_cache_and_test(False)

    @skipIf(hostoslist=no_match(["windows"]))
    @skipIf(oslist=['windows'], archs=['aarch64']) # Fails on windows 11
    def test_set_use_source_cache_true(self):
        """Test that after 'set use-source-cache false', files are locked."""
        self.set_use_source_cache_and_test(True)

    def set_use_source_cache_and_test(self, is_cache_enabled):
        """Common test for both True/False values of use-source-cache."""
        self.build()

        # Enable/Disable source cache
        self.runCmd(
                "settings set use-source-cache " +
                ("true" if is_cache_enabled else "false"))

        # Get paths for the main source file.
        src = self.getBuildArtifact("main-copy.cpp")
        self.assertTrue(src)

        # Make sure source file is bigger than 16K to trigger memory mapping
        self.assertGreater(os.stat(src).st_size, 4*4096)

        target, process, thread, breakpoint = lldbutil.run_to_name_breakpoint(
                self,
                "calc")

        # Show the source file contents to make sure LLDB loads src file.
        self.runCmd("source list")

        # Try deleting the source file.
        is_file_removed = self.removeFile(src)

        if is_cache_enabled:
            self.assertFalse(
                is_file_removed,
                "Source cache is enabled, but delete file succeeded")
        
        if not is_cache_enabled:
            self.assertTrue(
                is_file_removed,
                "Source cache is disabled, but delete file failed")

    def removeFile(self, src):
        """Remove file and return true iff file was successfully removed."""
        try:
            os.remove(src)
            return True
        except Exception:
            return False

