From 8f191846d5a08fffefff5a726221db800ad13698 Mon Sep 17 00:00:00 2001 From: Eric Hawicz Date: Sun, 18 Oct 2026 20:09:14 -0400 Subject: [PATCH] Add a shellcheck test, fix or ignore all warnings reported by shellcheck. --- .github/workflows/meson.yml | 2 ++ .shellcheckrc | 3 +++ .travis.yml | 6 ++++- abi-check.sh | 22 +++++++++---------- amiga/build-amiga-sdk.sh | 8 +++++-- amiga/package-amiga.sh | 5 +++-- bench/jc-bench.sh | 34 ++++++++++++++--------------- fuzz/build.sh | 20 ++++++++--------- reltools/bump_version.sh | 17 ++++++++------- reltools/check_symbols.sh | 2 ++ reltools/gen_issues_closed.sh | 3 ++- reltools/publish_docs.sh | 16 +++++++------- reltools/reltools.subr | 9 ++++---- reltools/update_authors.sh | 4 ++-- tests/CMakeLists.txt | 4 +++- tests/meson.build | 28 ++++++++++++++++++------ tests/shellcheck.test | 33 ++++++++++++++++++++++++++++ tests/test-defs.sh | 35 +++++++++++++++--------------- tests/test_basic.test | 2 +- tests/test_json_patch.test | 2 +- tests/test_object_add_failure.test | 2 +- 21 files changed, 163 insertions(+), 94 deletions(-) create mode 100644 .shellcheckrc create mode 100755 tests/shellcheck.test diff --git a/.github/workflows/meson.yml b/.github/workflows/meson.yml index d85e876..be4030b 100644 --- a/.github/workflows/meson.yml +++ b/.github/workflows/meson.yml @@ -24,6 +24,7 @@ jobs: - name: Install packages run: | python3 -m pip install meson ninja + sudo apt install shellcheck - name: Compile and Test run: | @@ -42,6 +43,7 @@ jobs: - name: Install packages run: | python3 -m pip install meson ninja + sudo apt install shellcheck - name: Compile and Test run: | diff --git a/.shellcheckrc b/.shellcheckrc new file mode 100644 index 0000000..53937ea --- /dev/null +++ b/.shellcheckrc @@ -0,0 +1,3 @@ +external-sources=true +source-path=reltools +source-path=tests diff --git a/.travis.yml b/.travis.yml index f006b09..9854762 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,7 @@ matrix: apt: packages: - valgrind + - shellcheck - cppcheck - doxygen - cmake @@ -25,6 +26,7 @@ matrix: apt: packages: - valgrind + - shellcheck - cppcheck - doxygen - cmake @@ -39,6 +41,7 @@ matrix: apt: packages: - valgrind + - shellcheck - cppcheck - doxygen - cmake @@ -66,6 +69,7 @@ matrix: apt: packages: - valgrind + - shellcheck - cppcheck - doxygen - cmake @@ -126,7 +130,7 @@ script: # when using bionic, Travis seems to ignore the "addons" section, so installing the packages with apt-get... - if [ -n "$CHECK" ]; then if [ "$TRAVIS_DIST" = "bionic" ]; then - sudo apt-get install -y valgrind cppcheck doxygen; + sudo apt-get install -y valgrind shellcheck cppcheck doxygen; fi; make distcheck; if type cppcheck &> /dev/null ; then cppcheck --error-exitcode=1 --quiet *.h *.c tests/ ; fi; diff --git a/abi-check.sh b/abi-check.sh index 585c14a..b175bc7 100755 --- a/abi-check.sh +++ b/abi-check.sh @@ -23,7 +23,7 @@ usage() { local exitval="$1" ; shift local errmsg="$1" - if [ $exitval -ne 0 ] ; then + if [ "$exitval" -ne 0 ] ; then exec 1>&2 fi if [ -n "$errmsg" ] ; then @@ -117,9 +117,9 @@ build_new() if [ ! -d "${BUILD_DEST}" ] || [ "${REBUILD_NEW}" -eq 1 ] ; then echo "Building $(pwd) (${release}) into ${BUILD_DEST}" rm -rf build.abi-check - mkdir -p build.abi-check/${release} + mkdir -p "build.abi-check/${release}" ( - cd build.abi-check/${release} + cd "build.abi-check/${release}" CFLAGS=-Og cmake -DCMAKE_INSTALL_PREFIX="${BUILD_DEST}" ../.. make && make test rm -rf "${BUILD_DEST}" @@ -160,7 +160,7 @@ mkxml() if [ ! -e "${INSTBASE}/json-c-${ver}/lib64" ] ; then ln -s lib "${INSTBASE}/json-c-${ver}/lib64" fi -cat < json-c-${ver}.xml +cat < "json-c-${ver}.xml" ${ver} @@ -186,7 +186,7 @@ abidump() rm -f "${dumppath}" fi if [ ! -e "${dumppath}" ] ; then - perl "${ACC}" -lib json-c -dump json-c-${libver}.xml -dump-path "${dumppath}" + perl "${ACC}" -lib json-c -dump "json-c-${libver}.xml" -dump-path "${dumppath}" else echo "ABI dump already exists at ${dumppath}" fi @@ -200,16 +200,16 @@ build_old build_new cd "${REPORTDIR}" -mkxml ${release} -mkxml ${prev} +mkxml "${release}" +mkxml "${prev}" echo "=== Generating ABI dumps ===" -abidump ${prev} -abidump ${release} +abidump "${prev}" +abidump "${release}" echo "=== Comparing ABIs ===" -perl "${ACC}" -l json-c -old ABI-${prev}.dump -new ABI-${release}.dump -perl "${ACC}" -l json-c -old ABI-${prev}.dump -new ABI-${release}.dump -report-format xml +perl "${ACC}" -l json-c -old "ABI-${prev}.dump" -new "ABI-${release}.dump" +perl "${ACC}" -l json-c -old "ABI-${prev}.dump" -new "ABI-${release}.dump" -report-format xml echo echo "Look in $(pwd)/compat_reports/json-c/${prev}_to_${release}" diff --git a/amiga/build-amiga-sdk.sh b/amiga/build-amiga-sdk.sh index 9669ae3..1d535a9 100755 --- a/amiga/build-amiga-sdk.sh +++ b/amiga/build-amiga-sdk.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash +# shellcheck shell=bash # Cross-build json-c for Amiga systems across every multilib slot and install # the archives plus headers into an SDK tree. # @@ -10,7 +11,7 @@ set -uo pipefail SDK=${AMIGA_SDK:-/opt/amiga} AMIGA_DIR=$(cd "$(dirname "$0")" && pwd) ROOT=$(cd "$AMIGA_DIR/.." && pwd) -cd "$ROOT" +cd "$ROOT" || exit 1 OSES=("$@"); [[ ${#OSES[@]} -eq 0 ]] && OSES=(AmigaOS3 AmigaOS4 MorphOS) # os | image tag | sdk subdir @@ -30,6 +31,7 @@ os_sdkdir() { case "$1" in esac; } # Per-OS variant table: "tree|slot|cmake args" +# shellcheck disable=SC2034 # used in vars nameref, below variants_AmigaOS3=( "libnix|.|-DM68K_CRT=nix20 -DM68K_CPU=68000 -DM68K_BASEREL=off" "libnix|libm020|-DM68K_CRT=nix20 -DM68K_CPU=68020 -DM68K_BASEREL=off" @@ -54,6 +56,7 @@ variants_AmigaOS3=( # ppc-amigaos -mcrt=clib4 -> /lib/clib4/ # ppc-morphos -mclib=libnix-> /lib/libnix/ # ppc-morphos -mbaserel32 -> /lib/libb32/ +# shellcheck disable=SC2034 # used in vars nameref, below variants_AmigaOS4=( ".|.|-DPPC_CRT=newlib" ".|clib2|-DPPC_CRT=clib2" @@ -61,6 +64,7 @@ variants_AmigaOS4=( ) # MORPHOS_CLIB=libnix (-mclib=libnix) and NOIXEMUL (-noixemul) select the same # multilib; it is the self-contained ABI, needing no ixemul.library on target. +# shellcheck disable=SC2034 # used in vars nameref, below variants_MorphOS=( ".|.|" ".|libb32|-DMORPHOS_BASEREL32=ON" @@ -79,7 +83,7 @@ for os in "${OSES[@]}"; do elif [[ -d $SDK/$osdir/$sdksub ]]; then SDKROOT=$SDK/$osdir/$sdksub else echo "skip $os: neither $SDK/$sdksub nor $SDK/$osdir/$sdksub"; continue; fi - eval "vars=(\"\${variants_$os[@]}\")" + declare -n vars="variants_${os}" # nameref for v in "${vars[@]}"; do IFS='|' read -r tree slot cargs <<<"$v" bdir="bld-$os-$(echo "$tree$slot$cargs" | tr -c 'A-Za-z0-9' '-' | cut -c1-40)" diff --git a/amiga/package-amiga.sh b/amiga/package-amiga.sh index 854577c..7834c9a 100755 --- a/amiga/package-amiga.sh +++ b/amiga/package-amiga.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash +# shellcheck shell=bash # Build every json-c variant for the requested Amiga systems and package them # into dist/json-c.lha. # @@ -13,7 +14,7 @@ set -uo pipefail AMIGA_DIR=$(cd "$(dirname "$0")" && pwd) ROOT=$(cd "$AMIGA_DIR/.." && pwd) -cd "$ROOT" +cd "$ROOT" || exit 1 DIST=$ROOT/dist STAGE=$DIST/stage OSES=("$@"); [[ ${#OSES[@]} -eq 0 ]] && OSES=(AmigaOS3 AmigaOS4 MorphOS) @@ -68,7 +69,7 @@ done # to refresh a single entry (e.g. the readme) in an existing archive with # `lha u` -- it APPENDS a second entry with the same name rather than replacing # it, and extraction then yields the stale copy. -( cd "$STAGE" && lha -aq2 "$DIST/json-c.lha" * >/dev/null ) +( cd "$STAGE" && lha -aq2 "$DIST/json-c.lha" ./* >/dev/null ) rm -rf "$STAGE" echo echo "packaged: ${built[*]}" diff --git a/bench/jc-bench.sh b/bench/jc-bench.sh index 06a0242..7103e74 100755 --- a/bench/jc-bench.sh +++ b/bench/jc-bench.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # # Benchmarking harness for json-c # @@ -19,17 +19,17 @@ usage() { exitval=$1 errmsg=$2 - if [ $exitval -ne 0 ] ; then + if [ "$exitval" -ne 0 ] ; then exec 1>&2 fi - if [ ! -z "$errmsg" ] ; then + if [ -n "$errmsg" ] ; then echo "ERROR: $errmsg" 1>&2 fi cat < $_commit] as 'after'" @@ -115,18 +115,18 @@ else fi # Identify "before" commit hash, in order of preference -if [ ! -z "$before_arg" -a -d "$before_arg" ] ; then +if [ -n "$before_arg" ] && [ -d "$before_arg" ] ; then # Use provided directory before_src_dir="$before_arg" before_commit= echo "Using provided directory [$before_arg] as 'before'" else _commit= - if [ ! -z "$before_arg" ] ; then + if [ -n "$before_arg" ] ; then # Use provided commit hash _commit=$(git rev-parse --verify "$before_arg") fi - if [ ! -z "$_commit" ] ;then + if [ -n "$_commit" ] ;then before_src_dir= # i.e. current tree before_commit="$_commit" echo "Using provided commit [$before_arg => $_commit] as 'before'" @@ -134,7 +134,7 @@ else # Use origin/${cur_branch}, if different from ${after_commit} _cur_branch=$(git rev-parse --abbrev-ref HEAD) _commit= - if [ ! -z "${_cur_branch}" ] ; then + if [ -n "${_cur_branch}" ] ; then _commit=$(git rev-parse --verify "origin/${_cur_branch}") echo "Using origin/${_cur_branch} [$_commit] as 'before'" fi @@ -143,7 +143,7 @@ else fi fi - if [ ! -z "$_commit" ] ; then + if [ -n "$_commit" ] ; then before_src_dir= # i.e. current tree before_commit="$_commit" else @@ -174,9 +174,9 @@ compile_benchmark() mkdir -p "${inst_dir}" mkdir -p "${bench_dir}" - if [ ! -z "$src_commit" ] ; then + if [ -n "$src_commit" ] ; then # Resolve the short hash, tag or branch name to full hash - src_commit=$(git rev-parse $src_commit) + src_commit=$(git rev-parse "$src_commit") fi # No src dir specified, clone and checkout $src_commit @@ -213,7 +213,7 @@ compile_benchmark() # XXX TODO: name "after" and "before" uniquely using the dir & commit -if [ $do_all -ne 0 -o $do_build -ne 0 ] ; then +if [ $do_all -ne 0 ] || [ $do_build -ne 0 ] ; then sleep 5 # Wait slightly, to allow the human to read the message # about what exactly we're doing to benchmark. compile_benchmark "after" "${after_src_dir}" "${after_commit}" @@ -242,12 +242,12 @@ run_benchmark() echo "DONE with $bname" } -if [ $do_all -ne 0 -o $do_run -ne 0 ] ; then +if [ "$do_all" -ne 0 ] || [ "$do_run" -ne 0 ] ; then run_benchmark "after" run_benchmark "before" fi -if [ $do_compare -ne 0 ] ; then +if [ "$do_compare" -ne 0 ] ; then # XXX this needs better analysis cd "${WORK}" diff -udr before/bench/results after/bench/results || true diff --git a/fuzz/build.sh b/fuzz/build.sh index 7a42e0b..8244657 100755 --- a/fuzz/build.sh +++ b/fuzz/build.sh @@ -20,20 +20,20 @@ mkdir build cd build cmake -DBUILD_SHARED_LIBS=OFF .. -make -j$(nproc) +make -j"$(nproc)" LIB=$(pwd)/libjson-c.a cd .. # These seem to be set externally, but let's assign defaults to # make it possible to at least partially test this standalone. -: ${SRC:=$(dirname "$0")} -: ${OUT:=$SRC/out} -: ${CXX:=gcc} -: ${CXXFLAGS:=} +: "${SRC:=$(dirname "$0")}" +: "${OUT:=$SRC/out}" +: "${CXX:=gcc}" +: "${CXXFLAGS:=}" [ -d "$OUT" ] || mkdir "$OUT" -cp $SRC/*.dict $OUT/. +cp "$SRC/*.dict" "$OUT/." # XXX this doesn't seem to make much sense, since $SRC is presumably # the "fuzz" directory, which is _inside_ the json-c repo, rather than @@ -44,9 +44,9 @@ INCS=$SRC/json-c set -x set -v -for f in $SRC/*_fuzzer.cc; do +for f in "$SRC"/*_fuzzer.cc; do fuzzer=$(basename "$f" _fuzzer.cc) - $CXX $CXXFLAGS -std=c++11 -I$INCS \ - $SRC/${fuzzer}_fuzzer.cc -o $OUT/${fuzzer}_fuzzer \ - -lFuzzingEngine $LIB + "$CXX" "$CXXFLAGS" -std=c++11 "-I$INCS" \ + "$SRC/${fuzzer}_fuzzer.cc" -o "$OUT/${fuzzer}_fuzzer" \ + -lFuzzingEngine "$LIB" done diff --git a/reltools/bump_version.sh b/reltools/bump_version.sh index c39651e..4aeae63 100755 --- a/reltools/bump_version.sh +++ b/reltools/bump_version.sh @@ -35,18 +35,20 @@ bump_release_ver() { echo "ERROR: bump_release_ver() not yet implemented in $0" 1>&2 echo "See RELEASE_CHECKLIST.txt for steps to take" 1>&2 - trap - EXIT - exit 1 + return 1 } bump_dev_ver() { + # Update the working directory to get it ready for the next release. + # This runs just _after_ a release has been done + + # shellcheck disable=SC2143 if [ -n "$(git status --porcelain | grep -v reltools/bump_version.sh)" ] ; then usage 1 "local changes in working directory, aborting" fi RELVER=$(get_most_recent_relver) - DEVVER=${RELVER}.99 NEXTVER=$(get_next_relver) if ! grep -q "^${NEXTVER}" ChangeLog ; then @@ -75,7 +77,7 @@ EOF # Use ${release}.99 to indicate a version "newer" than anything on the branch: - if ! grep -q ${RELVER}.99 json_c_version.h ; then + if ! grep -q "${RELVER}.99" json_c_version.h ; then local MAJOR MINOR MAJOR=${RELVER%%.*} MINOR=${RELVER#*.} @@ -100,11 +102,11 @@ EOF fi local RELTAG - RELTAG=$(get_most_recent_reltag) + RELTAG=$(get_most_recent_reltag "") echo "Extracting VERSION, SOVERSION from ${RELTAG}:CMakeLists.txt" local REL_SOVER REL_SOVERNUM - REL_SOVER=$(git show ${RELTAG}:CMakeLists.txt | awk '/set_target_prop.*PROJECT_NAME/,/)/') + REL_SOVER=$(git show "${RELTAG}:CMakeLists.txt" | awk '/set_target_prop.*PROJECT_NAME/,/)/') REL_VERNUM=$(echo "${REL_SOVER}" | grep " VERSION " | sed -e's/ *VERSION *//' ) REL_SOVERNUM=$(echo "${REL_SOVER}" | grep " SOVERSION " | sed -e's/ *SOVERSION *//' -e's/)//' ) echo " VERSION=${REL_VERNUM}" @@ -157,7 +159,7 @@ EOF echo "Warning: json-c-sym already has JSONC_${NEXTVER}" 1>&2 fi - git commit -a -m "Update the master branch to version ${release}.99" + git commit -a -m "Update the master branch to version ${RELVER}.99" } while [ $# -gt 0 ] ; do @@ -177,7 +179,6 @@ while [ $# -gt 0 ] ; do ;; *) usage 1 "Unknown args: $*" - exit 1 ;; esac done diff --git a/reltools/check_symbols.sh b/reltools/check_symbols.sh index dc24620..9c8a93f 100755 --- a/reltools/check_symbols.sh +++ b/reltools/check_symbols.sh @@ -10,6 +10,8 @@ exitval=0 XMLREPORT="$1" if [[ "${XMLREPORT}" = -* ]] || [ ! -r "${XMLREPORT}" ] ; then + echo "Usage: $0 " 1>&2 + exit 1 fi XSLTPROC=${XSLTPROC:-xsltproc} diff --git a/reltools/gen_issues_closed.sh b/reltools/gen_issues_closed.sh index 4b90363..42dc290 100755 --- a/reltools/gen_issues_closed.sh +++ b/reltools/gen_issues_closed.sh @@ -7,7 +7,8 @@ RUNDIR=$(dirname "$0") NEXT_VER=$(get_next_relver) -MOST_RECENT=$(ls ${RUNDIR}/../issues_closed*md | sort -V | tail -1) +# shellcheck disable=SC2012 # Using find is overkill +MOST_RECENT=$(ls "${RUNDIR}"/../issues_closed*md | sort -V | tail -1) PREV=$(grep 'NOW=' "${MOST_RECENT}" | sed -e's/.*=//') NOW=$(date +%Y-%m-%d) set -x -v diff --git a/reltools/publish_docs.sh b/reltools/publish_docs.sh index 673f1e7..9ca3b75 100755 --- a/reltools/publish_docs.sh +++ b/reltools/publish_docs.sh @@ -25,8 +25,8 @@ if [ ! -d "json-c-${release}" ] ; then git clone https://github.com/json-c/json-c "json-c-${release}" fi -cd json-c-${release} -git checkout ${reltag} +cd "json-c-${release}" +git checkout "${reltag}" if [ ! -e doc/html/index.html ] ; then echo "ERROR: unable to find doc/html/index.html on at version ${reltag} in $(pwd)" 1>&2 exit 1 @@ -38,11 +38,11 @@ if [ ! -d json-c-pages ] ; then git clone -b gh-pages https://github.com/json-c/json-c json-c-pages fi cd json-c-pages -mkdir -p json-c-${release} -cp -R ../json-c-${release}/doc json-c-${release}/. -git add json-c-${release} +mkdir -p "json-c-${release}" +cp -R "../json-c-${release}/doc" "json-c-${release}/." +git add "json-c-${release}" rm json-c-current-release -ln -s json-c-${release} json-c-current-release +ln -s "json-c-${release}" json-c-current-release git commit -a -m "Add the ${release} docs." # TODO: automate changes to index.html @@ -51,13 +51,13 @@ Steps to do: * Add section with links to new json-c-${release} release. * Update versions in the "Current release" section EOF -read -p "Press to run vi index.html: " +read -r -p "Press to run vi index.html: " vi index.html git commit -a -m "Update the doc links to point at ${release}" cat < "${JSON_C_TOP}/AUTHORS" } diff --git a/reltools/update_authors.sh b/reltools/update_authors.sh index b3cbe09..0595e2d 100755 --- a/reltools/update_authors.sh +++ b/reltools/update_authors.sh @@ -8,7 +8,7 @@ TOP=${RUNDIR}/.. update_authors() { - PREV=$(get_most_recent_reltag) - NEW_AUTHORS=$( git log -r ${PREV}..HEAD | grep Author: | sed -e's/Author: //' ; cat "${TOP}/AUTHORS" ) + PREV=$(get_most_recent_reltag "") + NEW_AUTHORS=$( git log -r "${PREV}..HEAD" | grep Author: | sed -e's/Author: //' ; cat "${TOP}/AUTHORS" ) echo "${NEW_AUTHORS}" | sort -u > "${TOP}/AUTHORS" } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 0678dd1..5081f14 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -39,7 +39,9 @@ set(ALL_TEST_NAMES test_visit test_object_iterator) -set(NOBUILD_TEST_NAMES "") +set(NOBUILD_TEST_NAMES + shellcheck + ) if (BUILD_APPS) set(NOBUILD_TEST_NAMES ${NOBUILD_TEST_NAMES} test_json_parse_cli) endif() diff --git a/tests/meson.build b/tests/meson.build index ca9f13d..08b07ed 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -8,6 +8,8 @@ test_lib = static_library( install: false, ) +fs = import('fs') + test_deps = declare_dependency( include_directories: '..', link_with: test_lib, @@ -15,6 +17,7 @@ test_deps = declare_dependency( # List of test sources and expected output files test_cases = [ + ['shellcheck.test'], ['test1', 'test1.expected'], ['test2', 'test2.expected'], ['test4', 'test4.expected'], @@ -47,7 +50,9 @@ test_cases = [ # Copy expected files and test data expected_files = [] foreach t : test_cases - expected_files += t[1] + if t.length() > 1 + expected_files += t[1] + endif endforeach foreach f : expected_files + ['valid.json', 'valid_nested.json', 'json_patch_spec_tests.json', 'json_patch_tests.json'] @@ -65,15 +70,24 @@ message('Test data directory: ' + testdir) foreach t : test_cases name = t[0] - expected = t[1] - exe = executable(name, name + '.c', - dependencies: test_deps, - build_by_default: false - ) + env_expected = [] + if t.length() > 1 + expected = t[1] + # XXX does this do anything? + env_expected = ['EXPECTED_FILE=' + meson.current_build_dir() / expected] + endif + if fs.exists(name + '.c') + exe = executable(name, name + '.c', + dependencies: test_deps, + build_by_default: false + ) + else + exe = find_program(name) + endif test(name, exe, args: special_args.get(name, []), - env: ['EXPECTED_FILE=' + meson.current_build_dir() / expected], + env: env_expected, workdir: testdir ) endforeach diff --git a/tests/shellcheck.test b/tests/shellcheck.test new file mode 100755 index 0000000..e4384f8 --- /dev/null +++ b/tests/shellcheck.test @@ -0,0 +1,33 @@ +#!/bin/sh +# +# Run shellcheck on all shell scripts in the source tree +# + +set -e + +if ! type shellcheck > /dev/null ; then + echo "$0: SKIPPED, shellcheck not found" + exit 0 +fi + +if test -z "$srcdir"; then + srcdir="${0%/*}" + test "$srcdir" = "$0" && srcdir=. + test -z "$srcdir" && srcdir=. +fi + +: "${VERBOSE:=1}" +. "$srcdir/test-defs.sh" +TOP="$srcdir/.." + +cd "$TOP" +if find ./* -name \*.sh -o \ + \( -name \*.test -type f \) -print0 | \ + xargs -0 shellcheck ; then + echo "$0: SUCCESS" + exit 0 +else + echo "$0: FAIL" + exit 1 +fi + diff --git a/tests/test-defs.sh b/tests/test-defs.sh index 7984309..c85fe48 100755 --- a/tests/test-defs.sh +++ b/tests/test-defs.sh @@ -1,6 +1,6 @@ #!/bin/sh -if [ ! -z "$JSONC_TEST_TRACE" ] ; then +if [ -n "$JSONC_TEST_TRACE" ] ; then VERBOSE=1 set -x set -v @@ -10,7 +10,7 @@ fi # stand-alone!! # srcdir=${srcdir-.} -if test ! -d $srcdir ; then +if test ! -d "$srcdir" ; then echo "test-defs.sh: installation error" 1>&2 exit 1 fi @@ -18,18 +18,17 @@ fi # Use absolute paths case "$srcdir" in /* | [A-Za-z]:\\*) ;; - *) srcdir=`\cd $srcdir && pwd` ;; + *) srcdir=$(cd "$srcdir" && pwd) ;; esac case "$top_builddir" in /* | [A-Za-z]:\\*) ;; - *) top_builddir=`\cd ${top_builddir-..} && pwd` ;; + *) top_builddir=$(cd "${top_builddir-..}" && pwd) ;; esac top_builddir=${top_builddir}/tests -progname=`echo "$0" | sed 's,^.*/,,'` -testname=`echo "$progname" | sed 's,-.*$,,'` +progname=$(echo "$0" | sed 's,^.*/,,') testsubdir=${testsubdir-testSubDir} testsubdir=${testsubdir}/${progname} @@ -64,7 +63,7 @@ case "${use_valgrind}" in ;; esac valgrind_path=$(which valgrind 2> /dev/null) -if [ -z "${valgrind_path}" -o ! -x "${valgrind_path}" ] ; then +if [ -z "${valgrind_path}" ] || [ ! -x "${valgrind_path}" ] ; then use_valgrind=0 fi @@ -99,11 +98,12 @@ run_output_test() fi REDIR_OUTPUT="> \"${TEST_OUTPUT}.out\" 2>&1" - if [ $VERBOSE -gt 1 ] ; then + if [ "$VERBOSE" -gt 1 ] ; then REDIR_OUTPUT="2>&1 | tee \"${TEST_OUTPUT}.out\"" fi - if [ $use_valgrind -eq 1 ] ; then + local exitval + if [ "$use_valgrind" -eq 1 ] ; then eval valgrind --tool=memcheck \ --trace-children=yes \ --demangle=yes \ @@ -111,20 +111,21 @@ run_output_test() --leak-check=full \ --show-reachable=yes \ --run-libc-freeres=yes \ - "\"${top_builddir}/${TEST_COMMAND}\"" \"\$@\" ${REDIR_OUTPUT} + "\"${top_builddir}/${TEST_COMMAND}\" \"\$@\" ${REDIR_OUTPUT}" exitval=$? else - eval "\"${top_builddir}/${TEST_COMMAND}"\" \"\$@\" ${REDIR_OUTPUT} + eval "\"${top_builddir}/${TEST_COMMAND}\" \"\$@\" ${REDIR_OUTPUT}" exitval=$? fi - if [ $exitval -ne $EXPECTED_EXITVAL ] ; then - echo "ERROR: \"${TEST_COMMAND} $@\" exited with incorrect exit status: $err != $EXPECTED_EXITVAL" 1>&2 + local err=0 + if [ "$exitval" -ne "$EXPECTED_EXITVAL" ] ; then + echo "ERROR: \"${TEST_COMMAND} $*\" exited with incorrect exit status: $err != $EXPECTED_EXITVAL" 1>&2 err=1 fi - if [ $use_valgrind -eq 1 ] ; then + if [ "$use_valgrind" -eq 1 ] ; then if ! tail -1 "${TEST_OUTPUT}.vg.out" | grep -q "ERROR SUMMARY: 0 errors" ; then echo "ERROR: valgrind found errors during execution:" 1>&2 cat "${TEST_OUTPUT}.vg.out" @@ -133,12 +134,12 @@ run_output_test() fi if ! "$CMP" -s "${srcdir}/${TEST_OUTPUT}.expected" "${TEST_OUTPUT}.out" ; then - echo "ERROR: \"${TEST_COMMAND} $@\" (${TEST_OUTPUT}) failed (set VERBOSE=1 to see full output):" 1>&2 - (cd "${CURDIR}" ; set -x ; diff "${srcdir}/${TEST_OUTPUT}.expected" "$testsubdir/${TEST_OUTPUT}.out") + echo "ERROR: \"${TEST_COMMAND} $*\" (${TEST_OUTPUT}) failed (set VERBOSE=1 to see full output):" 1>&2 + (cd "${CURDIR}" && set -x && diff "${srcdir}/${TEST_OUTPUT}.expected" "$testsubdir/${TEST_OUTPUT}.out") echo "cp \"$testsubdir/${TEST_OUTPUT}.out\" \"${srcdir}/${TEST_OUTPUT}.expected\"" 1>&2 err=1 fi - return $err + return "$err" } diff --git a/tests/test_basic.test b/tests/test_basic.test index 474e7a8..f9c951a 100755 --- a/tests/test_basic.test +++ b/tests/test_basic.test @@ -17,5 +17,5 @@ filename="${filename%.*}" # more stuff could be extended cp -f "$srcdir/valid.json" . -run_output_test $filename "$srcdir" +run_output_test "$filename" "$srcdir" exit $? diff --git a/tests/test_json_patch.test b/tests/test_json_patch.test index 0dc5aff..469164c 100755 --- a/tests/test_json_patch.test +++ b/tests/test_json_patch.test @@ -13,5 +13,5 @@ fi filename=$(basename "$0") filename="${filename%.*}" -run_output_test $filename "$srcdir" +run_output_test "$filename" "$srcdir" exit $? diff --git a/tests/test_object_add_failure.test b/tests/test_object_add_failure.test index 3912732..10c30b2 100755 --- a/tests/test_object_add_failure.test +++ b/tests/test_object_add_failure.test @@ -11,5 +11,5 @@ fi filename=$(basename "$0") filename="${filename%.*}" -run_output_test $filename +run_output_test "$filename" exit $?