From: Steven McDonald Subject: patch: regress: Work around glitchy clocks in vmm guests To: gameoftrees@openbsd.org Date: Sun, 29 Sep 2019 00:33:13 +0200 Some tests fail intermittently in vmm because the clock does not advance between steps, resulting in files that should have a newer mtime than the repo metadata but don't. Example failure: test_status_shows_local_mods_after_update --- /tmp/got-test-status_shows_local_mods_after_update-duAj87aL/stdout.expected Sun Sep 29 00:18:36 2019 +++ /tmp/got-test-status_shows_local_mods_after_update-duAj87aL/stdout Sun Sep 29 00:18:36 2019 @@ -1 +0,0 @@ -M numbers test failed; leaving test data in /tmp/got-test-status_shows_local_mods_after_update-duAj87aL Comparing the mtime on the 'numbers' file with that in .got/file-index shows that the timestamps are identical, which is why got does not treat this file as modified. This intermittent behaviour can be observed outside the context of got (here, x is a small program that just calls stat(2) on foo and displays the mtime): $ echo a >foo; ./x; echo b >foo; ./x 1569708831.911759175 1569708831.931539267 $ echo a >foo; ./x; echo b >foo; ./x 1569708832.741842903 1569708832.741842903 This is unlikely to be a problem in real-world usage because humans aren't as fast as these regression tests, so I think working around it in the tests is sufficient. The below diff makes this work consistently; sleeping for a nanosecond is sufficient because we just need the clock to advance by any amount at all. Better suggestions/OKs? diff --git a/regress/cmdline/commit.sh b/regress/cmdline/commit.sh index 55340c7..3413152 100755 --- a/regress/cmdline/commit.sh +++ b/regress/cmdline/commit.sh @@ -262,6 +262,7 @@ function test_commit_rejects_conflicted_file { git_show_head $testroot/repo >> $testroot/stdout.expected echo >> $testroot/stdout.expected + sleep 0.000000001 # vmm clock workaround (cd $testroot/wt && got update > $testroot/stdout) cmp -s $testroot/stdout.expected $testroot/stdout diff --git a/regress/cmdline/diff.sh b/regress/cmdline/diff.sh index 455469c..2036892 100755 --- a/regress/cmdline/diff.sh +++ b/regress/cmdline/diff.sh @@ -121,6 +121,7 @@ function test_diff_shows_conflict { echo -n "Updated to commit $head_rev" >> $testroot/stdout.expected echo >> $testroot/stdout.expected + sleep 0.000000001 # vmm clock workaround (cd $testroot/wt && got update > $testroot/stdout) cmp -s $testroot/stdout.expected $testroot/stdout diff --git a/regress/cmdline/stage.sh b/regress/cmdline/stage.sh index c847136..703285f 100755 --- a/regress/cmdline/stage.sh +++ b/regress/cmdline/stage.sh @@ -253,6 +253,7 @@ function test_stage_conflict { git_show_head $testroot/repo >> $testroot/stdout.expected echo >> $testroot/stdout.expected + sleep 0.000000001 # vmm clock workaround (cd $testroot/wt && got update > $testroot/stdout) cmp -s $testroot/stdout.expected $testroot/stdout @@ -1241,6 +1242,7 @@ function test_stage_commit_out_of_date { fi (cd $testroot/wt && got unstage > /dev/null) + sleep 0.000000001 # vmm clock workaround (cd $testroot/wt && got update > $testroot/stdout) ret="$?" if [ "$ret" != "0" ]; then @@ -1306,6 +1308,7 @@ function test_stage_commit { echo "modified file" > $testroot/wt/alpha (cd $testroot/wt && got stage alpha beta foo > /dev/null) + sleep 0.000000001 # vmm clock workaround echo "modified file again" > $testroot/wt/alpha echo "new file changed" > $testroot/wt/foo echo "non-staged change" > $testroot/wt/gamma/delta diff --git a/regress/cmdline/status.sh b/regress/cmdline/status.sh index 5fde224..c8ed4a7 100755 --- a/regress/cmdline/status.sh +++ b/regress/cmdline/status.sh @@ -188,6 +188,7 @@ function test_status_shows_local_mods_after_update { git_show_head $testroot/repo >> $testroot/stdout.expected echo >> $testroot/stdout.expected + sleep 0.000000001 # vmm clock workaround (cd $testroot/wt && got update > $testroot/stdout) cmp -s $testroot/stdout.expected $testroot/stdout @@ -319,6 +320,7 @@ function test_status_shows_no_mods_after_complete_merge { git_show_head $testroot/repo >> $testroot/stdout.expected echo >> $testroot/stdout.expected + sleep 0.000000001 # vmm clock workaround (cd $testroot/wt && got update > $testroot/stdout) cmp -s $testroot/stdout.expected $testroot/stdout @@ -373,6 +375,7 @@ function test_status_shows_conflict { git_show_head $testroot/repo >> $testroot/stdout.expected echo >> $testroot/stdout.expected + sleep 0.000000001 # vmm clock workaround (cd $testroot/wt && got update > $testroot/stdout) cmp -s $testroot/stdout.expected $testroot/stdout