From 52d10cf21105e1fa831431c48ecb47495be2a7f7 Mon Sep 17 00:00:00 2001 From: John Hood Date: Fri, 28 Oct 2016 02:01:14 -0400 Subject: [PATCH] Add a test for spinning on no-change screen updates --- src/tests/Makefile.am | 1 + src/tests/e2e-test-server | 7 ++++ src/tests/network-no-diff.test | 60 ++++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+) create mode 100755 src/tests/network-no-diff.test diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am index df3493d..a3b3f6c 100644 --- a/src/tests/Makefile.am +++ b/src/tests/Makefile.am @@ -22,6 +22,7 @@ displaytests = \ emulation-cursor-motion.test \ emulation-multiline-scroll.test \ emulation-wrap-across-frames.test \ + network-no-diff.test \ prediction-unicode.test \ pty-deadlock.test \ repeat.test \ diff --git a/src/tests/e2e-test-server b/src/tests/e2e-test-server index c720ca8..146943d 100755 --- a/src/tests/e2e-test-server +++ b/src/tests/e2e-test-server @@ -29,6 +29,11 @@ fi # run harnessed command eval "$@" testret=$? +# Capture mosh-server runtime if possible. +runtime=$(ps -o time= $PPID 2>/dev/null) +if [ $? -ne 0 ]; then # Cygwin... + runtime=- +fi # Wait for tmux client screen to become up to date. sleep 1 printf "@@@ server complete @@@" >&2 @@ -53,6 +58,8 @@ if ! tmux save-buffer "$testname.capture"; then printf "tmux save-buffer failed, erroring test\n" >&2 exit 99 fi +# Dump runtime into tmux log. +printf "@@@ runtime %s @@@\n" "$runtime" # return useful exitstatus from harnessed command if [ $testret -ne 0 ]; then exit 1 diff --git a/src/tests/network-no-diff.test b/src/tests/network-no-diff.test new file mode 100755 index 0000000..dc17e6b --- /dev/null +++ b/src/tests/network-no-diff.test @@ -0,0 +1,60 @@ +#!/bin/sh + +# +# This is a regression test to ensure that Mosh does not spin +# on updates that do not actually change the framebuffer. +# + +# shellcheck source=e2e-test-subrs +. "$(dirname "$0")/e2e-test-subrs" +PATH=$PATH:.:$srcdir +# Top-level wrapper. +if [ $# -eq 0 ]; then + e2e-test "$0" baseline post + exit +fi + +# OK, we have arguments, we're one of the test hooks. +if [ $# -ne 1 ]; then + fail "bad arguments %s\n" "$@" +fi + +baseline() +{ + # Generate updates that don't change the screen + i=0 + while [ $i -lt 10 ]; do + printf 'x\b' + i=$((i + 1)) + sleep 1 + done +} + +post() +{ + # Extract server run time. + runtime=$(sed -E -n 's/.*@@@ runtime: (.*) @@@.*/\1/p' "$(basename "$0").d/baseline.tmux.log") + + # If this system can't actually report runtime, bail. + if [ -z "$runtime" ] || [ "$runtime" -eq "-" ]; then + exit 0 + fi + + # If we ran for more than one second, fail. + seconds=${runtime##*:} + bigger=${runtime%:*} + onesec=$(echo "$seconds >= 1" | bc) + if [ "$onesec" -eq 1 ] || [ "$bigger" -ne 0 ]; then + exit 1 + fi + exit 0 +} + +case $1 in + baseline) + baseline;; + post) + post;; + *) + fail "unknown test argument %s\n" "$1";; +esac