Skip to content

Commit

Permalink
ftracetest: Initial commit for ftracetest
Browse files Browse the repository at this point in the history
ftracetest is a collection of testcase shell-scripts for ftrace.
To avoid regressions of ftrace, these testcases check correct
ftrace behaviors. If someone would like to add any features on
ftrace, the patch series should have at least one testcase for
checking the new behavior.

Link: http://lkml.kernel.org/p/20140922234250.23415.68758.stgit@kbuild-f20.novalocal

Acked-by: Shuah Khan <shuahkh@osg.samsung.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
  • Loading branch information
Masami Hiramatsu authored and Steven Rostedt committed Sep 23, 2014
1 parent 0f33be0 commit 6e68e6c
Show file tree
Hide file tree
Showing 6 changed files with 217 additions and 0 deletions.
1 change: 1 addition & 0 deletions MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -9310,6 +9310,7 @@ F: include/*/ftrace.h
F: include/linux/trace*.h
F: include/trace/
F: kernel/trace/
F: tools/testing/selftests/ftrace/

TRIVIAL PATCHES
M: Jiri Kosina <trivial@kernel.org>
Expand Down
1 change: 1 addition & 0 deletions tools/testing/selftests/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ TARGETS += powerpc
TARGETS += user
TARGETS += sysctl
TARGETS += firmware
TARGETS += ftrace

TARGETS_HOTPLUG = cpu-hotplug
TARGETS_HOTPLUG += memory-hotplug
Expand Down
7 changes: 7 additions & 0 deletions tools/testing/selftests/ftrace/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
all:

run_tests:
@/bin/sh ./ftracetest || echo "ftrace selftests: [FAIL]"

clean:
rm -rf logs/*
45 changes: 45 additions & 0 deletions tools/testing/selftests/ftrace/README
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
Linux Ftrace Testcases

This is a collection of testcases for ftrace tracing feature in the Linux
kernel. Since ftrace exports interfaces via the debugfs, we just need
shell scripts for testing. Feel free to add new test cases.

Running the ftrace testcases
============================

At first, you need to be the root user to run this script.
To run all testcases:

$ sudo ./ftracetest

To run specific testcases:

# ./ftracetest test.d/basic3.tc

Or you can also run testcases under given directory:

# ./ftracetest test.d/kprobe/

Contributing new testcases
==========================

Copy test.d/template to your testcase (whose filename must have *.tc
extension) and rewrite the test description line.

* The working directory of the script is <debugfs>/tracing/.

* Take care with side effects as the tests are run with root privilege.

* The tests should not run for a long period of time (more than 1 min.)
These are to be unit tests.

* You can add a directory for your testcases under test.d/ if needed.

* The test cases should run on dash (busybox shell) for testing on
minimal cross-build environments.

TODO
====

* Fancy colored output :)

159 changes: 159 additions & 0 deletions tools/testing/selftests/ftrace/ftracetest
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
#!/bin/sh

# ftracetest - Ftrace test shell scripts
#
# Copyright (C) Hitachi Ltd., 2014
# Written by Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
#
# 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
4 changes: 4 additions & 0 deletions tools/testing/selftests/ftrace/test.d/template
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/bin/sh
# description: %HERE DESCRIBE WHAT THIS DOES%
# you have to add ".tc" extention for your testcase file
exit 0 # Return 0 if the test is passed, otherwise return !0

0 comments on commit 6e68e6c

Please sign in to comment.