|
21 | 21 | import unittest |
22 | 22 | from pathlib import Path |
23 | 23 | from types import SimpleNamespace |
24 | | -from unittest.mock import Mock |
| 24 | +from unittest.mock import Mock, patch |
25 | 25 |
|
26 | 26 |
|
27 | 27 | def _module(name: str) -> types.ModuleType: |
@@ -167,6 +167,23 @@ def _parallel(**overrides): |
167 | 167 | return SimpleNamespace(**values) |
168 | 168 |
|
169 | 169 |
|
| 170 | +class OpenLakeHashSeedTests(unittest.TestCase): |
| 171 | + def test_requires_fixed_in_range_decimal_seed(self): |
| 172 | + for seed in (None, "", "random", "abc", "-1", "4294967296", "1.5", "12", "9" * 5000): |
| 173 | + with self.subTest(seed=seed), patch.dict(os.environ): |
| 174 | + if seed is None: |
| 175 | + os.environ.pop("PYTHONHASHSEED", None) |
| 176 | + else: |
| 177 | + os.environ["PYTHONHASHSEED"] = seed |
| 178 | + with self.assertRaisesRegex(RuntimeError, "before starting every Python worker"): |
| 179 | + ADAPTER._require_fixed_hash_seed() |
| 180 | + |
| 181 | + def test_accepts_fixed_seed_including_range_boundaries(self): |
| 182 | + for seed in ("0", "1", "42", "00042", "4294967295"): |
| 183 | + with self.subTest(seed=seed), patch.dict(os.environ, PYTHONHASHSEED=seed): |
| 184 | + ADAPTER._require_fixed_hash_seed() |
| 185 | + |
| 186 | + |
170 | 187 | class OpenLakeRankNamespaceTests(unittest.TestCase): |
171 | 188 | def test_compression_config_rejects_non_lossless_codecs(self): |
172 | 189 | for field, codec, mode in ( |
|
0 commit comments