1aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner#!/bin/sh 2aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# 3aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# Copyright (C) 2010 The Android Open Source Project 4aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# 5aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# Licensed under the Apache License, Version 2.0 (the "License"); 6aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# you may not use this file except in compliance with the License. 7aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# You may obtain a copy of the License at 8aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# 9aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# http://www.apache.org/licenses/LICENSE-2.0 10aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# 11aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# Unless required by applicable law or agreed to in writing, software 12aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# distributed under the License is distributed on an "AS IS" BASIS, 13aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# See the License for the specific language governing permissions and 15aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# limitations under the License. 16aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# 17aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# This shell script is used to run one test on a device emulator. 18aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# 19aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner 20aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' TurnerPROGDIR=`dirname $0` 21aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner 22aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# 23aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# Parse options 24aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# 25aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' TurnerVERBOSE=no 26aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' TurnerVERBOSE2=no 27aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' TurnerADB_CMD=adb 28aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner 29aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerwhile [ -n "$1" ]; do 30aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner opt="$1" 31aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'` 32aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner case "$opt" in 33aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner --help|-h|-\?) 34aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner OPTION_HELP=yes 35aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner ;; 36aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner --verbose) 37aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner if [ "$VERBOSE" = "yes" ] ; then 38aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner VERBOSE2=yes 39aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner else 40aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner VERBOSE=yes 41aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner fi 42aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner ;; 43aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner --adb=*) 44aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner ADB_CMD="$optarg" 45aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner ;; 46aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner -*) # unknown options 47aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo "ERROR: Unknown option '$opt', use --help for list of valid ones." 48aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner exit 1 49aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner ;; 50aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner *) # Simply record parameter 51aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner if [ -z "$PARAMETERS" ] ; then 52aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner PARAMETERS="$opt" 53aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner else 54aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner PARAMETERS="$PARAMETERS $opt" 55aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner fi 56aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner ;; 57aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner esac 58aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner shift 59aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerdone 60aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner 61aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerif [ "$OPTION_HELP" = "yes" ] ; then 62aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo "Usage: $PROGNAME [options] <test-name>" 63aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo "" 64aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo "Run one C library test on a device/emulator through ADB." 65aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo "" 66aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo "Valid options:" 67aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo "" 68aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo " --help|-h|-? Print this help" 69aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo " --verbose Enable verbose mode" 70aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo " --adb=<file> Specify adb executable for device tests" 71aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo "" 72aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner exit 0 73aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerfi 74aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner 75aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerif [ -z "$ANDROID_PRODUCT_OUT" ] ; then 76aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo "ERROR: ANDROID_PRODUCT_OUT not defined. Please run the 'lunch' command" 77aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner exit 1 78aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerfi 79aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner 80aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerif [ ! -f "$ANDROID_PRODUCT_OUT/system.img" ] ; then 81aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo "ERROR: Missing file: $ANDROID_PRODUCT_OUT/system.img" 82aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo "Are you sure you built the proper system image?" 83aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner exit 1 84aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerfi 85aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner 86aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' TurnerEXEC_ROOT_PATH="$ANDROID_PRODUCT_OUT/obj/EXECUTABLES" 87aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerif [ ! -d "$EXEC_ROOT_PATH" ] ; then 88aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo "ERROR: Missing directory: $EXEC_ROOT_PATH" 89aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo "Are you sure you built the proper system image?" 90aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner exit 1 91aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerfi 92aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner 93aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerif [ -z "$PARAMETERS" ] ; then 94aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo "ERROR: Please specify test name." 95aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo "Must be one of the following:" 96aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner for FILE in `cd $EXEC_ROOT_PATH && ls -d test_*`; do 97aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner TEST=`echo "$FILE" | sed -e "s!test_\(.*\)_intermediates!\\1!g"` 98aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo " $TEST" 99aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner done 100aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner exit 1 101aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerfi 102aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner 103aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' TurnerTEST="$PARAMETERS" 104aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# Normalize test name, i.e. remove test_ prefix 105aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' TurnerTEST=`echo "$TEST" | sed -e "s!^test_!!g"` 106aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner 107aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' TurnerTESTDIR="$EXEC_ROOT_PATH/test_${TEST}_intermediates" 108aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerif [ ! -d "$TESTDIR" ] ; then 109aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo "ERROR: No test by that name: test_$TEST!" 110aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner exit 1 111aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerfi 112aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner 113aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' TurnerTESTNAME="test_$TEST" 114aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' TurnerTESTEXE="$TESTDIR/$TESTNAME" 115aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerif [ ! -f "$TESTEXE" ] ; then 116aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo "ERROR: Missing file: $TESTEXE" 117aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo "Are you sure your last test build was complete?" 118aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner exit 1 119aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerfi 120aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner 121aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# Run a command in ADB and return 0 in case of success, or 1 otherwise. 122aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# This is needed because "adb shell" does not return the proper status 123aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# of the launched command. 124aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# 125aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# NOTE: You must call set_adb_cmd_log before that to set the location 126aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# of the temporary log file that will be used. 127aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# 128aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turneradb_cmd () 129aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner{ 130aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner local RET 131aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner if [ -z "$ADB_CMD_LOG" ] ; then 132aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner dump "INTERNAL ERROR: ADB_CMD_LOG not set!" 133aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner exit 1 134aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner fi 135aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner if [ $VERBOSE = "yes" ] ; then 136aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo "$ADB_CMD shell $@" 137aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner $ADB_CMD shell $@ "&&" echo OK "||" echo KO | tee $ADB_CMD_LOG 138aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner else 139aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner $ADB_CMD shell $@ "&&" echo OK "||" echo KO > $ADB_CMD_LOG 140aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner fi 141aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner # Get last line in log, should be OK or KO 142aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner RET=`tail -n1 $ADB_CMD_LOG` 143aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner # Get rid of \r at the end of lines 144aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner RET=`echo "$RET" | sed -e 's![[:cntrl:]]!!g'` 145aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner [ "$RET" = "OK" ] 146aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner} 147aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner 148aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerset_adb_cmd_log () 149aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner{ 150aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner ADB_CMD_LOG="$1" 151aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner} 152aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner 153aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# Returns 0 if a variable containing one or more items separated 154aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# by spaces contains a given value. 155aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# $1: variable name (e.g. FOO) 156aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner# $2: value to test 157aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnervar_list_contains () 158aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner{ 159aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo `var_value $1` | tr ' ' '\n' | fgrep -q -e "$2" 160aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner} 161aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner 162aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' TurnerTMPDIR=/tmp/bionic-tests 163aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnermkdir -p $TMPDIR 164aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerset_adb_cmd_log $TMPDIR/adb.log.txt 165aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner 166aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' TurnerDEVICE_TEST_DIR=/data/local/bionic-test 167aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' TurnerDEVICE_TEST=$DEVICE_TEST_DIR/$TESTNAME 1687f101d6dd0e9da88ffed3aef0686758950285b3dDavid 'Digit' Turneradb_cmd mkdir $DEVICE_TEST_DIR 169aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner$ADB_CMD push $TESTEXE $DEVICE_TEST_DIR/ 170aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerif [ $? != 0 ] ; then 171aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo "ERROR: Can't push test to device!" 172aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner exit 1 173aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerfi 174aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner 175aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turneradb_cmd chmod 0755 $DEVICE_TEST && 176aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turneradb_cmd $DEVICE_TEST 177aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' TurnerRET=$? 178aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turneradb_cmd rm -r $DEVICE_TEST_DIR 179aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner 180aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerif [ "$RET" != 0 ] ; then 181aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo "FAIL!" 182aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerelse 183aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turner echo "OK!" 184aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerfi 185aa47f0c8ebe0ee3fc6e6ab90b81848efb4c011a8David 'Digit' Turnerexit 0 186