فهرست منبع

Merge pull request #7735 from ThomasWaldmann/tests-with-env-var

tests: remove usage of environment_variable context manager, fixes #1002
TW 1 سال پیش
والد
کامیت
5babcf475c

+ 0 - 21
src/borg/testsuite/__init__.py

@@ -383,27 +383,6 @@ class changedir:
         os.chdir(self.old)
         os.chdir(self.old)
 
 
 
 
-class environment_variable:
-    def __init__(self, **values):
-        self.values = values
-        self.old_values = {}
-
-    def __enter__(self):
-        for k, v in self.values.items():
-            self.old_values[k] = os.environ.get(k)
-            if v is None:
-                os.environ.pop(k, None)
-            else:
-                os.environ[k] = v
-
-    def __exit__(self, *args, **kw):
-        for k, v in self.old_values.items():
-            if v is None:
-                os.environ.pop(k, None)
-            else:
-                os.environ[k] = v
-
-
 class FakeInputs:
 class FakeInputs:
     """Simulate multiple user inputs, can be used as input() replacement"""
     """Simulate multiple user inputs, can be used as input() replacement"""
 
 

+ 3 - 4
src/borg/testsuite/archiver/benchmark_cmd.py

@@ -1,9 +1,8 @@
 from ...constants import *  # NOQA
 from ...constants import *  # NOQA
-from .. import environment_variable
 from . import cmd, RK_ENCRYPTION
 from . import cmd, RK_ENCRYPTION
 
 
 
 
-def test_benchmark_crud(archiver):
+def test_benchmark_crud(archiver, monkeypatch):
     cmd(archiver, "rcreate", RK_ENCRYPTION)
     cmd(archiver, "rcreate", RK_ENCRYPTION)
-    with environment_variable(_BORG_BENCHMARK_CRUD_TEST="YES"):
-        cmd(archiver, "benchmark", "crud", archiver.input_path)
+    monkeypatch.setenv("_BORG_BENCHMARK_CRUD_TEST", "YES")
+    cmd(archiver, "benchmark", "crud", archiver.input_path)

+ 27 - 24
src/borg/testsuite/archiver/checks.py

@@ -15,7 +15,7 @@ from ...manifest import Manifest, MandatoryFeatureUnsupported
 from ...remote import RemoteRepository, PathNotAllowed
 from ...remote import RemoteRepository, PathNotAllowed
 from ...repository import Repository
 from ...repository import Repository
 from .. import llfuse
 from .. import llfuse
-from .. import changedir, environment_variable
+from .. import changedir
 from . import cmd, _extract_repository_id, open_repository, check_cache, create_test_files, create_src_archive
 from . import cmd, _extract_repository_id, open_repository, check_cache, create_test_files, create_src_archive
 from . import _set_repository_id, create_regular_file, assert_creates_file, generate_archiver_tests, RK_ENCRYPTION
 from . import _set_repository_id, create_regular_file, assert_creates_file, generate_archiver_tests, RK_ENCRYPTION
 
 
@@ -123,7 +123,7 @@ def test_repository_swap_detection2_no_cache(archivers, request):
             cmd(archiver, "create", "test.2", "input")
             cmd(archiver, "create", "test.2", "input")
 
 
 
 
-def test_repository_swap_detection_repokey_blank_passphrase(archivers, request):
+def test_repository_swap_detection_repokey_blank_passphrase(archivers, request, monkeypatch):
     archiver = request.getfixturevalue(archivers)
     archiver = request.getfixturevalue(archivers)
     # Check that a repokey repo with a blank passphrase is considered like a plaintext repo.
     # Check that a repokey repo with a blank passphrase is considered like a plaintext repo.
     create_test_files(archiver.input_path)
     create_test_files(archiver.input_path)
