dirstate: add append/new-file variants in the dirstate's read race tests stable
authorPierre-Yves David <pierre-yves.david@octobus.net>
Mon, 27 Feb 2023 03:14:30 +0100
branchstable
changeset 50235 385977432227
parent 50234 2be6d5782728
child 50236 53f196622699
dirstate: add append/new-file variants in the dirstate's read race tests This covers more ground and finds more bugs. At that point I gave up on making things as `known-bad-output` / `missing-correct-output` as this gets too messy.
tests/test-dirstate-read-race.t
--- a/tests/test-dirstate-read-race.t	Tue Dec 13 14:51:36 2022 +0100
+++ b/tests/test-dirstate-read-race.t	Mon Feb 27 03:14:30 2023 +0100
@@ -3,6 +3,7 @@
 ==============================================================================
 
 #testcases dirstate-v1 dirstate-v2-append dirstate-v2-rewrite
+#testcases pre-all-read pre-some-read
 
 Some commands, like `hg status`, do not need to take the wlock but need to
 access dirstate data.
@@ -46,6 +47,17 @@
   $ d2args="--config devel.dirstate.v2.data_update_mode=force-append"
 #endif
 
+
+#if dirstate-v1
+  $ cfg="devel.sync.dirstate.pre-read-file"
+#else
+#if pre-all-read
+  $ cfg="devel.sync.dirstate.pre-read-file"
+#else
+  $ cfg="devel.sync.dirstate.post-docket-read-file"
+#endif
+#endif
+
   $ directories="dir dir/nested dir2"
   $ first_files="dir/nested/a dir/b dir/c dir/d dir2/e f"
   $ second_files="g dir/nested/h dir/i dir/j dir2/k dir2/l dir/nested/m"
@@ -134,7 +146,7 @@
 
   $ hg st >$TESTTMP/status-race-lock.out 2>$TESTTMP/status-race-lock.log \
   > --config rhg.on-unsupported=abort \
-  > --config devel.sync.dirstate.pre-read-file=$TESTTMP/status-race-lock \
+  > --config ${cfg}=$TESTTMP/status-race-lock \
   > &
   $ $RUNTESTDIR/testlib/wait-on-file 5 $TESTTMP/status-race-lock.waiting
 
@@ -165,6 +177,7 @@
   $ cat $TESTTMP/status-race-lock.log
 #else
 #if rhg
+#if pre-all-read
   $ cat $TESTTMP/status-race-lock.out
   A dir/n
   A dir/o
@@ -173,12 +186,34 @@
   ? q
   $ cat $TESTTMP/status-race-lock.log
 #else
+#if dirstate-v2-append
+  $ cat $TESTTMP/status-race-lock.out
+  A dir/o
+  R dir/nested/m
+  ? dir/n
+  ? p
+  ? q
+  $ cat $TESTTMP/status-race-lock.log
+#else
+  $ cat $TESTTMP/status-race-lock.out
+  $ cat $TESTTMP/status-race-lock.log
+  abort: dirstate-v2 parse error: not enough bytes on disk
+#endif
+#endif
+#else
 #if rust
 #if dirstate-v2-rewrite
   $ cat $TESTTMP/status-race-lock.out
   $ cat $TESTTMP/status-race-lock.log
   abort: $ENOENT$: '$TESTTMP/race-with-add/.hg/dirstate.* (glob)
 #else
+  $ cat $TESTTMP/status-race-lock.out
+  A dir/o
+  R dir/nested/m
+  ? dir/n
+  ? p
+  ? q
+  $ cat $TESTTMP/status-race-lock.log
 #endif
 #else
   $ cat $TESTTMP/status-race-lock.out
@@ -203,7 +238,7 @@
 
   $ hg st >$TESTTMP/status-race-lock.out 2>$TESTTMP/status-race-lock.log \
   > --config rhg.on-unsupported=abort \
-  > --config devel.sync.dirstate.pre-read-file=$TESTTMP/status-race-lock \
+  > --config ${cfg}=$TESTTMP/status-race-lock \
   > &
   $ $RUNTESTDIR/testlib/wait-on-file 5 $TESTTMP/status-race-lock.waiting
 
@@ -245,18 +280,41 @@
   warning: ignoring unknown working parent 02a67a77ee9b! (no-rhg !)
 #else
 #if rhg
+#if pre-all-read
   $ cat $TESTTMP/status-race-lock.out
   ? dir/n
   ? p
   ? q
   $ cat $TESTTMP/status-race-lock.log
 #else
+#if dirstate-v2-append
+  $ cat $TESTTMP/status-race-lock.out
+  A dir/o
+  R dir/nested/m
+  ? dir/n
+  ? p
+  ? q
+  $ cat $TESTTMP/status-race-lock.log
+#else
+  $ cat $TESTTMP/status-race-lock.out
+  $ cat $TESTTMP/status-race-lock.log
+  abort: dirstate-v2 parse error: not enough bytes on disk
+#endif
+#endif
+#else
 #if rust
 #if dirstate-v2-rewrite
   $ cat $TESTTMP/status-race-lock.out
   $ cat $TESTTMP/status-race-lock.log
   abort: $ENOENT$: '$TESTTMP/race-with-commit/.hg/dirstate.* (glob)
 #else
