test-racy-mutations.t
125 lines
| 3.8 KiB
| text/troff
|
Tads3Lexer
/ tests / test-racy-mutations.t
Kyle Lippincott
|
r47349 | #testcases skip-detection fail-if-detected | ||
Test situations that "should" only be reproducible: | ||||
- on networked filesystems, or | ||||
- user using `hg debuglocks` to eliminate the lock file, or | ||||
- something (that doesn't respect the lock file) writing to the .hg directory | ||||
while we're running | ||||
r50886 | ||||
Initial setup | ||||
------------- | ||||
$ hg init base-repo | ||||
$ cd base-repo | ||||
Kyle Lippincott
|
r47349 | |||
r49923 | $ cat > "$TESTTMP_FORWARD_SLASH/waitlock_editor.sh" <<EOF | |||
Kyle Lippincott
|
r47349 | > [ -n "\${WAITLOCK_ANNOUNCE:-}" ] && touch "\${WAITLOCK_ANNOUNCE}" | ||
> f="\${WAITLOCK_FILE}" | ||||
> start=\`date +%s\` | ||||
> timeout=5 | ||||
r49923 | > "$RUNTESTDIR_FORWARD_SLASH/testlib/wait-on-file" "\$timeout" "\$f" | |||
Kyle Lippincott
|
r47349 | > if [ \$# -gt 1 ]; then | ||
> cat "\$@" | ||||
> fi | ||||
> EOF | ||||
Things behave differently if we don't already have a 00changelog.i file when | ||||
this all starts, so let's make one. | ||||
$ echo r0 > r0 | ||||
$ hg commit -qAm 'r0' | ||||
r50886 | $ 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 | ||||
----------- | ||||
Kyle Lippincott
|
r47349 | Start an hg commit that will take a while | ||
r50886 | ||||
$ cd main-client | ||||
Kyle Lippincott
|
r47349 | |||
#if fail-if-detected | ||||
r50886 | $ cat >> $HGRCPATH << EOF | |||
Kyle Lippincott
|
r47349 | > [debug] | ||
> revlog.verifyposition.changelog = fail | ||||
> EOF | ||||
#endif | ||||
$ echo foo > foo | ||||
r50886 | $ ( | |||
> 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}" | ||||
> ) & | ||||
Kyle Lippincott
|
r47349 | |||
Wait for the "editor" to actually start | ||||
r49923 | $ sh "$RUNTESTDIR_FORWARD_SLASH/testlib/wait-on-file" 5 "${EDITOR_STARTED}" | |||
r49922 | ||||
Kyle Lippincott
|
r47349 | |||
r50886 | Do a concurrent edition | |||
$ cd ../racing-client | ||||
$ touch ../pre-race | ||||
$ sleep 1 | ||||
Kyle Lippincott
|
r47349 | $ echo bar > bar | ||
r50886 | $ hg --repository ../racing-client commit -qAm 'r2 (bar)' bar | |||
$ hg --repository ../racing-client debugrevlogindex -c | ||||
Kyle Lippincott
|
r47349 | rev linkrev nodeid p1 p2 | ||
0 0 222799e2f90b 000000000000 000000000000 | ||||
1 1 6f124f6007a0 222799e2f90b 000000000000 | ||||
r50886 | 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 | ||||
Kyle Lippincott
|
r47349 | Awaken the editor from that first commit | ||
$ touch "${MISCHIEF_MANAGED}" | ||||
And wait for it to finish | ||||
r49923 | $ WAITLOCK_FILE="${JOBS_FINISHED}" sh "$TESTTMP_FORWARD_SLASH/waitlock_editor.sh" | |||
Kyle Lippincott
|
r47349 | |||
#if skip-detection | ||||
(Ensure there was no output) | ||||
$ cat .foo_commit_out | ||||
And observe a corrupted repository -- rev 2's linkrev is 1, which should never | ||||
happen for the changelog (the linkrev should always refer to itself). | ||||
$ hg debugrevlogindex -c | ||||
rev linkrev nodeid p1 p2 | ||||
0 0 222799e2f90b 000000000000 000000000000 | ||||
1 1 6f124f6007a0 222799e2f90b 000000000000 | ||||
2 1 ac80e6205bb2 222799e2f90b 000000000000 | ||||
#endif | ||||
#if fail-if-detected | ||||
$ cat .foo_commit_out | ||||
r50924 | note: commit message saved in .hg/last-message.txt | |||
note: use 'hg commit --logfile .hg/last-message.txt --edit' to reuse it | ||||
Kyle Lippincott
|
r47349 | transaction abort! | ||
rollback completed | ||||
abort: 00changelog.i: file cursor at position 249, expected 121 | ||||
And no corruption in the changelog. | ||||
$ hg debugrevlogindex -c | ||||
rev linkrev nodeid p1 p2 | ||||
0 0 222799e2f90b 000000000000 000000000000 | ||||
r47988 | 1 1 6f124f6007a0 222799e2f90b 000000000000 (missing-correct-output !) | |||
Kyle Lippincott
|
r47349 | And, because of transactions, there's none in the manifestlog either. | ||
$ hg debugrevlogindex -m | ||||
rev linkrev nodeid p1 p2 | ||||
0 0 7b7020262a56 000000000000 000000000000 | ||||
1 1 ad3fe36d86d9 7b7020262a56 000000000000 | ||||
#endif | ||||