changeset 50047:3997c64eff8b

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.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Tue, 07 Feb 2023 13:14:59 +0100
parents ffd19d73518d
children 420fad6bdec5
files tests/test-racy-mutations.t
diffstat 1 files changed, 44 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- 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