Mercurial > hgsubversion
comparison tests/test_revmap_migrate.py @ 1473:623af04c6e06
tests: new test about revmap two-way migrations
The test makes sure the bi-directional migration happens transparently, and
without data loss.
| author | Jun Wu <quark@fb.com> |
|---|---|
| date | Wed, 15 Jun 2016 18:25:39 +0100 |
| parents | |
| children | 8937f19586fe |
comparison
equal
deleted
inserted
replaced
| 1472:cf79525f507c | 1473:623af04c6e06 |
|---|---|
| 1 import test_util | |
| 2 | |
| 3 from mercurial import util as hgutil | |
| 4 from hgsubversion import svnmeta, maps | |
| 5 from mercurial.node import hex | |
| 6 | |
| 7 class TestRevMapMigrate(test_util.TestBase): | |
| 8 | |
| 9 def _test_revmap_migrate(self, fromclass, toclass): | |
| 10 # revmap interfaces to test | |
| 11 getters = [ | |
| 12 lambda x: x.branchedits('the_branch', 3), | |
| 13 lambda x: x.branchedits('the_branch', 4), | |
| 14 lambda x: x.branchedits('the_branch', 5), | |
| 15 lambda x: x.branchedits('the_branch', 6), | |
| 16 lambda x: x.branchedits(None, 5), | |
| 17 lambda x: x.branchedits('non_existed', 10), | |
| 18 lambda x: x.branchmaxrevnum('the_branch', 3), | |
| 19 lambda x: x.branchmaxrevnum('the_branch', 4), | |
| 20 lambda x: x.branchmaxrevnum('the_branch', 5), | |
| 21 lambda x: x.branchmaxrevnum('the_branch', 6), | |
| 22 lambda x: x.branchmaxrevnum(None, 5), | |
| 23 lambda x: x.branchmaxrevnum('non_existed', 10), | |
| 24 lambda x: list(x.revhashes(3)), | |
| 25 lambda x: list(x.revhashes(4)), | |
| 26 lambda x: list(x.revhashes(42)), | |
| 27 lambda x: list(x.revhashes(105)), | |
| 28 lambda x: x.firstpulled, | |
| 29 lambda x: x.lastpulled, | |
| 30 lambda x: x.lasthash, | |
| 31 ] | |
| 32 | |
| 33 svnmeta.SVNMeta._defaultrevmapclass = fromclass | |
| 34 repo = self._load_fixture_and_fetch('two_heads.svndump') | |
| 35 meta = svnmeta.SVNMeta(repo) | |
| 36 self.assertEqual(meta.revmap.__class__, fromclass) | |
| 37 origrevmap = meta.revmap | |
| 38 | |
| 39 # insert fake special (duplicated, with '\0') data | |
| 40 origrevmap[103, None] = b'\0' * 20 | |
| 41 origrevmap[104, None] = b'\0' * 18 + b'cd' | |
| 42 origrevmap[105, None] = b'ab\0cdefghijklmnopqrs' | |
| 43 origrevmap[104, None] = b'\0' * 18 + b'\xff\0' | |
| 44 origrevmap[105, 'ab'] = origrevmap[105, None] | |
| 45 | |
| 46 origvalues = [f(meta.revmap) for f in getters] | |
| 47 | |
| 48 # migrate to another format (transparently) | |
| 49 svnmeta.SVNMeta._defaultrevmapclass = toclass | |
| 50 meta = svnmeta.SVNMeta(repo) | |
| 51 self.assertEqual(meta.revmap.__class__, toclass) | |
| 52 | |
| 53 # enable iteration otherwise we cannot use iteritems | |
| 54 origrevmap._allowiter = True | |
| 55 for k, v in origrevmap.iteritems(): | |
| 56 newv = meta.revmap[k] | |
| 57 self.assertEqual(newv, v) | |
| 58 self.assertEqual(len(newv), 20) | |
| 59 self.assertEqual(meta.revmap[meta.revmap.hashes()[v]], v) | |
| 60 | |
| 61 newvalues = [f(meta.revmap) for f in getters] | |
| 62 self.assertEqual(origvalues, newvalues) | |
| 63 | |
| 64 def test_revmap_migrate_up(self): | |
| 65 self._test_revmap_migrate(maps.RevMap, maps.SqliteRevMap) | |
| 66 | |
| 67 def test_revmap_migrate_down(self): | |
| 68 self._test_revmap_migrate(maps.SqliteRevMap, maps.RevMap) |
