tests/test-racy-mutations.t
changeset 46607 e9901d01d135
child 47065 a12819559ccb
equal deleted inserted replaced
46606:ced66295ea90 46607:e9901d01d135
       
     1 #testcases skip-detection fail-if-detected
       
     2 
       
     3 Test situations that "should" only be reproducible:
       
     4 - on networked filesystems, or
       
     5 - user using `hg debuglocks` to eliminate the lock file, or
       
     6 - something (that doesn't respect the lock file) writing to the .hg directory
       
     7 while we're running
       
     8 
       
     9   $ hg init a
       
    10   $ cd a
       
    11 
       
    12   $ cat > "$TESTTMP/waitlock_editor.sh" <<EOF
       
    13   >     [ -n "\${WAITLOCK_ANNOUNCE:-}" ] && touch "\${WAITLOCK_ANNOUNCE}"
       
    14   >     f="\${WAITLOCK_FILE}"
       
    15   >     start=\`date +%s\`
       
    16   >     timeout=5
       
    17   >     while [ \\( ! -f \$f \\) -a \\( ! -L \$f \\) ]; do
       
    18   >         now=\`date +%s\`
       
    19   >         if [ "\`expr \$now - \$start\`" -gt \$timeout ]; then
       
    20   >             echo "timeout: \$f was not created in \$timeout seconds (it is now \$(date +%s))"
       
    21   >             exit 1
       
    22   >         fi
       
    23   >         sleep 0.1
       
    24   >     done
       
    25   >     if [ \$# -gt 1 ]; then
       
    26   >         cat "\$@"
       
    27   >     fi
       
    28   > EOF
       
    29   $ chmod +x "$TESTTMP/waitlock_editor.sh"
       
    30 
       
    31 Things behave differently if we don't already have a 00changelog.i file when
       
    32 this all starts, so let's make one.
       
    33 
       
    34   $ echo r0 > r0
       
    35   $ hg commit -qAm 'r0'
       
    36 
       
    37 Start an hg commit that will take a while
       
    38   $ EDITOR_STARTED="$(pwd)/.editor_started"
       
    39   $ MISCHIEF_MANAGED="$(pwd)/.mischief_managed"
       
    40   $ JOBS_FINISHED="$(pwd)/.jobs_finished"
       
    41 
       
    42 #if fail-if-detected
       
    43   $ cat >> .hg/hgrc << EOF
       
    44   > [debug]
       
    45   > revlog.verifyposition.changelog = fail
       
    46   > EOF
       
    47 #endif
       
    48 
       
    49   $ echo foo > foo
       
    50   $ (WAITLOCK_ANNOUNCE="${EDITOR_STARTED}" \
       
    51   >      WAITLOCK_FILE="${MISCHIEF_MANAGED}" \
       
    52   >           HGEDITOR="$TESTTMP/waitlock_editor.sh" \
       
    53   >           hg commit -qAm 'r1 (foo)' --edit foo > .foo_commit_out 2>&1 ; touch "${JOBS_FINISHED}") &
       
    54 
       
    55 Wait for the "editor" to actually start
       
    56   $ WAITLOCK_FILE="${EDITOR_STARTED}" "$TESTTMP/waitlock_editor.sh"
       
    57 
       
    58 Break the locks, and make another commit.
       
    59   $ hg debuglocks -LW
       
    60   $ echo bar > bar
       
    61   $ hg commit -qAm 'r2 (bar)' bar
       
    62   $ hg debugrevlogindex -c
       
    63      rev linkrev nodeid       p1           p2
       
    64        0       0 222799e2f90b 000000000000 000000000000
       
    65        1       1 6f124f6007a0 222799e2f90b 000000000000
       
    66 
       
    67 Awaken the editor from that first commit
       
    68   $ touch "${MISCHIEF_MANAGED}"
       
    69 And wait for it to finish
       
    70   $ WAITLOCK_FILE="${JOBS_FINISHED}" "$TESTTMP/waitlock_editor.sh"
       
    71 
       
    72 #if skip-detection
       
    73 (Ensure there was no output)
       
    74   $ cat .foo_commit_out
       
    75 And observe a corrupted repository -- rev 2's linkrev is 1, which should never
       
    76 happen for the changelog (the linkrev should always refer to itself).
       
    77   $ hg debugrevlogindex -c
       
    78      rev linkrev nodeid       p1           p2
       
    79        0       0 222799e2f90b 000000000000 000000000000
       
    80        1       1 6f124f6007a0 222799e2f90b 000000000000
       
    81        2       1 ac80e6205bb2 222799e2f90b 000000000000
       
    82 #endif
       
    83 
       
    84 #if fail-if-detected
       
    85   $ cat .foo_commit_out
       
    86   transaction abort!
       
    87   rollback completed
       
    88   note: commit message saved in .hg/last-message.txt
       
    89   note: use 'hg commit --logfile .hg/last-message.txt --edit' to reuse it
       
    90   abort: 00changelog.i: file cursor at position 249, expected 121
       
    91 And no corruption in the changelog.
       
    92   $ hg debugrevlogindex -c
       
    93      rev linkrev nodeid       p1           p2
       
    94        0       0 222799e2f90b 000000000000 000000000000
       
    95        1       1 6f124f6007a0 222799e2f90b 000000000000
       
    96 And, because of transactions, there's none in the manifestlog either.
       
    97   $ hg debugrevlogindex -m
       
    98      rev linkrev nodeid       p1           p2
       
    99        0       0 7b7020262a56 000000000000 000000000000
       
   100        1       1 ad3fe36d86d9 7b7020262a56 000000000000
       
   101 #endif
       
   102