+  $ cat $TESTTMP/status-race-lock.out
+  A dir/o
+  R dir/nested/m
+  ? dir/n
+  ? p
+  ? q
+  $ cat $TESTTMP/status-race-lock.log
 #endif
 #else
   $ cat $TESTTMP/status-race-lock.out
@@ -281,7 +339,7 @@
 
   $ hg st >$TESTTMP/status-race-lock.out 2>$TESTTMP/status-race-lock.log \
   > --config rhg.on-unsupported=abort \
-  > --config devel.sync.dirstate.pre-read-file=$TESTTMP/status-race-lock \
+  > --config ${cfg}=$TESTTMP/status-race-lock \
   > &
   $ $RUNTESTDIR/testlib/wait-on-file 5 $TESTTMP/status-race-lock.waiting
 do an update
@@ -301,6 +359,25 @@
   0 files updated, 0 files merged, 6 files removed, 0 files unresolved
   $ touch $TESTTMP/status-race-lock
   $ wait
+#if rhg dirstate-v2-append pre-some-read
+  $ hg log -GT '{node|short} {desc}\n'
+  @  9a86dcbfb938 more files to have two commit
+  |
+  o  4f23db756b09 recreate a bunch of files to facilitate dirstate-v2 append
+  
+  $ hg status
+  A dir/o
+  R dir/nested/m
+  ! dir/i
+  ! dir/j
+  ! dir/nested/h
+  ! dir2/k
+  ! dir2/l
+  ! g
+  ? dir/n
+  ? p
+  ? q
+#else
   $ hg log -GT '{node|short} {desc}\n'
   o  9a86dcbfb938 more files to have two commit
   |
@@ -311,6 +388,7 @@
   ? dir/n
   ? p
   ? q
+#endif
 
 The status process should return a consistent result and not crash.
 
@@ -323,6 +401,7 @@
   $ cat $TESTTMP/status-race-lock.log
 #else
 #if rhg
+#if pre-all-read
   $ cat $TESTTMP/status-race-lock.out
   A dir/o
   ? dir/n
@@ -330,12 +409,46 @@
   ? q
   $ cat $TESTTMP/status-race-lock.log
 #else
+#if dirstate-v2-append
+  $ cat $TESTTMP/status-race-lock.out
+  A dir/o
+  R dir/nested/m
+  ! dir/i
+  ! dir/j
+  ! dir/nested/h
+  ! dir2/k
+  ! dir2/l
+  ! g
+  ? dir/n
+  ? p
+  ? q
+  $ cat $TESTTMP/status-race-lock.log
+#else
+  $ cat $TESTTMP/status-race-lock.out
+  $ cat $TESTTMP/status-race-lock.log
+  abort: dirstate-v2 parse error: not enough bytes on disk
+#endif
+#endif
+#else
 #if rust
 #if dirstate-v2-rewrite
   $ cat $TESTTMP/status-race-lock.out
   $ cat $TESTTMP/status-race-lock.log
   abort: $ENOENT$: '$TESTTMP/race-with-update/.hg/dirstate.* (glob)
 #else
+  $ cat $TESTTMP/status-race-lock.out
+  A dir/o
+  R dir/nested/m
+  ! dir/i
+  ! dir/j
+  ! dir/nested/h
+  ! dir2/k
+  ! dir2/l
+  ! g
+  ? dir/n
+  ? p
+  ? q
+  $ cat $TESTTMP/status-race-lock.log
 #endif
 #else
   $ cat $TESTTMP/status-race-lock.out
@@ -362,7 +475,7 @@
 
   $ hg st >$TESTTMP/status-race-lock.out 2>$TESTTMP/status-race-lock.log \
   > --config rhg.on-unsupported=abort \
-  > --config devel.sync.dirstate.pre-read-file=$TESTTMP/status-race-lock \
+  > --config ${cfg}=$TESTTMP/status-race-lock \
   > &
   $ $RUNTESTDIR/testlib/wait-on-file 5 $TESTTMP/status-race-lock.waiting
 do an update
@@ -389,6 +502,16 @@
   $ cat $TESTTMP/status-race-lock.log
 #else
 #if rhg
+#if pre-all-read
+  $ cat $TESTTMP/status-race-lock.out
+  A dir/o
+  R dir/nested/m
+  ? dir/n
+  ? p
+  ? q
+  $ cat $TESTTMP/status-race-lock.log
+#else
+#if dirstate-v2-append
   $ cat $TESTTMP/status-race-lock.out
   A dir/o
   R dir/nested/m
@@ -397,12 +520,25 @@
   ? q
   $ cat $TESTTMP/status-race-lock.log
 #else
+  $ cat $TESTTMP/status-race-lock.out
+  $ cat $TESTTMP/status-race-lock.log
+  abort: dirstate-v2 parse error: not enough bytes on disk
+#endif
+#endif
+#else
 #if rust
 #if dirstate-v2-rewrite
   $ cat $TESTTMP/status-race-lock.out
   $ cat $TESTTMP/status-race-lock.log
   abort: $ENOENT$: '$TESTTMP/race-with-status/.hg/dirstate.* (glob)
 #else
+  $ cat $TESTTMP/status-race-lock.out
+  A dir/o
+  R dir/nested/m
+  ? dir/n
+  ? p
+  ? q
+  $ cat $TESTTMP/status-race-lock.log
 #endif
 #else
   $ cat $TESTTMP/status-race-lock.out