Patchwork [3,of,5] tests: rework revision branch cache tests

login
register
mail settings
Submitter Mads Kiilerich
Date Jan. 14, 2015, 11:24 p.m.
Message ID <82624926786279b4c2ad.1421277878@localhost.localdomain>
Download mbox | patch
Permalink /patch/7459/
State Accepted
Commit 01426cad66dc1fed88ac67f311923cf9fdc621e5
Headers show

Comments

Mads Kiilerich - Jan. 14, 2015, 11:24 p.m.
# HG changeset patch
# User Mads Kiilerich <madski@unity3d.com>
# Date 1421194526 -3600
#      Wed Jan 14 01:15:26 2015 +0100
# Node ID 82624926786279b4c2ada666151015a82608b0b3
# Parent  2c32e9ed5aa5ee5a1091695d28e745ff1c2d868f
tests: rework revision branch cache tests

The tests that were added with the revision branch cache in 678f53865c68 had
suffered from bit rot in the development iterations. They were no longer that
"good".

Now, the tests are rewritten and reworked to be more readable and maintainable
and relevant for the actual implementation.

This also utilizes the new 'f' helper tool for keeping an eye the cache files.

Patch

diff --git a/tests/test-branches.t b/tests/test-branches.t
--- a/tests/test-branches.t
+++ b/tests/test-branches.t
@@ -520,79 +520,104 @@  template output:
    }
   ]
 
-revision branch name caching implementation
 
-cache creation
-  $ rm .hg/cache/rbc-revs-v1
-  $ hg debugrevspec 'branch("re:a ")'
-  7
-  $ [ -f .hg/cache/rbc-revs-v1 ] || echo no file
-  no file
-recovery from invalid cache file
-  $ echo > .hg/cache/rbc-revs-v1
-  $ hg debugrevspec 'branch("re:a ")'
-  7
-cache update NOT fully written from revset
-  $ "$TESTDIR/md5sum.py" .hg/cache/rbc-revs-v1
-  68b329da9893e34099c7d8ad5cb9c940  .hg/cache/rbc-revs-v1
-recovery from other corruption - extra trailing data
+Tests of revision branch name caching
+
+We rev branch cache is updated automatically. In these tests we use a trick to
+trigger rebuilds. We remove the branch head cache and run 'hg head' to cause a
+rebuild that also will populate the rev branch cache.
+
+revision branch cache is created when building the branch head cache
+  $ rm -rf .hg/cache; hg head a -T '{rev}\n'
+  5
+  $ f --hexdump --size .hg/cache/rbc-*
+  .hg/cache/rbc-names-v1: size=87
+  0000: 64 65 66 61 75 6c 74 00 61 00 62 00 63 00 61 20 |default.a.b.c.a |
+  0010: 62 72 61 6e 63 68 20 6e 61 6d 65 20 6d 75 63 68 |branch name much|
+  0020: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65 | longer than the|
+  0030: 20 64 65 66 61 75 6c 74 20 6a 75 73 74 69 66 69 | default justifi|
+  0040: 63 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 62 |cation used by b|
+  0050: 72 61 6e 63 68 65 73                            |ranches|
+  .hg/cache/rbc-revs-v1: size=120
+  0000: 19 70 9c 5a 00 00 00 00 dd 6b 44 0d 00 00 00 01 |.p.Z.....kD.....|
+  0010: 88 1f e2 b9 00 00 00 01 ac 22 03 33 00 00 00 02 |.........".3....|
+  0020: ae e3 9c d1 00 00 00 02 d8 cb c6 1d 00 00 00 01 |................|
+  0030: 58 97 36 a2 00 00 00 03 10 ff 58 95 00 00 00 04 |X.6.......X.....|
+  0040: ee bb 94 44 00 00 00 02 5f 40 61 bb 00 00 00 02 |...D...._@a.....|
+  0050: bf be 84 1b 00 00 00 02 d3 f1 63 45 80 00 00 02 |..........cE....|
+  0060: e3 d4 9c 05 80 00 00 02 e2 3b 55 05 00 00 00 02 |.........;U.....|
+  0070: f8 94 c2 56 80 00 00 03                         |...V....|
+recovery from invalid cache revs file with trailing data
   $ echo >> .hg/cache/rbc-revs-v1
