Jak vytvořit poškozený soubor pro testy
Validátor, kterému se ukazovaly jen zdravé soubory, nebyl opravdu otestován. Tady je postup, jak získat soubor záměrně rozbitý, který vyjde přesně v požadované velikosti a nese manifest říkající, co s ním má váš systém udělat.
Stručná odpověď
tfg generate --format png --size 2mb --damage zero-head --out ./out zapíše PNG o přesně
2097152 bajtech, jehož první bajty jsou nuly, a manifest vedle něj zaznamená, že ho má váš
systém odmítnout.
Obvyklý způsob
Proč je ručně poškozený soubor špatný test
Obvykle se sáhne po hexadecimálním editoru, skriptu, který převrátí pár náhodných bajtů, nebo po
zkrácení souboru pomocí head či truncate. Jednou to funguje a pak to
stojí:
- Pokaždé je to jiné. Náhodný bajt padne při každém spuštění jinam, takže chyba z úterý se ve středu nemusí vrátit.
- Mění to velikost. Zkrácený soubor je menší než limit, pod kterým měl zůstat, takže kontrola velikosti odpoví dřív než kontrola obsahu a test projde z nesprávného důvodu.
- Často si toho nikdo nevšimne. Prostý text se dá číst i se změněným bajtem uprostřed a shovívavá čtečka obrázků ho prostě vykreslí, takže soubor, který měl být rozbitý, se přijme.
- Neříká, co se má stát. Soubor jsou jen bajty a ten, kdo test čte později, musí hádat, zda se mělo přijmout, nebo odmítnout.
Co dostanete
Poškozený soubor má stále velikost, kterou jste chtěli
Soubor se vygeneruje normálně a poškodí se až potom, cestou na disk. Zachová velikost, kterou jste chtěli, a stejný příkaz zapíše znovu stejné bajty.
tfg generate --format png --size 2mb --damage zero-head --out ./out
tfg generate --format pdf --size 1mb --count 5 --damage zero-head:bytes=16 --out ./broken
Nastavení se píše za dvojtečku. Přepínač lze opakovat a poškození se použijí v pořadí, v jakém je zapíšete. Funguje s každým z 26 formátů.
Co umí
Jaká poškození existují?
Toto je seznam, který program vypisuje, načtený z něj při sestavení této stránky. tfg
damage vypíše totéž a tfg damage <id> řekne, co které z nich přijímá.
| Poškození | Co dělá s bajty | Nejmenší soubor | Nastavení |
|---|---|---|---|
zero-head |
Přepíše prvních několik bajtů souboru nulami a jeho délku nechá být. Většina čteček se dívá nejdřív tam, takže si tohoto poškození všimne téměř cokoli. | 8 | bytes |
zero-head zapíše nuly přes začátek souboru. Většina čteček se dívá nejdřív tam, na
signaturu a hlavičku, které říkají, co soubor je, takže si toho všimne téměř každá. Prostý text
a logy signaturu nemají a odmítnou se také, protože řada nulových bajtů není text. Pod čtyřmi
bajty některé formáty vyjdou s poškozením, na které si žádná čtečka nestěžuje, proto nastavení
začíná na čtyřech.
Co říká manifest
Manifest, který říká, co se má stát
Každý poškozený soubor dostane záznam, že ho má váš systém odmítnout, s poškozením zapsaným vedle:
"expected": {
"outcome": "reject",
"reason": "content_malformed",
"confidence": "certain"
},
"damage": [
{
"type": "zero-head",
"settings": {
"bytes": "8"
}
}
]
Dva požadavky se odmítnou dřív, než se cokoli zapíše, protože každý by na disku nechal soubor, který manifest popisuje špatně:
- soubor menší, než poškození potřebuje, který by vyšel nezměněný
-
expected: acceptvedle poškození, protože by to nic nemohlo splnit. Napištesanitize, pokud má váš systém soubor opravit, nebounspecified, pokud je právě to vaše otázka
V receptu
Zdravé a rozbité soubory v jednom běhu
Dejte obojí do jednoho receptu a manifest ponese očekávání každého souboru, takže test nepotřebuje seznam, který je který:
version: 1
targets:
- id: healthy
format: pdf
size: 1mb
expected: accept
- id: broken
format: pdf
size: 1mb
damage:
- zero-head
V testu
Z toho udělat test
Test přečte manifest a ověří, že to, co se stalo, je to, co bylo uvedeno. Nepotřebuje seznam názvů souborů:
import json, os
directory = "healthy-and-broken"
manifest = json.load(open(os.path.join(directory, "manifest.json")))
for entry in manifest["files"]:
response = upload(os.path.join(directory, entry["path"]))
if entry["expected"]["outcome"] == "reject":
assert not response.ok
else:
assert response.ok
Dobré odmítnutí je čisté. Zpráva, která říká, co bylo špatně, je odpověď, kterou chcete. Chyba serveru, zaseknutí nebo napůl uložený soubor je vada, kterou má tento test najít.
Dál
Kam jít odtud
- Předvolba upload-validation klade formuláři zbývající dvě otázky, na velikost a na typ.
- Testovací soubory v CI spouštějí takový recept v pipeline.
-
Dokumentace obsahuje každý přepínač
tfg generate.