Files
libretro/tests/test_split_names.py
T

111 lines
3.7 KiB
Python

"""A --split part is named after its group and its platform version.
The intermediate name of each part joined every system id of the group: the
"Other" group of RetroBat (100 systems) gave a 786-byte file name, the write
failed with ENAMETOOLONG and the platform's split was never produced. The
directory holding the parts did not carry the version the parts carry, so a
rescrape that moved the version left both generations under one
SHA256SUMS.txt.
"""
from __future__ import annotations
import os
import sys
import tempfile
import unittest
from pathlib import Path
import yaml
REPO_ROOT = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(REPO_ROOT / "scripts"))
import common
from common import build_zip_contents_index, compute_hashes
from generate_pack import generate_split_packs
class SplitPartNames(unittest.TestCase):
def setUp(self):
self.tmp = tempfile.TemporaryDirectory()
root = Path(self.tmp.name)
self.platforms = root / "platforms"
self.emulators = root / "emulators"
self.out = root / "dist"
bios = root / "bios" / "Test"
for path in (self.platforms, self.emulators, bios):
path.mkdir(parents=True)
blob = bios / "shared.bin"
blob.write_bytes(b"shared")
h = compute_hashes(str(blob))
self.db = {
"files": {
h["sha1"]: {
"name": "shared.bin", "md5": h["md5"], "sha1": h["sha1"],
"sha256": h["sha256"], "path": str(blob), "paths": [str(blob)],
}
},
"indexes": {
"by_md5": {h["md5"]: h["sha1"]},
"by_name": {"shared.bin": [h["sha1"]]},
"by_crc32": {},
"by_path_suffix": {},
},
}
(self.platforms / "_registry.yml").write_text(
yaml.dump({"platforms": {"longplat": {"status": "active"}}})
)
self.sha1 = h["sha1"]
def tearDown(self):
self.tmp.cleanup()
def _platform(self, version: str, systems: int) -> None:
config = {
"platform": "LongTest",
"version": version,
"verification_mode": "existence",
"systems": {
f"unbranded-system-number-{n:03d}": {
"files": [{"name": "shared.bin", "sha1": self.sha1}]
}
for n in range(systems)
},
}
(self.platforms / "longplat.yml").write_text(yaml.dump(config))
common._platform_config_cache.clear()
def _split(self, group_by: str) -> list[str]:
return generate_split_packs(
"longplat", str(self.platforms), self.db, self.tmp.name, str(self.out),
group_by=group_by, emulators_dir=str(self.emulators),
zip_contents=build_zip_contents_index(self.db), emu_profiles={},
)
def test_a_large_group_is_written(self):
self._platform("1.0", 40)
parts = self._split("manufacturer")
self.assertEqual(
[os.path.basename(p) for p in parts], ["LongTest_1.0_Other_BIOS_Pack.zip"]
)
self.assertTrue(os.path.isfile(parts[0]))
def test_two_versions_do_not_share_a_directory(self):
self._platform("1.0", 2)
first = {os.path.dirname(p) for p in self._split("system")}
self._platform("1.1", 2)
second = {os.path.dirname(p) for p in self._split("system")}
self.assertEqual(len(first), 1)
self.assertEqual(len(second), 1)
self.assertNotEqual(first, second)
for directory in second:
self.assertTrue(
all("_1.1_" in name for name in os.listdir(directory)),
os.listdir(directory),
)
if __name__ == "__main__":
unittest.main()