-  $ hg debugrevspec 'branch("re:a ")'
-  7
-cache update NOT fully written from revset
-  $ "$TESTDIR/md5sum.py" .hg/cache/rbc-revs-v1
-  e1c06d85ae7b8b032bef47e42e4c08f9  .hg/cache/rbc-revs-v1
-lazy update after commit
-  $ hg tag tag
-  $ "$TESTDIR/md5sum.py" .hg/cache/rbc-revs-v1
-  d0c0166808ee0a1f0e8894915ad363b6  .hg/cache/rbc-revs-v1
-  $ hg debugrevspec 'branch("re:a ")'
-  7
-  $ "$TESTDIR/md5sum.py" .hg/cache/rbc-revs-v1
-  d0c0166808ee0a1f0e8894915ad363b6  .hg/cache/rbc-revs-v1
-update after rollback - cache keeps stripped revs until written for other reasons
+  $ rm -f .hg/cache/branch* && hg head a -T '{rev}\n' --debug
+  5
+  $ f --size .hg/cache/rbc-revs*
+  .hg/cache/rbc-revs-v1: size=120
+recovery from invalid cache file with partial last record
+  $ mv .hg/cache/rbc-revs-v1 .
+  $ f -qDB 119 rbc-revs-v1 > .hg/cache/rbc-revs-v1
+  $ f --size .hg/cache/rbc-revs*
+  .hg/cache/rbc-revs-v1: size=119
+  $ rm -f .hg/cache/branch* && hg head a -T '{rev}\n' --debug
+  5
+  $ f --size .hg/cache/rbc-revs*
+  .hg/cache/rbc-revs-v1: size=120
+recovery from invalid cache file with missing record - no truncation
+  $ mv .hg/cache/rbc-revs-v1 .
+  $ f -qDB 112 rbc-revs-v1 > .hg/cache/rbc-revs-v1
+  $ rm -f .hg/cache/branch* && hg head a -T '{rev}\n' --debug
+  5
+  $ f --size .hg/cache/rbc-revs*
+  .hg/cache/rbc-revs-v1: size=120
+recovery from invalid cache file with some bad records
+  $ mv .hg/cache/rbc-revs-v1 .
+  $ f -qDB 8 rbc-revs-v1 > .hg/cache/rbc-revs-v1
+  $ f --size .hg/cache/rbc-revs*
+  .hg/cache/rbc-revs-v1: size=8
+  $ f -qDB 112 rbc-revs-v1 >> .hg/cache/rbc-revs-v1
+  $ f --size .hg/cache/rbc-revs*
+  .hg/cache/rbc-revs-v1: size=120
+  $ hg log -r 'branch(.)' -T '{rev} '
+  3 4 8 9 10 11 12 13  (no-eol)
+  $ rm -f .hg/cache/branch* && hg head a -T '{rev}\n' --debug
+  5
+  $ f --size --hexdump --bytes=16 .hg/cache/rbc-revs*
+  .hg/cache/rbc-revs-v1: size=120
+  0000: 19 70 9c 5a 00 00 00 00 dd 6b 44 0d 00 00 00 01 |.p.Z.....kD.....|
+cache is updated when committing
+  $ hg branch i-will-regret-this
+  marked working directory as branch i-will-regret-this
+  (branches are permanent and global, did you want a bookmark?)
+  $ hg ci -m regrets
+  $ f --size .hg/cache/rbc-*
+  .hg/cache/rbc-names-v1: size=106
+  .hg/cache/rbc-revs-v1: size=128
+update after rollback - the cache will be correct but rbc-names will will still
+contain the branch name even though it no longer is used
   $ hg up -qr '.^'
   $ hg rollback -qf
