#!/bin/bash
#
# Copyright (C) 2013 Christian Babeux <christian.babeux@efficios.com>
# Copyright (C) 2014, 2016 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
#
# SPDX-License-Identifier: GPL-2.0-only
#

TEST_DESC="Kernel tracer - Rotation destroy flush"

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

NR_ITER=10
NUM_TESTS=$((13*$NR_ITER))
EVENT_NAME="lttng_test_filter_event"
CHANNEL_NAME="testchan"
PAGE_SIZE=$(getconf PAGE_SIZE)
SIZE_LIMIT=$PAGE_SIZE

TESTCMD="echo -n 10000 > /proc/lttng-test-filter-event"

# Ensure the daemons invoke abort on error.
export LTTNG_ABORT_ON_ERROR=1

source $TESTDIR/utils/utils.sh

function signal_cleanup()
{
	diag "*** Exiting ***"
	modprobe --remove lttng-test
	full_cleanup
}

function enable_kernel_lttng_channel_size_limit ()
{
	sess_name="$1"
	channel_name="$2"
	tracefile_size_limit="$3"

	test_name="Enable channel $channel_name "
	test_name+="for session $sess_name: "
	test_name+="$tracefile_size_limit bytes tracefile limit"

	$TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-channel \
	    -k $channel_name -s $sess_name \
	    -C $tracefile_size_limit >/dev/null 2>&1

	ok $? "$test_name"
}

function enable_kernel_lttng_event_per_channel ()
{
	sess_name="$1"
	event_name="$2"
	channel_name="$3"

	test_name="Enable event $event_name "
	test_name+="for session $sess_name "
	test_name+="in channel $channel_name"

	$TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-event "$event_name" \
	    -s $sess_name -k -c $channel_name >/dev/null 2>&1

	ok $? "$test_name"
}

function test_rotation_destroy_flush_single()
{
	start_lttng_sessiond
	modprobe lttng-test

	create_lttng_session_ok $SESSION_NAME $TRACE_PATH
	enable_kernel_lttng_channel_size_limit \
		$SESSION_NAME $CHANNEL_NAME $SIZE_LIMIT
	enable_kernel_lttng_event_per_channel \
		$SESSION_NAME $EVENT_NAME $CHANNEL_NAME
	start_lttng_tracing_ok $SESSION_NAME
	eval ${TESTCMD}
	# stop and destroy
	stop_lttng_tracing_ok $SESSION_NAME
	destroy_lttng_session_ok $SESSION_NAME

	rm -rf $TRACE_PATH

	create_lttng_session_ok $SESSION_NAME $TRACE_PATH
	enable_kernel_lttng_channel_size_limit \
		$SESSION_NAME $CHANNEL_NAME $SIZE_LIMIT
	enable_kernel_lttng_event_per_channel \
		$SESSION_NAME $EVENT_NAME $CHANNEL_NAME
	start_lttng_tracing_ok $SESSION_NAME
	eval ${TESTCMD}
	# destroy only
	destroy_lttng_session_ok $SESSION_NAME

	rm -rf $TRACE_PATH

	modprobe --remove lttng-test
	stop_lttng_sessiond
}

function test_rotation_destroy_flush()
{
	for a in $(seq 1 ${NR_ITER}); do
		diag "Iteration ${a}/${NR_ITER}"
		test_rotation_destroy_flush_single
	done
}

# MUST set TESTDIR before calling those functions
plan_tests $NUM_TESTS

print_test_banner "$TEST_DESC"

TESTS=(
	"test_rotation_destroy_flush"
)

TEST_COUNT=${#TESTS[@]}
i=0

if [ "$(id -u)" == "0" ]; then
	isroot=1
else
	isroot=0
fi

skip $isroot "Root access is needed. Skipping all tests." $NUM_TESTS ||
{
	validate_lttng_modules_present
	trap signal_cleanup SIGTERM SIGINT

	while [ "$i" -lt "$TEST_COUNT" ]; do

		TRACE_PATH=$(mktemp --tmpdir -d -t tmp.test_kernel_rotation_destroy_flush.XXXXXX)

		# Execute test
		${TESTS[$i]}

		let "i++"
	done
}
