From: Masami Hiramatsu (Google) <[email protected]>

Add a new ftracetest test case (filter-syntax-check.tc) to verify valid
event filter expressions, error_log caret reporting for malformed filter
expressions (empty filters, missing fields, unbalanced parentheses and
quotes, dangling logical operators, invalid fields/values/cpulists),
newline truncation on multi-line filter input, and error returns on
invalid subsystem filters.

Signed-off-by: Masami Hiramatsu (Google) <[email protected]>
---
 .../ftrace/test.d/filter/filter-syntax-check.tc    |   52 ++++++++++++++++++++
 1 file changed, 52 insertions(+)
 create mode 100644 
tools/testing/selftests/ftrace/test.d/filter/filter-syntax-check.tc

diff --git 
a/tools/testing/selftests/ftrace/test.d/filter/filter-syntax-check.tc 
b/tools/testing/selftests/ftrace/test.d/filter/filter-syntax-check.tc
new file mode 100644
index 000000000000..68c8accc5ffd
--- /dev/null
+++ b/tools/testing/selftests/ftrace/test.d/filter/filter-syntax-check.tc
@@ -0,0 +1,52 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0
+# description: event filter - test filter syntax error check
+# requires: set_event events/sched/sched_switch/filter error_log
+# flags: instance
+
+check_error() { # command-with-error-pos-by-^
+    ftrace_errlog_check 'event filter parse error' "$1" 
'events/sched/sched_switch/filter'
+}
+
+# Valid filter expressions
+echo '(common_pid == 0)' > events/sched/sched_switch/filter
+echo '((common_pid == 0) && (prev_pid == 0))' > 
events/sched/sched_switch/filter
+echo 'prev_comm ~ "*sh"' > events/sched/sched_switch/filter
+echo 'common_pid == CPUS{0}' > events/sched/sched_switch/filter
+echo 'common_pid != CPUS{0}' > events/sched/sched_switch/filter
+echo 0 > events/sched/sched_switch/filter
+
+# Empty or meaningless filter expressions
+check_error '^()'                                              # NO_FILTER
+check_error '=^= 1'                                            # INVALID_FILTER
+
+# Unbalanced parentheses and quotes
+check_error '^(common_pid == 1'                                        # 
TOO_MANY_OPEN
+check_error 'common_pid == 1^)'                                        # 
TOO_MANY_CLOSE
+check_error 'prev_comm == ^"bash'                              # MISSING_QUOTE
+
+# Dangling logical operators
+check_error 'common_pid == 1 &&^'                              # TOO_MANY_PREDS
+check_error 'common_pid == 1 ||^'                              # TOO_MANY_PREDS
+check_error 'common_pid == 1 || (common_pid == 2 && )^'                # 
INVALID_FILTER
+
+# Invalid field, operator, or operand value
+check_error 'no_such_field ^== 1'                              # 
FIELD_NOT_FOUND
+check_error 'common_pid == @^'                                 # INVALID_VALUE
+check_error 'common_pid == CPUS0}^'                            # 
MISSING_BRACE_OPEN
+check_error 'common_pid == CPUS{}^'                            # 
INVALID_CPULIST
+
+# Multi-line input must be truncated at the first newline
+echo > error_log
+! ( printf "common_pid == CPUS{0\n\"} && common_pid == 0 && common_pid == 
CPUS{0\n\"}" | \
+    dd of=events/sched/sched_switch/filter bs=4096 ) 2> /dev/null
+grep -q "Missing '}'" error_log
+! grep -q "Missing matching quote" error_log
+
+# Subsystem filter must fail on invalid filter expressions
+echo 'common_pid >= 0' > events/sched/filter
+! echo 'no_such_field == 1' > events/sched/filter
+! echo 'common_pid == 1 &&' > events/sched/filter
+echo 0 > events/sched/filter
+
+exit 0


Reply via email to