#!/bin/sh # ftracetest - Ftrace test shell scripts # # Copyright (C) Hitachi Ltd., 2014 # Written by Masami Hiramatsu # # Released under the terms of the GPL v2. usage() { # errno [message] [ "$2" ] && echo $2 echo "Usage: ftracetest [options] [testcase(s)] [testcase-directory(s)]" echo " Options:" echo " -h|--help Show help message" echo " -k|--keep Keep passed test logs" echo " -d|--debug Debug mode (trace all shell commands)" exit $1 } errexit() { # message echo "Error: $1" 1>&2 exit 1 } # Ensuring user privilege if [ `id -u` -ne 0 ]; then errexit "this must be run by root user" fi # Utilities absdir() { # file_path (cd `dirname $1`; pwd) } abspath() { echo `absdir $1`/`basename $1` } find_testcases() { #directory echo `find $1 -name \*.tc` } parse_opts() { # opts local OPT_TEST_CASES= local OPT_TEST_DIR= while [ "$1" ]; do case "$1" in --help|-h) usage 0 ;; --keep|-k) KEEP_LOG=1 shift 1 ;; --debug|-d) DEBUG=1 shift 1 ;; *.tc) if [ -f "$1" ]; then OPT_TEST_CASES="$OPT_TEST_CASES `abspath $1`" shift 1 else usage 1 "$1 is not a testcase" fi ;; *) if [ -d "$1" ]; then OPT_TEST_DIR=`abspath $1` OPT_TEST_CASES="$OPT_TEST_CASES `find_testcases $OPT_TEST_DIR`" shift 1 else usage 1 "Invalid option ($1)" fi ;; esac done if [ "$OPT_TEST_CASES" ]; then TEST_CASES=$OPT_TEST_CASES fi } # Parameters DEBUGFS_DIR=`grep debugfs /proc/mounts | cut -f2 -d' '` TRACING_DIR=$DEBUGFS_DIR/tracing TOP_DIR=`absdir $0` TEST_DIR=$TOP_DIR/test.d TEST_CASES=`find_testcases $TEST_DIR` LOG_DIR=$TOP_DIR/logs/`date +%Y%m%d-%H%M%S`/ KEEP_LOG=0 DEBUG=0 # Parse command-line options parse_opts $* [ $DEBUG -ne 0 ] && set -x # Verify parameters if [ -z "$DEBUGFS_DIR" -o ! -d "$TRACING_DIR" ]; then errexit "No ftrace directory found" fi # Preparing logs LOG_FILE=$LOG_DIR/ftracetest.log mkdir -p $LOG_DIR || errexit "Failed to make a log directory: $LOG_DIR" date > $LOG_FILE prlog() { # messages echo "$@" | tee -a $LOG_FILE } catlog() { #file cat $1 | tee -a $LOG_FILE } prlog "=== Ftrace unit tests ===" # Testcase management PASSED_CASES= FAILED_CASES= CASENO=0 testcase() { # testfile CASENO=$((CASENO+1)) prlog -n "[$CASENO]"`grep "^#[ \t]*description:" $1 | cut -f2 -d:` } failed() { prlog " [FAIL]" FAILED_CASES="$FAILED_CASES $CASENO" } passed() { prlog " [PASS]" PASSED_CASES="$PASSED_CASES $CASENO" } # Run one test case run_test() { # testfile local testname=`basename $1` local testlog=`mktemp --tmpdir=$LOG_DIR ${testname}-XXXXXX.log` testcase $1 echo "execute: "$1 > $testlog (cd $TRACING_DIR; set -x ; . $1) >> $testlog 2>&1 ret=$? if [ $ret -ne 0 ]; then failed catlog $testlog else passed [ $KEEP_LOG -eq 0 ] && rm $testlog fi } # Main loop for t in $TEST_CASES; do run_test $t done prlog "" prlog "# of passed: " `echo $PASSED_CASES | wc -w` prlog "# of failed: " `echo $FAILED_CASES | wc -w` test -z "$FAILED_CASES" # if no error, return 0