@@ -132,30 +132,33 @@ def test_repository_swap_detection_repokey_blank_passphrase(archivers, request):
     cmd(archiver, "create", "test", "input")
     cmd(archiver, "create", "test", "input")
     # Attacker replaces it with her own repository, which is encrypted but has no passphrase set
     # Attacker replaces it with her own repository, which is encrypted but has no passphrase set
     shutil.rmtree(archiver.repository_path)
     shutil.rmtree(archiver.repository_path)
-    with environment_variable(BORG_PASSPHRASE=""):
-        cmd(archiver, "rcreate", RK_ENCRYPTION)
-        # Delete cache & security database, AKA switch to user perspective
-        cmd(archiver, "rdelete", "--cache-only")
-        shutil.rmtree(get_security_directory(archiver.repository_path))
-    with environment_variable(BORG_PASSPHRASE=None):
-        # This is the part were the user would be tricked, e.g. she assumes that BORG_PASSPHRASE
-        # is set, while it isn't. Previously this raised no warning,
-        # since the repository is, technically, encrypted.
-        if archiver.FORK_DEFAULT:
-            cmd(archiver, "create", "test.2", "input", exit_code=EXIT_ERROR)
-        else:
-            with pytest.raises(Cache.CacheInitAbortedError):
-                cmd(archiver, "create", "test.2", "input")
-
-
-def test_repository_move(archivers, request):
+
+    monkeypatch.setenv("BORG_PASSPHRASE", "")
+    cmd(archiver, "rcreate", RK_ENCRYPTION)
+    # Delete cache & security database, AKA switch to user perspective
+    cmd(archiver, "rdelete", "--cache-only")
+    shutil.rmtree(get_security_directory(archiver.repository_path))
+
+    monkeypatch.delenv("BORG_PASSPHRASE")
+    # This is the part were the user would be tricked, e.g. she assumes that BORG_PASSPHRASE
+    # is set, while it isn't. Previously this raised no warning,
+    # since the repository is, technically, encrypted.
+    if archiver.FORK_DEFAULT:
+        cmd(archiver, "create", "test.2", "input", exit_code=EXIT_ERROR)
+    else:
+        with pytest.raises(Cache.CacheInitAbortedError):
+            cmd(archiver, "create", "test.2", "input")
+
+
+def test_repository_move(archivers, request, monkeypatch):
     archiver = request.getfixturevalue(archivers)
     archiver = request.getfixturevalue(archivers)
     cmd(archiver, "rcreate", RK_ENCRYPTION)
     cmd(archiver, "rcreate", RK_ENCRYPTION)
     security_dir = get_security_directory(archiver.repository_path)
     security_dir = get_security_directory(archiver.repository_path)
     os.replace(archiver.repository_path, archiver.repository_path + "_new")
     os.replace(archiver.repository_path, archiver.repository_path + "_new")
     archiver.repository_location += "_new"
     archiver.repository_location += "_new"
-    with environment_variable(BORG_RELOCATED_REPO_ACCESS_IS_OK="yes"):
-        cmd(archiver, "rinfo")
+    monkeypatch.setenv("BORG_RELOCATED_REPO_ACCESS_IS_OK", "yes")
+    cmd(archiver, "rinfo")
+    monkeypatch.delenv("BORG_RELOCATED_REPO_ACCESS_IS_OK")
     with open(os.path.join(security_dir, "location")) as fd:
     with open(os.path.join(security_dir, "location")) as fd:
         location = fd.read()
         location = fd.read()
         assert location == Location(archiver.repository_location).canonical_path()
         assert location == Location(archiver.repository_location).canonical_path()
@@ -179,7 +182,7 @@ def test_security_dir_compat(archivers, request):
     cmd(archiver, "rinfo")
     cmd(archiver, "rinfo")
 
 
 
 
-def test_unknown_unencrypted(archivers, request):
+def test_unknown_unencrypted(archivers, request, monkeypatch):
     archiver = request.getfixturevalue(archivers)
     archiver = request.getfixturevalue(archivers)
     cmd(archiver, "rcreate", "--encryption=none")
     cmd(archiver, "rcreate", "--encryption=none")
     # Ok: repository is known
     # Ok: repository is known
