aboutsummaryrefslogtreecommitdiffstats
path: root/shflags_parsing_test.sh
diff options
context:
space:
mode:
authorBob Badour <bbadour@google.com>2020-05-19 18:42:31 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2020-05-19 18:42:31 +0000
commit7ef808bcfab8caf6982638109313922bd01ebabe (patch)
treeda581028905318f358769fc7bb6f8aa7373e2fb7 /shflags_parsing_test.sh
parent61ff40b5dc949665a5d3cd13dcca0a128453b7f5 (diff)
parent3dac286b93162f3ea66f52c2f4dd094c87fd755b (diff)
downloadplatform_external_shflags-master.tar.gz
platform_external_shflags-master.tar.bz2
platform_external_shflags-master.zip
Merge remote-tracking branch 'aosp/upstream-master' into mymerge am: 2e0d635a87 am: 3dac286b93HEADmaster
Change-Id: Ia5282f67996c2f14271d3cd84a7c25f76ed6ec73
Diffstat (limited to 'shflags_parsing_test.sh')
-rwxr-xr-xshflags_parsing_test.sh333
1 files changed, 333 insertions, 0 deletions
diff --git a/shflags_parsing_test.sh b/shflags_parsing_test.sh
new file mode 100755
index 0000000..606d757
--- /dev/null
+++ b/shflags_parsing_test.sh
@@ -0,0 +1,333 @@
+#! /bin/sh
+# vim:et:ft=sh:sts=2:sw=2
+#
+# shFlags unit test for the flag definition methods
+#
+# Copyright 2008-2020 Kate Ward. All Rights Reserved.
+# Released under the Apache 2.0 license.
+#
+# Author: kate.ward@forestent.com (Kate Ward)
+# https://github.com/kward/shflags
+#
+### ShellCheck (http://www.shellcheck.net/)
+# Disable source following.
+# shellcheck disable=SC1090,SC1091
+
+# TODO(kward): assert on FLAGS errors
+# TODO(kward): testNonStandardIFS()
+
+# These variables will be overridden by the test helpers.
+stdoutF="${TMPDIR:-/tmp}/STDOUT"
+stderrF="${TMPDIR:-/tmp}/STDERR"
+
+# Load test helpers.
+. ./shflags_test_helpers
+
+testGetoptStandard() {
+ if ! _flags_getoptStandard '-b' >"${stdoutF}" 2>"${stderrF}"; then
+ fail "error parsing -b flag"
+ _showTestOutput
+ fi
+
+ if _flags_getoptStandard '-x' >"${stdoutF}" 2>"${stderrF}"; then
+ fail "expected error parsing invalid -x flag"
+ _showTestOutput
+ fi
+}
+
+testGetoptEnhanced() {
+ if ! flags_getoptIsEnh; then
+ return
+ fi
+
+ if ! _flags_getoptEnhanced '-b' >"${stdoutF}" 2>"${stderrF}"; then
+ fail "error parsing -b flag"
+ _showTestOutput
+ fi
+ if ! _flags_getoptEnhanced '--bool' >"${stdoutF}" 2>"${stderrF}"; then
+ fail "error parsing --bool flag"
+ _showTestOutput
+ fi
+
+ if _flags_getoptEnhanced '-x' >"${stdoutF}" 2>"${stderrF}"; then
+ fail "expected error parsing invalid -x flag"
+ _showTestOutput
+ fi
+ if _flags_getoptEnhanced '--xyz' >"${stdoutF}" 2>"${stderrF}"; then
+ fail "expected error parsing invalid --xyz flag"
+ _showTestOutput
+ fi
+}
+
+testValidBoolsShort() {
+ desc='bool_true_arg'
+ if FLAGS -b >"${stdoutF}" 2>"${stderrF}"; then
+ assertTrue "${desc}: expected true value" "${FLAGS_bool:-}"
+ else
+ fail "${desc}: FLAGS returned a non-zero result ($?)"
+ fi
+ th_showOutput
+
+ desc='bool2_defined'
+ DEFINE_boolean bool2 true '2nd boolean' B
+ if FLAGS >"${stdoutF}" 2>"${stderrF}"; then
+ assertTrue "${desc}: expected true value" "${FLAGS_bool2:-}"
+ else
+ fail "${desc}: FLAGS returned a non-zero result ($?)"
+ fi
+ th_showOutput
+
+ desc='bool_false_arg'
+ if FLAGS -B >"${stdoutF}" 2>"${stderrF}"; then
+ assertFalse "${desc}: expected false value" "${FLAGS_bool2:-}"
+ else
+ fail "${desc}: FLAGS returned a non-zero result ($?)"
+ fi
+ th_showOutput
+}
+
+# TODO(kate): separate into multiple functions to reflect correct usage
+testValidBoolsLong() {
+ flags_getoptIsEnh
+ [ $? -eq "${FLAGS_FALSE}" ] && return
+
+ # Note: the default value of bool is 'false'.
+
+ # Leave flag false.
+ FLAGS --nobool >"${stdoutF}" 2>"${stderrF}"
+ r3turn=$?
+ assertTrue "FLAGS returned a non-zero result (${r3turn})" ${r3turn}
+ assertFalse '--noXX flag resulted in true value.' "${FLAGS_bool:-}"
+ assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
+ th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
+
+ # Flip flag true.
+ FLAGS --bool >"${stdoutF}" 2>"${stderrF}"
+ r3turn=$?
+ assertTrue "FLAGS returned a non-zero result (${r3turn})" ${r3turn}
+ assertTrue '--XX flag resulted in false value.' "${FLAGS_bool:-}"
+ assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
+ th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
+
+ # Flip flag back false.
+ FLAGS --nobool >"${stdoutF}" 2>"${stderrF}"
+ r3turn=$?
+ assertTrue "FLAGS returned a non-zero result (${r3turn})" ${r3turn}
+ assertFalse '--noXX flag resulted in true value.' "${FLAGS_bool:-}"
+ assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
+ th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
+}
+
+testFloats() {
+ _testFloats '-f'
+ if flags_getoptIsEnh; then
+ _testFloats '--float'
+ fi
+}
+
+_testFloats() {
+ flag=$1
+
+ for value in ${TH_FLOAT_VALID}; do
+ if FLAGS "${flag}" "${value}" >"${stdoutF}" 2>"${stderrF}"; then
+ # shellcheck disable=SC2154
+ assertEquals "${flag}: incorrect value" "${value}" "${FLAGS_float}"
+ else
+ fail "${flag}: unexpected non-zero result ($?)"
+ th_showOutput
+ fi
+ done
+
+ for value in ${TH_FLOAT_INVALID}; do
+ # Wrap FLAGS in () to catch errors.
+ if (FLAGS "${flag}" "${value}" >"${stdoutF}" 2>"${stderrF}"); then
+ fail "${flag}: expected a non-zero result"
+ th_showOutput
+ else
+ assertEquals "${flag}: expected an error" $? "${FLAGS_ERROR}"
+ fi
+ done
+}
+
+testIntegers() {
+ _testIntegers '-i'
+ if flags_getoptIsEnh; then
+ _testIntegers '--int'
+ fi
+}
+
+_testIntegers() {
+ flag=$1
+
+ for value in ${TH_INT_VALID}; do
+ if FLAGS "${flag}" "${value}" >"${stdoutF}" 2>"${stderrF}"; then
+ # shellcheck disable=SC2154
+ assertEquals "${flag}: incorrect value" "${value}" "${FLAGS_int}"
+ else
+ fail "${flag}: unexpected non-zero result ($?)"
+ th_showOutput
+ fi
+ done
+
+ for value in ${TH_INT_INVALID}; do
+ # Wrap FLAGS in () to catch errors.
+ if (FLAGS "${flag}" "${value}" >"${stdoutF}" 2>"${stderrF}"); then
+ fail "${flag}: expected a non-zero result"
+ th_showOutput
+ else
+ assertEquals "${flag}: expected an error" $? "${FLAGS_ERROR}"
+ fi
+ done
+}
+
+testStrings() {
+ _testStrings 'std_single_word' -s single_word
+ if flags_getoptIsEnh; then
+ _testStrings 'enh_single_word' --str single_word
+ _testStrings 'enh_multi_word' --str 'string with spaces'
+ fi
+}
+
+_testStrings() {
+ desc=$1
+ flag=$2
+ value=$3
+
+ if FLAGS "${flag}" "${value}" >"${stdoutF}" 2>"${stderrF}"; then
+ # shellcheck disable=SC2154
+ assertEquals "${desc}: incorrect value" "${value}" "${FLAGS_str}"
+ else
+ fail "${desc}: unexpected non-zero result ($?)"
+ # Validate that an error is thrown for unsupported getopt uses.
+ assertFatalMsg '.* spaces in options'
+ th_showOutput
+ fi
+}
+
+testMultipleFlags() {
+ _testMultipleFlags '-b' '-i' '-f' '-s'
+ flags_getoptIsEnh
+ [ $? -eq "${FLAGS_FALSE}" ] && return
+ _testMultipleFlags '--bool' '--int' '--float' '--str'
+}
+
+_testMultipleFlags() {
+ boolFlag=$1
+ intFlag=$2
+ floatFlag=$3
+ strFlag=$4
+
+ FLAGS \
+ "${boolFlag}" \
+ "${intFlag}" 567 \
+ "${floatFlag}" 123.45678 \
+ "${strFlag}" 'some_string' \
+ >"${stdoutF}" 2>"${stderrF}"
+ r3turn=$?
+ assertTrue "use of multiple flags returned a non-zero result" ${r3turn}
+ assertTrue 'boolean test failed.' "${FLAGS_bool}"
+ assertNotSame 'float test failed.' 0 "${FLAGS_float}"
+ assertNotSame 'integer test failed.' 0 "${FLAGS_int}"
+ assertNotSame 'string test failed.' '' "${FLAGS_str}"
+ assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
+ th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
+}
+
+_testNonFlagArgs() {
+ argc=$1
+ shift
+
+ FLAGS "$@" >"${stdoutF}" 2>"${stderrF}"
+ r3turn=$?
+ assertTrue 'parse returned non-zero value.' ${r3turn}
+ th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
+
+ eval set -- "${FLAGS_ARGV}"
+ assertEquals 'wrong count of argv arguments returned.' "${argc}" $#
+}
+
+testSingleNonFlagArg() { _testNonFlagArgs 1 argOne; }
+testMultipleNonFlagArgs() { _testNonFlagArgs 3 argOne argTwo arg3; }
+
+testMultipleNonFlagStringArgsWithSpaces() {
+ if flags_getoptIsEnh; then
+ _testNonFlagArgs 3 argOne 'arg two' arg3
+ fi
+}
+
+testFlagsWithEquals() {
+ if ! flags_getoptIsEnh; then
+ return
+ fi
+
+ FLAGS --str='str_flag' 'non_flag' >"${stdoutF}" 2>"${stderrF}"
+ assertTrue 'FLAGS returned a non-zero result' $?
+ assertEquals 'string flag not set properly' 'str_flag' "${FLAGS_str}"
+ th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
+
+ eval set -- "${FLAGS_ARGV}"
+ assertEquals 'wrong count of argv arguments returned.' 1 $#
+}
+
+testComplicatedCommandLineStandard() {
+ flags_getoptIsEnh
+ [ $? -eq "${FLAGS_TRUE}" ] && return
+
+ # Note: standard getopt stops parsing after first non-flag argument, which
+ # results in the remaining flags being treated as arguments instead.
+ FLAGS -i 1 non_flag_1 -s 'two' non_flag_2 -f 3 non_flag_3 \
+ >"${stdoutF}" 2>"${stderrF}"
+ r3turn=$?
+ assertTrue 'FLAGS returned a non-zero result' ${r3turn}
+ assertEquals 'failed int test' 1 "${FLAGS_int}"
+ th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
+
+ eval set -- "${FLAGS_ARGV}"
+ assertEquals 'incorrect number of argv values' 7 $#
+}
+
+testComplicatedCommandLineEnhanced() {
+ flags_getoptIsEnh
+ [ $? -eq "${FLAGS_FALSE}" ] && return
+
+ FLAGS -i 1 non_flag_1 --str='two' non_flag_2 --float 3 'non flag 3' \
+ >"${stdoutF}" 2>"${stderrF}"
+ r3turn=$?
+ assertTrue 'FLAGS returned a non-zero result' ${r3turn}
+ assertEquals 'failed int test' 1 "${FLAGS_int}"
+ assertEquals 'failed str test' 'two' "${FLAGS_str}"
+ assertEquals 'failed float test' 3 "${FLAGS_float}"
+ th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
+
+ eval set -- "${FLAGS_ARGV}"
+ assertEquals 'incorrect number of argv values' 3 $#
+}
+
+oneTimeSetUp() {
+ th_oneTimeSetUp
+
+ if flags_getoptIsStd; then
+ th_warn 'Standard version of getopt found. Enhanced tests will be skipped.'
+ else
+ th_warn 'Enhanced version of getopt found. Standard tests will be skipped.'
+ fi
+}
+
+setUp() {
+ DEFINE_boolean bool false 'boolean test' 'b'
+ DEFINE_float float 0.0 'float test' 'f'
+ DEFINE_integer int 0 'integer test' 'i'
+ DEFINE_string str '' 'string test' 's'
+}
+
+tearDown() {
+ flags_reset
+}
+
+# showTestOutput for the most recently run test.
+_showTestOutput() { th_showOutput "${SHUNIT_FALSE}" "${stdoutF}" "${stderrF}"; }
+
+# Load and run shUnit2.
+# shellcheck disable=SC2034
+[ -n "${ZSH_VERSION:-}" ] && SHUNIT_PARENT=$0
+. "${TH_SHUNIT}"