#!/bin/bash
#
# SPDX-FileCopyrightText: 2012 Christian Babeux <christian.babeux@efficios.com>
# SPDX-FileCopyrightText: 2025 Michael Jeanson <mjeanson@efficios.com>
#
# SPDX-License-Identifier: GPL-2.0-only
#

TEST_DESC="Filtering - Unsupported operators"

CURDIR=$(dirname "$0")
TESTDIR=$CURDIR/../../..

NUM_GLOBAL_TESTS=2
NUM_UST_TESTS=20
NUM_KERNEL_TESTS=20
NUM_TESTS=$(( NUM_UST_TESTS + NUM_KERNEL_TESTS + NUM_GLOBAL_TESTS ))

# shellcheck source-path=SCRIPTDIR/../../..
source "$TESTDIR/utils/utils.sh"

function test_ust_filter_unsupported_op
{
	local test_op_str="$1"
	local test_op_tkn="$2"

	local session_name="filter-unsupported-ops"
	local event_name="bogus"
	local test_filter="intfield $test_op_tkn 1"
	local trace_path
	local file_err_output

	diag "Test UST filter expression with unsupported operator $test_op_str ($test_op_tkn)"

	trace_path=$(mktemp -d -t "tmp.${FUNCNAME[0]}_trace_path.XXXXXX")
	file_err_output=$(mktemp -t "tmp.${FUNCNAME[0]}_err_output.XXXXXX")

	# Create session
	create_lttng_session_ok "$session_name" "$trace_path"

	# Apply filter
	ERROR_OUTPUT_DEST="$file_err_output" enable_ust_lttng_event_fail "$session_name" "$event_name" "" --filter "$test_filter"

	# Test stderr for unsupported operator
	grep -i -q "not[[:space:]]\+supported" "$file_err_output"
	ok $? "Unsupported error reported for: $test_op_str ($test_op_tkn)"

	# Destroy session
	destroy_lttng_session_ok "$session_name"

	rm -rf "$trace_path"
	rm -f "$file_err_output"
}

function test_kernel_filter_unsupported_op
{
	local test_op_str="$1"
	local test_op_tkn="$2"

	local session_name="filter-unsupported-ops"
	local event_name="bogus"
	local test_filter="intfield $test_op_tkn 1"
	local trace_path
	local file_err_output

	diag "Test kernel filter expression with unsupported operator $test_op_str ($test_op_tkn)"

	trace_path=$(mktemp -d -t "tmp.${FUNCNAME[0]}_trace_path.XXXXXX")
	file_err_output=$(mktemp -t "tmp.${FUNCNAME[0]}_err_output.XXXXXX")

	# Create session
	create_lttng_session_ok "$session_name" "$trace_path"

	# Apply filter
	ERROR_OUTPUT_DEST="$file_err_output" enable_kernel_lttng_event_fail "$session_name" "$event_name" "" --filter "$test_filter"

	# Test stderr for unsupported operator
	grep -i -q "not[[:space:]]\+supported" "$file_err_output"
	ok $? "Unsupported error reported for: $test_op_str ($test_op_tkn)"

	# Destroy session
	destroy_lttng_session_ok "$session_name"

	rm -rf "$trace_path"
	rm -f "$file_err_output"
}


plan_tests $NUM_TESTS

print_test_banner "$TEST_DESC"

# Unsupported operators
OP_STR=("MUL" "DIV" "MOD" "PLUS" "MINUS")

OP_TKN=("*" "/" "%" "+" "-")

OP_COUNT=${#OP_STR[@]}

start_lttng_sessiond

diag "Test UST unsupported filter operations"

i=0
while [ "$i" -lt "$OP_COUNT" ]; do
	test_ust_filter_unsupported_op "${OP_STR[$i]}" "${OP_TKN[$i]}"
	(( i++ ))
done

check_skip_kernel_test $NUM_KERNEL_TESTS "Skipping kernel unsupported filter operations tests." ||
{
	diag "Test kernel unsupported filter operations"

	i=0
	while [ "$i" -lt "$OP_COUNT" ]; do
		test_kernel_filter_unsupported_op "${OP_STR[$i]}" "${OP_TKN[$i]}"
		(( i++ ))
	done
}

stop_lttng_sessiond
