123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- # SPDX-License-Identifier: BSD-3-Clause
- source helpers.sh
- # We don't need a TPM for this test, so unset the EXIT handler.
- trap - EXIT
- # Since this only tests tools options and docs
- # and is not portable skip it on FreeBSD
- if [ "$OS" == "FreeBSD" ]; then
- exit 0
- fi
- srcdir="$(readlink -e "$(dirname "$0")")"
- toolsdir="$(readlink -e "${srcdir}"/../../../tools)"
- mandir="$(readlink -e "${srcdir}"/../../../man)"
- # Provide a sanitizing test on whether a toggle
- # is effectively taken into account on option parsing.
- # Also, checks if the options are documented in the
- # respective man file consistently.
- # Functionnal check is left for dedicated test cases.
- #
- # It assumes that the layout for describing toggles and
- # option is coherent among the tools
- function check_toggle() {
- toggle=${1}
- if [ ${#toggle} -ne 1 ]; then
- echo "toggle should be one character only !"
- exit 254
- fi
- for i in $(grep "'${toggle}'[[:space:]]*}" "${toolsdir}"/*.c | \
- sed "s%[[:space:]]*%%g"); do
- # An example:
- # i: tools/tpm2_nvdefine.c:{"hierarchy",required_argument,NULL,'a'},
- # filename: tools/tpm2_nvdefine.c
- # match: {"hierarchy",required_argument,NULL,'a'},
- # option: a
- # option_long: hierarchy
- # optionlist: "x:a:s:b:P:p:L:"
- # getcase: case'a':
- filename=${i%%:*};
- match=${i##*:};
- option="$(sed -r "s%.*'([^'])'.*%\1%g" <<< "${match}")"
- option_long="$(grep -oP '(?<={").*(?=")' <<< "${match}")"
- optionlist="$(grep -R "tpm2_options_new" "${filename}" | \
- sed -r 's%.*("[^"]+").*%\1%g')"
- getcase="$(grep "case '${option}'" "${filename}" | \
- sed "s%[[:space:]]*%%g")"
- echo "filename: $filename"
- echo " match: $match"
- echo " option: $option"
- echo " option_long: $option_long"
- echo " optionlist: $optionlist"
- echo " getcase: $getcase"
- if [[ "${filename}" =~ tpm2_options.c$ ]]; then
- continue
- fi
- if ! grep -q "${option}" <<< "${optionlist}"; then
- echo "$filename: option -$option (--$option_long) not found in \
- option list $optionlist"
- exit 1
- fi
- if ! test -n "${getcase}"; then
- echo "$filename: switch case '$option' not found for option \
- -$option (--$option_long)"
- exit 1
- fi
- ####################### check man page #######################
- man_filename="$(basename $filename)" # tpm2_nvdefine.c
- man_filename="$mandir/${man_filename%.*}.1.md" # man/tpm2_nvdefine.1.md
- man=$(cat "$man_filename")
- # resolve markdown includes
- man_resolved="$man"
- for md_include in $(grep -Po '(?<=\]\()common/.*(?=\))' <<< "$man"); do
- man_resolved="$man_resolved $(cat $mandir/$md_include)"
- done
- # search markdown for option (short and long)
- man_opt=$(grep -oe "\*\*-$option\*\*, \*\*\\\--$option_long\*\*" \
- <<< "$man_resolved") || true
- if [ -n "$man_opt" ]; then
- echo " man_opt: $man_opt"
- else
- echo "$filename: missing option -$option/--$option_long in \
- $man_filename"
- exit 1
- fi
- done
- }
- fail=0
- # For each detected option toggle, check if it is actually declared to be used
- # and documented
- for i in $(grep -rn "case '.'" "${toolsdir}"/*.c | \
- cut -d"'" -f2-2 | sort | uniq); do
- check_toggle "${i}"
- done
- # For each documented option toggle in the man pages, look if it is present in
- # the code
- for j in $(grep -oe "\*\*-.\*\*, \*\*\\\--.*\*\*" "${mandir}"/*.1.md | \
- sed -r 's/\s//g' ); do
- filename=${j%%:*};
- option="$(grep -oP '(?<=\*\*-).(?=\*\*)' <<< "$j")"
- option_long="$(grep -oP '(?<=\*\*\\\--).*(?=\*\*)' <<< "$j")"
- c_filename=$(basename ${filename%.1.md}).c
- echo "$filename: looking for -$option (--$option_long) in $c_filename"
- found=$(grep -r "case '${option}'" "$toolsdir" --include="$c_filename") \
- || true
- if [ -z "$found" ]; then
- echo "$filename: missing option -$option (--$option_long) in \
- $c_filename"
- exit 1
- fi
- done
- exit $fail
|