diff --git a/tests/Makefile b/tests/Makefile index 6ee6c5d..746c1ba 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -5,11 +5,19 @@ BOARDS_URL := https://github.com/linux-sunxi/sunxi-boards/archive/master.zip BOARDS_DIR := sunxi-boards -check: check_all_fex +check: check_all_fex coverage +# Conversion cycle (.fex -> .bin -> .fex) test for all sunxi-boards check_all_fex: $(BOARDS_DIR)/README unify-fex ./test_all_fex.sh $(BOARDS_DIR) +coverage: + # Usage help / invocation with no args + ../sunxi-fexc -? 2> /dev/null ; exit 0 + # Improve code coverage for corner cases (e.g. erroneous parameters) + ./test_fex2bin_corner_cases.sh + ./test_bin2fex_corner_cases.sh + # Retrieve and extract sunxi-boards archive (containing all .fex) $(BOARDS_DIR).zip: curl -fLsS -o $@ $(BOARDS_URL) diff --git a/tests/test_bin2fex_corner_cases.sh b/tests/test_bin2fex_corner_cases.sh new file mode 100755 index 0000000..b10746b --- /dev/null +++ b/tests/test_bin2fex_corner_cases.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# +# === Test errors / corner cases of "bin2fex", improving on code coverage === +# +BIN2FEX=../bin2fex +TESTFILE=sunxi-boards/sys_config/a10/a10-olinuxino-lime +# use sunxi-fexc in "fex2bin" mode, testing explicit parameters at the same time +FEX2BIN="../sunxi-fexc -v -q -I fex -O bin" + +${FEX2BIN} ${TESTFILE}.fex ${TESTFILE}.bin +# have bin2fex explicitly read /dev/stdin, to force use of fexc.c's "read_all()" +cat ${TESTFILE}.bin | ${BIN2FEX} /dev/stdin > /dev/null +rm -f ${TESTFILE}.bin diff --git a/tests/test_fex2bin_corner_cases.sh b/tests/test_fex2bin_corner_cases.sh new file mode 100755 index 0000000..2fe7ebe --- /dev/null +++ b/tests/test_fex2bin_corner_cases.sh @@ -0,0 +1,74 @@ +#!/bin/bash +# +# === Test errors / corner cases of "fex2bin", improving on code coverage === +# +FEX2BIN=../fex2bin + +function expect () { + OUT=`${FEX2BIN} 2>&1` + if (! echo ${OUT} | grep -q "$1"); then + echo ERROR: Expected substring \"$1\" not found in output: + echo ${OUT} + exit 1 + fi + #echo ${OUT} +} + +# missing section, CRLF line ending +echo -e "foobar\r\n" | expect "data must follow a section" + +# malformed sections +expect "incomplete section declaration" <<-EOF + [foobar +EOF +expect "invalid character at 5" <<-EOF + [foo#bar] +EOF + +# invalid entry +expect "invalid character at 4" <<-EOF + [foo] + bar +EOF + +# bad port specifiers +expect "parse error at 12" <<-EOF + [foo] + bar = port:P@0 +EOF +expect "invalid character at 14" <<-EOF + [foo] + bar = port:PA* +EOF +expect "port out of range at 14" <<-EOF + [foo] + bar = port:PA666 +EOF +expect "value out of range at 17" <<-EOF + [foo] + bar = port:PA00<-1> +EOF +expect "invalid character at 18" <<-EOF + [foo] + bar = port:PA00<0 > +EOF + +# bad = pairs +expect "invalid character at 8" <<-EOF + [foo] + bar = 0* +EOF +expect "value out of range" <<-EOF + [foo] + bar = 4294967296 +EOF +expect "unquoted value 'bad', assuming string" <<-EOF + [foo] + bar = bad +EOF + +# test truncation of very long identifiers +${FEX2BIN} > /dev/null <<-EOF + [an_overly_long_section_name_to_truncate] + an_overly_long_entry_name_to_truncate = 0 +EOF