From: Wen Yang <[email protected]> When a subdirectory is passed (e.g. an RV monitor's test directory), ftracetest fell back to its own functions file, losing the RV-specific check_requires handling for ':monitor' and ':reactor' requirements.
Walk up from OPT_TEST_DIR until a directory containing test.d/functions is found, stopping after five levels so a stray argument cannot reach an unrelated functions file further up the tree. When no such directory is found the previous default is kept. Note that TOP_DIR also feeds LOG_TOP_DIR, so logs now follow the directory the tests were found in: an RV run writes to verification/logs rather than ftrace/logs. Signed-off-by: Wen Yang <[email protected]> --- tools/testing/selftests/ftrace/ftracetest | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/ftrace/ftracetest b/tools/testing/selftests/ftrace/ftracetest index 0a56bf209f6c..3d3c3a4dfa34 100755 --- a/tools/testing/selftests/ftrace/ftracetest +++ b/tools/testing/selftests/ftrace/ftracetest @@ -159,9 +159,22 @@ parse_opts() { # opts if [ -n "$OPT_TEST_CASES" ]; then TEST_CASES=$OPT_TEST_CASES fi - if [ -n "$OPT_TEST_DIR" -a -f "$OPT_TEST_DIR"/test.d/functions ]; then - TOP_DIR=$OPT_TEST_DIR - TEST_DIR=$TOP_DIR/test.d + if [ -n "$OPT_TEST_DIR" ]; then + # A subdirectory of test.d can be given; walk up to the directory + # holding test.d/functions. The bound keeps a stray directory from + # reaching an unrelated functions file further up the tree. + local dir=$OPT_TEST_DIR + local depth=0 + while [ "$depth" -lt 5 ]; do + if [ -f "$dir/test.d/functions" ]; then + TOP_DIR=$dir + TEST_DIR=$TOP_DIR/test.d + break + fi + case "$dir" in /|//|.) break;; esac + dir=$(dirname "$dir") + depth=$((depth + 1)) + done fi } -- 2.25.1
