1*053f45beSAndroid Build Coastguard Worker#!/bin/bash 2*053f45beSAndroid Build Coastguard Worker# 3*053f45beSAndroid Build Coastguard Worker# Copyright (C) 2017 Luis R. Rodriguez <[email protected]> 4*053f45beSAndroid Build Coastguard Worker# 5*053f45beSAndroid Build Coastguard Worker# This program is free software; you can redistribute it and/or modify it 6*053f45beSAndroid Build Coastguard Worker# under the terms of the GNU General Public License as published by the Free 7*053f45beSAndroid Build Coastguard Worker# Software Foundation; either version 2 of the License, or at your option any 8*053f45beSAndroid Build Coastguard Worker# later version; or, when distributed separately from the Linux kernel or 9*053f45beSAndroid Build Coastguard Worker# when incorporated into other software packages, subject to the following 10*053f45beSAndroid Build Coastguard Worker# license: 11*053f45beSAndroid Build Coastguard Worker# 12*053f45beSAndroid Build Coastguard Worker# This program is free software; you can redistribute it and/or modify it 13*053f45beSAndroid Build Coastguard Worker# under the terms of copyleft-next (version 0.3.1 or later) as published 14*053f45beSAndroid Build Coastguard Worker# at http://copyleft-next.org/. 15*053f45beSAndroid Build Coastguard Worker 16*053f45beSAndroid Build Coastguard Worker# This is a stress test script for kmod, the kernel module loader. It uses 17*053f45beSAndroid Build Coastguard Worker# test_kmod which exposes a series of knobs for the API for us so we can 18*053f45beSAndroid Build Coastguard Worker# tweak each test in userspace rather than in kernelspace. 19*053f45beSAndroid Build Coastguard Worker# 20*053f45beSAndroid Build Coastguard Worker# The way kmod works is it uses the kernel's usermode helper API to eventually 21*053f45beSAndroid Build Coastguard Worker# call /sbin/modprobe. It has a limit of the number of concurrent calls 22*053f45beSAndroid Build Coastguard Worker# possible. The kernel interface to load modules is request_module(), however 23*053f45beSAndroid Build Coastguard Worker# mount uses get_fs_type(). Both behave slightly differently, but the 24*053f45beSAndroid Build Coastguard Worker# differences are important enough to test each call separately. For this 25*053f45beSAndroid Build Coastguard Worker# reason test_kmod starts by providing tests for both calls. 26*053f45beSAndroid Build Coastguard Worker# 27*053f45beSAndroid Build Coastguard Worker# The test driver test_kmod assumes a series of defaults which you can 28*053f45beSAndroid Build Coastguard Worker# override by exporting to your environment prior running this script. 29*053f45beSAndroid Build Coastguard Worker# For instance this script assumes you do not have xfs loaded upon boot. 30*053f45beSAndroid Build Coastguard Worker# If this is false, export DEFAULT_KMOD_FS="ext4" prior to running this 31*053f45beSAndroid Build Coastguard Worker# script if the filesystem module you don't have loaded upon bootup 32*053f45beSAndroid Build Coastguard Worker# is ext4 instead. Refer to allow_user_defaults() for a list of user 33*053f45beSAndroid Build Coastguard Worker# override variables possible. 34*053f45beSAndroid Build Coastguard Worker# 35*053f45beSAndroid Build Coastguard Worker# You'll want at least 4 GiB of RAM to expect to run these tests 36*053f45beSAndroid Build Coastguard Worker# without running out of memory on them. For other requirements refer 37*053f45beSAndroid Build Coastguard Worker# to test_reqs() 38*053f45beSAndroid Build Coastguard Worker 39*053f45beSAndroid Build Coastguard Workerset -e 40*053f45beSAndroid Build Coastguard Worker 41*053f45beSAndroid Build Coastguard WorkerTEST_NAME="kmod" 42*053f45beSAndroid Build Coastguard WorkerTEST_DRIVER="test_${TEST_NAME}" 43*053f45beSAndroid Build Coastguard WorkerTEST_DIR=$(dirname $0) 44*053f45beSAndroid Build Coastguard Worker 45*053f45beSAndroid Build Coastguard Worker# This represents 46*053f45beSAndroid Build Coastguard Worker# 47*053f45beSAndroid Build Coastguard Worker# TEST_ID:TEST_COUNT:ENABLED 48*053f45beSAndroid Build Coastguard Worker# 49*053f45beSAndroid Build Coastguard Worker# TEST_ID: is the test id number 50*053f45beSAndroid Build Coastguard Worker# TEST_COUNT: number of times we should run the test 51*053f45beSAndroid Build Coastguard Worker# ENABLED: 1 if enabled, 0 otherwise 52*053f45beSAndroid Build Coastguard Worker# 53*053f45beSAndroid Build Coastguard Worker# Once these are enabled please leave them as-is. Write your own test, 54*053f45beSAndroid Build Coastguard Worker# we have tons of space. 55*053f45beSAndroid Build Coastguard WorkerALL_TESTS="0001:3:1" 56*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0002:3:1" 57*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0003:1:1" 58*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0004:1:1" 59*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0005:10:1" 60*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0006:10:1" 61*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0007:5:1" 62*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0008:150:1" 63*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0009:150:1" 64*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0010:1:1" 65*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0011:1:1" 66*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0012:1:1" 67*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0013:1:1" 68*053f45beSAndroid Build Coastguard Worker 69*053f45beSAndroid Build Coastguard Worker# Kselftest framework requirement - SKIP code is 4. 70*053f45beSAndroid Build Coastguard Workerksft_skip=4 71*053f45beSAndroid Build Coastguard Worker 72*053f45beSAndroid Build Coastguard Workertest_modprobe() 73*053f45beSAndroid Build Coastguard Worker{ 74*053f45beSAndroid Build Coastguard Worker if [ ! -d $DIR ]; then 75*053f45beSAndroid Build Coastguard Worker echo "$0: $DIR not present" >&2 76*053f45beSAndroid Build Coastguard Worker echo "You must have the following enabled in your kernel:" >&2 77*053f45beSAndroid Build Coastguard Worker cat $TEST_DIR/config >&2 78*053f45beSAndroid Build Coastguard Worker exit $ksft_skip 79*053f45beSAndroid Build Coastguard Worker fi 80*053f45beSAndroid Build Coastguard Worker} 81*053f45beSAndroid Build Coastguard Worker 82*053f45beSAndroid Build Coastguard Workerfunction allow_user_defaults() 83*053f45beSAndroid Build Coastguard Worker{ 84*053f45beSAndroid Build Coastguard Worker if [ -z $DEFAULT_KMOD_DRIVER ]; then 85*053f45beSAndroid Build Coastguard Worker DEFAULT_KMOD_DRIVER="test_module" 86*053f45beSAndroid Build Coastguard Worker fi 87*053f45beSAndroid Build Coastguard Worker 88*053f45beSAndroid Build Coastguard Worker if [ -z $DEFAULT_KMOD_FS ]; then 89*053f45beSAndroid Build Coastguard Worker DEFAULT_KMOD_FS="xfs" 90*053f45beSAndroid Build Coastguard Worker fi 91*053f45beSAndroid Build Coastguard Worker 92*053f45beSAndroid Build Coastguard Worker if [ -z $PROC_DIR ]; then 93*053f45beSAndroid Build Coastguard Worker PROC_DIR="/proc/sys/kernel/" 94*053f45beSAndroid Build Coastguard Worker fi 95*053f45beSAndroid Build Coastguard Worker 96*053f45beSAndroid Build Coastguard Worker if [ -z $MODPROBE_LIMIT ]; then 97*053f45beSAndroid Build Coastguard Worker MODPROBE_LIMIT=50 98*053f45beSAndroid Build Coastguard Worker fi 99*053f45beSAndroid Build Coastguard Worker 100*053f45beSAndroid Build Coastguard Worker if [ -z $DIR ]; then 101*053f45beSAndroid Build Coastguard Worker DIR="/sys/devices/virtual/misc/${TEST_DRIVER}0/" 102*053f45beSAndroid Build Coastguard Worker fi 103*053f45beSAndroid Build Coastguard Worker 104*053f45beSAndroid Build Coastguard Worker if [ -z $DEFAULT_NUM_TESTS ]; then 105*053f45beSAndroid Build Coastguard Worker DEFAULT_NUM_TESTS=150 106*053f45beSAndroid Build Coastguard Worker fi 107*053f45beSAndroid Build Coastguard Worker 108*053f45beSAndroid Build Coastguard Worker MODPROBE_LIMIT_FILE="${PROC_DIR}/kmod-limit" 109*053f45beSAndroid Build Coastguard Worker} 110*053f45beSAndroid Build Coastguard Worker 111*053f45beSAndroid Build Coastguard Workertest_reqs() 112*053f45beSAndroid Build Coastguard Worker{ 113*053f45beSAndroid Build Coastguard Worker if ! which modprobe 2> /dev/null > /dev/null; then 114*053f45beSAndroid Build Coastguard Worker echo "$0: You need modprobe installed" >&2 115*053f45beSAndroid Build Coastguard Worker exit $ksft_skip 116*053f45beSAndroid Build Coastguard Worker fi 117*053f45beSAndroid Build Coastguard Worker 118*053f45beSAndroid Build Coastguard Worker if ! which kmod 2> /dev/null > /dev/null; then 119*053f45beSAndroid Build Coastguard Worker echo "$0: You need kmod installed" >&2 120*053f45beSAndroid Build Coastguard Worker exit $ksft_skip 121*053f45beSAndroid Build Coastguard Worker fi 122*053f45beSAndroid Build Coastguard Worker 123*053f45beSAndroid Build Coastguard Worker # kmod 19 has a bad bug where it returns 0 when modprobe 124*053f45beSAndroid Build Coastguard Worker # gets called *even* if the module was not loaded due to 125*053f45beSAndroid Build Coastguard Worker # some bad heuristics. For details see: 126*053f45beSAndroid Build Coastguard Worker # 127*053f45beSAndroid Build Coastguard Worker # A work around is possible in-kernel but its rather 128*053f45beSAndroid Build Coastguard Worker # complex. 129*053f45beSAndroid Build Coastguard Worker KMOD_VERSION=$(kmod --version | awk '{print $3}') 130*053f45beSAndroid Build Coastguard Worker if [[ $KMOD_VERSION -le 19 ]]; then 131*053f45beSAndroid Build Coastguard Worker echo "$0: You need at least kmod 20" >&2 132*053f45beSAndroid Build Coastguard Worker echo "kmod <= 19 is buggy, for details see:" >&2 133*053f45beSAndroid Build Coastguard Worker echo "https://git.kernel.org/cgit/utils/kernel/kmod/kmod.git/commit/libkmod/libkmod-module.c?id=fd44a98ae2eb5eb32161088954ab21e58e19dfc4" >&2 134*053f45beSAndroid Build Coastguard Worker exit $ksft_skip 135*053f45beSAndroid Build Coastguard Worker fi 136*053f45beSAndroid Build Coastguard Worker 137*053f45beSAndroid Build Coastguard Worker uid=$(id -u) 138*053f45beSAndroid Build Coastguard Worker if [ $uid -ne 0 ]; then 139*053f45beSAndroid Build Coastguard Worker echo $msg must be run as root >&2 140*053f45beSAndroid Build Coastguard Worker exit $ksft_skip 141*053f45beSAndroid Build Coastguard Worker fi 142*053f45beSAndroid Build Coastguard Worker} 143*053f45beSAndroid Build Coastguard Worker 144*053f45beSAndroid Build Coastguard Workerfunction load_req_mod() 145*053f45beSAndroid Build Coastguard Worker{ 146*053f45beSAndroid Build Coastguard Worker trap "test_modprobe" EXIT 147*053f45beSAndroid Build Coastguard Worker 148*053f45beSAndroid Build Coastguard Worker if [ ! -d $DIR ]; then 149*053f45beSAndroid Build Coastguard Worker # Alanis: "Oh isn't it ironic?" 150*053f45beSAndroid Build Coastguard Worker modprobe $TEST_DRIVER 151*053f45beSAndroid Build Coastguard Worker fi 152*053f45beSAndroid Build Coastguard Worker} 153*053f45beSAndroid Build Coastguard Worker 154*053f45beSAndroid Build Coastguard Workertest_finish() 155*053f45beSAndroid Build Coastguard Worker{ 156*053f45beSAndroid Build Coastguard Worker echo "$MODPROBE" > /proc/sys/kernel/modprobe 157*053f45beSAndroid Build Coastguard Worker echo "Test completed" 158*053f45beSAndroid Build Coastguard Worker} 159*053f45beSAndroid Build Coastguard Worker 160*053f45beSAndroid Build Coastguard Workererrno_name_to_val() 161*053f45beSAndroid Build Coastguard Worker{ 162*053f45beSAndroid Build Coastguard Worker case "$1" in 163*053f45beSAndroid Build Coastguard Worker # kmod calls modprobe and upon of a module not found 164*053f45beSAndroid Build Coastguard Worker # modprobe returns just 1... However in the kernel we 165*053f45beSAndroid Build Coastguard Worker # *sometimes* see 256... 166*053f45beSAndroid Build Coastguard Worker MODULE_NOT_FOUND) 167*053f45beSAndroid Build Coastguard Worker echo 256;; 168*053f45beSAndroid Build Coastguard Worker SUCCESS) 169*053f45beSAndroid Build Coastguard Worker echo 0;; 170*053f45beSAndroid Build Coastguard Worker -EPERM) 171*053f45beSAndroid Build Coastguard Worker echo -1;; 172*053f45beSAndroid Build Coastguard Worker -ENOENT) 173*053f45beSAndroid Build Coastguard Worker echo -2;; 174*053f45beSAndroid Build Coastguard Worker -EINVAL) 175*053f45beSAndroid Build Coastguard Worker echo -22;; 176*053f45beSAndroid Build Coastguard Worker -ERR_ANY) 177*053f45beSAndroid Build Coastguard Worker echo -123456;; 178*053f45beSAndroid Build Coastguard Worker *) 179*053f45beSAndroid Build Coastguard Worker echo invalid;; 180*053f45beSAndroid Build Coastguard Worker esac 181*053f45beSAndroid Build Coastguard Worker} 182*053f45beSAndroid Build Coastguard Worker 183*053f45beSAndroid Build Coastguard Workererrno_val_to_name() 184*053f45beSAndroid Build Coastguard Worker case "$1" in 185*053f45beSAndroid Build Coastguard Worker 256) 186*053f45beSAndroid Build Coastguard Worker echo MODULE_NOT_FOUND;; 187*053f45beSAndroid Build Coastguard Worker 0) 188*053f45beSAndroid Build Coastguard Worker echo SUCCESS;; 189*053f45beSAndroid Build Coastguard Worker -1) 190*053f45beSAndroid Build Coastguard Worker echo -EPERM;; 191*053f45beSAndroid Build Coastguard Worker -2) 192*053f45beSAndroid Build Coastguard Worker echo -ENOENT;; 193*053f45beSAndroid Build Coastguard Worker -22) 194*053f45beSAndroid Build Coastguard Worker echo -EINVAL;; 195*053f45beSAndroid Build Coastguard Worker -123456) 196*053f45beSAndroid Build Coastguard Worker echo -ERR_ANY;; 197*053f45beSAndroid Build Coastguard Worker *) 198*053f45beSAndroid Build Coastguard Worker echo invalid;; 199*053f45beSAndroid Build Coastguard Worker esac 200*053f45beSAndroid Build Coastguard Worker 201*053f45beSAndroid Build Coastguard Workerconfig_set_test_case_driver() 202*053f45beSAndroid Build Coastguard Worker{ 203*053f45beSAndroid Build Coastguard Worker if ! echo -n 1 >$DIR/config_test_case; then 204*053f45beSAndroid Build Coastguard Worker echo "$0: Unable to set to test case to driver" >&2 205*053f45beSAndroid Build Coastguard Worker exit 1 206*053f45beSAndroid Build Coastguard Worker fi 207*053f45beSAndroid Build Coastguard Worker} 208*053f45beSAndroid Build Coastguard Worker 209*053f45beSAndroid Build Coastguard Workerconfig_set_test_case_fs() 210*053f45beSAndroid Build Coastguard Worker{ 211*053f45beSAndroid Build Coastguard Worker if ! echo -n 2 >$DIR/config_test_case; then 212*053f45beSAndroid Build Coastguard Worker echo "$0: Unable to set to test case to fs" >&2 213*053f45beSAndroid Build Coastguard Worker exit 1 214*053f45beSAndroid Build Coastguard Worker fi 215*053f45beSAndroid Build Coastguard Worker} 216*053f45beSAndroid Build Coastguard Worker 217*053f45beSAndroid Build Coastguard Workerconfig_num_threads() 218*053f45beSAndroid Build Coastguard Worker{ 219*053f45beSAndroid Build Coastguard Worker if ! echo -n $1 >$DIR/config_num_threads; then 220*053f45beSAndroid Build Coastguard Worker echo "$0: Unable to set to number of threads" >&2 221*053f45beSAndroid Build Coastguard Worker exit 1 222*053f45beSAndroid Build Coastguard Worker fi 223*053f45beSAndroid Build Coastguard Worker} 224*053f45beSAndroid Build Coastguard Worker 225*053f45beSAndroid Build Coastguard Workerconfig_get_modprobe_limit() 226*053f45beSAndroid Build Coastguard Worker{ 227*053f45beSAndroid Build Coastguard Worker if [[ -f ${MODPROBE_LIMIT_FILE} ]] ; then 228*053f45beSAndroid Build Coastguard Worker MODPROBE_LIMIT=$(cat $MODPROBE_LIMIT_FILE) 229*053f45beSAndroid Build Coastguard Worker fi 230*053f45beSAndroid Build Coastguard Worker echo $MODPROBE_LIMIT 231*053f45beSAndroid Build Coastguard Worker} 232*053f45beSAndroid Build Coastguard Worker 233*053f45beSAndroid Build Coastguard Workerconfig_num_thread_limit_extra() 234*053f45beSAndroid Build Coastguard Worker{ 235*053f45beSAndroid Build Coastguard Worker MODPROBE_LIMIT=$(config_get_modprobe_limit) 236*053f45beSAndroid Build Coastguard Worker let EXTRA_LIMIT=$MODPROBE_LIMIT+$1 237*053f45beSAndroid Build Coastguard Worker config_num_threads $EXTRA_LIMIT 238*053f45beSAndroid Build Coastguard Worker} 239*053f45beSAndroid Build Coastguard Worker 240*053f45beSAndroid Build Coastguard Worker# For special characters use printf directly, 241*053f45beSAndroid Build Coastguard Worker# refer to kmod_test_0001 242*053f45beSAndroid Build Coastguard Workerconfig_set_driver() 243*053f45beSAndroid Build Coastguard Worker{ 244*053f45beSAndroid Build Coastguard Worker if ! echo -n $1 >$DIR/config_test_driver; then 245*053f45beSAndroid Build Coastguard Worker echo "$0: Unable to set driver" >&2 246*053f45beSAndroid Build Coastguard Worker exit 1 247*053f45beSAndroid Build Coastguard Worker fi 248*053f45beSAndroid Build Coastguard Worker} 249*053f45beSAndroid Build Coastguard Worker 250*053f45beSAndroid Build Coastguard Workerconfig_set_fs() 251*053f45beSAndroid Build Coastguard Worker{ 252*053f45beSAndroid Build Coastguard Worker if ! echo -n $1 >$DIR/config_test_fs; then 253*053f45beSAndroid Build Coastguard Worker echo "$0: Unable to set driver" >&2 254*053f45beSAndroid Build Coastguard Worker exit 1 255*053f45beSAndroid Build Coastguard Worker fi 256*053f45beSAndroid Build Coastguard Worker} 257*053f45beSAndroid Build Coastguard Worker 258*053f45beSAndroid Build Coastguard Workerconfig_get_driver() 259*053f45beSAndroid Build Coastguard Worker{ 260*053f45beSAndroid Build Coastguard Worker cat $DIR/config_test_driver 261*053f45beSAndroid Build Coastguard Worker} 262*053f45beSAndroid Build Coastguard Worker 263*053f45beSAndroid Build Coastguard Workerconfig_get_test_result() 264*053f45beSAndroid Build Coastguard Worker{ 265*053f45beSAndroid Build Coastguard Worker cat $DIR/test_result 266*053f45beSAndroid Build Coastguard Worker} 267*053f45beSAndroid Build Coastguard Worker 268*053f45beSAndroid Build Coastguard Workerconfig_reset() 269*053f45beSAndroid Build Coastguard Worker{ 270*053f45beSAndroid Build Coastguard Worker if ! echo -n "1" >"$DIR"/reset; then 271*053f45beSAndroid Build Coastguard Worker echo "$0: reset should have worked" >&2 272*053f45beSAndroid Build Coastguard Worker exit 1 273*053f45beSAndroid Build Coastguard Worker fi 274*053f45beSAndroid Build Coastguard Worker} 275*053f45beSAndroid Build Coastguard Worker 276*053f45beSAndroid Build Coastguard Workerconfig_show_config() 277*053f45beSAndroid Build Coastguard Worker{ 278*053f45beSAndroid Build Coastguard Worker echo "----------------------------------------------------" 279*053f45beSAndroid Build Coastguard Worker cat "$DIR"/config 280*053f45beSAndroid Build Coastguard Worker echo "----------------------------------------------------" 281*053f45beSAndroid Build Coastguard Worker} 282*053f45beSAndroid Build Coastguard Worker 283*053f45beSAndroid Build Coastguard Workerconfig_trigger() 284*053f45beSAndroid Build Coastguard Worker{ 285*053f45beSAndroid Build Coastguard Worker if ! echo -n "1" >"$DIR"/trigger_config 2>/dev/null; then 286*053f45beSAndroid Build Coastguard Worker echo "$1: FAIL - loading should have worked" 287*053f45beSAndroid Build Coastguard Worker config_show_config 288*053f45beSAndroid Build Coastguard Worker exit 1 289*053f45beSAndroid Build Coastguard Worker fi 290*053f45beSAndroid Build Coastguard Worker echo "$1: OK! - loading kmod test" 291*053f45beSAndroid Build Coastguard Worker} 292*053f45beSAndroid Build Coastguard Worker 293*053f45beSAndroid Build Coastguard Workerconfig_trigger_want_fail() 294*053f45beSAndroid Build Coastguard Worker{ 295*053f45beSAndroid Build Coastguard Worker if echo "1" > $DIR/trigger_config 2>/dev/null; then 296*053f45beSAndroid Build Coastguard Worker echo "$1: FAIL - test case was expected to fail" 297*053f45beSAndroid Build Coastguard Worker config_show_config 298*053f45beSAndroid Build Coastguard Worker exit 1 299*053f45beSAndroid Build Coastguard Worker fi 300*053f45beSAndroid Build Coastguard Worker echo "$1: OK! - kmod test case failed as expected" 301*053f45beSAndroid Build Coastguard Worker} 302*053f45beSAndroid Build Coastguard Worker 303*053f45beSAndroid Build Coastguard Workerconfig_expect_result() 304*053f45beSAndroid Build Coastguard Worker{ 305*053f45beSAndroid Build Coastguard Worker RC=$(config_get_test_result) 306*053f45beSAndroid Build Coastguard Worker RC_NAME=$(errno_val_to_name $RC) 307*053f45beSAndroid Build Coastguard Worker 308*053f45beSAndroid Build Coastguard Worker ERRNO_NAME=$2 309*053f45beSAndroid Build Coastguard Worker ERRNO=$(errno_name_to_val $ERRNO_NAME) 310*053f45beSAndroid Build Coastguard Worker 311*053f45beSAndroid Build Coastguard Worker if [[ $ERRNO_NAME = "-ERR_ANY" ]]; then 312*053f45beSAndroid Build Coastguard Worker if [[ $RC -ge 0 ]]; then 313*053f45beSAndroid Build Coastguard Worker echo "$1: FAIL, test expects $ERRNO_NAME - got $RC_NAME ($RC)" >&2 314*053f45beSAndroid Build Coastguard Worker config_show_config 315*053f45beSAndroid Build Coastguard Worker exit 1 316*053f45beSAndroid Build Coastguard Worker fi 317*053f45beSAndroid Build Coastguard Worker elif [[ $RC != $ERRNO ]]; then 318*053f45beSAndroid Build Coastguard Worker echo "$1: FAIL, test expects $ERRNO_NAME ($ERRNO) - got $RC_NAME ($RC)" >&2 319*053f45beSAndroid Build Coastguard Worker config_show_config 320*053f45beSAndroid Build Coastguard Worker exit 1 321*053f45beSAndroid Build Coastguard Worker fi 322*053f45beSAndroid Build Coastguard Worker echo "$1: OK! - Return value: $RC ($RC_NAME), expected $ERRNO_NAME" 323*053f45beSAndroid Build Coastguard Worker} 324*053f45beSAndroid Build Coastguard Worker 325*053f45beSAndroid Build Coastguard Workerkmod_defaults_driver() 326*053f45beSAndroid Build Coastguard Worker{ 327*053f45beSAndroid Build Coastguard Worker config_reset 328*053f45beSAndroid Build Coastguard Worker modprobe -r $DEFAULT_KMOD_DRIVER 329*053f45beSAndroid Build Coastguard Worker config_set_driver $DEFAULT_KMOD_DRIVER 330*053f45beSAndroid Build Coastguard Worker} 331*053f45beSAndroid Build Coastguard Worker 332*053f45beSAndroid Build Coastguard Workerkmod_defaults_fs() 333*053f45beSAndroid Build Coastguard Worker{ 334*053f45beSAndroid Build Coastguard Worker config_reset 335*053f45beSAndroid Build Coastguard Worker modprobe -r $DEFAULT_KMOD_FS 336*053f45beSAndroid Build Coastguard Worker config_set_fs $DEFAULT_KMOD_FS 337*053f45beSAndroid Build Coastguard Worker config_set_test_case_fs 338*053f45beSAndroid Build Coastguard Worker} 339*053f45beSAndroid Build Coastguard Worker 340*053f45beSAndroid Build Coastguard Workerkmod_test_0001_driver() 341*053f45beSAndroid Build Coastguard Worker{ 342*053f45beSAndroid Build Coastguard Worker NAME='\000' 343*053f45beSAndroid Build Coastguard Worker 344*053f45beSAndroid Build Coastguard Worker kmod_defaults_driver 345*053f45beSAndroid Build Coastguard Worker config_num_threads 1 346*053f45beSAndroid Build Coastguard Worker printf $NAME >"$DIR"/config_test_driver 347*053f45beSAndroid Build Coastguard Worker config_trigger ${FUNCNAME[0]} 348*053f45beSAndroid Build Coastguard Worker config_expect_result ${FUNCNAME[0]} MODULE_NOT_FOUND 349*053f45beSAndroid Build Coastguard Worker} 350*053f45beSAndroid Build Coastguard Worker 351*053f45beSAndroid Build Coastguard Workerkmod_test_0001_fs() 352*053f45beSAndroid Build Coastguard Worker{ 353*053f45beSAndroid Build Coastguard Worker NAME='\000' 354*053f45beSAndroid Build Coastguard Worker 355*053f45beSAndroid Build Coastguard Worker kmod_defaults_fs 356*053f45beSAndroid Build Coastguard Worker config_num_threads 1 357*053f45beSAndroid Build Coastguard Worker printf $NAME >"$DIR"/config_test_fs 358*053f45beSAndroid Build Coastguard Worker config_trigger ${FUNCNAME[0]} 359*053f45beSAndroid Build Coastguard Worker config_expect_result ${FUNCNAME[0]} -EINVAL 360*053f45beSAndroid Build Coastguard Worker} 361*053f45beSAndroid Build Coastguard Worker 362*053f45beSAndroid Build Coastguard Workerkmod_test_0001() 363*053f45beSAndroid Build Coastguard Worker{ 364*053f45beSAndroid Build Coastguard Worker kmod_test_0001_driver 365*053f45beSAndroid Build Coastguard Worker kmod_test_0001_fs 366*053f45beSAndroid Build Coastguard Worker} 367*053f45beSAndroid Build Coastguard Worker 368*053f45beSAndroid Build Coastguard Workerkmod_test_0002_driver() 369*053f45beSAndroid Build Coastguard Worker{ 370*053f45beSAndroid Build Coastguard Worker NAME="nope-$DEFAULT_KMOD_DRIVER" 371*053f45beSAndroid Build Coastguard Worker 372*053f45beSAndroid Build Coastguard Worker kmod_defaults_driver 373*053f45beSAndroid Build Coastguard Worker config_set_driver $NAME 374*053f45beSAndroid Build Coastguard Worker config_num_threads 1 375*053f45beSAndroid Build Coastguard Worker config_trigger ${FUNCNAME[0]} 376*053f45beSAndroid Build Coastguard Worker config_expect_result ${FUNCNAME[0]} MODULE_NOT_FOUND 377*053f45beSAndroid Build Coastguard Worker} 378*053f45beSAndroid Build Coastguard Worker 379*053f45beSAndroid Build Coastguard Workerkmod_test_0002_fs() 380*053f45beSAndroid Build Coastguard Worker{ 381*053f45beSAndroid Build Coastguard Worker NAME="nope-$DEFAULT_KMOD_FS" 382*053f45beSAndroid Build Coastguard Worker 383*053f45beSAndroid Build Coastguard Worker kmod_defaults_fs 384*053f45beSAndroid Build Coastguard Worker config_set_fs $NAME 385*053f45beSAndroid Build Coastguard Worker config_trigger ${FUNCNAME[0]} 386*053f45beSAndroid Build Coastguard Worker config_expect_result ${FUNCNAME[0]} -EINVAL 387*053f45beSAndroid Build Coastguard Worker} 388*053f45beSAndroid Build Coastguard Worker 389*053f45beSAndroid Build Coastguard Workerkmod_test_0002() 390*053f45beSAndroid Build Coastguard Worker{ 391*053f45beSAndroid Build Coastguard Worker kmod_test_0002_driver 392*053f45beSAndroid Build Coastguard Worker kmod_test_0002_fs 393*053f45beSAndroid Build Coastguard Worker} 394*053f45beSAndroid Build Coastguard Worker 395*053f45beSAndroid Build Coastguard Workerkmod_test_0003() 396*053f45beSAndroid Build Coastguard Worker{ 397*053f45beSAndroid Build Coastguard Worker kmod_defaults_fs 398*053f45beSAndroid Build Coastguard Worker config_num_threads 1 399*053f45beSAndroid Build Coastguard Worker config_trigger ${FUNCNAME[0]} 400*053f45beSAndroid Build Coastguard Worker config_expect_result ${FUNCNAME[0]} SUCCESS 401*053f45beSAndroid Build Coastguard Worker} 402*053f45beSAndroid Build Coastguard Worker 403*053f45beSAndroid Build Coastguard Workerkmod_test_0004() 404*053f45beSAndroid Build Coastguard Worker{ 405*053f45beSAndroid Build Coastguard Worker kmod_defaults_fs 406*053f45beSAndroid Build Coastguard Worker config_num_threads 2 407*053f45beSAndroid Build Coastguard Worker config_trigger ${FUNCNAME[0]} 408*053f45beSAndroid Build Coastguard Worker config_expect_result ${FUNCNAME[0]} SUCCESS 409*053f45beSAndroid Build Coastguard Worker} 410*053f45beSAndroid Build Coastguard Worker 411*053f45beSAndroid Build Coastguard Workerkmod_test_0005() 412*053f45beSAndroid Build Coastguard Worker{ 413*053f45beSAndroid Build Coastguard Worker kmod_defaults_driver 414*053f45beSAndroid Build Coastguard Worker config_trigger ${FUNCNAME[0]} 415*053f45beSAndroid Build Coastguard Worker config_expect_result ${FUNCNAME[0]} SUCCESS 416*053f45beSAndroid Build Coastguard Worker} 417*053f45beSAndroid Build Coastguard Worker 418*053f45beSAndroid Build Coastguard Workerkmod_test_0006() 419*053f45beSAndroid Build Coastguard Worker{ 420*053f45beSAndroid Build Coastguard Worker kmod_defaults_fs 421*053f45beSAndroid Build Coastguard Worker config_trigger ${FUNCNAME[0]} 422*053f45beSAndroid Build Coastguard Worker config_expect_result ${FUNCNAME[0]} SUCCESS 423*053f45beSAndroid Build Coastguard Worker} 424*053f45beSAndroid Build Coastguard Worker 425*053f45beSAndroid Build Coastguard Workerkmod_test_0007() 426*053f45beSAndroid Build Coastguard Worker{ 427*053f45beSAndroid Build Coastguard Worker kmod_test_0005 428*053f45beSAndroid Build Coastguard Worker kmod_test_0006 429*053f45beSAndroid Build Coastguard Worker} 430*053f45beSAndroid Build Coastguard Worker 431*053f45beSAndroid Build Coastguard Workerkmod_test_0008() 432*053f45beSAndroid Build Coastguard Worker{ 433*053f45beSAndroid Build Coastguard Worker kmod_defaults_driver 434*053f45beSAndroid Build Coastguard Worker MODPROBE_LIMIT=$(config_get_modprobe_limit) 435*053f45beSAndroid Build Coastguard Worker let EXTRA=$MODPROBE_LIMIT/6 436*053f45beSAndroid Build Coastguard Worker config_num_thread_limit_extra $EXTRA 437*053f45beSAndroid Build Coastguard Worker config_trigger ${FUNCNAME[0]} 438*053f45beSAndroid Build Coastguard Worker config_expect_result ${FUNCNAME[0]} SUCCESS 439*053f45beSAndroid Build Coastguard Worker} 440*053f45beSAndroid Build Coastguard Worker 441*053f45beSAndroid Build Coastguard Workerkmod_test_0009() 442*053f45beSAndroid Build Coastguard Worker{ 443*053f45beSAndroid Build Coastguard Worker kmod_defaults_fs 444*053f45beSAndroid Build Coastguard Worker MODPROBE_LIMIT=$(config_get_modprobe_limit) 445*053f45beSAndroid Build Coastguard Worker let EXTRA=$MODPROBE_LIMIT/4 446*053f45beSAndroid Build Coastguard Worker config_num_thread_limit_extra $EXTRA 447*053f45beSAndroid Build Coastguard Worker config_trigger ${FUNCNAME[0]} 448*053f45beSAndroid Build Coastguard Worker config_expect_result ${FUNCNAME[0]} SUCCESS 449*053f45beSAndroid Build Coastguard Worker} 450*053f45beSAndroid Build Coastguard Worker 451*053f45beSAndroid Build Coastguard Workerkmod_test_0010() 452*053f45beSAndroid Build Coastguard Worker{ 453*053f45beSAndroid Build Coastguard Worker kmod_defaults_driver 454*053f45beSAndroid Build Coastguard Worker config_num_threads 1 455*053f45beSAndroid Build Coastguard Worker echo "/KMOD_TEST_NONEXISTENT" > /proc/sys/kernel/modprobe 456*053f45beSAndroid Build Coastguard Worker config_trigger ${FUNCNAME[0]} 457*053f45beSAndroid Build Coastguard Worker config_expect_result ${FUNCNAME[0]} -ENOENT 458*053f45beSAndroid Build Coastguard Worker echo "$MODPROBE" > /proc/sys/kernel/modprobe 459*053f45beSAndroid Build Coastguard Worker} 460*053f45beSAndroid Build Coastguard Worker 461*053f45beSAndroid Build Coastguard Workerkmod_test_0011() 462*053f45beSAndroid Build Coastguard Worker{ 463*053f45beSAndroid Build Coastguard Worker kmod_defaults_driver 464*053f45beSAndroid Build Coastguard Worker config_num_threads 1 465*053f45beSAndroid Build Coastguard Worker # This causes the kernel to not even try executing modprobe. The error 466*053f45beSAndroid Build Coastguard Worker # code is still -ENOENT like when modprobe doesn't exist, so we can't 467*053f45beSAndroid Build Coastguard Worker # easily test for the exact difference. But this still is a useful test 468*053f45beSAndroid Build Coastguard Worker # since there was a bug where request_module() returned 0 in this case. 469*053f45beSAndroid Build Coastguard Worker echo > /proc/sys/kernel/modprobe 470*053f45beSAndroid Build Coastguard Worker config_trigger ${FUNCNAME[0]} 471*053f45beSAndroid Build Coastguard Worker config_expect_result ${FUNCNAME[0]} -ENOENT 472*053f45beSAndroid Build Coastguard Worker echo "$MODPROBE" > /proc/sys/kernel/modprobe 473*053f45beSAndroid Build Coastguard Worker} 474*053f45beSAndroid Build Coastguard Worker 475*053f45beSAndroid Build Coastguard Workerkmod_check_visibility() 476*053f45beSAndroid Build Coastguard Worker{ 477*053f45beSAndroid Build Coastguard Worker local name="$1" 478*053f45beSAndroid Build Coastguard Worker local cmd="$2" 479*053f45beSAndroid Build Coastguard Worker 480*053f45beSAndroid Build Coastguard Worker modprobe $DEFAULT_KMOD_DRIVER 481*053f45beSAndroid Build Coastguard Worker 482*053f45beSAndroid Build Coastguard Worker local priv=$(eval $cmd) 483*053f45beSAndroid Build Coastguard Worker local unpriv=$(capsh --drop=CAP_SYSLOG -- -c "$cmd") 484*053f45beSAndroid Build Coastguard Worker 485*053f45beSAndroid Build Coastguard Worker if [ "$priv" = "$unpriv" ] || \ 486*053f45beSAndroid Build Coastguard Worker [ "${priv:0:3}" = "0x0" ] || \ 487*053f45beSAndroid Build Coastguard Worker [ "${unpriv:0:3}" != "0x0" ] ; then 488*053f45beSAndroid Build Coastguard Worker echo "${FUNCNAME[0]}: FAIL, $name visible to unpriv: '$priv' vs '$unpriv'" >&2 489*053f45beSAndroid Build Coastguard Worker exit 1 490*053f45beSAndroid Build Coastguard Worker else 491*053f45beSAndroid Build Coastguard Worker echo "${FUNCNAME[0]}: OK!" 492*053f45beSAndroid Build Coastguard Worker fi 493*053f45beSAndroid Build Coastguard Worker} 494*053f45beSAndroid Build Coastguard Worker 495*053f45beSAndroid Build Coastguard Workerkmod_test_0012() 496*053f45beSAndroid Build Coastguard Worker{ 497*053f45beSAndroid Build Coastguard Worker kmod_check_visibility /proc/modules \ 498*053f45beSAndroid Build Coastguard Worker "grep '^${DEFAULT_KMOD_DRIVER}\b' /proc/modules | awk '{print \$NF}'" 499*053f45beSAndroid Build Coastguard Worker} 500*053f45beSAndroid Build Coastguard Worker 501*053f45beSAndroid Build Coastguard Workerkmod_test_0013() 502*053f45beSAndroid Build Coastguard Worker{ 503*053f45beSAndroid Build Coastguard Worker kmod_check_visibility '/sys/module/*/sections/*' \ 504*053f45beSAndroid Build Coastguard Worker "cat /sys/module/${DEFAULT_KMOD_DRIVER}/sections/.*text | head -n1" 505*053f45beSAndroid Build Coastguard Worker} 506*053f45beSAndroid Build Coastguard Worker 507*053f45beSAndroid Build Coastguard Workerlist_tests() 508*053f45beSAndroid Build Coastguard Worker{ 509*053f45beSAndroid Build Coastguard Worker echo "Test ID list:" 510*053f45beSAndroid Build Coastguard Worker echo 511*053f45beSAndroid Build Coastguard Worker echo "TEST_ID x NUM_TEST" 512*053f45beSAndroid Build Coastguard Worker echo "TEST_ID: Test ID" 513*053f45beSAndroid Build Coastguard Worker echo "NUM_TESTS: Number of recommended times to run the test" 514*053f45beSAndroid Build Coastguard Worker echo 515*053f45beSAndroid Build Coastguard Worker echo "0001 x $(get_test_count 0001) - Simple test - 1 thread for empty string" 516*053f45beSAndroid Build Coastguard Worker echo "0002 x $(get_test_count 0002) - Simple test - 1 thread for modules/filesystems that do not exist" 517*053f45beSAndroid Build Coastguard Worker echo "0003 x $(get_test_count 0003) - Simple test - 1 thread for get_fs_type() only" 518*053f45beSAndroid Build Coastguard Worker echo "0004 x $(get_test_count 0004) - Simple test - 2 threads for get_fs_type() only" 519*053f45beSAndroid Build Coastguard Worker echo "0005 x $(get_test_count 0005) - multithreaded tests with default setup - request_module() only" 520*053f45beSAndroid Build Coastguard Worker echo "0006 x $(get_test_count 0006) - multithreaded tests with default setup - get_fs_type() only" 521*053f45beSAndroid Build Coastguard Worker echo "0007 x $(get_test_count 0007) - multithreaded tests with default setup test request_module() and get_fs_type()" 522*053f45beSAndroid Build Coastguard Worker echo "0008 x $(get_test_count 0008) - multithreaded - push kmod_concurrent over max_modprobes for request_module()" 523*053f45beSAndroid Build Coastguard Worker echo "0009 x $(get_test_count 0009) - multithreaded - push kmod_concurrent over max_modprobes for get_fs_type()" 524*053f45beSAndroid Build Coastguard Worker echo "0010 x $(get_test_count 0010) - test nonexistent modprobe path" 525*053f45beSAndroid Build Coastguard Worker echo "0011 x $(get_test_count 0011) - test completely disabling module autoloading" 526*053f45beSAndroid Build Coastguard Worker echo "0012 x $(get_test_count 0012) - test /proc/modules address visibility under CAP_SYSLOG" 527*053f45beSAndroid Build Coastguard Worker echo "0013 x $(get_test_count 0013) - test /sys/module/*/sections/* visibility under CAP_SYSLOG" 528*053f45beSAndroid Build Coastguard Worker} 529*053f45beSAndroid Build Coastguard Worker 530*053f45beSAndroid Build Coastguard Workerusage() 531*053f45beSAndroid Build Coastguard Worker{ 532*053f45beSAndroid Build Coastguard Worker NUM_TESTS=$(grep -o ' ' <<<"$ALL_TESTS" | grep -c .) 533*053f45beSAndroid Build Coastguard Worker let NUM_TESTS=$NUM_TESTS+1 534*053f45beSAndroid Build Coastguard Worker MAX_TEST=$(printf "%04d\n" $NUM_TESTS) 535*053f45beSAndroid Build Coastguard Worker echo "Usage: $0 [ -t <4-number-digit> ] | [ -w <4-number-digit> ] |" 536*053f45beSAndroid Build Coastguard Worker echo " [ -s <4-number-digit> ] | [ -c <4-number-digit> <test- count>" 537*053f45beSAndroid Build Coastguard Worker echo " [ all ] [ -h | --help ] [ -l ]" 538*053f45beSAndroid Build Coastguard Worker echo "" 539*053f45beSAndroid Build Coastguard Worker echo "Valid tests: 0001-$MAX_TEST" 540*053f45beSAndroid Build Coastguard Worker echo "" 541*053f45beSAndroid Build Coastguard Worker echo " all Runs all tests (default)" 542*053f45beSAndroid Build Coastguard Worker echo " -t Run test ID the number amount of times is recommended" 543*053f45beSAndroid Build Coastguard Worker echo " -w Watch test ID run until it runs into an error" 544*053f45beSAndroid Build Coastguard Worker echo " -s Run test ID once" 545*053f45beSAndroid Build Coastguard Worker echo " -c Run test ID x test-count number of times" 546*053f45beSAndroid Build Coastguard Worker echo " -l List all test ID list" 547*053f45beSAndroid Build Coastguard Worker echo " -h|--help Help" 548*053f45beSAndroid Build Coastguard Worker echo 549*053f45beSAndroid Build Coastguard Worker echo "If an error every occurs execution will immediately terminate." 550*053f45beSAndroid Build Coastguard Worker echo "If you are adding a new test try using -w <test-ID> first to" 551*053f45beSAndroid Build Coastguard Worker echo "make sure the test passes a series of tests." 552*053f45beSAndroid Build Coastguard Worker echo 553*053f45beSAndroid Build Coastguard Worker echo Example uses: 554*053f45beSAndroid Build Coastguard Worker echo 555*053f45beSAndroid Build Coastguard Worker echo "${TEST_NAME}.sh -- executes all tests" 556*053f45beSAndroid Build Coastguard Worker echo "${TEST_NAME}.sh -t 0008 -- Executes test ID 0008 number of times is recommended" 557*053f45beSAndroid Build Coastguard Worker echo "${TEST_NAME}.sh -w 0008 -- Watch test ID 0008 run until an error occurs" 558*053f45beSAndroid Build Coastguard Worker echo "${TEST_NAME}.sh -s 0008 -- Run test ID 0008 once" 559*053f45beSAndroid Build Coastguard Worker echo "${TEST_NAME}.sh -c 0008 3 -- Run test ID 0008 three times" 560*053f45beSAndroid Build Coastguard Worker echo 561*053f45beSAndroid Build Coastguard Worker list_tests 562*053f45beSAndroid Build Coastguard Worker exit 1 563*053f45beSAndroid Build Coastguard Worker} 564*053f45beSAndroid Build Coastguard Worker 565*053f45beSAndroid Build Coastguard Workerfunction test_num() 566*053f45beSAndroid Build Coastguard Worker{ 567*053f45beSAndroid Build Coastguard Worker re='^[0-9]+$' 568*053f45beSAndroid Build Coastguard Worker if ! [[ $1 =~ $re ]]; then 569*053f45beSAndroid Build Coastguard Worker usage 570*053f45beSAndroid Build Coastguard Worker fi 571*053f45beSAndroid Build Coastguard Worker} 572*053f45beSAndroid Build Coastguard Worker 573*053f45beSAndroid Build Coastguard Workerfunction get_test_data() 574*053f45beSAndroid Build Coastguard Worker{ 575*053f45beSAndroid Build Coastguard Worker test_num $1 576*053f45beSAndroid Build Coastguard Worker local field_num=$(echo $1 | sed 's/^0*//') 577*053f45beSAndroid Build Coastguard Worker echo $ALL_TESTS | awk '{print $'$field_num'}' 578*053f45beSAndroid Build Coastguard Worker} 579*053f45beSAndroid Build Coastguard Worker 580*053f45beSAndroid Build Coastguard Workerfunction get_test_count() 581*053f45beSAndroid Build Coastguard Worker{ 582*053f45beSAndroid Build Coastguard Worker TEST_DATA=$(get_test_data $1) 583*053f45beSAndroid Build Coastguard Worker LAST_TWO=${TEST_DATA#*:*} 584*053f45beSAndroid Build Coastguard Worker echo ${LAST_TWO%:*} 585*053f45beSAndroid Build Coastguard Worker} 586*053f45beSAndroid Build Coastguard Worker 587*053f45beSAndroid Build Coastguard Workerfunction get_test_enabled() 588*053f45beSAndroid Build Coastguard Worker{ 589*053f45beSAndroid Build Coastguard Worker TEST_DATA=$(get_test_data $1) 590*053f45beSAndroid Build Coastguard Worker echo ${TEST_DATA#*:*:} 591*053f45beSAndroid Build Coastguard Worker} 592*053f45beSAndroid Build Coastguard Worker 593*053f45beSAndroid Build Coastguard Workerfunction run_all_tests() 594*053f45beSAndroid Build Coastguard Worker{ 595*053f45beSAndroid Build Coastguard Worker for i in $ALL_TESTS ; do 596*053f45beSAndroid Build Coastguard Worker TEST_ID=${i%:*:*} 597*053f45beSAndroid Build Coastguard Worker ENABLED=$(get_test_enabled $TEST_ID) 598*053f45beSAndroid Build Coastguard Worker TEST_COUNT=$(get_test_count $TEST_ID) 599*053f45beSAndroid Build Coastguard Worker if [[ $ENABLED -eq "1" ]]; then 600*053f45beSAndroid Build Coastguard Worker test_case $TEST_ID $TEST_COUNT 601*053f45beSAndroid Build Coastguard Worker fi 602*053f45beSAndroid Build Coastguard Worker done 603*053f45beSAndroid Build Coastguard Worker} 604*053f45beSAndroid Build Coastguard Worker 605*053f45beSAndroid Build Coastguard Workerfunction watch_log() 606*053f45beSAndroid Build Coastguard Worker{ 607*053f45beSAndroid Build Coastguard Worker if [ $# -ne 3 ]; then 608*053f45beSAndroid Build Coastguard Worker clear 609*053f45beSAndroid Build Coastguard Worker fi 610*053f45beSAndroid Build Coastguard Worker date 611*053f45beSAndroid Build Coastguard Worker echo "Running test: $2 - run #$1" 612*053f45beSAndroid Build Coastguard Worker} 613*053f45beSAndroid Build Coastguard Worker 614*053f45beSAndroid Build Coastguard Workerfunction watch_case() 615*053f45beSAndroid Build Coastguard Worker{ 616*053f45beSAndroid Build Coastguard Worker i=0 617*053f45beSAndroid Build Coastguard Worker while [ 1 ]; do 618*053f45beSAndroid Build Coastguard Worker 619*053f45beSAndroid Build Coastguard Worker if [ $# -eq 1 ]; then 620*053f45beSAndroid Build Coastguard Worker test_num $1 621*053f45beSAndroid Build Coastguard Worker watch_log $i ${TEST_NAME}_test_$1 622*053f45beSAndroid Build Coastguard Worker ${TEST_NAME}_test_$1 623*053f45beSAndroid Build Coastguard Worker else 624*053f45beSAndroid Build Coastguard Worker watch_log $i all 625*053f45beSAndroid Build Coastguard Worker run_all_tests 626*053f45beSAndroid Build Coastguard Worker fi 627*053f45beSAndroid Build Coastguard Worker let i=$i+1 628*053f45beSAndroid Build Coastguard Worker done 629*053f45beSAndroid Build Coastguard Worker} 630*053f45beSAndroid Build Coastguard Worker 631*053f45beSAndroid Build Coastguard Workerfunction test_case() 632*053f45beSAndroid Build Coastguard Worker{ 633*053f45beSAndroid Build Coastguard Worker NUM_TESTS=$DEFAULT_NUM_TESTS 634*053f45beSAndroid Build Coastguard Worker if [ $# -eq 2 ]; then 635*053f45beSAndroid Build Coastguard Worker NUM_TESTS=$2 636*053f45beSAndroid Build Coastguard Worker fi 637*053f45beSAndroid Build Coastguard Worker 638*053f45beSAndroid Build Coastguard Worker i=0 639*053f45beSAndroid Build Coastguard Worker while [ $i -lt $NUM_TESTS ]; do 640*053f45beSAndroid Build Coastguard Worker test_num $1 641*053f45beSAndroid Build Coastguard Worker watch_log $i ${TEST_NAME}_test_$1 noclear 642*053f45beSAndroid Build Coastguard Worker RUN_TEST=${TEST_NAME}_test_$1 643*053f45beSAndroid Build Coastguard Worker $RUN_TEST 644*053f45beSAndroid Build Coastguard Worker let i=$i+1 645*053f45beSAndroid Build Coastguard Worker done 646*053f45beSAndroid Build Coastguard Worker} 647*053f45beSAndroid Build Coastguard Worker 648*053f45beSAndroid Build Coastguard Workerfunction parse_args() 649*053f45beSAndroid Build Coastguard Worker{ 650*053f45beSAndroid Build Coastguard Worker if [ $# -eq 0 ]; then 651*053f45beSAndroid Build Coastguard Worker run_all_tests 652*053f45beSAndroid Build Coastguard Worker else 653*053f45beSAndroid Build Coastguard Worker if [[ "$1" = "all" ]]; then 654*053f45beSAndroid Build Coastguard Worker run_all_tests 655*053f45beSAndroid Build Coastguard Worker elif [[ "$1" = "-w" ]]; then 656*053f45beSAndroid Build Coastguard Worker shift 657*053f45beSAndroid Build Coastguard Worker watch_case $@ 658*053f45beSAndroid Build Coastguard Worker elif [[ "$1" = "-t" ]]; then 659*053f45beSAndroid Build Coastguard Worker shift 660*053f45beSAndroid Build Coastguard Worker test_num $1 661*053f45beSAndroid Build Coastguard Worker test_case $1 $(get_test_count $1) 662*053f45beSAndroid Build Coastguard Worker elif [[ "$1" = "-c" ]]; then 663*053f45beSAndroid Build Coastguard Worker shift 664*053f45beSAndroid Build Coastguard Worker test_num $1 665*053f45beSAndroid Build Coastguard Worker test_num $2 666*053f45beSAndroid Build Coastguard Worker test_case $1 $2 667*053f45beSAndroid Build Coastguard Worker elif [[ "$1" = "-s" ]]; then 668*053f45beSAndroid Build Coastguard Worker shift 669*053f45beSAndroid Build Coastguard Worker test_case $1 1 670*053f45beSAndroid Build Coastguard Worker elif [[ "$1" = "-l" ]]; then 671*053f45beSAndroid Build Coastguard Worker list_tests 672*053f45beSAndroid Build Coastguard Worker elif [[ "$1" = "-h" || "$1" = "--help" ]]; then 673*053f45beSAndroid Build Coastguard Worker usage 674*053f45beSAndroid Build Coastguard Worker else 675*053f45beSAndroid Build Coastguard Worker usage 676*053f45beSAndroid Build Coastguard Worker fi 677*053f45beSAndroid Build Coastguard Worker fi 678*053f45beSAndroid Build Coastguard Worker} 679*053f45beSAndroid Build Coastguard Worker 680*053f45beSAndroid Build Coastguard Workertest_reqs 681*053f45beSAndroid Build Coastguard Workerallow_user_defaults 682*053f45beSAndroid Build Coastguard Workerload_req_mod 683*053f45beSAndroid Build Coastguard Worker 684*053f45beSAndroid Build Coastguard WorkerMODPROBE=$(</proc/sys/kernel/modprobe) 685*053f45beSAndroid Build Coastguard Workertrap "test_finish" EXIT 686*053f45beSAndroid Build Coastguard Worker 687*053f45beSAndroid Build Coastguard Workerparse_args $@ 688*053f45beSAndroid Build Coastguard Worker 689*053f45beSAndroid Build Coastguard Workerexit 0 690