#!/bin/bash set -euo pipefail if [[ $# -ne 2 ]]; then echo "$0 {kurumi} {base_byte}" exit 1 fi TOOL=$1 BASE_BYTE=$2 TEST_DIR=$(mktemp -d) # Delete temporary directory and exit with nonzero status. function die { echo "$1" rm -rf "$TEST_DIR" exit 1 } # Encode two messages and verify output. function run_test { "$TOOL" "$2" "$3" > "$TEST_DIR/output.c" || die "$1 (encode)" echo -n -e "$2" > "$TEST_DIR/expected1.txt" echo -n -e "$3" > "$TEST_DIR/expected2.txt" gcc -Wno-div-by-zero "$TEST_DIR/output.c" -o "$TEST_DIR/output.exe" \ || die "$1 (compile)" gcc -c "$TEST_DIR/output.c" -o /dev/null 2>&1 \ | "$TEST_DIR/output.exe" > "$TEST_DIR/actual1.txt" \ || die "$1 (decode gcc)" diff -q "$TEST_DIR/expected1.txt" "$TEST_DIR/actual1.txt" \ || die "$1 (diff gcc)" clang -c "$TEST_DIR/output.c" -o /dev/null 2>&1 \ | "$TEST_DIR/output.exe" > "$TEST_DIR/actual2.txt" \ || die "$1 (decode clang)" diff -q "$TEST_DIR/expected2.txt" "$TEST_DIR/actual2.txt" \ || die "$1 (diff clang)" ruby "$TEST_DIR/output.c" \ | "$TEST_DIR/output.exe" > "$TEST_DIR/actual1.txt" \ || die "$1 (decode ruby)" diff -q "$TEST_DIR/expected1.txt" "$TEST_DIR/actual1.txt" \ || die "$1 (diff ruby)" perl "$TEST_DIR/output.c" \ | "$TEST_DIR/output.exe" > "$TEST_DIR/actual2.txt" \ || die "$1 (decode perl)" diff -q "$TEST_DIR/expected2.txt" "$TEST_DIR/actual2.txt" \ || die "$1 (diff perl)" } # First message is the base byte repeated 257 times, while second message # is every byte value from 0x01 to 0xff. First message is longer than # second message so that we would also test the base byte value against # the 0x00 combination. msg1=$(perl -e "foreach(1..257){ print '\\x$BASE_BYTE'; }") msg2=$(perl -e "foreach(1..255){ printf '\\x%x', \$_; }") run_test "$LINENO: exhaustive $BASE_BYTE" "$msg1" "$msg2" # Previous test covered (base,0), we need one more to cover (0,base). run_test "$LINENO: zero $BASE_BYTE" "" "\x$BASE_BYTE" rm -rf "$TEST_DIR" exit 0