From 6ec3876b55cd4c50ca1959bb6f631b458d68d0e8 Mon Sep 17 00:00:00 2001 From: Bernhard Nortmann Date: Fri, 3 Jun 2016 10:37:26 +0200 Subject: [PATCH] tests: Improve code coverage by testing corner cases This patch adds shell scripts that deliberately go through some extra program invocations, e.g. erroneous use of fex2bin. The goal of these test cases is to improve on code (branch) coverage. Signed-off-by: Bernhard Nortmann --- tests/Makefile | 10 +++- tests/test_bin2fex_corner_cases.sh | 13 ++++++ tests/test_fex2bin_corner_cases.sh | 74 ++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 1 deletion(-) create mode 100755 tests/test_bin2fex_corner_cases.sh create mode 100755 tests/test_fex2bin_corner_cases.sh 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