1*5a6e8488SAndroid Build Coastguard Worker#! /bin/sh 2*5a6e8488SAndroid Build Coastguard Worker# 3*5a6e8488SAndroid Build Coastguard Worker# SPDX-License-Identifier: BSD-2-Clause 4*5a6e8488SAndroid Build Coastguard Worker# 5*5a6e8488SAndroid Build Coastguard Worker# Copyright (c) 2018-2024 Gavin D. Howard and contributors. 6*5a6e8488SAndroid Build Coastguard Worker# 7*5a6e8488SAndroid Build Coastguard Worker# Redistribution and use in source and binary forms, with or without 8*5a6e8488SAndroid Build Coastguard Worker# modification, are permitted provided that the following conditions are met: 9*5a6e8488SAndroid Build Coastguard Worker# 10*5a6e8488SAndroid Build Coastguard Worker# * Redistributions of source code must retain the above copyright notice, this 11*5a6e8488SAndroid Build Coastguard Worker# list of conditions and the following disclaimer. 12*5a6e8488SAndroid Build Coastguard Worker# 13*5a6e8488SAndroid Build Coastguard Worker# * Redistributions in binary form must reproduce the above copyright notice, 14*5a6e8488SAndroid Build Coastguard Worker# this list of conditions and the following disclaimer in the documentation 15*5a6e8488SAndroid Build Coastguard Worker# and/or other materials provided with the distribution. 16*5a6e8488SAndroid Build Coastguard Worker# 17*5a6e8488SAndroid Build Coastguard Worker# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18*5a6e8488SAndroid Build Coastguard Worker# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*5a6e8488SAndroid Build Coastguard Worker# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*5a6e8488SAndroid Build Coastguard Worker# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 21*5a6e8488SAndroid Build Coastguard Worker# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22*5a6e8488SAndroid Build Coastguard Worker# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23*5a6e8488SAndroid Build Coastguard Worker# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24*5a6e8488SAndroid Build Coastguard Worker# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25*5a6e8488SAndroid Build Coastguard Worker# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26*5a6e8488SAndroid Build Coastguard Worker# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27*5a6e8488SAndroid Build Coastguard Worker# POSSIBILITY OF SUCH DAMAGE. 28*5a6e8488SAndroid Build Coastguard Worker# 29*5a6e8488SAndroid Build Coastguard Worker 30*5a6e8488SAndroid Build Coastguard Workerset -e 31*5a6e8488SAndroid Build Coastguard Worker 32*5a6e8488SAndroid Build Coastguard Workerscript="$0" 33*5a6e8488SAndroid Build Coastguard Workertestdir=$(dirname "$script") 34*5a6e8488SAndroid Build Coastguard Worker 35*5a6e8488SAndroid Build Coastguard Worker. "$testdir/../scripts/functions.sh" 36*5a6e8488SAndroid Build Coastguard Worker 37*5a6e8488SAndroid Build Coastguard Workeroutputdir=${BC_TEST_OUTPUT_DIR:-$testdir} 38*5a6e8488SAndroid Build Coastguard Worker 39*5a6e8488SAndroid Build Coastguard Worker# Just print the usage and exit with an error. This can receive a message to 40*5a6e8488SAndroid Build Coastguard Worker# print. 41*5a6e8488SAndroid Build Coastguard Worker# @param 1 A message to print. 42*5a6e8488SAndroid Build Coastguard Workerusage() { 43*5a6e8488SAndroid Build Coastguard Worker if [ $# -eq 1 ]; then 44*5a6e8488SAndroid Build Coastguard Worker printf '%s\n\n' "$1" 45*5a6e8488SAndroid Build Coastguard Worker fi 46*5a6e8488SAndroid Build Coastguard Worker printf 'usage: %s dir [exe [args...]]\n' "$script" 47*5a6e8488SAndroid Build Coastguard Worker printf 'valid dirs are:\n' 48*5a6e8488SAndroid Build Coastguard Worker printf '\n' 49*5a6e8488SAndroid Build Coastguard Worker cat "$testdir/all.txt" 50*5a6e8488SAndroid Build Coastguard Worker printf '\n' 51*5a6e8488SAndroid Build Coastguard Worker exit 1 52*5a6e8488SAndroid Build Coastguard Worker} 53*5a6e8488SAndroid Build Coastguard Worker 54*5a6e8488SAndroid Build Coastguard Worker# Command-line processing. 55*5a6e8488SAndroid Build Coastguard Workerif [ "$#" -lt 1 ]; then 56*5a6e8488SAndroid Build Coastguard Worker usage "Not enough arguments" 57*5a6e8488SAndroid Build Coastguard Workerfi 58*5a6e8488SAndroid Build Coastguard Worker 59*5a6e8488SAndroid Build Coastguard Workerd="$1" 60*5a6e8488SAndroid Build Coastguard Workershift 61*5a6e8488SAndroid Build Coastguard Workercheck_d_arg "$d" 62*5a6e8488SAndroid Build Coastguard Worker 63*5a6e8488SAndroid Build Coastguard Workerif [ "$#" -gt 0 ]; then 64*5a6e8488SAndroid Build Coastguard Worker exe="$1" 65*5a6e8488SAndroid Build Coastguard Worker shift 66*5a6e8488SAndroid Build Coastguard Worker check_exec_arg "$exe" 67*5a6e8488SAndroid Build Coastguard Workerelse 68*5a6e8488SAndroid Build Coastguard Worker exe="$testdir/../bin/$d" 69*5a6e8488SAndroid Build Coastguard Worker check_exec_arg "$exe" 70*5a6e8488SAndroid Build Coastguard Workerfi 71*5a6e8488SAndroid Build Coastguard Worker 72*5a6e8488SAndroid Build Coastguard Workername="$testdir/$d/read.txt" 73*5a6e8488SAndroid Build Coastguard Workerresults="$testdir/$d/read_results.txt" 74*5a6e8488SAndroid Build Coastguard Workererrors="$testdir/$d/read_errors.txt" 75*5a6e8488SAndroid Build Coastguard Worker 76*5a6e8488SAndroid Build Coastguard Workerout="$outputdir/${d}_outputs/read_results.txt" 77*5a6e8488SAndroid Build Coastguard Workermultiple_res="$outputdir/${d}_outputs/read_multiple_results.txt" 78*5a6e8488SAndroid Build Coastguard Workeroutdir=$(dirname "$out") 79*5a6e8488SAndroid Build Coastguard Worker 80*5a6e8488SAndroid Build Coastguard Worker# Make sure the directory exists. 81*5a6e8488SAndroid Build Coastguard Workerif [ ! -d "$outdir" ]; then 82*5a6e8488SAndroid Build Coastguard Worker mkdir -p "$outdir" 83*5a6e8488SAndroid Build Coastguard Workerfi 84*5a6e8488SAndroid Build Coastguard Worker 85*5a6e8488SAndroid Build Coastguard Workerexebase=$(basename "$exe") 86*5a6e8488SAndroid Build Coastguard Worker 87*5a6e8488SAndroid Build Coastguard Worker# Set stuff for the correct calculator. 88*5a6e8488SAndroid Build Coastguard Workerif [ "$d" = "bc" ]; then 89*5a6e8488SAndroid Build Coastguard Worker options="-lq" 90*5a6e8488SAndroid Build Coastguard Worker halt="halt" 91*5a6e8488SAndroid Build Coastguard Worker read_call="read()" 92*5a6e8488SAndroid Build Coastguard Worker read_expr="${read_call}\n5+5;" 93*5a6e8488SAndroid Build Coastguard Worker read_multiple=$(printf '%s\n%s\n%s\n' "3" "2" "1") 94*5a6e8488SAndroid Build Coastguard Workerelse 95*5a6e8488SAndroid Build Coastguard Worker options="-x" 96*5a6e8488SAndroid Build Coastguard Worker halt="q" 97*5a6e8488SAndroid Build Coastguard Worker read_call="?" 98*5a6e8488SAndroid Build Coastguard Worker read_expr="${read_call}" 99*5a6e8488SAndroid Build Coastguard Worker read_multiple=$(printf '%spR\n%spR\n%spR\n' "3" "2" "1") 100*5a6e8488SAndroid Build Coastguard Workerfi 101*5a6e8488SAndroid Build Coastguard Worker 102*5a6e8488SAndroid Build Coastguard Worker# I use these, so unset them to make the tests work. 103*5a6e8488SAndroid Build Coastguard Workerunset BC_ENV_ARGS 104*5a6e8488SAndroid Build Coastguard Workerunset BC_LINE_LENGTH 105*5a6e8488SAndroid Build Coastguard Workerunset DC_ENV_ARGS 106*5a6e8488SAndroid Build Coastguard Workerunset DC_LINE_LENGTH 107*5a6e8488SAndroid Build Coastguard Worker 108*5a6e8488SAndroid Build Coastguard Workerprintf 'Running %s read...' "$d" 109*5a6e8488SAndroid Build Coastguard Worker 110*5a6e8488SAndroid Build Coastguard Workerset +e 111*5a6e8488SAndroid Build Coastguard Worker 112*5a6e8488SAndroid Build Coastguard Worker# Run read() on every line. 113*5a6e8488SAndroid Build Coastguard Workerwhile read line; do 114*5a6e8488SAndroid Build Coastguard Worker 115*5a6e8488SAndroid Build Coastguard Worker printf '%s\n%s\n' "$read_call" "$line" | "$exe" "$@" "$options" > "$out" 116*5a6e8488SAndroid Build Coastguard Worker checktest "$d" "$?" 'read' "$results" "$out" 117*5a6e8488SAndroid Build Coastguard Worker 118*5a6e8488SAndroid Build Coastguard Workerdone < "$name" 119*5a6e8488SAndroid Build Coastguard Worker 120*5a6e8488SAndroid Build Coastguard Workerprintf 'pass\n' 121*5a6e8488SAndroid Build Coastguard Worker 122*5a6e8488SAndroid Build Coastguard Workerprintf 'Running %s read multiple...' "$d" 123*5a6e8488SAndroid Build Coastguard Worker 124*5a6e8488SAndroid Build Coastguard Workerprintf '3\n2\n1\n' > "$multiple_res" 125*5a6e8488SAndroid Build Coastguard Worker 126*5a6e8488SAndroid Build Coastguard Worker# Run multiple read() calls. 127*5a6e8488SAndroid Build Coastguard Workerprintf '%s\n' "$read_multiple" | "$exe" "$@" "$options" -e "$read_call" -e "$read_call" -e "$read_call" > "$out" 128*5a6e8488SAndroid Build Coastguard Workerchecktest "$d" "$?" 'read multiple' "$multiple_res" "$out" 129*5a6e8488SAndroid Build Coastguard Worker 130*5a6e8488SAndroid Build Coastguard Workerprintf 'pass\n' 131*5a6e8488SAndroid Build Coastguard Worker 132*5a6e8488SAndroid Build Coastguard Workerprintf 'Running %s read errors...' "$d" 133*5a6e8488SAndroid Build Coastguard Worker 134*5a6e8488SAndroid Build Coastguard Worker# Run read on every line. 135*5a6e8488SAndroid Build Coastguard Workerwhile read line; do 136*5a6e8488SAndroid Build Coastguard Worker 137*5a6e8488SAndroid Build Coastguard Worker printf '%s\n%s\n' "$read_call" "$line" | "$exe" "$@" "$options" 2> "$out" > /dev/null 138*5a6e8488SAndroid Build Coastguard Worker err="$?" 139*5a6e8488SAndroid Build Coastguard Worker 140*5a6e8488SAndroid Build Coastguard Worker checkerrtest "$d" "$err" "$line" "$out" "$exebase" 141*5a6e8488SAndroid Build Coastguard Worker 142*5a6e8488SAndroid Build Coastguard Workerdone < "$errors" 143*5a6e8488SAndroid Build Coastguard Worker 144*5a6e8488SAndroid Build Coastguard Workerprintf 'pass\n' 145*5a6e8488SAndroid Build Coastguard Worker 146*5a6e8488SAndroid Build Coastguard Workerprintf 'Running %s empty read...' "$d" 147*5a6e8488SAndroid Build Coastguard Worker 148*5a6e8488SAndroid Build Coastguard Workerread_test=$(printf '%s\n' "$read_call") 149*5a6e8488SAndroid Build Coastguard Worker 150*5a6e8488SAndroid Build Coastguard Workerprintf '%s\n' "$read_test" | "$exe" "$@" "$opts" 2> "$out" > /dev/null 151*5a6e8488SAndroid Build Coastguard Workererr="$?" 152*5a6e8488SAndroid Build Coastguard Worker 153*5a6e8488SAndroid Build Coastguard Workercheckerrtest "$d" "$err" "$read_test" "$out" "$exebase" 154*5a6e8488SAndroid Build Coastguard Worker 155*5a6e8488SAndroid Build Coastguard Workerprintf 'pass\n' 156*5a6e8488SAndroid Build Coastguard Worker 157*5a6e8488SAndroid Build Coastguard Workerprintf 'Running %s read EOF...' "$d" 158*5a6e8488SAndroid Build Coastguard Worker 159*5a6e8488SAndroid Build Coastguard Workerread_test=$(printf '%s' "$read_call") 160*5a6e8488SAndroid Build Coastguard Worker 161*5a6e8488SAndroid Build Coastguard Workerprintf '%s' "$read_test" | "$exe" "$@" "$opts" 2> "$out" > /dev/null 162*5a6e8488SAndroid Build Coastguard Workererr="$?" 163*5a6e8488SAndroid Build Coastguard Worker 164*5a6e8488SAndroid Build Coastguard Workercheckerrtest "$d" "$err" "$read_test" "$out" "$exebase" 165*5a6e8488SAndroid Build Coastguard Worker 166*5a6e8488SAndroid Build Coastguard Workerexec printf 'pass\n' 167