📄 general.m4
字号:
AS_BOX([Tested programs.]) echo} >&AS_MESSAGE_LOG_FD# Report what programs are being tested.for at_program in : $at_testeddo test "$at_program" = : && continue _AS_PATH_WALK([$PATH], [test -f $as_dir/$at_program && break]) if test -f $as_dir/$at_program; then { echo "AT_LINE: $as_dir/$at_program --version" $as_dir/$at_program --version echo } >&AS_MESSAGE_LOG_FD 2>&1 else AS_ERROR([cannot find $at_program]) fidone{ AS_BOX([Silently running the tests.])} >&AS_MESSAGE_LOG_FDat_start_date=`date`at_start_time=`(date +%s) 2>/dev/null`echo "$as_me: starting at: $at_start_date" >&AS_MESSAGE_LOG_FDat_pass_list=at_fail_list=at_skip_list=at_group_count=0m4_divert([TESTS])dnl# Create the master directory if it doesn't already exist.test -d $at_suite_dir || mkdir $at_suite_dir || AS_ERROR([cannot create $at_suite_dir])# Can we diff with `/dev/null'? DU 5.0 refuses.if diff /dev/null /dev/null >/dev/null 2>&1; then at_devnull=/dev/nullelse at_devnull=$at_suite_dir/devnull cp /dev/null $at_devnullfi# Use `diff -u' when possible.if diff -u $at_devnull $at_devnull >/dev/null 2>&1; then at_diff='diff -u'else at_diff=difffifor at_group in $at_groupsdo # Be sure to come back to the top test directory. cd $at_suite_dir case $at_group in banner-*) ;; *) # Skip tests we already run (using --keywords makes it easy to get # duplication). case " $at_pass_test $at_skip_test $at_fail_test " in *" $at_group "* ) continue;; esac # Normalize the test group number. at_group_normalized=`expr "00000$at_group" : ".*\($at_format\)"` # Create a fresh directory for the next test group, and enter. at_group_dir=$at_suite_dir/$at_group_normalized rm -rf $at_group_dir mkdir $at_group_dir || AS_ERROR([cannot create $at_group_dir]) cd $at_group_dir ;; esac at_status=0 # Clearly separate the test groups when verbose. test $at_group_count != 0 && $at_verbose case $at_group indnl Test groups inserted here (TESTS).m4_divert([TAIL])[]dnl * ) echo "$as_me: no such test group: $at_group" >&2 continue ;; esac # Be sure to come back to the suite directory, in particular # since below we might `rm' the group directory we are in currently. cd $at_suite_dir case $at_group in banner-*) ;; *) if test ! -f $at_check_line_file; then sed "s/^ */$as_me: warning: /" <<_ATEOF A failure happened in a test group before any test could be run. This means that test suite is improperly designed. Please report this failure to <AT_PACKAGE_BUGREPORT>._ATEOF echo "$at_setup_line" >$at_check_line_file fi at_group_count=`expr 1 + $at_group_count` $at_verbose $ECHO_N "$at_group. $at_setup_line: $ECHO_C" case $at_status in 0) at_msg="ok" at_pass_list="$at_pass_list $at_group" # Cleanup the group directory, unless the user wants the files. $at_debug_p || rm -rf $at_group_dir ;; 77) at_msg="ok (skipped near \``cat $at_check_line_file`')" at_skip_list="$at_skip_list $at_group" # Cleanup the group directory, unless the user wants the files. $at_debug_p || rm -rf $at_group_dir ;; *) at_msg="FAILED near \``cat $at_check_line_file`'" at_fail_list="$at_fail_list $at_group" # Up failure, keep the group directory for autopsy. # Create the debugging script. { echo "#! /bin/sh" echo 'test "${ZSH_VERSION+set}" = set && alias -g '\''${1+"$[@]"}'\''='\''"$[@]"'\''' echo "cd $at_dir" echo 'exec ${CONFIG_SHELL-'"$SHELL"'}' "$[0]" \ '-v -d' "$at_debug_args" "$at_group" '${1+"$[@]"}' echo 'exit 1' } >$at_group_dir/run chmod +x $at_group_dir/run ;; esac echo $at_msg at_log_msg="$at_group. $at_setup_line: $at_msg" # If the group failed, $at_times_file is not available. test -f $at_times_file && at_log_msg="$at_log_msg (`sed 1d $at_times_file`)" echo "$at_log_msg" >&AS_MESSAGE_LOG_FD $at_errexit_p && test -n "$at_fail_list" && break ;; esacdone# Back to the top directory, in particular because we might# rerun the suite verbosely.cd $at_dir# Compute the duration of the suite.at_stop_date=`date`at_stop_time=`(date +%s) 2>/dev/null`echo "$as_me: ending at: $at_stop_date" >&AS_MESSAGE_LOG_FDat_duration_s=`(expr $at_stop_time - $at_start_time) 2>/dev/null`at_duration_m=`(expr $at_duration_s / 60) 2>/dev/null`at_duration_h=`(expr $at_duration_m / 60) 2>/dev/null`at_duration_s=`(expr $at_duration_s % 60) 2>/dev/null`at_duration_m=`(expr $at_duration_m % 60) 2>/dev/null`at_duration="${at_duration_h}h ${at_duration_m}m ${at_duration_s}s"if test "$at_duration" != "h m s"; then echo "$as_me: test suite duration: $at_duration" >&AS_MESSAGE_LOG_FDfi# Wrap up the test suite with summary statistics.at_skip_count=`set dummy $at_skip_list; shift; echo $[@%:@]`at_fail_count=`set dummy $at_fail_list; shift; echo $[@%:@]`if test $at_fail_count = 0; then if test $at_skip_count = 0; then AS_BOX([All $at_group_count tests were successful.]) else AS_BOX([All $at_group_count tests were successful ($at_skip_count skipped).]) fielif test $at_debug_p = false; then if $at_errexit_p; then AS_BOX([ERROR: One of the tests failed, inhibiting subsequent tests.]) else AS_BOX([ERROR: Suite unsuccessful, $at_fail_count of $at_group_count tests failed.]) fi # Normalize the names so that `ls' lists them in order. echo 'You may investigate any problem if you feel able to do so, in which' echo 'case the test suite provides a good starting point.' echo echo 'Now, failed tests will be executed again, verbosely, and logged' echo 'in the file '$as_me'.log.' { echo echo AS_BOX([Summary of the failures.]) # Summary of failed and skipped tests. if test $at_fail_count != 0; then echo "Failed tests:" $SHELL $[0] $at_fail_list --list echo fi if test $at_skip_count != 0; then echo "Skipped tests:" $SHELL $[0] $at_skip_list --list echo fi echo AS_BOX([Verbosely re-running the failing tests.]) echo } >&AS_MESSAGE_LOG_FD exec AS_MESSAGE_LOG_FD>/dev/null $SHELL $[0] -v -d $at_debug_args $at_fail_list 2>&1 | tee -a $as_me.log exec AS_MESSAGE_LOG_FD>>$as_me.log { echo if test -n "$at_top_srcdir"; then AS_BOX([Configuration logs.]) echo for at_file in `find "$at_top_srcdir" -name config.log -print` do echo "$as_me: $at_file:" sed 's/^/| /' $at_file echo done fi } >&AS_MESSAGE_LOG_FD AS_BOX([$as_me.log is created.]) echo echo "Please send \`$as_me.log' and all information you think might help:" echo echo " To: <AT_PACKAGE_BUGREPORT>" echo " Subject: @<:@AT_PACKAGE_STRING@:>@ $as_me:$at_fail_list failed" echo exit 1fiexit 0m4_divert_pop([TAIL])dnldnl End of AT_INIT: divert to KILL, only test groups are to bednl output, the rest is ignored. Current diversion is BODY, inheriteddnl from M4sh.m4_divert_push([KILL])m4_wrap([m4_divert_pop([KILL])[]])])# AT_INIT# AT_TESTED(PROGRAMS)# -------------------# Specify the list of programs exercised by the test suite. Their# versions are logged, and in the case of embedded test suite, they# must correspond to the version of the package.. The PATH should be# already preset so the proper executable will be selected.m4_define([AT_TESTED],[m4_append_uniq([AT_tested], [$1], [ ])])# AT_SETUP(DESCRIPTION)# ---------------------# Start a group of related tests, all to be executed in the same subshell.# The group is testing what DESCRIPTION says.m4_define([AT_SETUP],[m4_ifdef([AT_keywords], [m4_undefine([AT_keywords])])m4_define([AT_line], AT_LINE)m4_define([AT_description], [$1])m4_define([AT_ordinal], m4_incr(AT_ordinal))m4_append([AT_groups_all], [ ]m4_defn([AT_ordinal]))m4_divert_push([TESTS])dnl AT_ordinal ) @%:@ AT_ordinal. m4_defn([AT_line]): $1 at_setup_line='m4_defn([AT_line])' $at_verbose "AT_ordinal. m4_defn([AT_line]): testing $1..." $at_quiet $ECHO_N "m4_format([[%3d: %-18s]], AT_ordinal, m4_defn([AT_line]))[]$ECHO_C" ( $at_traceon])# AT_KEYWORDS(KEYOWRDS)# ---------------------# Declare a list of keywords associated to the current test group.m4_define([AT_KEYWORDS],[m4_append_uniq([AT_keywords], [$1], [,])])# AT_CLEANUP# ----------# Complete a group of related tests.m4_define([AT_CLEANUP],[m4_append([AT_help],at_help_all=$at_help_all'm4_defn([AT_ordinal]);m4_defn([AT_line]);m4_defn([AT_description]);m4_ifdef([AT_keywords], [m4_defn([AT_keywords])])')dnl $at_times_skip || times >$at_times_file ) at_status=$? ;;m4_divert_pop([TESTS])dnl Back to KILL.])# AT_CLEANUP# AT_BANNER(TEXT)# ---------------# Output TEXT without any shell expansion.m4_define([AT_BANNER],[m4_define([AT_banner_ordinal], m4_incr(AT_banner_ordinal))m4_append([AT_groups_all], [ banner-]m4_defn([AT_banner_ordinal]))m4_divert_text([TESTS],[ banner-AT_banner_ordinal ) @%:@ Banner AT_banner_ordinal. AT_LINE cat <<\_ATEOF$1_ATEOF ;;])dnl])# AT_BANNER# AT_DATA(FILE, CONTENTS)# -----------------------# Initialize an input data FILE with given CONTENTS, which should end with# an end of line.# This macro is not robust to active symbols in CONTENTS *on purpose*.# If you don't want CONTENT to be evaluated, quote it twice.m4_define([AT_DATA],[cat >$1 <<'_ATEOF'$2[]_ATEOF])# AT_CHECK(COMMANDS, [STATUS = 0], STDOUT, STDERR)# ------------------------------------------------# Execute a test by performing given shell COMMANDS. These commands# should normally exit with STATUS, while producing expected STDOUT and# STDERR contents.## STATUS, STDOUT, and STDERR are not checked if equal to `ignore'.## If STDOUT is `expout', then stdout is compared to the content of the file# `expout'. Likewise for STDERR and `experr'.## If STDOUT is `stdout', then the stdout is left in the file `stdout',# likewise for STDERR and `stderr'. Don't do this:## AT_CHECK([command >out])# # Some checks on `out'## do this instead:## AT_CHECK([command], [], [stdout])# # Some checks on `stdout'## This is an unfortunate limitation inherited from Ultrix which will not# let you redirect several times the same FD (see the Autoconf documentation).# If you use the `AT_CHECK([command >out])' be sure to get a test suite# that will show spurious failures.## You might wonder why not just use `ignore' and directly use stdout and# stderr left by the test suite. Firstly because the names of these files# is an internal detail, and secondly, because## AT_CHECK([command], [], [ignore])# AT_CHECK([check stdout])## will use `stdout' both in input and output: undefined behavior would# certainly result. That's why the test suite will save them in `at-stdout'# and `at-stderr', and will provide you with `stdout' and `stderr'.## Any line of stderr starting with leading blanks and a `+' are filtered# out, since most shells when tracing include subshell traces in stderr.# This may cause spurious failures when the test suite is run with `-x'.### Implementation Details# ----------------------# Ideally, we would like to run## ( $at_traceon; COMMANDS >at-stdout 2> at-stderr )## but we must group COMMANDS as it is not limited to a single command, and# then the shells will save the traces in at-stderr. So we have to filter# them out when checking stderr, and we must send them into the test suite's# stderr to honor -x properly.## Limiting COMMANDS to a single command is not good either, since them# the user herself would use {} or (), and then we face the same problem.## But then, there is no point in running## ( $at_traceon { $1 ; } >at-stdout 2>at-stder1 )## instead of the simpler## ( $at_traceon; $1 ) >at-stdout 2>at-stder1#m4_define([AT_CHECK],[$at_traceoff$at_verbose "AT_LINE: AS_ESCAPE([$1])"echo AT_LINE >$at_check_line_file( $at_traceon; $1 ) >$at_stdout 2>$at_stder1at_status=$?grep '^ *+' $at_stder1 >&2grep -v '^ *+' $at_stder1 >$at_stderrat_failed=falsednl Check stderr.m4_case([$4], stderr, [(echo stderr:; tee stderr <$at_stderr) >&5], ignore, [(echo stderr:; cat $at_stderr) >&5], experr, [$at_diff experr $at_stderr >&5 || at_failed=:], [], [$at_diff $at_devnull $at_stderr >&5 || at_failed=:], [echo >>$at_stderr; echo "AS_ESCAPE([$4])" | $at_diff - $at_stderr >&5 || at_failed=:])dnl Check stdout.m4_case([$3], stdout, [(echo stdout:; tee stdout <$at_stdout) >&5], ignore, [(echo stdout:; cat $at_stdout) >&5], expout, [$at_diff expout $at_stdout >&5 || at_failed=:], [], [$at_diff $at_devnull $at_stdout >&5 || at_failed=:], [echo >>$at_stdout; echo "AS_ESCAPE([$3])" | $at_diff - $at_stdout >&5 || at_failed=:])dnl Check exit val. Don't `skip' if we are precisely checking $? = 77.case $at_status inm4_case([$2], [77], [], [ 77) exit 77;;])dnlm4_case([$2], [ignore], [ *);;], [ m4_default([$2], [0])) ;; *) $at_verbose "AT_LINE: exit code was $at_status, expected m4_default([$2], [0])" >&2 at_failed=:;;])esacAS_IF($at_failed, [$5], [$6])$at_failed && exit 1$at_traceon])# AT_CHECK
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -