#
# Test case for operation when gfsd network interface is down
#
load "gfarm_v2::generate_testdata"
load "gfarm2fs::wait_for_gfsd_connect"

#
# Test parameters
#
# GFARM_HOME:	A directory path of Gfarm which this test will be executed
# FILE_SIZE:	Size of a file to be created
#
setup_operation_in_gfsd_ifdown()
{
	# default parameter
	GFARM_HOME=${GFARM_HOME-"/"}
	FILE_SIZE=${FILE_SIZE-"100M"}
	RETRY_COUNT=${RETRY_COUNT-"20"}
	RETRY_INTERVAL=${RETRY_INTERVAL-"30"}

	# miscellaneous parameters
	GFARM_FILE1=$GFARM_HOME/${TEST_EXEC_ID}_1
	GFARM_FILE2=$GFARM_HOME/${TEST_EXEC_ID}_2
	GFARM_FILE3=$GFARM_HOME/${TEST_EXEC_ID}_3
	GFARM_FILE4=$GFARM_HOME/${TEST_EXEC_ID}_4

	# prepare: check whether required hosts are defined
	$GFSERVICE systest::gfarm_v2::check_hostids_defined - "gfmd1 gfsd1 gfsd2 client1"
	[ $? -ne 0 ] && return $RESULT_UNSUPPORTED

	# prepare: wait until gfsd get connected
	wait_for_gfsd_connect gfsd1 client1 $RETRY_COUNT $RETRY_INTERVAL
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: gfsd1 is unavailable"
		return $RESULT_FATAL
	fi

	wait_for_gfsd_connect gfsd2 client1 $RETRY_COUNT $RETRY_INTERVAL
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: gfsd2 is unavailable"
		return $RESULT_FATAL
	fi

	# prepare: make a file
	generate_testdata $FILE_SIZE | $GFSERVICE systest::gfarm_v2::read_and_register \
		client1 $GFARM_FILE1 gfmd1 gfsd1
	generate_testdata $FILE_SIZE | $GFSERVICE systest::gfarm_v2::read_and_register \
		client1 $GFARM_FILE2 gfmd1 gfsd2

	# prepare: make network interface down
	$GFSERVICE systest::gfarm2fs::ifdown gfsd1
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to execute ifdown on gfsd1"
		return $RESULT_FATAL
	fi

	return $RESULT_PASS
}

test_operation_in_gfsd_ifdown()
{
	RESULT=$RESULT_PASS

	# step: write file
	generate_testdata $FILE_SIZE | $GFSERVICE systest::gfarm_v2::read_and_register \
		client1 $GFARM_FILE3 gfmd1 gfsd2
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to make a file on gfsd2"
		set_result RESULT $RESULT_FAIL
	fi

	# step: read file
	$GFSERVICE systest::gfarm2fs::export_file client1 $GFARM_FILE2 gfmd1 > /dev/null
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to read a file on gfsd2"
		set_result RESULT $RESULT_FAIL
	fi

	# step: write file
	generate_testdata $FILE_SIZE | $GFSERVICE systest::gfarm_v2::read_and_register \
		client1 $GFARM_FILE4 gfmd1 gfsd1
	if [ $? -eq 0 ]; then
		log_warn "$TESTNAME: wrote file unexpectedly to gfsd1"
		set_result RESULT $RESULT_XPASS
	fi

	# step: read file
	$GFSERVICE systest::gfarm2fs::export_file client1 $GFARM_FILE1 gfmd1 > /dev/null
	if [ $? -eq 0 ]; then
		log_warn "$TESTNAME: read a file unexpectedly from gfsd1"
		set_result RESULT $RESULT_XPASS
	fi

	return $RESULT
}

teardown_operation_in_gfsd_ifdown()
{
	# cleanup: make network interface up
	$GFSERVICE systest::gfarm2fs::ifup gfsd1

	# cleanup: remove files
	$GFSERVICE gfcmd client1 gfrm -f $GFARM_FILE1 $GFARM_FILE2 \
		$GFARM_FILE3 $GFARM_FILE4

	return $RESULT_PASS
}
