Hoe maak je een beschadigd bestand om mee te testen
Een validator aan wie alleen gezonde bestanden zijn getoond, is niet echt getest. Zo krijg je een bestand dat met opzet kapot is, precies de grootte heeft die je vraagt en een manifest meebrengt dat zegt wat je systeem ermee moet doen.
Het korte antwoord
tfg generate --format png --size 2mb --damage zero-head --out ./out schrijft een PNG
van precies 2097152 bytes waarvan de eerste bytes nullen zijn, en het manifest ernaast legt vast
dat je systeem het moet weigeren.
De gebruikelijke weg
Waarom een met de hand beschadigd bestand een slechte test is
Gebruikelijk zijn een hexeditor, een script dat een paar willekeurige bytes omgooit, of een bestand
dat met head of truncate wordt ingekort. Het werkt één keer, en daarna
kost het je:
- Het is elke keer anders. Een willekeurige byte komt bij elke run ergens anders terecht, dus een fout van dinsdag komt woensdag misschien niet terug.
- Het verandert de grootte. Een ingekort bestand is kleiner dan de limiet waaronder het hoorde te blijven, dus de groottecontrole antwoordt vóór de inhoudscontrole en de test slaagt om de verkeerde reden.
- Het valt vaak niet op. Platte tekst blijft leesbaar met een gewijzigde byte in het midden, en een toegeeflijke afbeeldingslezer tekent het gewoon, waardoor het bestand dat kapot moest zijn wordt geaccepteerd.
- Het zegt niets over wat er moet gebeuren. Het bestand is alleen bytes, en wie de test later leest, moet raden of acceptatie of weigering de bedoeling was.
Wat je krijgt
Een beschadigd bestand heeft nog steeds de grootte die je vroeg
Het bestand wordt normaal gegenereerd en daarna kapotgemaakt, op weg naar de schijf. Het houdt de grootte die je vroeg, en hetzelfde commando schrijft opnieuw dezelfde bytes.
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
Instellingen komen achter een dubbele punt. De optie mag herhaald worden, en de beschadigingen worden toegepast in de volgorde waarin je ze schrijft. Het werkt met elk van de 26 formaten.
Wat het kan
Welke beschadigingen zijn er?
Dit is de lijst die het programma afdrukt, uit het programma gelezen op het moment dat deze pagina
wordt gebouwd. tfg damage drukt dezelfde af, en tfg damage <id>
zegt wat één ervan aanneemt.
| Beschadiging | Wat het met de bytes doet | Kleinste bestand | Instellingen |
|---|---|---|---|
zero-head |
Overschrijft de eerste bytes van het bestand met nullen en laat de lengte ongemoeid. De meeste lezers kijken daar eerst, dus bijna alles merkt deze beschadiging. | 8 | bytes |
zero-head schrijft nullen over het begin van het bestand. De meeste lezers kijken daar
eerst, naar de handtekening en de kop die zeggen wat het bestand is, dus bijna elke lezer merkt
het. Platte tekst en logbestanden hebben geen handtekening en worden ook geweigerd, omdat een
reeks nulbytes geen tekst is. Onder vier bytes komen sommige formaten uit met schade waar geen
lezer over klaagt, en daarom begint de instelling bij vier.
Wat het manifest zegt
Een manifest dat zegt wat er moet gebeuren
Elk beschadigd bestand krijgt een regel die zegt dat je systeem het moet weigeren, met de beschadiging ernaast vastgelegd:
"expected": {
"outcome": "reject",
"reason": "content_malformed",
"confidence": "certain"
},
"damage": [
{
"type": "zero-head",
"settings": {
"bytes": "8"
}
}
]
Twee verzoeken worden geweigerd voordat er iets wordt geschreven, omdat elk een bestand op schijf zou laten staan dat het manifest verkeerd beschrijft:
- een bestand dat kleiner is dan de beschadiging nodig heeft en ongewijzigd zou uitkomen
-
expected: acceptnaast een beschadiging, omdat niets daaraan kan voldoen. Schrijfsanitizeals je systeem het bestand moet repareren, ofunspecifiedals dat juist de vraag is die je stelt
In een recept
Gezonde en kapotte bestanden in één run
Zet beide in één recept, en het manifest draagt de verwachting van elk bestand, zodat de test geen lijst nodig heeft van welk bestand welk is:
version: 1
targets:
- id: healthy
format: pdf
size: 1mb
expected: accept
- id: broken
format: pdf
size: 1mb
damage:
- zero-head
In een test
Er een test van maken
De test leest het manifest en controleert dat wat er gebeurde is wat er werd opgegeven. Hij heeft geen lijst met bestandsnamen nodig:
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
Een goede weigering is een schone weigering. Een melding die zegt wat er mis was, is het antwoord dat je wilt. Een serverfout, een vastloper of een half opgeslagen bestand is het gebrek dat deze test moet vinden.
Verder
Waar je vandaar heen kunt
- De preset upload-validation stelt een formulier de andere twee vragen, die over de grootte en die over het type.
- Testbestanden in CI draait een recept als dit in een pipeline.
-
De documentatie bevat elke optie van
tfg generate.