@@ -196,8 +199,8 @@ def test_unknown_unencrypted(archivers, request):
     else:
     else:
         with pytest.raises(Cache.CacheInitAbortedError):
         with pytest.raises(Cache.CacheInitAbortedError):
             cmd(archiver, "rinfo")
             cmd(archiver, "rinfo")
-    with environment_variable(BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK="yes"):
-        cmd(archiver, "rinfo")
+    monkeypatch.setenv("BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK", "yes")
+    cmd(archiver, "rinfo")
 
 
 
 
 def test_unknown_feature_on_create(archivers, request):
 def test_unknown_feature_on_create(archivers, request):

+ 47 - 48
src/borg/testsuite/archiver/disk_full.py

@@ -20,14 +20,13 @@ import shutil
 import pytest
 import pytest
 
 
 from ...constants import *  # NOQA
 from ...constants import *  # NOQA
-from .. import environment_variable
 from . import cmd_fixture
 from . import cmd_fixture
 
 
 DF_MOUNT = "/tmp/borg-mount"
 DF_MOUNT = "/tmp/borg-mount"
 
 
 
 
 @pytest.mark.skipif(not os.path.exists(DF_MOUNT), reason="needs a 16MB fs mounted on %s" % DF_MOUNT)
 @pytest.mark.skipif(not os.path.exists(DF_MOUNT), reason="needs a 16MB fs mounted on %s" % DF_MOUNT)
-def test_disk_full(cmd_fixture):
+def test_disk_full(cmd_fixture, monkeypatch):
     def make_files(dir, count, size, rnd=True):
     def make_files(dir, count, size, rnd=True):
         shutil.rmtree(dir, ignore_errors=True)
         shutil.rmtree(dir, ignore_errors=True)
         os.mkdir(dir)
         os.mkdir(dir)
@@ -41,49 +40,49 @@ def test_disk_full(cmd_fixture):
                 data = os.urandom(size)
                 data = os.urandom(size)
                 f.write(data)
                 f.write(data)
 
 
