Viewing files at commit e70815b9044aCommit detailsView latest

Browse files
tests/test_environment.py 95 lines · 4.4 KB · python
1
from __future__ import annotations
2
3
import os
4
import shutil
5
import subprocess
6
import sys
7
import tempfile
8
import unittest
9
from pathlib import Path
10
from unittest import mock
11
12
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "scripts"))
13
14
from oakbench.environment import ENV_ISOLATION_VERSION, base_env  # noqa: E402
15
16
17
class EnvironmentPolicyTest(unittest.TestCase):
18
    def test_inherited_git_plumbing_cannot_redirect_any_lane(self):
19
        poison = {"GIT_DIR": "/wrong", "GIT_WORK_TREE": "/wrong", "GIT_INDEX_FILE": "/wrong",
20
                  "GIT_OBJECT_DIRECTORY": "/wrong", "GIT_CONFIG_COUNT": "1",
21
                  "GIT_CONFIG_KEY_0": "core.hooksPath", "GIT_CONFIG_VALUE_0": "/wrong",
22
                  "GIT_CONFIG_GLOBAL": "/wrong", "GIT_NO_REPLACE_OBJECTS": "0"}
23
        with mock.patch.dict(os.environ, poison):
24
            env = base_env()
25
        for key in poison.keys() - {"GIT_CONFIG_GLOBAL", "GIT_NO_REPLACE_OBJECTS"}:
26
            self.assertFalse(key in env, key)
27
        self.assertEqual(env["GIT_CONFIG_GLOBAL"], os.devnull)
28
        self.assertEqual(env["GIT_NO_REPLACE_OBJECTS"], "1")
29
30
    def test_update_check_is_disabled_despite_host_override_and_in_agent_children(self):
31
        from oakbench.agent_environment import agent_environment
32
        for hostile in ("0", "", "false"):
33
            with self.subTest(hostile=hostile), mock.patch.dict(os.environ, {"OAK_NO_UPDATE_CHECK": hostile}):
34
                env = base_env()
35
                self.assertEqual(env["OAK_NO_UPDATE_CHECK"], "1")
36
                self.assertEqual(agent_environment(env)["OAK_NO_UPDATE_CHECK"], "1")
37
                self.assertEqual(agent_environment({"OAK_NO_UPDATE_CHECK": hostile})["OAK_NO_UPDATE_CHECK"], "1")
38
        self.assertEqual(agent_environment({})["OAK_NO_UPDATE_CHECK"], "1")
39
        self.assertEqual(ENV_ISOLATION_VERSION, "3")
40
41
    @unittest.skipUnless(shutil.which("git"), "Git required")
42
    def test_real_git_initializes_requested_checkout_with_poisoned_host_environment(self):
43
        with tempfile.TemporaryDirectory() as tmp:
44
            target, poison = Path(tmp) / "target", Path(tmp) / "poison"
45
            target.mkdir(); poison.mkdir()
46
            with mock.patch.dict(os.environ, {"GIT_DIR": str(poison / ".git"), "GIT_WORK_TREE": str(poison)}):
47
                process = subprocess.run([shutil.which("git"), "init", "-q"], cwd=target,
48
                                         env=base_env(), capture_output=True, timeout=20)
49
            self.assertEqual(process.returncode, 0, process.stderr)
50
            self.assertTrue((target / ".git").is_dir())
51
            self.assertFalse((poison / ".git").exists())
52
53
    def test_base_env_isolates_host_home_git_config_and_locale(self) -> None:
54
        env = base_env()
55
        bench_home = Path(env["HOME"])
56
57
        self.assertNotEqual(bench_home, Path.home())
58
        self.assertTrue(bench_home.is_dir())
59
        self.assertEqual(env["XDG_CONFIG_HOME"], str(bench_home / ".config"))
60
        self.assertEqual(env["XDG_CACHE_HOME"], str(bench_home / ".cache"))
61
        self.assertEqual(env["ZDOTDIR"], str(bench_home))
62
        self.assertEqual(env["BASH_ENV"], os.devnull)
63
        self.assertEqual(env["ENV"], os.devnull)
64
        self.assertEqual(env["GIT_CONFIG_GLOBAL"], os.devnull)
65
        self.assertEqual(env["GIT_CONFIG_NOSYSTEM"], "1")
66
        self.assertEqual(env["LC_ALL"], "C")
67
        self.assertEqual(env["LANG"], "C")
68
        self.assertEqual(env["TZ"], "UTC")
69
        self.assertEqual(env["OAK_BENCH_ENV_ISOLATION_VERSION"], ENV_ISOLATION_VERSION)
70
71
    def test_base_env_accepts_explicit_stable_home(self) -> None:
72
        with tempfile.TemporaryDirectory() as tmp:
73
            home = Path(tmp) / "bench-home"
74
            first = base_env(home=home)
75
            second = base_env(home=home)
76
        self.assertEqual(first["HOME"], second["HOME"])
77
        self.assertEqual(first["XDG_CONFIG_HOME"], str(home / ".config"))
78
79
    def test_base_env_preserves_existing_path_and_explicit_tokens(self) -> None:
80
        old_token = os.environ.get("OAK_API_KEY")
81
        try:
82
            os.environ["OAK_API_KEY"] = "test-token"
83
            env = base_env()
84
        finally:
85
            if old_token is None:
86
                os.environ.pop("OAK_API_KEY", None)
87
            else:
88
                os.environ["OAK_API_KEY"] = old_token
89
90
        self.assertEqual(env.get("PATH"), os.environ.get("PATH"))
91
        self.assertEqual(env["OAK_API_KEY"], "test-token")
92
93
94
if __name__ == "__main__":
95
    unittest.main()