1"""
2Tests large source files are not locked on Windows when source cache is disabled
3"""
4
5import lldb
6import os
7from lldbsuite.test.decorators import *
8from lldbsuite.test.lldbtest import *
9from lldbsuite.test import lldbutil
10from shutil import copy
11
12class SettingsUseSourceCacheTestCase(TestBase):
13
14    mydir = TestBase.compute_mydir(__file__)
15    NO_DEBUG_INFO_TESTCASE = True
16
17    def test_set_use_source_cache_false(self):
18        """Test that after 'set use-source-cache false', files are not locked."""
19        self.set_use_source_cache_and_test(False)
20
21    @skipIf(hostoslist=no_match(["windows"]))
22    def test_set_use_source_cache_true(self):
23        """Test that after 'set use-source-cache false', files are locked."""
24        self.set_use_source_cache_and_test(True)
25
26    def set_use_source_cache_and_test(self, is_cache_enabled):
27        """Common test for both True/False values of use-source-cache."""
28        self.build()
29
30        # Enable/Disable source cache
31        self.runCmd(
32                "settings set use-source-cache " +
33                ("true" if is_cache_enabled else "false"))
34
35        # Get paths for the main source file.
36        src = self.getBuildArtifact("main-copy.cpp")
37        self.assertTrue(src)
38
39        # Make sure source file is bigger than 16K to trigger memory mapping
40        self.assertGreater(os.stat(src).st_size, 4*4096)
41
42        target, process, thread, breakpoint = lldbutil.run_to_name_breakpoint(
43                self,
44                "calc")
45
46        # Show the source file contents to make sure LLDB loads src file.
47        self.runCmd("source list")
48
49        # Try deleting the source file.
50        is_file_removed = self.removeFile(src)
51
52        if is_cache_enabled:
53            self.assertFalse(
54                is_file_removed,
55                "Source cache is enabled, but delete file succeeded")
56
57        if not is_cache_enabled:
58            self.assertTrue(
59                is_file_removed,
60                "Source cache is disabled, but delete file failed")
61
62    def removeFile(self, src):
63        """Remove file and return true iff file was successfully removed."""
64        try:
65            os.remove(src)
66            return True
67        except Exception:
68            return False
69
70