18c2ecf20Sopenharmony_ci#!/bin/bash
28c2ecf20Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ciALL_TESTS="
58c2ecf20Sopenharmony_ci	settime
68c2ecf20Sopenharmony_ci	adjtime
78c2ecf20Sopenharmony_ci	adjfreq
88c2ecf20Sopenharmony_ci"
98c2ecf20Sopenharmony_ciDEV=$1
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci##############################################################################
128c2ecf20Sopenharmony_ci# Sanity checks
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ciif [[ "$(id -u)" -ne 0 ]]; then
158c2ecf20Sopenharmony_ci	echo "SKIP: need root privileges"
168c2ecf20Sopenharmony_ci	exit 0
178c2ecf20Sopenharmony_cifi
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ciif [[ "$DEV" == "" ]]; then
208c2ecf20Sopenharmony_ci	echo "SKIP: PTP device not provided"
218c2ecf20Sopenharmony_ci	exit 0
228c2ecf20Sopenharmony_cifi
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_cirequire_command()
258c2ecf20Sopenharmony_ci{
268c2ecf20Sopenharmony_ci	local cmd=$1; shift
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci	if [[ ! -x "$(command -v "$cmd")" ]]; then
298c2ecf20Sopenharmony_ci		echo "SKIP: $cmd not installed"
308c2ecf20Sopenharmony_ci		exit 1
318c2ecf20Sopenharmony_ci	fi
328c2ecf20Sopenharmony_ci}
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ciphc_sanity()
358c2ecf20Sopenharmony_ci{
368c2ecf20Sopenharmony_ci	phc_ctl $DEV get &> /dev/null
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci	if [ $? != 0 ]; then
398c2ecf20Sopenharmony_ci		echo "SKIP: unknown clock $DEV: No such device"
408c2ecf20Sopenharmony_ci		exit 1
418c2ecf20Sopenharmony_ci	fi
428c2ecf20Sopenharmony_ci}
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_cirequire_command phc_ctl
458c2ecf20Sopenharmony_ciphc_sanity
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci##############################################################################
488c2ecf20Sopenharmony_ci# Helpers
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci# Exit status to return at the end. Set in case one of the tests fails.
518c2ecf20Sopenharmony_ciEXIT_STATUS=0
528c2ecf20Sopenharmony_ci# Per-test return value. Clear at the beginning of each test.
538c2ecf20Sopenharmony_ciRET=0
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_cicheck_err()
568c2ecf20Sopenharmony_ci{
578c2ecf20Sopenharmony_ci	local err=$1
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_ci	if [[ $RET -eq 0 && $err -ne 0 ]]; then
608c2ecf20Sopenharmony_ci		RET=$err
618c2ecf20Sopenharmony_ci	fi
628c2ecf20Sopenharmony_ci}
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_cilog_test()
658c2ecf20Sopenharmony_ci{
668c2ecf20Sopenharmony_ci	local test_name=$1
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci	if [[ $RET -ne 0 ]]; then
698c2ecf20Sopenharmony_ci		EXIT_STATUS=1
708c2ecf20Sopenharmony_ci		printf "TEST: %-60s  [FAIL]\n" "$test_name"
718c2ecf20Sopenharmony_ci		return 1
728c2ecf20Sopenharmony_ci	fi
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_ci	printf "TEST: %-60s  [ OK ]\n" "$test_name"
758c2ecf20Sopenharmony_ci	return 0
768c2ecf20Sopenharmony_ci}
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_citests_run()
798c2ecf20Sopenharmony_ci{
808c2ecf20Sopenharmony_ci	local current_test
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ci	for current_test in ${TESTS:-$ALL_TESTS}; do
838c2ecf20Sopenharmony_ci		$current_test
848c2ecf20Sopenharmony_ci	done
858c2ecf20Sopenharmony_ci}
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci##############################################################################
888c2ecf20Sopenharmony_ci# Tests
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_cisettime_do()
918c2ecf20Sopenharmony_ci{
928c2ecf20Sopenharmony_ci	local res
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_ci	res=$(phc_ctl $DEV set 0 wait 120.5 get 2> /dev/null \
958c2ecf20Sopenharmony_ci		| awk '/clock time is/{print $5}' \
968c2ecf20Sopenharmony_ci		| awk -F. '{print $1}')
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci	(( res == 120 ))
998c2ecf20Sopenharmony_ci}
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ciadjtime_do()
1028c2ecf20Sopenharmony_ci{
1038c2ecf20Sopenharmony_ci	local res
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_ci	res=$(phc_ctl $DEV set 0 adj 10 get 2> /dev/null \
1068c2ecf20Sopenharmony_ci		| awk '/clock time is/{print $5}' \
1078c2ecf20Sopenharmony_ci		| awk -F. '{print $1}')
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ci	(( res == 10 ))
1108c2ecf20Sopenharmony_ci}
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_ciadjfreq_do()
1138c2ecf20Sopenharmony_ci{
1148c2ecf20Sopenharmony_ci	local res
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_ci	# Set the clock to be 1% faster
1178c2ecf20Sopenharmony_ci	res=$(phc_ctl $DEV freq 10000000 set 0 wait 100.5 get 2> /dev/null \
1188c2ecf20Sopenharmony_ci		| awk '/clock time is/{print $5}' \
1198c2ecf20Sopenharmony_ci		| awk -F. '{print $1}')
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_ci	(( res == 101 ))
1228c2ecf20Sopenharmony_ci}
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_ci##############################################################################
1258c2ecf20Sopenharmony_ci
1268c2ecf20Sopenharmony_cicleanup()
1278c2ecf20Sopenharmony_ci{
1288c2ecf20Sopenharmony_ci	phc_ctl $DEV freq 0.0 &> /dev/null
1298c2ecf20Sopenharmony_ci	phc_ctl $DEV set &> /dev/null
1308c2ecf20Sopenharmony_ci}
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_cisettime()
1338c2ecf20Sopenharmony_ci{
1348c2ecf20Sopenharmony_ci	RET=0
1358c2ecf20Sopenharmony_ci
1368c2ecf20Sopenharmony_ci	settime_do
1378c2ecf20Sopenharmony_ci	check_err $?
1388c2ecf20Sopenharmony_ci	log_test "settime"
1398c2ecf20Sopenharmony_ci	cleanup
1408c2ecf20Sopenharmony_ci}
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_ciadjtime()
1438c2ecf20Sopenharmony_ci{
1448c2ecf20Sopenharmony_ci	RET=0
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_ci	adjtime_do
1478c2ecf20Sopenharmony_ci	check_err $?
1488c2ecf20Sopenharmony_ci	log_test "adjtime"
1498c2ecf20Sopenharmony_ci	cleanup
1508c2ecf20Sopenharmony_ci}
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_ciadjfreq()
1538c2ecf20Sopenharmony_ci{
1548c2ecf20Sopenharmony_ci	RET=0
1558c2ecf20Sopenharmony_ci
1568c2ecf20Sopenharmony_ci	adjfreq_do
1578c2ecf20Sopenharmony_ci	check_err $?
1588c2ecf20Sopenharmony_ci	log_test "adjfreq"
1598c2ecf20Sopenharmony_ci	cleanup
1608c2ecf20Sopenharmony_ci}
1618c2ecf20Sopenharmony_ci
1628c2ecf20Sopenharmony_citrap cleanup EXIT
1638c2ecf20Sopenharmony_ci
1648c2ecf20Sopenharmony_citests_run
1658c2ecf20Sopenharmony_ci
1668c2ecf20Sopenharmony_ciexit $EXIT_STATUS
167