-    with environment_variable(BORG_CHECK_I_KNOW_WHAT_I_AM_DOING="YES"):
-        mount = DF_MOUNT
-        assert os.path.exists(mount)
-        repo = os.path.join(mount, "repo")
-        input = os.path.join(mount, "input")
-        reserve = os.path.join(mount, "reserve")
-        for j in range(100):
-            shutil.rmtree(repo, ignore_errors=True)
-            shutil.rmtree(input, ignore_errors=True)
-            # keep some space and some inodes in reserve that we can free up later:
-            make_files(reserve, 80, 100000, rnd=False)
-            rc, out = cmd_fixture(f"--repo={repo}", "rcreate")
-            if rc != EXIT_SUCCESS:
-                print("rcreate", rc, out)
-            assert rc == EXIT_SUCCESS
-            try:
-                success, i = True, 0
-                while success:
-                    i += 1
-                    try:
-                        make_files(input, 20, 200000)
-                    except OSError as err:
-                        if err.errno == errno.ENOSPC:
-                            # already out of space
-                            break
-                        raise
-                    try:
-                        rc, out = cmd_fixture("--repo=%s" % repo, "create", "test%03d" % i, input)
-                        success = rc == EXIT_SUCCESS
-                        if not success:
-                            print("create", rc, out)
-                    finally:
-                        # make sure repo is not locked
-                        shutil.rmtree(os.path.join(repo, "lock.exclusive"), ignore_errors=True)
-                        os.remove(os.path.join(repo, "lock.roster"))
-            finally:
-                # now some error happened, likely we are out of disk space.
-                # free some space such that we can expect borg to be able to work normally:
-                shutil.rmtree(reserve, ignore_errors=True)
-            rc, out = cmd_fixture(f"--repo={repo}", "rlist")
-            if rc != EXIT_SUCCESS:
-                print("rlist", rc, out)
-            rc, out = cmd_fixture(f"--repo={repo}", "check", "--repair")
-            if rc != EXIT_SUCCESS:
-                print("check", rc, out)
-            assert rc == EXIT_SUCCESS
+    monkeypatch.setenv("BORG_CHECK_I_KNOW_WHAT_I_AM_DOING", "YES")
+    mount = DF_MOUNT
+    assert os.path.exists(mount)
+    repo = os.path.join(mount, "repo")
+    input = os.path.join(mount, "input")
+    reserve = os.path.join(mount, "reserve")
+    for j in range(100):
+        shutil.rmtree(repo, ignore_errors=True)
+        shutil.rmtree(input, ignore_errors=True)
+        # keep some space and some inodes in reserve that we can free up later:
+        make_files(reserve, 80, 100000, rnd=False)
+        rc, out = cmd_fixture(f"--repo={repo}", "rcreate")
+        if rc != EXIT_SUCCESS:
+            print("rcreate", rc, out)
+        assert rc == EXIT_SUCCESS
+        try:
+            success, i = True, 0
+            while success:
+                i += 1
+                try:
+                    make_files(input, 20, 200000)
+                except OSError as err:
+                    if err.errno == errno.ENOSPC:
+                        # already out of space
+                        break
+                    raise
+                try:
+                    rc, out = cmd_fixture("--repo=%s" % repo, "create", "test%03d" % i, input)
+                    success = rc == EXIT_SUCCESS
+                    if not success:
+                        print("create", rc, out)
+                finally:
+                    # make sure repo is not locked
+                    shutil.rmtree(os.path.join(repo, "lock.exclusive"), ignore_errors=True)
+                    os.remove(os.path.join(repo, "lock.roster"))
+        finally:
+            # now some error happened, likely we are out of disk space.
+            # free some space such that we can expect borg to be able to work normally:
+            shutil.rmtree(reserve, ignore_errors=True)
+        rc, out = cmd_fixture(f"--repo={repo}", "rlist")
+        if rc != EXIT_SUCCESS:
+            print("rlist", rc, out)
+        rc, out = cmd_fixture(f"--repo={repo}", "check", "--repair")
+        if rc != EXIT_SUCCESS:
+            print("check", rc, out)
+        assert rc == EXIT_SUCCESS

+ 3 - 4
src/borg/testsuite/archiver/key_cmds.py

@@ -10,7 +10,6 @@ from ...helpers import EXIT_ERROR
 from ...helpers import bin_to_hex
 from ...helpers import bin_to_hex
 from ...helpers import msgpack
 from ...helpers import msgpack
 from ...repository import Repository
 from ...repository import Repository
-from .. import environment_variable
 from .. import key
 from .. import key
 from . import RK_ENCRYPTION, KF_ENCRYPTION, cmd, _extract_repository_id, _set_repository_id, generate_archiver_tests
 from . import RK_ENCRYPTION, KF_ENCRYPTION, cmd, _extract_repository_id, _set_repository_id, generate_archiver_tests
 
 
@@ -96,7 +95,7 @@ def test_key_export_keyfile(archivers, request):
     assert key_contents2 == key_contents
     assert key_contents2 == key_contents
 
 
 
 
-def test_key_import_keyfile_with_borg_key_file(archivers, request):
+def test_key_import_keyfile_with_borg_key_file(archivers, request, monkeypatch):
     archiver = request.getfixturevalue(archivers)
     archiver = request.getfixturevalue(archivers)
     cmd(archiver, "rcreate", KF_ENCRYPTION)
     cmd(archiver, "rcreate", KF_ENCRYPTION)
 
 
@@ -109,8 +108,8 @@ def test_key_import_keyfile_with_borg_key_file(archivers, request):
     os.unlink(key_file)
     os.unlink(key_file)
 
 
     imported_key_file = os.path.join(archiver.output_path, "imported")
     imported_key_file = os.path.join(archiver.output_path, "imported")
