diff tests/test-wireproto-command-filedata.t @ 40922:ca6372b7e566

tests: add tests for server-side linknode adjustment with wireprotov2 The current implementation of linknode serving in wireprotov2 simply serves up the linkrev/linknode as stored: it doesn't attempt to adjust the linknode to what the receiver is aware of. This can result in the client seeing a linknode referencing a changeset that is unknown to it. This commit adds test coverage of that scenario. The tests in test-wireproto-command-filesdata.t demonstrate two failures. First, the linknode refers to a changeset not in the available set. Second, the server doesn't send a file revision that it should have (because of linkrev filtering). The test in test-wireproto-exchange.t demonstrates that the lack of a file revision results in a corrupted repository on the client. Differential Revision: https://phab.mercurial-scm.org/D5404
author Gregory Szorc <gregory.szorc@gmail.com>
date Mon, 10 Dec 2018 17:26:12 +0000
parents afdbc9c6a333
children 95c4cca641f6
line wrap: on
line diff
--- a/tests/test-wireproto-command-filedata.t	Mon Dec 10 16:53:09 2018 +0000
+++ b/tests/test-wireproto-command-filedata.t	Mon Dec 10 17:26:12 2018 +0000
@@ -27,9 +27,26 @@
   $ hg commit -m 'commit 3'
   created new head
 
+Create multiple heads introducing the same changeset
+
+  $ hg -q up -r 0
+  $ echo foo > dupe-file
+  $ hg commit -Am 'dupe 1'
+  adding dupe-file
+  created new head
+  $ hg -q up -r 0
+  $ echo foo > dupe-file
+  $ hg commit -Am 'dupe 2'
+  adding dupe-file
+  created new head
+
   $ hg log -G -T '{rev}:{node} {desc}\n'
-  @  3:5ce944d7fece1252dae06c34422b573c191b9489 commit 3
+  @  5:732c3dd7bee94242de656000e5f458e7ccfe2828 dupe 2
   |
+  | o  4:4334f10897d13c3e8beb4b636f7272b4ec2d0322 dupe 1
+  |/
+  | o  3:5ce944d7fece1252dae06c34422b573c191b9489 commit 3
+  |/
   | o  2:b3c27db01410dae01e5485d425b1440078df540c commit 2
   | |
   | o  1:3ef5e551f219ba505481d34d6b0316b017fa3f00 commit 1
@@ -47,6 +64,10 @@
      rev linkrev nodeid                                   p1                                       p2
        0       0 bbba6c06b30f443d34ff841bc985c4d0827c6be4 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000
 
+  $ hg --debug debugindex dupe-file
+     rev linkrev nodeid                                   p1                                       p2
+       0       4 2ed2a3912a0b24502043eae84ee4b279c18b90dd 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000
+
   $ hg serve -p $HGPORT -d --pid-file hg.pid -E error.log
   $ cat hg.pid > $DAEMON_PIDS
 
@@ -309,4 +330,35 @@
     b'a0\n00000000000000000000000000000000000000\n11111111111111111111111111111111111111\na2\n'
   ]
 
+Linknode for duplicate revision is the initial revision
+
+  $ sendhttpv2peer << EOF
+  > command filedata
+  >     nodes eval:[b'\x2e\xd2\xa3\x91\x2a\x0b\x24\x50\x20\x43\xea\xe8\x4e\xe4\xb2\x79\xc1\x8b\x90\xdd']
+  >     path eval:b'dupe-file'
+  >     fields eval:[b'linknode', b'parents', b'revision']
+  > EOF
+  creating http peer for wire protocol version 2
+  sending filedata command
+  response: gen[
+    {
+      b'totalitems': 1
+    },
+    {
+      b'fieldsfollowing': [
+        [
+          b'revision',
+          4
+        ]
+      ],
+      b'linknode': b'C4\xf1\x08\x97\xd1<>\x8b\xebKcorr\xb4\xec-\x03"',
+      b'node': b'.\xd2\xa3\x91*\x0b$P C\xea\xe8N\xe4\xb2y\xc1\x8b\x90\xdd',
+      b'parents': [
+        b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+        b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+      ]
+    },
+    b'foo\n'
+  ]
+
   $ cat error.log