xref: /aosp_15_r20/external/toybox/scripts/test.sh (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
1*cf5a6c84SAndroid Build Coastguard Worker#!/bin/bash
2*cf5a6c84SAndroid Build Coastguard Worker
3*cf5a6c84SAndroid Build Coastguard Workersource scripts/runtest.sh
4*cf5a6c84SAndroid Build Coastguard Workersource scripts/portability.sh
5*cf5a6c84SAndroid Build Coastguard Worker
6*cf5a6c84SAndroid Build Coastguard Worker# Kill child processes when we exit
7*cf5a6c84SAndroid Build Coastguard Workertrap 'kill $(jobs -p) 2>/dev/null; exit 1' INT
8*cf5a6c84SAndroid Build Coastguard Worker
9*cf5a6c84SAndroid Build Coastguard Worker# Create working directory
10*cf5a6c84SAndroid Build Coastguard WorkerTOPDIR="$PWD"
11*cf5a6c84SAndroid Build Coastguard Workerexport FILES="$PWD"/tests/files PREFIX=generated/testdir
12*cf5a6c84SAndroid Build Coastguard Workerrm -rf "$PREFIX"
13*cf5a6c84SAndroid Build Coastguard Workermkdir -p "$PREFIX"/testdir
14*cf5a6c84SAndroid Build Coastguard Worker
15*cf5a6c84SAndroid Build Coastguard Worker# Populate working directory
16*cf5a6c84SAndroid Build Coastguard Workerif [ -z "$TEST_HOST" ]
17*cf5a6c84SAndroid Build Coastguard Workerthen
18*cf5a6c84SAndroid Build Coastguard Worker  if [ $# -ne 0 ]
19*cf5a6c84SAndroid Build Coastguard Worker  then
20*cf5a6c84SAndroid Build Coastguard Worker    scripts/single.sh "$@" || exit 1
21*cf5a6c84SAndroid Build Coastguard Worker  else
22*cf5a6c84SAndroid Build Coastguard Worker    scripts/install.sh --symlink --force || exit 1
23*cf5a6c84SAndroid Build Coastguard Worker  fi
24*cf5a6c84SAndroid Build Coastguard Workerfi
25*cf5a6c84SAndroid Build Coastguard Worker
26*cf5a6c84SAndroid Build Coastguard Worker# Add prefix to $PATH
27*cf5a6c84SAndroid Build Coastguard Workerexport -n PREFIX
28*cf5a6c84SAndroid Build Coastguard Workercd "$PREFIX"
29*cf5a6c84SAndroid Build Coastguard WorkerPATH="$PWD:$PATH" TESTDIR="$PWD"
30*cf5a6c84SAndroid Build Coastguard Workerexport LC_COLLATE=C
31*cf5a6c84SAndroid Build Coastguard Worker
32*cf5a6c84SAndroid Build Coastguard Worker# Collection OPTIONFLAGS for optional()
33*cf5a6c84SAndroid Build Coastguard Worker[ -f "$TOPDIR/generated/config.h" ] &&
34*cf5a6c84SAndroid Build Coastguard Worker  export OPTIONFLAGS=:$($SED -nr 's/^#define CFG_(.*) 1$/\1/p' "$TOPDIR/generated/config.h" | tr '\n' :)
35*cf5a6c84SAndroid Build Coastguard Worker
36*cf5a6c84SAndroid Build Coastguard Worker# Run a test file in $TESTDIR/testdir with $CMDNAME and $C set, parse $FAILCOUNT
37*cf5a6c84SAndroid Build Coastguard Workerdo_test()
38*cf5a6c84SAndroid Build Coastguard Worker{
39*cf5a6c84SAndroid Build Coastguard Worker  # reset testdir
40*cf5a6c84SAndroid Build Coastguard Worker  cd "$TESTDIR" && rm -rf testdir continue && mkdir testdir && cd testdir ||
41*cf5a6c84SAndroid Build Coastguard Worker    exit 1
42*cf5a6c84SAndroid Build Coastguard Worker
43*cf5a6c84SAndroid Build Coastguard Worker  # set CMDNAME to base name of test file, and C to full path to command
44*cf5a6c84SAndroid Build Coastguard Worker  CMDNAME="${1##*/}" CMDNAME="${CMDNAME%.test}"
45*cf5a6c84SAndroid Build Coastguard Worker  if [ -z "$TEST_HOST" ]
46*cf5a6c84SAndroid Build Coastguard Worker  then
47*cf5a6c84SAndroid Build Coastguard Worker    C="$TESTDIR/$CMDNAME"
48*cf5a6c84SAndroid Build Coastguard Worker    [ ! -e "$C" ] && echo "$SHOWSKIP: $CMDNAME disabled" && return
49*cf5a6c84SAndroid Build Coastguard Worker    C="$(dirname $(realpath "$C"))/$CMDNAME"
50*cf5a6c84SAndroid Build Coastguard Worker  else
51*cf5a6c84SAndroid Build Coastguard Worker    C="$(which $CMDNAME 2>/dev/null)"
52*cf5a6c84SAndroid Build Coastguard Worker    [ -z "$C" ] && printf '%s\n' "$SHOWSKIP: no $CMDNAME" && return
53*cf5a6c84SAndroid Build Coastguard Worker  fi
54*cf5a6c84SAndroid Build Coastguard Worker
55*cf5a6c84SAndroid Build Coastguard Worker  # Run command.test in a subshell
56*cf5a6c84SAndroid Build Coastguard Worker  (. "$1"; cd "$TESTDIR"; echo "$FAILCOUNT" > continue)
57*cf5a6c84SAndroid Build Coastguard Worker  cd "$TESTDIR"
58*cf5a6c84SAndroid Build Coastguard Worker  [ -e continue ] && FAILCOUNT=$(($(cat continue)+$FAILCOUNT)) || exit 1
59*cf5a6c84SAndroid Build Coastguard Worker}
60*cf5a6c84SAndroid Build Coastguard Worker
61*cf5a6c84SAndroid Build Coastguard Worker# Run each test listed on command line or else all tests with executable bit set
62*cf5a6c84SAndroid Build Coastguard Workerif [ $# -ne 0 ]
63*cf5a6c84SAndroid Build Coastguard Workerthen
64*cf5a6c84SAndroid Build Coastguard Worker  for i in "$@"
65*cf5a6c84SAndroid Build Coastguard Worker  do
66*cf5a6c84SAndroid Build Coastguard Worker    do_test "$TOPDIR"/tests/$i.test
67*cf5a6c84SAndroid Build Coastguard Worker  done
68*cf5a6c84SAndroid Build Coastguard Workerelse
69*cf5a6c84SAndroid Build Coastguard Worker  for i in "$TOPDIR"/tests/*.test
70*cf5a6c84SAndroid Build Coastguard Worker  do
71*cf5a6c84SAndroid Build Coastguard Worker    [ -z "$TEST_ALL" ] && [ ! -x "$i" ] && continue
72*cf5a6c84SAndroid Build Coastguard Worker    do_test "$i"
73*cf5a6c84SAndroid Build Coastguard Worker  done
74*cf5a6c84SAndroid Build Coastguard Workerfi
75*cf5a6c84SAndroid Build Coastguard Worker
76*cf5a6c84SAndroid Build Coastguard Worker[ $FAILCOUNT -eq 0 ]
77