-  $ "$TESTDIR/md5sum.py" .hg/cache/rbc-revs-v1
-  d8c2acdc229bf942fde1dfdbe8f9d933  .hg/cache/rbc-revs-v1
-  $ hg debugrevspec 'branch("re:a ")'
-  7
-  $ "$TESTDIR/md5sum.py" .hg/cache/rbc-revs-v1
-  d8c2acdc229bf942fde1dfdbe8f9d933  .hg/cache/rbc-revs-v1
-handle history mutations that doesn't change the tip node - this is a problem
-with the cache invalidation scheme used by branchmap
-  $ hg log -r tip+b -T'{rev}:{node|short} {branch}\n'
-  14:f894c25619d3 c
-  13:e23b5505d1ad b
-  $ hg bundle -q --all bu.hg
-  $ hg --config extensions.strip= strip --no-b -qr -1:
-  $ hg up -q tip
-  $ hg branch
-  b
-  $ hg branch -q hacked
-  $ hg ci --amend -qm 'hacked'
-  $ hg pull -q bu.hg -r f894c25619d3
-  $ hg log -r tip+b -T'{rev}:{node|short} {branch}\n'
-  14:f894c25619d3 c
-  12:e3d49c0575d8 b
-  $ hg debugrevspec 'branch("hacked")'
-  13
-  $ "$TESTDIR/md5sum.py" .hg/cache/rbc-revs-v1
-  22424d7e106c894336d9d705b0241bc5  .hg/cache/rbc-revs-v1
-cleanup, restore old state
-  $ hg --config extensions.strip= strip --no-b -qr -2:
-  $ hg pull -q bu.hg
-  $ rm bu.hg
-  $ hg up -qr tip
-  $ hg log -r tip -T'{rev}:{node|short}\n'
-  14:f894c25619d3
-the cache file do not go back to the old state - it still contains the
-now unused 'hacked' branch name)
-  $ hg debugrevspec 'branch("re:a ")'
-  7
-  $ "$TESTDIR/md5sum.py" .hg/cache/rbc-revs-v1
-  d8c2acdc229bf942fde1dfdbe8f9d933  .hg/cache/rbc-revs-v1
-  $ cat .hg/cache/rbc-names-v1
-  default\x00a\x00b\x00c\x00a branch name much longer than the default justification used by branches\x00hacked (no-eol) (esc)
+  $ f --size --hexdump .hg/cache/rbc-*
+  .hg/cache/rbc-names-v1: size=106
+  0000: 64 65 66 61 75 6c 74 00 61 00 62 00 63 00 61 20 |default.a.b.c.a |
+  0010: 62 72 61 6e 63 68 20 6e 61 6d 65 20 6d 75 63 68 |branch name much|
+  0020: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65 | longer than the|
+  0030: 20 64 65 66 61 75 6c 74 20 6a 75 73 74 69 66 69 | default justifi|
+  0040: 63 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 62 |cation used by b|
+  0050: 72 61 6e 63 68 65 73 00 69 2d 77 69 6c 6c 2d 72 |ranches.i-will-r|
+  0060: 65 67 72 65 74 2d 74 68 69 73                   |egret-this|
+  .hg/cache/rbc-revs-v1: size=120
+  0000: 19 70 9c 5a 00 00 00 00 dd 6b 44 0d 00 00 00 01 |.p.Z.....kD.....|
+  0010: 88 1f e2 b9 00 00 00 01 ac 22 03 33 00 00 00 02 |.........".3....|
+  0020: ae e3 9c d1 00 00 00 02 d8 cb c6 1d 00 00 00 01 |................|
+  0030: 58 97 36 a2 00 00 00 03 10 ff 58 95 00 00 00 04 |X.6.......X.....|
+  0040: ee bb 94 44 00 00 00 02 5f 40 61 bb 00 00 00 02 |...D...._@a.....|
+  0050: bf be 84 1b 00 00 00 02 d3 f1 63 45 80 00 00 02 |..........cE....|
+  0060: e3 d4 9c 05 80 00 00 02 e2 3b 55 05 00 00 00 02 |.........;U.....|
+  0070: f8 94 c2 56 80 00 00 03                         |...V....|
+cache is updated/truncated when stripping - it is thus very hard to get in a
+situation where the cache is out of sync and the hash check detects it
+  $ hg --config extensions.strip= strip -r tip --nob
+  $ f --size .hg/cache/rbc-revs*
+  .hg/cache/rbc-revs-v1: size=112
 
   $ cd ..