1#!/bin/sh 2 3# ftracetest - Ftrace test shell scripts 4# 5# Copyright (C) Hitachi Ltd., 2014 6# Written by Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> 7# 8# Released under the terms of the GPL v2. 9 10usage() { # errno [message] 11[ "$2" ] && echo $2 12echo "Usage: ftracetest [options] [testcase(s)] [testcase-directory(s)]" 13echo " Options:" 14echo " -h|--help Show help message" 15echo " -k|--keep Keep passed test logs" 16echo " -d|--debug Debug mode (trace all shell commands)" 17exit $1 18} 19 20errexit() { # message 21 echo "Error: $1" 1>&2 22 exit 1 23} 24 25# Ensuring user privilege 26if [ `id -u` -ne 0 ]; then 27 errexit "this must be run by root user" 28fi 29 30# Utilities 31absdir() { # file_path 32 (cd `dirname $1`; pwd) 33} 34 35abspath() { 36 echo `absdir $1`/`basename $1` 37} 38 39find_testcases() { #directory 40 echo `find $1 -name \*.tc` 41} 42 43parse_opts() { # opts 44 local OPT_TEST_CASES= 45 local OPT_TEST_DIR= 46 47 while [ "$1" ]; do 48 case "$1" in 49 --help|-h) 50 usage 0 51 ;; 52 --keep|-k) 53 KEEP_LOG=1 54 shift 1 55 ;; 56 --debug|-d) 57 DEBUG=1 58 shift 1 59 ;; 60 *.tc) 61 if [ -f "$1" ]; then 62 OPT_TEST_CASES="$OPT_TEST_CASES `abspath $1`" 63 shift 1 64 else 65 usage 1 "$1 is not a testcase" 66 fi 67 ;; 68 *) 69 if [ -d "$1" ]; then 70 OPT_TEST_DIR=`abspath $1` 71 OPT_TEST_CASES="$OPT_TEST_CASES `find_testcases $OPT_TEST_DIR`" 72 shift 1 73 else 74 usage 1 "Invalid option ($1)" 75 fi 76 ;; 77 esac 78 done 79 if [ "$OPT_TEST_CASES" ]; then 80 TEST_CASES=$OPT_TEST_CASES 81 fi 82} 83 84# Parameters 85DEBUGFS_DIR=`grep debugfs /proc/mounts | cut -f2 -d' '` 86TRACING_DIR=$DEBUGFS_DIR/tracing 87TOP_DIR=`absdir $0` 88TEST_DIR=$TOP_DIR/test.d 89TEST_CASES=`find_testcases $TEST_DIR` 90LOG_DIR=$TOP_DIR/logs/`date +%Y%m%d-%H%M%S`/ 91KEEP_LOG=0 92DEBUG=0 93# Parse command-line options 94parse_opts $* 95 96[ $DEBUG -ne 0 ] && set -x 97 98# Verify parameters 99if [ -z "$DEBUGFS_DIR" -o ! -d "$TRACING_DIR" ]; then 100 errexit "No ftrace directory found" 101fi 102 103# Preparing logs 104LOG_FILE=$LOG_DIR/ftracetest.log 105mkdir -p $LOG_DIR || errexit "Failed to make a log directory: $LOG_DIR" 106date > $LOG_FILE 107prlog() { # messages 108 echo "$@" | tee -a $LOG_FILE 109} 110catlog() { #file 111 cat $1 | tee -a $LOG_FILE 112} 113prlog "=== Ftrace unit tests ===" 114 115 116# Testcase management 117PASSED_CASES= 118FAILED_CASES= 119CASENO=0 120testcase() { # testfile 121 CASENO=$((CASENO+1)) 122 prlog -n "[$CASENO]"`grep "^#[ \t]*description:" $1 | cut -f2 -d:` 123} 124failed() { 125 prlog " [FAIL]" 126 FAILED_CASES="$FAILED_CASES $CASENO" 127} 128passed() { 129 prlog " [PASS]" 130 PASSED_CASES="$PASSED_CASES $CASENO" 131} 132 133 134# Run one test case 135run_test() { # testfile 136 local testname=`basename $1` 137 local testlog=`mktemp --tmpdir=$LOG_DIR ${testname}-XXXXXX.log` 138 testcase $1 139 echo "execute: "$1 > $testlog 140 (cd $TRACING_DIR; set -x ; . $1) >> $testlog 2>&1 141 ret=$? 142 if [ $ret -ne 0 ]; then 143 failed 144 catlog $testlog 145 else 146 passed 147 [ $KEEP_LOG -eq 0 ] && rm $testlog 148 fi 149} 150 151# Main loop 152for t in $TEST_CASES; do 153 run_test $t 154done 155prlog "" 156prlog "# of passed: " `echo $PASSED_CASES | wc -w` 157prlog "# of failed: " `echo $FAILED_CASES | wc -w` 158 159test -z "$FAILED_CASES" # if no error, return 0 160