#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#

#
# Copyright (c) 2017 by Lawrence Livermore National Security, LLC.
# Use is subject to license terms.
#
# Copyright (c) 2020 by Delphix. All rights reserved.
#

. $STF_SUITE/include/libtest.shlib
. $STF_SUITE/tests/functional/events/events.cfg

#
# wait for 'event' to show up in the log 'file'
function file_wait_event # file event timeout
{
	file=$1
	event=$2
	timeout=${3:-120}

	SECONDS=0

	until grep -q "^ZEVENT_CLASS=$event" $ZED_DEBUG_LOG ; do
		if [[ $SECONDS -gt $timeout ]]; then
			echo file_wait_event exceeded $SECONDS seconds
			return 1
		fi

		sleep 1
	done

	return 0;
}

#
# Wait for up to 'timeout' seconds for the 'file' to settle, i.e.
# not be updated for a period of 'delay' seconds.
#
function file_wait # file delay timeout
{
	file=$1
	delay=${2:-3}
	timeout=${3:-120}

	SECONDS=0

	while [ $(( $(date +%s) - $(stat -c %Y $file) )) -lt $delay ]; do
		if [[ $SECONDS -gt $timeout ]]; then
			echo file_wait exceeded $SECONDS seconds
			return 1
		fi

		sleep 1
	done

	return 0;
}

function run_and_verify
{
	typeset event pool
	set -A events

	while getopts "e:p:" opt; do
		case $opt in
		e)
			events+=("$OPTARG")
			;;
		p)
			pool=$OPTARG
			;;
		esac
	done
	shift $(($OPTIND - 1))

	pool=${pool:-$TESTPOOL}
	fullcmd="$1"
	cmd=$(echo $fullcmd | awk '{print $1}')

	# If we aren't running zpool or zfs, something is wrong
	[[ $cmd == "zpool" || $cmd == "zfs" ]] || \
	    log_fail "run_and_verify called with \"$cmd ($fullcmd)\""

	log_note "Checking events for command: '$fullcmd'"

	# Remove any previous events from the logs.
	log_must zpool events -c
	log_must truncate -s 0 $ZED_DEBUG_LOG

	# Run the command as provided.
	log_must eval "$fullcmd"

	# Collect the new events and verify there are some.
	log_must zpool sync -f
	log_must eval "zpool events >$TMP_EVENTS 2>/dev/null"
	log_must eval "zpool events -v > $TMP_EVENTS_FULL 2>/dev/null"

	log_must test -s $TMP_EVENTS
	log_must test -s $TMP_EVENTS_FULL

	# If the only event is history then we don't observe zed debug log
	if [[ "${events[0]}" != "sysevent.fs.zfs.history_event" ]]; then
		# wait for all the non-history events to show up in the
		# debug log, all-debug.sh filters history events.
		for event in ${events[*]}; do
			if [[ "$event" == \
			    "sysevent.fs.zfs.history_event" ]]; then
				continue
			fi

			log_must file_wait_event $ZED_DEBUG_LOG "$event"
		done

		log_must cp $ZED_DEBUG_LOG $TMP_EVENTS_ZED
		log_must test -s $TMP_EVENTS_ZED

		log_note "Events logged:"
		grep "^ZEVENT_CLASS" $TMP_EVENTS_ZED
	fi

	log_note "Events generated:"
	cat $TMP_EVENTS

	# Verify all the expected events appear in the log.
	for event in ${events[*]}; do

		# Verify the event is in in the short output.
		log_must grep -q "$event" $TMP_EVENTS

		# Verify the event is in the verbose output with pool name.
		awk -v event="$event" \
		    'BEGIN{FS="\n"; RS=""} $0 ~ event { print $0 }' \
		    $TMP_EVENTS_FULL >$TMP_EVENT_FULL
		log_must grep -q "pool = \"$pool\"" $TMP_EVENT_FULL

		# all-debug.sh filters history events (seen in ZED_DEBUG_LOG)
		if [[ "$event" == "sysevent.fs.zfs.history_event" ]]; then
			continue
		fi

		# Verify the event was received by the ZED and logged.
		awk -v event="$event" \
		    'BEGIN{FS="\n"; RS=""} $0 ~ event { print $0 }' \
		    $TMP_EVENTS_ZED >$TMP_EVENT_ZED
		log_must grep -q "^ZEVENT_POOL=$pool" $TMP_EVENT_ZED
	done

	rm -f $TMP_EVENTS $TMP_EVENTS_FULL $TMP_EVENT_FULL \
	    $TMP_EVENTS_ZED $TMP_EVENT_ZED
}
