diff options
-rw-r--r-- | lib/spack/spack/test/util/file_cache.py | 21 | ||||
-rw-r--r-- | lib/spack/spack/util/file_cache.py | 3 |
2 files changed, 22 insertions, 2 deletions
diff --git a/lib/spack/spack/test/util/file_cache.py b/lib/spack/spack/test/util/file_cache.py index 024ce329b3..1b28cd760d 100644 --- a/lib/spack/spack/test/util/file_cache.py +++ b/lib/spack/spack/test/util/file_cache.py @@ -32,6 +32,27 @@ def test_write_and_read_cache_file(file_cache): assert text == "foobar\n" +@pytest.mark.skipif(sys.platform == "win32", reason="Locks not supported on Windows") +def test_failed_write_and_read_cache_file(file_cache): + """Test failing to write then attempting to read a cached file.""" + with pytest.raises(RuntimeError, match=r"^foobar$"): + with file_cache.write_transaction("test.yaml") as (old, new): + assert old is None + assert new is not None + raise RuntimeError("foobar") + + # Cache dir should have exactly one (lock) file + assert os.listdir(file_cache.root) == [".test.yaml.lock"] + + # File does not exist + assert not file_cache.init_entry("test.yaml") + + # Attempting to read will cause a FileNotFoundError + with pytest.raises(FileNotFoundError, match=r"test\.yaml"): + with file_cache.read_transaction("test.yaml"): + pass + + def test_write_and_remove_cache_file(file_cache): """Test two write transactions on a cached file. Then try to remove an entry from it. diff --git a/lib/spack/spack/util/file_cache.py b/lib/spack/spack/util/file_cache.py index 759d150045..dc89afdde7 100644 --- a/lib/spack/spack/util/file_cache.py +++ b/lib/spack/spack/util/file_cache.py @@ -144,8 +144,7 @@ class FileCache(object): cm.tmp_file.close() if value: - # remove tmp on exception & raise it - shutil.rmtree(cm.tmp_filename, True) + os.remove(cm.tmp_filename) else: rename(cm.tmp_filename, cm.orig_filename) |