test: use a more direct approach to test racy mutation
authorPierre-Yves David <pierre-yves.david@octobus.net>
Tue, 07 Feb 2023 13:14:59 +0100
changeset 50047 3997c64eff8b
parent 50046 ffd19d73518d
child 50048 420fad6bdec5
test: use a more direct approach to test racy mutation The previous test was relying on implementation details and harder to maintain. The new version is closer to the initial intend : "What happens the file get overwritten from under the current process" This change is motivated by further changes around the transaction and dirstate logic that would break the fragile equilibrium that existed before this patch. Making this change early make it easier to review on its own and remove noise in future larger changes.
tests/test-racy-mutations.t
--- a/tests/test-racy-mutations.t	Mon Feb 13 23:56:13 2023 +0100
+++ b/tests/test-racy-mutations.t	Tue Feb 07 13:14:59 2023 +0100
@@ -6,8 +6,12 @@
 - something (that doesn't respect the lock file) writing to the .hg directory
 while we're running
 
-  $ hg init a
-  $ cd a
+
+Initial setup
+-------------
+
+  $ hg init base-repo
+  $ cd base-repo
 
   $ cat > "$TESTTMP_FORWARD_SLASH/waitlock_editor.sh" <<EOF
   >     [ -n "\${WAITLOCK_ANNOUNCE:-}" ] && touch "\${WAITLOCK_ANNOUNCE}"
@@ -26,46 +30,63 @@
   $ echo r0 > r0
   $ hg commit -qAm 'r0'
 
+  $ cd ..
+  $ cp -R base-repo main-client
+  $ cp -R base-repo racing-client
+
+  $ mkdir sync
+  $ EDITOR_STARTED="$TESTTMP_FORWARD_SLASH/sync/.editor_started"
+  $ MISCHIEF_MANAGED="$TESTTMP_FORWARD_SLASH/sync/.mischief_managed"
+  $ JOBS_FINISHED="$TESTTMP_FORWARD_SLASH/sync/.jobs_finished"
+
+Actual test
+-----------
+
 Start an hg commit that will take a while
-  $ EDITOR_STARTED="$TESTTMP_FORWARD_SLASH/a/.editor_started"
-  $ MISCHIEF_MANAGED="$TESTTMP_FORWARD_SLASH/a/.mischief_managed"
-  $ JOBS_FINISHED="$TESTTMP_FORWARD_SLASH/a/.jobs_finished"
+
+  $ cd main-client
 
 #if fail-if-detected
-  $ cat >> .hg/hgrc << EOF
+  $ cat >> $HGRCPATH << EOF
   > [debug]
   > revlog.verifyposition.changelog = fail
   > EOF
 #endif
 
-  $ cat >> .hg/hgrc << EOF
-  > [ui]
-  > editor=sh $TESTTMP_FORWARD_SLASH/waitlock_editor.sh
-  > EOF
-
   $ echo foo > foo
-  $ (unset HGEDITOR;
-  >      WAITLOCK_ANNOUNCE="${EDITOR_STARTED}" \
-  >      WAITLOCK_FILE="${MISCHIEF_MANAGED}" \
-  >           hg commit -qAm 'r1 (foo)' --edit foo > .foo_commit_out 2>&1 ; touch "${JOBS_FINISHED}") &
+  $ (
+  >    unset HGEDITOR;
+  >    WAITLOCK_ANNOUNCE="${EDITOR_STARTED}" \
+  >    WAITLOCK_FILE="${MISCHIEF_MANAGED}" \
+  >    hg commit -qAm 'r1 (foo)' --edit foo \
+  >    --config ui.editor="sh $TESTTMP_FORWARD_SLASH/waitlock_editor.sh" \
+  >    > .foo_commit_out 2>&1 ;\
+  >    touch "${JOBS_FINISHED}"
+  > ) &
 
 Wait for the "editor" to actually start
   $ sh "$RUNTESTDIR_FORWARD_SLASH/testlib/wait-on-file" 5 "${EDITOR_STARTED}"
 
-  $ cat >> .hg/hgrc << EOF
-  > [ui]
-  > editor=
-  > EOF
 
-Break the locks, and make another commit.
-  $ hg debuglocks -LW
+Do a concurrent edition
+  $ cd ../racing-client
+  $ touch ../pre-race
+  $ sleep 1
   $ echo bar > bar
-  $ hg commit -qAm 'r2 (bar)' bar
-  $ hg debugrevlogindex -c
+  $ hg --repository ../racing-client commit -qAm 'r2 (bar)' bar
+  $ hg --repository ../racing-client debugrevlogindex -c
      rev linkrev nodeid       p1           p2
        0       0 222799e2f90b 000000000000 000000000000
        1       1 6f124f6007a0 222799e2f90b 000000000000
 
+We simulate an network FS race by overwriting raced repo content with the new
+content of the files changed in the racing repository
+
+  $ for x in `find . -type f -newer ../pre-race`; do
+  >    cp $x ../main-client/$x
+  > done
+  $ cd ../main-client
+
 Awaken the editor from that first commit
   $ touch "${MISCHIEF_MANAGED}"
 And wait for it to finish