#!/bin/bash

#
# This file is part of the coreboot project.
#
# Copyright (C) 2015 Intel Corporation.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FIMMA_TEST_NAMEESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc.
#

MMA_LOCAL_DATA_STORAGE=/usr/local/mma
#
# format of MMA_AUTOMATED_TEST_CONFIG file is as below
# with 1 or more repeted lines with same format
#
# <testname> <testparam> <#times to run this test>
#
# e.g.
# RMT.efi RMTConfig.bin 2
# Margin1D.efi Margin1DCmdAllConfig.bin 1
#
#
MMA_AUTOMATED_TEST_CONFIG="${MMA_LOCAL_DATA_STORAGE}"/tests
MMA_AUTOMATED_TEST_COUNT="${MMA_LOCAL_DATA_STORAGE}"/count
MMA_SETUP_TEST_TOOL=mma_setup_test.sh
MMA_GET_RESULT_TOOL=mma_get_result.sh
MMA_TEST_RESULTS_PATH="${MMA_LOCAL_DATA_STORAGE}/results$(date +_%y_%m_%d_%H_%M)"
# Clear MMA_TEST_NUMBER just in case it is set in environment
MMA_TEST_NUMBER=

# Set a number of global params based on test number
# MMA_TEST_NUMBER - test number, stored in MMA_AUTOMATED_TEST_COUNT
# MMA_TEST_NAME  - test name
# MMA_TEST_PARAM - test parameter
# MMA_TEST_COUNT - test count, number of times to run the test
# MMA_TEST_RESULT_NAME - filename for result
get_mma_autotest_params() {
	typeset -i i=${MMA_TEST_NUMBER}
	exec 9< "${MMA_AUTOMATED_TEST_CONFIG}"
	while read -u9 MMA_TEST_NAME MMA_TEST_PARAM MMA_TEST_COUNT
	do
		case "${MMA_TEST_NAME}" in
			("#"*|"") continue;; # Allow blank lines and comments
		esac
		: $(( i -= MMA_TEST_COUNT ))
		if (( i <= 0 )) ; then
			printf -v MMA_TEST_RESULT_NAME \
			"${MMA_TEST_NAME%.efi}_${MMA_TEST_PARAM%.bin}_%d.bin" \
				$((MMA_TEST_COUNT+i))
			return
		fi
	done
	${MMA_SETUP_TEST_TOOL} reset
	rm "${MMA_AUTOMATED_TEST_COUNT}"
	mv "${MMA_AUTOMATED_TEST_CONFIG}" "${MMA_TEST_RESULTS_PATH}"
	exit 0
}

main() {
	# sleep 30 sec, before we start. This would give some time if we want
	# to stop automation.
	sleep 30s
	mkdir -p "${MMA_LOCAL_DATA_STORAGE}"
	# Exit is there are no tests
	[ -e "${MMA_AUTOMATED_TEST_CONFIG}" ] || exit 0

	if [ -e "${MMA_AUTOMATED_TEST_COUNT}" ] ; then
		. "${MMA_AUTOMATED_TEST_COUNT}"
	fi

	mkdir -p "${MMA_TEST_RESULTS_PATH}"

	if [ "${MMA_TEST_NUMBER}" ] ; then
		get_mma_autotest_params
		${MMA_GET_RESULT_TOOL} \
			"${MMA_TEST_RESULTS_PATH}"/"${MMA_TEST_RESULT_NAME}"
	fi

	: $(( MMA_TEST_NUMBER += 1 ))
	printf "MMA_TEST_NUMBER=${MMA_TEST_NUMBER}\n" \
			> "${MMA_AUTOMATED_TEST_COUNT}"
	printf "MMA_TEST_RESULTS_PATH=%s" "${MMA_TEST_RESULTS_PATH}" \
			>> "${MMA_AUTOMATED_TEST_COUNT}"
	get_mma_autotest_params
	${MMA_SETUP_TEST_TOOL} set ${MMA_TEST_NAME} ${MMA_TEST_PARAM}

	# sync the filesystem, hoping this would minimize
	# the chances of fs corruption
	sync
	sleep 2s
	sync
	sleep 2s
	sync
	sleep 2s
	ectool reboot_ec
}

main "$@"
