# SPDX-License-Identifier: CDDL-1.0
#
# 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 https://opensource.org/licenses/CDDL-1.0.
# 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 2008 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#

#
# Copyright (c) 2013, 2016 by Delphix. All rights reserved.
#

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

function setup
{
	log_must rm -rf $VDIR $VDIR2
	log_must mkdir -p $VDIR $VDIR2
	log_must truncate -s $MINVDEVSIZE $VDEV $SDEV $LDEV $VDEV2 $SDEV2 $LDEV2

	return 0
}

function cleanup
{
	poolexists $TESTPOOL && destroy_pool $TESTPOOL
	poolexists $TESTPOOL2 && destroy_pool $TESTPOOL2
	rm -rf $TESTDIR $VDIR $VDIR2
}

#
# Try zpool status/iostat for given pool
#
# $1 pool
#
function display_status
{
	typeset pool=$1

	typeset -i ret=0
	zpool status -xv $pool > /dev/null 2>&1
	ret=$?

	zpool iostat > /dev/null 2>&1
	((ret |= $?))

	typeset mntpnt=$(get_prop mountpoint $pool)
	dd if=/dev/urandom of=$mntpnt/testfile.$$ &
	typeset pid=$!

	zpool iostat -v 1 3 > /dev/null
	((ret |= $?))

	kill -9 $pid
	wait

	return $ret
}

#
# Verify the give slog device have correct type and status
#
# $1 pool name
# $2 device name
# $3 device status
# $4 device type
#
function verify_slog_device
{
	typeset pool=$1
	typeset device=$2
	typeset status=$3
	typeset type=$4

	if [[ -z $pool || -z $device || -z $status ]]; then
		log_fail "Usage: verify_slog_device <pool> <device> " \
			"<status> [type]"
	fi

	#
	# Get all the slog devices and status table like below
	#
	# mirror:/disks/d ONLINE mirror:/disks/e ONLINE stripe:/disks/f ONLINE
	#
	set -A dev_stat_tab $(zpool status -v $pool | awk 'BEGIN {start=0} \
				/\tlogs/ {start=1}
				/\tmirror/ || /\tspares/ || /^$/ {start=0}
				(start==1) && /\t  (\/|[a-zA-Z])/ \
					{print "stripe:" $1 " " $2}
				(start==1) && /\t    (\/|[a-zA-Z])/ \
					{print "mirror:" $1 " " $2}
				# When hotspare is replacing
				(start==1) && /\t      (\/|[a-zA-Z])/ \
					{print "mirror:" $1 " " $2}'
			     )

	typeset -i i=0
	typeset find=0
	while (( i < ${#dev_stat_tab[@]} )); do
		typeset dev=${dev_stat_tab[$i]}
		typeset stat=${dev_stat_tab[((i+1))]}

		case $dev in
			stripe:$device)
				if [[ "$type" == 'mirror' ]]; then
					log_note "Unexpected type: mirror"
					return 1
				else
					if [[ $stat != $status ]]; then
						log_note "Status($stat) " \
							"!= Expected stat($status)"
						return 1
					fi
					return 0
				fi
				;;
			mirror:$device)
				if [[ -z "$type" || $type == 'stripe' ]]; then
					log_note "Unexpected type: stripe"
					return 1
				else
					if [[ $stat != $status ]]; then
						log_note "Status($stat) " \
							"!= Expected stat($status)"
						return 1
					fi
					return 0
				fi
				;;
		esac

		((i += 2))
	done

	log_note "Can not find device: $device"

	return 1
}
