#!/bin/bash set -euo pipefail if [[ $# -ne 2 ]]; then echo "$0 {force_crc} {crc32}" exit 1 fi TOOL=$1 CRC32=$2 TEST_DIR=$(mktemp -d) # Delete temporary directory and exit with nonzero status. function die { echo "$1" rm -rf "$TEST_DIR" exit 1 } # Run tool and compare output against the expected CRC. function run_test { expected_crc=$2 "$TOOL" "$expected_crc" "$TEST_DIR/input.txt" "$TEST_DIR/input.map" \ > "$TEST_DIR/actual.txt" \ || die "$1 (run)" actual_crc=$("$CRC32" "$TEST_DIR/actual.txt") if [[ "$expected_crc" != "$actual_crc" ]]; then die "$1 (check)" fi } # Try empty input. We will get an error status because this tool can't # handle empty files, but we want to see that it doesn't crash. "$TOOL" 00000000 /dev/null /dev/null && die "$LINENO: empty" # Check that mapping file with different size from input is rejected. echo "1" > "$TEST_DIR/input.txt" echo "12" > "$TEST_DIR/input.map" "$TOOL" 00000000 "$TEST_DIR/input.txt" "$TEST_DIR/input.map" \ > /dev/null 2>&1 && die "$LINENO: mismatched map size" # Test basic CRC32 computation using CRC32 quines. echo "XXXXXXXX" > "$TEST_DIR/input.txt" for q in 58a8a1b9 86319a79; do echo "$q" > "$TEST_DIR/expected.txt" "$TOOL" "$q" "$TEST_DIR/input.txt" "$TEST_DIR/input.txt" \ > "$TEST_DIR/actual.txt" \ || die "$LINENO: insert $q" diff "$TEST_DIR/expected.txt" "$TEST_DIR/actual.txt" \ || die "$LINENO: compare $q" "$TOOL" "$q" "$TEST_DIR/expected.txt" "$TEST_DIR/expected.txt" \ > "$TEST_DIR/actual.txt" \ || die "$LINENO: verify $q" diff "$TEST_DIR/expected.txt" "$TEST_DIR/actual.txt" \ || die "$LINENO: compare $q" done # Fix up a few bytes to reach target CRC. echo -n "1234567890" > "$TEST_DIR/input.txt" echo -n "X........." > "$TEST_DIR/input.map" run_test "$LINENO: fix prefix 1 byte" "01b32f0d" echo -n "XX........" > "$TEST_DIR/input.map" run_test "$LINENO: fix prefix 2 bytes" "94fe51b9" echo -n ".........X" > "$TEST_DIR/input.map" run_test "$LINENO: fix suffix 1 byte" "4cad8e17" echo -n "........XX" > "$TEST_DIR/input.map" run_test "$LINENO: fix suffix 2 bytes" "ceb6164e" echo -n "....X....." > "$TEST_DIR/input.map" run_test "$LINENO: fix middle 1 byte" "be5aee68" echo -n "....XX...." > "$TEST_DIR/input.map" run_test "$LINENO: fix middle 2 bytes" "6c9aa5fa" echo -n "..XX..XX.." > "$TEST_DIR/input.map" run_test "$LINENO: fix scattered bytes" "4be0bb66" # Insert CRC to a small files with contiguous region for adjustment. echo -n "...|...|...|...|" > "$TEST_DIR/input.txt" echo -n "XXXXXXXX...XXXXX" > "$TEST_DIR/input.map" run_test "$LINENO: adjust suffix" "12345678" echo -n "XXXXX...XXXXXXXX" > "$TEST_DIR/input.map" run_test "$LINENO: adjust prefix" "56780000" # Check that original input characters are used first. # # Space is not used as replacement characters unless the original file # had them, so if we didn't use the original characters, we won't be # able to adjust this file to match the expected CRC. echo " " > "$TEST_DIR/input.txt" echo "XXX" > "$TEST_DIR/input.map" run_test "$LINENO: prefer original characters" "cc6afb7e" rm -rf "$TEST_DIR" exit 0