Spaces:
Sleeping
Sleeping
| """Garde-fou : les clés du store d'artefacts sont filesystem-safe. | |
| L'audit S58/S59 a relevé un crash Windows reproductible : | |
| ``OSError: [WinError 87] The parameter is incorrect`` sur | |
| ``os.replace(tmp, dst)`` quand ``dst`` contient un ``:``. | |
| Cause : ``:`` est un caractère réservé du filesystem NTFS (Alternate | |
| Data Streams) — un filename comme ``abc:raw_text.json`` est rejeté. | |
| Le bug existait depuis S47 mais n'avait jamais été détecté en CI | |
| parce que les builds Windows passaient en silence (l'écriture | |
| non-atomique ``write_text`` directe ne nettoyait pas le tmp donc | |
| laissait un fichier orphelin sans erreur ; après S59 #9 atomique, | |
| le bug est devenu visible). | |
| Ce test verrouille que tout caractère réservé Windows est rejeté. | |
| """ | |
| from __future__ import annotations | |
| from picarones.domain.artifacts import ArtifactType | |
| from picarones.pipeline.cache_helpers import ( | |
| _KEY_SEPARATOR, | |
| storage_key_for_output, | |
| ) | |
| #: Caractères que NTFS / Windows refusent dans un nom de fichier. | |
| #: Source : https://learn.microsoft.com/windows/win32/fileio/naming-a-file | |
| _WINDOWS_FORBIDDEN = frozenset(r'<>:"/\|?*') | |
| def test_storage_key_separator_filesystem_safe() -> None: | |
| """Le séparateur de clé composite ne contient aucun caractère | |
| interdit sur Windows. | |
| """ | |
| assert not (set(_KEY_SEPARATOR) & _WINDOWS_FORBIDDEN), ( | |
| f"_KEY_SEPARATOR={_KEY_SEPARATOR!r} contient un caractère " | |
| f"réservé Windows. Voir _WINDOWS_FORBIDDEN={_WINDOWS_FORBIDDEN!r}." | |
| ) | |
| def test_storage_keys_for_all_artifact_types_filesystem_safe() -> None: | |
| """Pour chaque ``ArtifactType``, la clé composite produite par | |
| ``storage_key_for_output`` est filesystem-safe. | |
| Couvre l'intégralité de l'enum — un nouveau type de la forme | |
| ``my:type`` (avec ``:`` dans la value) ferait échouer ce test | |
| et exigerait soit la révision du nom du type soit l'introduction | |
| d'un encoding dans le store. | |
| """ | |
| fake_hash = "0" * 64 # SHA-256 hex stub | |
| for at in ArtifactType: | |
| key = storage_key_for_output(fake_hash, at) | |
| offending = set(key) & _WINDOWS_FORBIDDEN | |
| assert not offending, ( | |
| f"storage_key_for_output(hash, {at!r}) = {key!r} contient " | |
| f"des caractères interdits sur Windows : {sorted(offending)!r}." | |
| ) | |