-    with environment_variable(BORG_KEY_FILE=imported_key_file):
-        cmd(archiver, "key", "import", exported_key_file)
+    monkeypatch.setenv("BORG_KEY_FILE", imported_key_file)
+    cmd(archiver, "key", "import", exported_key_file)
     assert not os.path.isfile(key_file), '"borg key import" should respect BORG_KEY_FILE'
     assert not os.path.isfile(key_file), '"borg key import" should respect BORG_KEY_FILE'
 
 
     with open(imported_key_file) as fd:
     with open(imported_key_file) as fd:

+ 16 - 17
src/borg/testsuite/archiver/rcreate_cmd.py

@@ -7,7 +7,6 @@ from ...helpers.errors import Error
 from ...constants import *  # NOQA
 from ...constants import *  # NOQA
 from ...crypto.key import FlexiKey
 from ...crypto.key import FlexiKey
 from ...repository import Repository
 from ...repository import Repository
-from .. import environment_variable
 from . import cmd, generate_archiver_tests, RK_ENCRYPTION, KF_ENCRYPTION
 from . import cmd, generate_archiver_tests, RK_ENCRYPTION, KF_ENCRYPTION
 
 
 pytest_generate_tests = lambda metafunc: generate_archiver_tests(metafunc, kinds="local,remote,binary")  # NOQA
 pytest_generate_tests = lambda metafunc: generate_archiver_tests(metafunc, kinds="local,remote,binary")  # NOQA
@@ -58,24 +57,24 @@ def test_rcreate_nested_repositories(archivers, request):
             cmd(archiver, "rcreate", RK_ENCRYPTION)
             cmd(archiver, "rcreate", RK_ENCRYPTION)
 
 
 
 
-def test_rcreate_refuse_to_overwrite_keyfile(archivers, request):
+def test_rcreate_refuse_to_overwrite_keyfile(archivers, request, monkeypatch):
     #  BORG_KEY_FILE=something borg rcreate should quit if "something" already exists.
     #  BORG_KEY_FILE=something borg rcreate should quit if "something" already exists.
     #  See: https://github.com/borgbackup/borg/pull/6046
     #  See: https://github.com/borgbackup/borg/pull/6046
     archiver = request.getfixturevalue(archivers)
     archiver = request.getfixturevalue(archivers)
     keyfile = os.path.join(archiver.tmpdir, "keyfile")
     keyfile = os.path.join(archiver.tmpdir, "keyfile")
+    monkeypatch.setenv("BORG_KEY_FILE", keyfile)
     original_location = archiver.repository_location
     original_location = archiver.repository_location
-    with environment_variable(BORG_KEY_FILE=keyfile):
-        archiver.repository_location = original_location + "0"
-        cmd(archiver, "rcreate", KF_ENCRYPTION)
-        with open(keyfile) as file:
-            before = file.read()
-        archiver.repository_location = original_location + "1"
-        arg = ("rcreate", KF_ENCRYPTION)
-        if archiver.FORK_DEFAULT:
-            cmd(archiver, *arg, exit_code=2)
-        else:
-            with pytest.raises(Error):
-                cmd(archiver, *arg)
-        with open(keyfile) as file:
-            after = file.read()
-        assert before == after
+    archiver.repository_location = original_location + "0"
+    cmd(archiver, "rcreate", KF_ENCRYPTION)
+    with open(keyfile) as file:
+        before = file.read()
+    archiver.repository_location = original_location + "1"
+    arg = ("rcreate", KF_ENCRYPTION)
+    if archiver.FORK_DEFAULT:
+        cmd(archiver, *arg, exit_code=2)
+    else:
+        with pytest.raises(Error):
+            cmd(archiver, *arg)
+    with open(keyfile) as file:
+        after = file.read()
+    assert before == after