Testing Files Generator
Čeština

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í:

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ě:

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