| #!/bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| |
| ALL_TESTS=" |
| settime |
| adjtime |
| adjfreq |
| " |
| DEV=$1 |
| |
| ############################################################################## |
| # Sanity checks |
| |
| if [[ "$(id -u)" -ne 0 ]]; then |
| echo "SKIP: need root privileges" |
| exit 0 |
| fi |
| |
| if [[ "$DEV" == "" ]]; then |
| echo "SKIP: PTP device not provided" |
| exit 0 |
| fi |
| |
| require_command() |
| { |
| local cmd=$1; shift |
| |
| if [[ ! -x "$(command -v "$cmd")" ]]; then |
| echo "SKIP: $cmd not installed" |
| exit 1 |
| fi |
| } |
| |
| phc_sanity() |
| { |
| phc_ctl $DEV get &> /dev/null |
| |
| if [ $? != 0 ]; then |
| echo "SKIP: unknown clock $DEV: No such device" |
| exit 1 |
| fi |
| } |
| |
| require_command phc_ctl |
| phc_sanity |
| |
| ############################################################################## |
| # Helpers |
| |
| # Exit status to return at the end. Set in case one of the tests fails. |
| EXIT_STATUS=0 |
| # Per-test return value. Clear at the beginning of each test. |
| RET=0 |
| |
| check_err() |
| { |
| local err=$1 |
| |
| if [[ $RET -eq 0 && $err -ne 0 ]]; then |
| RET=$err |
| fi |
| } |
| |
| log_test() |
| { |
| local test_name=$1 |
| |
| if [[ $RET -ne 0 ]]; then |
| EXIT_STATUS=1 |
| printf "TEST: %-60s [FAIL]\n" "$test_name" |
| return 1 |
| fi |
| |
| printf "TEST: %-60s [ OK ]\n" "$test_name" |
| return 0 |
| } |
| |
| tests_run() |
| { |
| local current_test |
| |
| for current_test in ${TESTS:-$ALL_TESTS}; do |
| $current_test |
| done |
| } |
| |
| ############################################################################## |
| # Tests |
| |
| settime_do() |
| { |
| local res |
| |
| res=$(phc_ctl $DEV set 0 wait 120.5 get 2> /dev/null \ |
| | awk '/clock time is/{print $5}' \ |
| | awk -F. '{print $1}') |
| |
| (( res == 120 )) |
| } |
| |
| adjtime_do() |
| { |
| local res |
| |
| res=$(phc_ctl $DEV set 0 adj 10 get 2> /dev/null \ |
| | awk '/clock time is/{print $5}' \ |
| | awk -F. '{print $1}') |
| |
| (( res == 10 )) |
| } |
| |
| adjfreq_do() |
| { |
| local res |
| |
| # Set the clock to be 1% faster |
| res=$(phc_ctl $DEV freq 10000000 set 0 wait 100.5 get 2> /dev/null \ |
| | awk '/clock time is/{print $5}' \ |
| | awk -F. '{print $1}') |
| |
| (( res == 101 )) |
| } |
| |
| ############################################################################## |
| |
| cleanup() |
| { |
| phc_ctl $DEV freq 0.0 &> /dev/null |
| phc_ctl $DEV set &> /dev/null |
| } |
| |
| settime() |
| { |
| RET=0 |
| |
| settime_do |
| check_err $? |
| log_test "settime" |
| cleanup |
| } |
| |
| adjtime() |
| { |
| RET=0 |
| |
| adjtime_do |
| check_err $? |
| log_test "adjtime" |
| cleanup |
| } |
| |
| adjfreq() |
| { |
| RET=0 |
| |
| adjfreq_do |
| check_err $? |
| log_test "adjfreq" |
| cleanup |
| } |
| |
| trap cleanup EXIT |
| |
| tests_run |
| |
| exit $EXIT_STATUS |