tests: rework revision branch cache tests
authorMads Kiilerich <madski@unity3d.com>
Wed, 14 Jan 2015 01:15:26 +0100
changeset 23861 01426cad66dc
parent 23860 bead0c7b4f68
child 23862 7aa1405528a3
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.
tests/test-branches.t
--- a/tests/test-branches.t	Wed Jan 14 01:15:26 2015 +0100
+++ b/tests/test-branches.t	Wed Jan 14 01:15:26 2015 +0100
@@ -520,79 +520,104 @@
    }
   ]
 
-revision branch name caching implementation
+
+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.
 
-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
+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 ..