xref: /aosp_15_r20/external/shflags/shflags_public_test.sh (revision 63d4e48fb639f6414be0db9d718e3be2667e4fed)
1*63d4e48fSSadaf Ebrahimi#! /bin/sh
2*63d4e48fSSadaf Ebrahimi# vim:et:ft=sh:sts=2:sw=2
3*63d4e48fSSadaf Ebrahimi#
4*63d4e48fSSadaf Ebrahimi# shFlags unit test for the public functions.
5*63d4e48fSSadaf Ebrahimi#
6*63d4e48fSSadaf Ebrahimi# Copyright 2008-2020 Kate Ward. All Rights Reserved.
7*63d4e48fSSadaf Ebrahimi# Released under the Apache 2.0 license.
8*63d4e48fSSadaf Ebrahimi#
9*63d4e48fSSadaf Ebrahimi# Author: [email protected] (Kate Ward)
10*63d4e48fSSadaf Ebrahimi# https://github.com/kward/shflags
11*63d4e48fSSadaf Ebrahimi#
12*63d4e48fSSadaf Ebrahimi### ShellCheck (http://www.shellcheck.net/)
13*63d4e48fSSadaf Ebrahimi# Disable source following.
14*63d4e48fSSadaf Ebrahimi#   shellcheck disable=SC1090,SC1091
15*63d4e48fSSadaf Ebrahimi# $() are not fully portable (POSIX != portable).
16*63d4e48fSSadaf Ebrahimi#   shellcheck disable=SC2006
17*63d4e48fSSadaf Ebrahimi
18*63d4e48fSSadaf Ebrahimi# These variables will be overridden by the test helpers.
19*63d4e48fSSadaf EbrahimiexpectedF="${TMPDIR:-/tmp}/expected"
20*63d4e48fSSadaf EbrahimireturnF="${TMPDIR:-/tmp}/return"
21*63d4e48fSSadaf EbrahimistdoutF="${TMPDIR:-/tmp}/STDOUT"
22*63d4e48fSSadaf EbrahimistderrF="${TMPDIR:-/tmp}/STDERR"
23*63d4e48fSSadaf Ebrahimi
24*63d4e48fSSadaf Ebrahimi# Load test helpers.
25*63d4e48fSSadaf Ebrahimi. ./shflags_test_helpers
26*63d4e48fSSadaf Ebrahimi
27*63d4e48fSSadaf EbrahimitestHelp() {
28*63d4e48fSSadaf Ebrahimi  _testHelp '-h'
29*63d4e48fSSadaf Ebrahimi  _testHelp '--help'
30*63d4e48fSSadaf Ebrahimi}
31*63d4e48fSSadaf Ebrahimi
32*63d4e48fSSadaf Ebrahimi_testHelp() {
33*63d4e48fSSadaf Ebrahimi  if ! flags_getoptIsEnh; then
34*63d4e48fSSadaf Ebrahimi    return
35*63d4e48fSSadaf Ebrahimi  fi
36*63d4e48fSSadaf Ebrahimi
37*63d4e48fSSadaf Ebrahimi  flag=$1
38*63d4e48fSSadaf Ebrahimi
39*63d4e48fSSadaf Ebrahimi  # Test default help output.
40*63d4e48fSSadaf Ebrahimi  th_clearReturn
41*63d4e48fSSadaf Ebrahimi  (
42*63d4e48fSSadaf Ebrahimi    FLAGS "${flag}" >"${stdoutF}" 2>"${stderrF}"
43*63d4e48fSSadaf Ebrahimi    echo $? >"${returnF}"
44*63d4e48fSSadaf Ebrahimi  )
45*63d4e48fSSadaf Ebrahimi  assertFalse \
46*63d4e48fSSadaf Ebrahimi      'short help request should have returned a false exit code.' \
47*63d4e48fSSadaf Ebrahimi      "$(th_queryReturn)"
48*63d4e48fSSadaf Ebrahimi  (grep 'show this help' "${stderrF}" >/dev/null)
49*63d4e48fSSadaf Ebrahimi  r3turn=$?
50*63d4e48fSSadaf Ebrahimi  assertTrue \
51*63d4e48fSSadaf Ebrahimi      'short request for help should have produced some help output.' \
52*63d4e48fSSadaf Ebrahimi      ${r3turn}
53*63d4e48fSSadaf Ebrahimi  [ ${r3turn} -ne "${FLAGS_TRUE}" ] && th_showOutput
54*63d4e48fSSadaf Ebrahimi
55*63d4e48fSSadaf Ebrahimi  # Test proper output when FLAGS_HELP set.
56*63d4e48fSSadaf Ebrahimi  (
57*63d4e48fSSadaf Ebrahimi    FLAGS_HELP='this is a test'
58*63d4e48fSSadaf Ebrahimi    FLAGS "${flag}" >"${stdoutF}" 2>"${stderrF}"
59*63d4e48fSSadaf Ebrahimi  )
60*63d4e48fSSadaf Ebrahimi  (grep 'this is a test' "${stderrF}" >/dev/null)
61*63d4e48fSSadaf Ebrahimi  r3turn=$?
62*63d4e48fSSadaf Ebrahimi  assertTrue 'setting FLAGS_HELP did not produce expected result' ${r3turn}
63*63d4e48fSSadaf Ebrahimi  [ ${r3turn} -ne "${FLAGS_TRUE}" ] && th_showOutput
64*63d4e48fSSadaf Ebrahimi
65*63d4e48fSSadaf Ebrahimi  # Test that "'" chars work in help string.
66*63d4e48fSSadaf Ebrahimi  (
67*63d4e48fSSadaf Ebrahimi    # shellcheck disable=SC2034
68*63d4e48fSSadaf Ebrahimi    DEFINE_boolean b false "help string containing a ' char" b
69*63d4e48fSSadaf Ebrahimi    FLAGS "${flag}" >"${stdoutF}" 2>"${stderrF}"
70*63d4e48fSSadaf Ebrahimi  )
71*63d4e48fSSadaf Ebrahimi  (grep "help string containing a ' char" "${stderrF}" >/dev/null)
72*63d4e48fSSadaf Ebrahimi  r3turn=$?
73*63d4e48fSSadaf Ebrahimi  assertTrue "help strings containing apostrophes don't work" ${r3turn}
74*63d4e48fSSadaf Ebrahimi  [ ${r3turn} -ne "${FLAGS_TRUE}" ] && th_showOutput
75*63d4e48fSSadaf Ebrahimi
76*63d4e48fSSadaf Ebrahimi  return "${SHUNIT_TRUE}"
77*63d4e48fSSadaf Ebrahimi}
78*63d4e48fSSadaf Ebrahimi
79*63d4e48fSSadaf Ebrahimimock_flags_columns() {
80*63d4e48fSSadaf Ebrahimi  echo 80
81*63d4e48fSSadaf Ebrahimi}
82*63d4e48fSSadaf Ebrahimi
83*63d4e48fSSadaf EbrahimitestStandardHelpOutput() {
84*63d4e48fSSadaf Ebrahimi  if ! flags_getoptIsStd; then
85*63d4e48fSSadaf Ebrahimi   startSkipping
86*63d4e48fSSadaf Ebrahimi fi
87*63d4e48fSSadaf Ebrahimi
88*63d4e48fSSadaf Ebrahimi  DEFINE_boolean test_bool false 'test boolean' b
89*63d4e48fSSadaf Ebrahimi  DEFINE_integer test_int 0 'test integer' i
90*63d4e48fSSadaf Ebrahimi  DEFINE_string test_str '' 'test string' s
91*63d4e48fSSadaf Ebrahimi  DEFINE_string long_desc 'blah' \
92*63d4e48fSSadaf Ebrahimi      'testing of a long description to force wrap of default value' D
93*63d4e48fSSadaf Ebrahimi  DEFINE_string long_default \
94*63d4e48fSSadaf Ebrahimi      'this_is_a_long_default_value_to_force_alternate_indentation' \
95*63d4e48fSSadaf Ebrahimi      'testing of long default value' F
96*63d4e48fSSadaf Ebrahimi
97*63d4e48fSSadaf Ebrahimi  # Test for https://github.com/kward/shflags/issues/28.
98*63d4e48fSSadaf Ebrahimi  DEFINE_boolean 'force' false '' f
99*63d4e48fSSadaf Ebrahimi
100*63d4e48fSSadaf Ebrahimi  help='USAGE: standard [flags] args'
101*63d4e48fSSadaf Ebrahimi
102*63d4e48fSSadaf Ebrahimi  cat >"${expectedF}" <<EOF
103*63d4e48fSSadaf Ebrahimi${help}
104*63d4e48fSSadaf Ebrahimiflags:
105*63d4e48fSSadaf Ebrahimi  -b  test boolean (default: false)
106*63d4e48fSSadaf Ebrahimi  -i  test integer (default: 0)
107*63d4e48fSSadaf Ebrahimi  -s  test string (default: '')
108*63d4e48fSSadaf Ebrahimi  -D  testing of a long description to force wrap of default value
109*63d4e48fSSadaf Ebrahimi      (default: 'blah')
110*63d4e48fSSadaf Ebrahimi  -F  testing of long default value
111*63d4e48fSSadaf Ebrahimi      (default: 'this_is_a_long_default_value_to_force_alternate_indentation')
112*63d4e48fSSadaf Ebrahimi  -f  (default: false)
113*63d4e48fSSadaf Ebrahimi  -h  show this help (default: false)
114*63d4e48fSSadaf EbrahimiEOF
115*63d4e48fSSadaf Ebrahimi  (
116*63d4e48fSSadaf Ebrahimi    _flags_columns() { mock_flags_columns; }
117*63d4e48fSSadaf Ebrahimi    FLAGS_HELP=${help};
118*63d4e48fSSadaf Ebrahimi    # Wrap FLAGS call in if/then/else so 'set -e' works properly.
119*63d4e48fSSadaf Ebrahimi    if FLAGS -h >"${stdoutF}" 2>"${stderrF}"; then
120*63d4e48fSSadaf Ebrahimi      rtrn=$?
121*63d4e48fSSadaf Ebrahimi    else
122*63d4e48fSSadaf Ebrahimi      rtrn=$?
123*63d4e48fSSadaf Ebrahimi    fi
124*63d4e48fSSadaf Ebrahimi    echo "${rtrn}" >"${returnF}"
125*63d4e48fSSadaf Ebrahimi  )
126*63d4e48fSSadaf Ebrahimi  assertFalse 'a call for help should return a non-zero exit code.' "$(th_queryReturn)"
127*63d4e48fSSadaf Ebrahimi
128*63d4e48fSSadaf Ebrahimi  if ! diff "${expectedF}" "${stderrF}" >/dev/null; then
129*63d4e48fSSadaf Ebrahimi    fail 'unexpected help output'
130*63d4e48fSSadaf Ebrahimi    th_showOutput
131*63d4e48fSSadaf Ebrahimi  fi
132*63d4e48fSSadaf Ebrahimi}
133*63d4e48fSSadaf Ebrahimi
134*63d4e48fSSadaf EbrahimitestEnhancedHelpOutput() {
135*63d4e48fSSadaf Ebrahimi  if ! flags_getoptIsEnh; then
136*63d4e48fSSadaf Ebrahimi    startSkipping
137*63d4e48fSSadaf Ebrahimi  fi
138*63d4e48fSSadaf Ebrahimi
139*63d4e48fSSadaf Ebrahimi  # shellcheck disable=SC2034
140*63d4e48fSSadaf Ebrahimi  DEFINE_boolean test_bool false 'test boolean' b
141*63d4e48fSSadaf Ebrahimi  # shellcheck disable=SC2034
142*63d4e48fSSadaf Ebrahimi  DEFINE_integer test_int 0 'test integer' i
143*63d4e48fSSadaf Ebrahimi  # shellcheck disable=SC2034
144*63d4e48fSSadaf Ebrahimi  DEFINE_string test_str '' 'test string' s
145*63d4e48fSSadaf Ebrahimi  # shellcheck disable=SC2034
146*63d4e48fSSadaf Ebrahimi  DEFINE_string long_desc 'blah' \
147*63d4e48fSSadaf Ebrahimi      'testing of a long description to force wrap of default value' D
148*63d4e48fSSadaf Ebrahimi  # shellcheck disable=SC2034
149*63d4e48fSSadaf Ebrahimi  DEFINE_string long_default \
150*63d4e48fSSadaf Ebrahimi      'this_is_a_long_default_value_to_force_alternate_indentation' \
151*63d4e48fSSadaf Ebrahimi      'testing of long default value' F
152*63d4e48fSSadaf Ebrahimi
153*63d4e48fSSadaf Ebrahimi  # Test for https://github.com/kward/shflags/issues/28.
154*63d4e48fSSadaf Ebrahimi  DEFINE_boolean 'force' false '' f
155*63d4e48fSSadaf Ebrahimi
156*63d4e48fSSadaf Ebrahimi  help='USAGE: enhanced [flags] args'
157*63d4e48fSSadaf Ebrahimi
158*63d4e48fSSadaf Ebrahimi  cat >"${expectedF}" <<EOF
159*63d4e48fSSadaf Ebrahimi${help}
160*63d4e48fSSadaf Ebrahimiflags:
161*63d4e48fSSadaf Ebrahimi  -b,--[no]test_bool:  test boolean (default: false)
162*63d4e48fSSadaf Ebrahimi  -i,--test_int:  test integer (default: 0)
163*63d4e48fSSadaf Ebrahimi  -s,--test_str:  test string (default: '')
164*63d4e48fSSadaf Ebrahimi  -D,--long_desc:  testing of a long description to force wrap of default value
165*63d4e48fSSadaf Ebrahimi                   (default: 'blah')
166*63d4e48fSSadaf Ebrahimi  -F,--long_default:  testing of long default value
167*63d4e48fSSadaf Ebrahimi    (default: 'this_is_a_long_default_value_to_force_alternate_indentation')
168*63d4e48fSSadaf Ebrahimi  -f,--[no]force:  (default: false)
169*63d4e48fSSadaf Ebrahimi  -h,--help:  show this help (default: false)
170*63d4e48fSSadaf EbrahimiEOF
171*63d4e48fSSadaf Ebrahimi  (
172*63d4e48fSSadaf Ebrahimi    _flags_columns() { mock_flags_columns; }
173*63d4e48fSSadaf Ebrahimi    # shellcheck disable=SC2034
174*63d4e48fSSadaf Ebrahimi    FLAGS_HELP=${help}
175*63d4e48fSSadaf Ebrahimi    # Wrap FLAGS call in if/then/else so 'set -e' works properly.
176*63d4e48fSSadaf Ebrahimi    if FLAGS -h >"${stdoutF}" 2>"${stderrF}"; then
177*63d4e48fSSadaf Ebrahimi      rtrn=$?
178*63d4e48fSSadaf Ebrahimi    else
179*63d4e48fSSadaf Ebrahimi      rtrn=$?
180*63d4e48fSSadaf Ebrahimi    fi
181*63d4e48fSSadaf Ebrahimi    echo "${rtrn}" >"${returnF}"
182*63d4e48fSSadaf Ebrahimi  )
183*63d4e48fSSadaf Ebrahimi  assertFalse 'a call for help should return a non-zero exit code.' "$(th_queryReturn)"
184*63d4e48fSSadaf Ebrahimi
185*63d4e48fSSadaf Ebrahimi  if ! diff "${expectedF}" "${stderrF}" >/dev/null; then
186*63d4e48fSSadaf Ebrahimi    fail 'unexpected help output'
187*63d4e48fSSadaf Ebrahimi    th_showOutput
188*63d4e48fSSadaf Ebrahimi  fi
189*63d4e48fSSadaf Ebrahimi}
190*63d4e48fSSadaf Ebrahimi
191*63d4e48fSSadaf EbrahimitestNoHelp() {
192*63d4e48fSSadaf Ebrahimi  if ! flags_getoptIsEnh; then
193*63d4e48fSSadaf Ebrahimi    startSkipping
194*63d4e48fSSadaf Ebrahimi  fi
195*63d4e48fSSadaf Ebrahimi
196*63d4e48fSSadaf Ebrahimi  ( FLAGS --nohelp >"${stdoutF}" 2>"${stderrF}" )
197*63d4e48fSSadaf Ebrahimi  r3turn=$?
198*63d4e48fSSadaf Ebrahimi  assertTrue "FLAGS returned a non-zero result (${r3turn})" ${r3turn}
199*63d4e48fSSadaf Ebrahimi  assertFalse 'expected no output to STDOUT' "[ -s '${stdoutF}' ]"
200*63d4e48fSSadaf Ebrahimi  assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
201*63d4e48fSSadaf Ebrahimi}
202*63d4e48fSSadaf Ebrahimi
203*63d4e48fSSadaf EbrahimitestLoggingLevel() {
204*63d4e48fSSadaf Ebrahimi  # Check that the default logging level is set properly.
205*63d4e48fSSadaf Ebrahimi  got=`flags_loggingLevel` want=${__FLAGS_LEVEL_DEFAULT}
206*63d4e48fSSadaf Ebrahimi  assertTrue "Unexpected default logging level = ${got}, want ${want}" "[ ${got} -eq ${want} ]"
207*63d4e48fSSadaf Ebrahimi
208*63d4e48fSSadaf Ebrahimi  # Override the logging level, and check again.
209*63d4e48fSSadaf Ebrahimi  flags_setLoggingLevel "${FLAGS_LEVEL_FATAL}"
210*63d4e48fSSadaf Ebrahimi  flags_setLoggingLevel "${FLAGS_LEVEL_INFO}"
211*63d4e48fSSadaf Ebrahimi  got=`flags_loggingLevel` want=${FLAGS_LEVEL_INFO}
212*63d4e48fSSadaf Ebrahimi  assertTrue "Unexpected configured logging level = ${got}, want ${want}" "[ ${got} -eq ${want} ]"
213*63d4e48fSSadaf Ebrahimi}
214*63d4e48fSSadaf Ebrahimi
215*63d4e48fSSadaf Ebrahimi# According to https://github.com/kward/shflags/issues/28
216*63d4e48fSSadaf Ebrahimi#
217*63d4e48fSSadaf Ebrahimi#   DEFINE_boolean misbehaves when help-string is empty
218*63d4e48fSSadaf EbrahimitestIssue28() {
219*63d4e48fSSadaf Ebrahimi  # shellcheck disable=SC2034
220*63d4e48fSSadaf Ebrahimi  DEFINE_boolean 'force' false '' f
221*63d4e48fSSadaf Ebrahimi
222*63d4e48fSSadaf Ebrahimi  testHelp && return
223*63d4e48fSSadaf Ebrahimi}
224*63d4e48fSSadaf Ebrahimi
225*63d4e48fSSadaf EbrahimioneTimeSetUp() {
226*63d4e48fSSadaf Ebrahimi  th_oneTimeSetUp
227*63d4e48fSSadaf Ebrahimi
228*63d4e48fSSadaf Ebrahimi  if flags_getoptIsStd; then
229*63d4e48fSSadaf Ebrahimi    th_warn 'Standard version of getopt found. Enhanced tests will be skipped.'
230*63d4e48fSSadaf Ebrahimi    return
231*63d4e48fSSadaf Ebrahimi  fi
232*63d4e48fSSadaf Ebrahimi  th_warn 'Enhanced version of getopt found. Standard tests will be skipped.'
233*63d4e48fSSadaf Ebrahimi}
234*63d4e48fSSadaf Ebrahimi
235*63d4e48fSSadaf EbrahimisetUp() {
236*63d4e48fSSadaf Ebrahimi  flags_reset
237*63d4e48fSSadaf Ebrahimi}
238*63d4e48fSSadaf Ebrahimi
239*63d4e48fSSadaf Ebrahimi# Load and run shUnit2.
240*63d4e48fSSadaf Ebrahimi# shellcheck disable=SC2034
241*63d4e48fSSadaf Ebrahimi[ -n "${ZSH_VERSION:-}" ] && SHUNIT_PARENT=$0
242*63d4e48fSSadaf Ebrahimi. "${TH_SHUNIT}"
243