On 07/06/2019 14:15, Vladimir Oltean wrote: > On Mon, 3 Jun 2019 at 15:25, Ido Schimmel <ido...@idosch.org> wrote: >> >> From: Shalom Toledo <shal...@mellanox.com> >> >> Test the PTP Physical Hardware Clock functionality using the "phc_ctl" (a >> part of "linuxptp"). >> >> The test contains three sub-tests: >> * "settime" test >> * "adjtime" test >> * "adjfreq" test >> >> "settime" test: >> * set the PHC time to 0 seconds. >> * wait for 120.5 seconds. >> * check if PHC time equal to 120.XX seconds. >> >> "adjtime" test: >> * set the PHC time to 0 seconds. >> * adjust the time by 10 seconds. >> * check if PHC time equal to 10.XX seconds. >> >> "adjfreq" test: >> * adjust the PHC frequency to be 1% faster. >> * set the PHC time to 0 seconds. >> * wait for 100.5 seconds. >> * check if PHC time equal to 101.XX seconds. >> >> Usage: >> $ ./phc.sh /dev/ptp<X> >> >> It is possible to run a subset of the tests, for example: >> * To run only the "settime" test: >> $ TESTS="settime" ./phc.sh /dev/ptp<X> >> >> Signed-off-by: Shalom Toledo <shal...@mellanox.com> >> Reviewed-by: Petr Machata <pe...@mellanox.com> >> Signed-off-by: Ido Schimmel <ido...@mellanox.com> >> --- >> tools/testing/selftests/ptp/phc.sh | 166 +++++++++++++++++++++++++++++ >> 1 file changed, 166 insertions(+) >> create mode 100755 tools/testing/selftests/ptp/phc.sh >> >> diff --git a/tools/testing/selftests/ptp/phc.sh >> b/tools/testing/selftests/ptp/phc.sh >> new file mode 100755 >> index 000000000000..ac6e5a6e1d3a >> --- /dev/null >> +++ b/tools/testing/selftests/ptp/phc.sh >> @@ -0,0 +1,166 @@ >> +#!/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 >> -- >> 2.20.1 >> > > Cool testing framework, thanks! > Some things to consider: > - Why the .5 in the wait commands?
To make sure the clock get to the expected time. It's been tested on different devices. > - I suspect there's a huge margin of inaccuracy that the test is > missing by only looking at the 'seconds' portion of the PHC time after > the adjfreq operation (up to 10^9 - 1 ppb, in the worst case). Correct, but this test does the work. It tests the basic functionality of PHC. I'm just sending a v2 based on Richard comments, feel free to extended this framework. All of us will get benefit from it. > > Tested-by: Vladimir Oltean <olte...@gmail.com> > > Regards, > -Vladimir >