diff -r 44dc34b8d17b -r 72e487851a53 tests/test-ssh-proto.t --- a/tests/test-ssh-proto.t Tue Feb 27 15:47:44 2018 -0800 +++ b/tests/test-ssh-proto.t Thu Mar 01 08:24:54 2018 -0800 @@ -12,10 +12,29 @@ $ echo 0 > foo $ hg -q add foo $ hg commit -m initial - $ cd .. + +A no-op connection performs a handshake + + $ hg debugwireproto --localssh << EOF + > EOF + creating ssh peer from handshake results + +Raw peers don't perform any activity + + $ hg debugwireproto --localssh --peer raw << EOF + > EOF + using raw connection to peer + $ hg debugwireproto --localssh --peer ssh1 << EOF + > EOF + creating ssh peer for wire protocol version 1 + $ hg debugwireproto --localssh --peer ssh2 << EOF + > EOF + creating ssh peer for wire protocol version 2 Test a normal behaving server, for sanity + $ cd .. + $ hg --debug debugpeer ssh://user@dummy/server running * "*/tests/dummyssh" 'user@dummy' 'hg -R server serve --stdio' (glob) (no-windows !) running * "*\tests/dummyssh" "user@dummy" "hg -R server serve --stdio" (glob) (windows !) @@ -33,11 +52,19 @@ Server should answer the "hello" command in isolation - $ hg -R server serve --stdio << EOF - > hello + $ hg -R server debugwireproto --localssh --peer raw << EOF + > raw + > hello\n + > readline + > readline > EOF - 384 - capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN + using raw connection to peer + i> write(6) -> None: + i> hello\n + o> readline() -> 4: + o> 384\n + o> readline() -> 384: + o> capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN\n `hg debugserve --sshstdio` works @@ -80,16 +107,33 @@ Server should reply with capabilities and should send "1\n\n" as a successful reply with empty response to the "between". - $ hg -R server serve --stdio << EOF - > hello - > between - > pairs 81 - > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + $ hg -R server debugwireproto --localssh --peer raw << EOF + > raw + > hello\n + > readline + > readline + > raw + > between\n + > pairs 81\n + > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + > readline + > readline > EOF - 384 - capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN - 1 - + using raw connection to peer + i> write(6) -> None: + i> hello\n + o> readline() -> 4: + o> 384\n + o> readline() -> 384: + o> capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN\n + i> write(98) -> None: + i> between\n + i> pairs 81\n + i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + o> readline() -> 2: + o> 1\n + o> readline() -> 1: + o> \n SSH banner is not printed by default, ignored by clients @@ -127,26 +171,63 @@ And test the banner with the raw protocol - $ SSHSERVERMODE=banner hg -R server serve --stdio << EOF - > hello - > between - > pairs 81 - > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + $ SSHSERVERMODE=banner hg -R server debugwireproto --localssh --peer raw << EOF + > raw + > hello\n + > readline + > readline + > readline + > readline + > readline + > readline + > readline + > readline + > readline + > readline + > readline + > readline + > raw + > between\n + > pairs 81\n + > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + > readline + > readline > EOF - banner: line 0 - banner: line 1 - banner: line 2 - banner: line 3 - banner: line 4 - banner: line 5 - banner: line 6 - banner: line 7 - banner: line 8 - banner: line 9 - 384 - capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN - 1 - + using raw connection to peer + i> write(6) -> None: + i> hello\n + o> readline() -> 15: + o> banner: line 0\n + o> readline() -> 15: + o> banner: line 1\n + o> readline() -> 15: + o> banner: line 2\n + o> readline() -> 15: + o> banner: line 3\n + o> readline() -> 15: + o> banner: line 4\n + o> readline() -> 15: + o> banner: line 5\n + o> readline() -> 15: + o> banner: line 6\n + o> readline() -> 15: + o> banner: line 7\n + o> readline() -> 15: + o> banner: line 8\n + o> readline() -> 15: + o> banner: line 9\n + o> readline() -> 4: + o> 384\n + o> readline() -> 384: + o> capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN\n + i> write(98) -> None: + i> between\n + i> pairs 81\n + i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + o> readline() -> 2: + o> 1\n + o> readline() -> 1: + o> \n Connecting to a <0.9.1 server that doesn't support the hello command. The client should refuse, as we dropped support for connecting to such @@ -167,18 +248,37 @@ Sending an unknown command to the server results in an empty response to that command - $ hg -R server serve --stdio << EOF - > pre-hello - > hello - > between - > pairs 81 - > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + $ hg -R server debugwireproto --localssh --peer raw << EOF + > raw + > pre-hello\n + > readline + > raw + > hello\n + > readline + > raw + > between\n + > pairs 81\n + > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + > readline + > readline > EOF - 0 - 384 - capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN - 1 - + using raw connection to peer + i> write(10) -> None: + i> pre-hello\n + o> readline() -> 2: + o> 0\n + i> write(6) -> None: + i> hello\n + o> readline() -> 4: + o> 384\n + i> write(98) -> None: + i> between\n + i> pairs 81\n + i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + o> readline() -> 384: + o> capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN\n + o> readline() -> 2: + o> 1\n $ hg --config sshpeer.mode=extra-handshake-commands --config sshpeer.handshake-mode=pre-no-args --debug debugpeer ssh://user@dummy/server running * "*/tests/dummyssh" 'user@dummy' 'hg -R server serve --stdio' (glob) (no-windows !) @@ -199,22 +299,54 @@ Send multiple unknown commands before hello - $ hg -R server serve --stdio << EOF - > unknown1 - > unknown2 - > unknown3 - > hello - > between - > pairs 81 - > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + $ hg -R server debugwireproto --localssh --peer raw << EOF + > raw + > unknown1\n + > readline + > raw + > unknown2\n + > readline + > raw + > unknown3\n + > readline + > raw + > hello\n + > readline + > readline + > raw + > between\n + > pairs 81\n + > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + > readline + > readline > EOF - 0 - 0 - 0 - 384 - capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN - 1 - + using raw connection to peer + i> write(9) -> None: + i> unknown1\n + o> readline() -> 2: + o> 0\n + i> write(9) -> None: + i> unknown2\n + o> readline() -> 2: + o> 0\n + i> write(9) -> None: + i> unknown3\n + o> readline() -> 2: + o> 0\n + i> write(6) -> None: + i> hello\n + o> readline() -> 4: + o> 384\n + o> readline() -> 384: + o> capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN\n + i> write(98) -> None: + i> between\n + i> pairs 81\n + i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + o> readline() -> 2: + o> 1\n + o> readline() -> 1: + o> \n $ hg --config sshpeer.mode=extra-handshake-commands --config sshpeer.handshake-mode=pre-multiple-no-args --debug debugpeer ssh://user@dummy/server running * "*/tests/dummyssh" 'user@dummy' 'hg -R server serve --stdio' (glob) (no-windows !) @@ -239,62 +371,154 @@ Send an unknown command before hello that has arguments - $ hg -R server serve --stdio << EOF - > with-args - > foo 13 - > value for foo - > bar 13 - > value for bar - > hello - > between - > pairs 81 - > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + $ cd server + + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > with-args\n + > foo 13\n + > value for foo\n + > bar 13\n + > value for bar\n + > readline + > readline + > readline + > readline + > readline + > raw + > hello\n + > readline + > readline + > raw + > between\n + > pairs 81\n + > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + > readline + > readline > EOF - 0 - 0 - 0 - 0 - 0 - 384 - capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN - 1 - + using raw connection to peer + i> write(52) -> None: + i> with-args\n + i> foo 13\n + i> value for foo\n + i> bar 13\n + i> value for bar\n + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n + i> write(6) -> None: + i> hello\n + o> readline() -> 4: + o> 384\n + o> readline() -> 384: + o> capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN\n + i> write(98) -> None: + i> between\n + i> pairs 81\n + i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + o> readline() -> 2: + o> 1\n + o> readline() -> 1: + o> \n Send an unknown command having an argument that looks numeric - $ hg -R server serve --stdio << EOF - > unknown - > foo 1 - > 0 - > hello - > between - > pairs 81 - > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > unknown\n + > foo 1\n + > 0\n + > readline + > readline + > readline + > raw + > hello\n + > readline + > readline + > raw + > between\n + > pairs 81\n + > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + > readline + > readline > EOF - 0 - 0 - 0 - 384 - capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN - 1 - + using raw connection to peer + i> write(16) -> None: + i> unknown\n + i> foo 1\n + i> 0\n + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n + i> write(6) -> None: + i> hello\n + o> readline() -> 4: + o> 384\n + o> readline() -> 384: + o> capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN\n + i> write(98) -> None: + i> between\n + i> pairs 81\n + i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + o> readline() -> 2: + o> 1\n + o> readline() -> 1: + o> \n - $ hg -R server serve --stdio << EOF - > unknown - > foo 1 - > 1 - > hello - > between - > pairs 81 - > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > unknown\n + > foo 1\n + > 1\n + > readline + > readline + > readline + > raw + > hello\n + > readline + > readline + > raw + > between\n + > pairs 81\n + > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + > readline + > readline > EOF - 0 - 0 - 0 - 384 - capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN - 1 - + using raw connection to peer + i> write(16) -> None: + i> unknown\n + i> foo 1\n + i> 1\n + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n + i> write(6) -> None: + i> hello\n + o> readline() -> 4: + o> 384\n + o> readline() -> 384: + o> capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN\n + i> write(98) -> None: + i> between\n + i> pairs 81\n + i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + o> readline() -> 2: + o> 1\n + o> readline() -> 1: + o> \n When sending a dict argument value, it is serialized to " " followed by " \n" for each item @@ -302,176 +526,402 @@ Dictionary value for unknown command - $ hg -R server serve --stdio << EOF - > unknown - > dict 3 - > key1 3 - > foo - > key2 3 - > bar - > key3 3 - > baz - > hello + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > unknown\n + > dict 3\n + > key1 3\n + > foo\n + > key2 3\n + > bar\n + > key3 3\n + > baz\n + > readline + > readline + > readline + > readline + > readline + > readline + > readline + > readline + > raw + > hello\n + > readline + > readline > EOF - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 384 - capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN + using raw connection to peer + i> write(48) -> None: + i> unknown\n + i> dict 3\n + i> key1 3\n + i> foo\n + i> key2 3\n + i> bar\n + i> key3 3\n + i> baz\n + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n + i> write(6) -> None: + i> hello\n + o> readline() -> 4: + o> 384\n + o> readline() -> 384: + o> capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN\n Incomplete dictionary send - $ hg -R server serve --stdio << EOF - > unknown - > dict 3 - > key1 3 - > foo + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > unknown\n + > dict 3\n + > key1 3\n + > foo\n + > readline + > readline + > readline + > readline > EOF - 0 - 0 - 0 - 0 + using raw connection to peer + i> write(26) -> None: + i> unknown\n + i> dict 3\n + i> key1 3\n + i> foo\n + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n Incomplete value send - $ hg -R server serve --stdio << EOF - > unknown - > dict 3 - > key1 3 - > fo + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > unknown\n + > dict 3\n + > key1 3\n + > fo + > readline + > readline + > readline > EOF - 0 - 0 - 0 - 0 + using raw connection to peer + i> write(24) -> None: + i> unknown\n + i> dict 3\n + i> key1 3\n + i> fo + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n Send a command line with spaces - $ hg -R server serve --stdio << EOF - > unknown withspace - > hello - > between - > pairs 81 - > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > unknown withspace\n + > readline + > raw + > hello\n + > readline + > readline + > raw + > between\n + > pairs 81\n + > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + > readline + > readline > EOF - 0 - 384 - capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN - 1 - + using raw connection to peer + i> write(18) -> None: + i> unknown withspace\n + o> readline() -> 2: + o> 0\n + i> write(6) -> None: + i> hello\n + o> readline() -> 4: + o> 384\n + o> readline() -> 384: + o> capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN\n + i> write(98) -> None: + i> between\n + i> pairs 81\n + i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + o> readline() -> 2: + o> 1\n + o> readline() -> 1: + o> \n - $ hg -R server serve --stdio << EOF - > unknown with multiple spaces - > hello - > between - > pairs 81 - > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > unknown with multiple spaces\n + > readline + > raw + > hello\n + > readline + > readline + > raw + > between\n + > pairs 81\n + > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + > readline > EOF - 0 - 384 - capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN - 1 - + using raw connection to peer + i> write(29) -> None: + i> unknown with multiple spaces\n + o> readline() -> 2: + o> 0\n + i> write(6) -> None: + i> hello\n + o> readline() -> 4: + o> 384\n + o> readline() -> 384: + o> capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN\n + i> write(98) -> None: + i> between\n + i> pairs 81\n + i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + o> readline() -> 2: + o> 1\n - $ hg -R server serve --stdio << EOF - > unknown with spaces - > key 10 - > some value - > hello - > between - > pairs 81 - > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > unknown with spaces\n + > key 10\n + > some value\n + > readline + > readline + > readline + > raw + > hello\n + > readline + > readline + > raw + > between\n + > pairs 81\n + > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + > readline + > readline > EOF - 0 - 0 - 0 - 384 - capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN - 1 - + using raw connection to peer + i> write(38) -> None: + i> unknown with spaces\n + i> key 10\n + i> some value\n + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n + i> write(6) -> None: + i> hello\n + o> readline() -> 4: + o> 384\n + o> readline() -> 384: + o> capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN\n + i> write(98) -> None: + i> between\n + i> pairs 81\n + i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + o> readline() -> 2: + o> 1\n + o> readline() -> 1: + o> \n Send an unknown command after the "between" - $ hg -R server serve --stdio << EOF - > hello - > between - > pairs 81 - > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000unknown + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > hello\n + > readline + > readline + > raw + > between\n + > pairs 81\n + > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000unknown + > readline + > readline > EOF - 384 - capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN - 1 - - 0 + using raw connection to peer + i> write(6) -> None: + i> hello\n + o> readline() -> 4: + o> 384\n + o> readline() -> 384: + o> capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN\n + i> write(105) -> None: + i> between\n + i> pairs 81\n + i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000unknown + o> readline() -> 2: + o> 1\n + o> readline() -> 1: + o> \n And one with arguments - $ hg -R server serve --stdio << EOF - > hello - > between - > pairs 81 - > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000unknown - > foo 5 - > value - > bar 3 - > baz + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > hello\n + > between\n + > pairs 81\n + > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + > readline + > readline + > readline + > readline + > raw + > unknown\n + > foo 5\n + > \nvalue\n + > bar 3\n + > baz\n + > readline + > readline + > readline > EOF - 384 - capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN - 1 - - 0 - 0 - 0 - 0 - 0 + using raw connection to peer + i> write(104) -> None: + i> hello\n + i> between\n + i> pairs 81\n + i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + o> readline() -> 4: + o> 384\n + o> readline() -> 384: + o> capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN\n + o> readline() -> 2: + o> 1\n + o> readline() -> 1: + o> \n + i> write(31) -> None: + i> unknown\n + i> foo 5\n + i> \n + i> value\n + i> bar 3\n + i> baz\n + o> readline() -> 2: + o> 0\n + o> readline() -> 2: + o> 0\n + o> readline() -> 0: Send a valid command before the handshake - $ hg -R server serve --stdio << EOF - > heads - > hello - > between - > pairs 81 - > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > heads\n + > readline + > raw + > hello\n + > between\n + > pairs 81\n + > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + > readline + > readline + > readline + > readline > EOF - 41 - 68986213bd4485ea51533535e3fc9e78007a711f - 384 - capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN - 1 - + using raw connection to peer + i> write(6) -> None: + i> heads\n + o> readline() -> 3: + o> 41\n + i> write(104) -> None: + i> hello\n + i> between\n + i> pairs 81\n + i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + o> readline() -> 41: + o> 68986213bd4485ea51533535e3fc9e78007a711f\n + o> readline() -> 4: + o> 384\n + o> readline() -> 384: + o> capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN\n + o> readline() -> 2: + o> 1\n And a variation that doesn't send the between command - $ hg -R server serve --stdio << EOF - > heads - > hello + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > heads\n + > readline + > raw + > hello\n + > readline + > readline > EOF - 41 - 68986213bd4485ea51533535e3fc9e78007a711f - 384 - capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN + using raw connection to peer + i> write(6) -> None: + i> heads\n + o> readline() -> 3: + o> 41\n + i> write(6) -> None: + i> hello\n + o> readline() -> 41: + o> 68986213bd4485ea51533535e3fc9e78007a711f\n + o> readline() -> 4: + o> 384\n Send an upgrade request to a server that doesn't support that command - $ hg -R server serve --stdio << EOF - > upgrade 2e82ab3f-9ce3-4b4e-8f8c-6fd1c0e9e23a proto=irrelevant1%2Cirrelevant2 - > hello - > between - > pairs 81 - > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > upgrade 2e82ab3f-9ce3-4b4e-8f8c-6fd1c0e9e23a proto=irrelevant1%2Cirrelevant2\n + > readline + > raw + > hello\n + > between\n + > pairs 81\n + > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + > readline + > readline + > readline + > readline > EOF - 0 - 384 - capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN - 1 - + using raw connection to peer + i> write(77) -> None: + i> upgrade 2e82ab3f-9ce3-4b4e-8f8c-6fd1c0e9e23a proto=irrelevant1%2Cirrelevant2\n + o> readline() -> 2: + o> 0\n + i> write(104) -> None: + i> hello\n + i> between\n + i> pairs 81\n + i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + o> readline() -> 4: + o> 384\n + o> readline() -> 384: + o> capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN\n + o> readline() -> 2: + o> 1\n + o> readline() -> 1: + o> \n + + $ cd .. $ hg --config experimental.sshpeer.advertise-v2=true --debug debugpeer ssh://user@dummy/server running * "*/tests/dummyssh" 'user@dummy' 'hg -R server serve --stdio' (glob) (no-windows !) @@ -500,17 +950,34 @@ Send an upgrade request to a server that supports upgrade - >>> with open('payload', 'wb') as fh: - ... fh.write(b'upgrade this-is-some-token proto=exp-ssh-v2-0001\n') - ... fh.write(b'hello\n') - ... fh.write(b'between\n') - ... fh.write(b'pairs 81\n') - ... fh.write(b'0000000000000000000000000000000000000000-0000000000000000000000000000000000000000') + $ cd server - $ hg -R server serve --stdio < payload - upgraded this-is-some-token exp-ssh-v2-0001 - 383 - capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > upgrade this-is-some-token proto=exp-ssh-v2-0001\n + > hello\n + > between\n + > pairs 81\n + > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + > readline + > readline + > readline + > EOF + using raw connection to peer + i> write(153) -> None: + i> upgrade this-is-some-token proto=exp-ssh-v2-0001\n + i> hello\n + i> between\n + i> pairs 81\n + i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + o> readline() -> 44: + o> upgraded this-is-some-token exp-ssh-v2-0001\n + o> readline() -> 4: + o> 383\n + o> readline() -> 384: + o> capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN\n + + $ cd .. $ hg --config experimental.sshpeer.advertise-v2=true --debug debugpeer ssh://user@dummy/server running * "*/tests/dummyssh" 'user@dummy' 'hg -R server serve --stdio' (glob) (no-windows !) @@ -578,95 +1045,210 @@ Command after upgrade to version 2 is processed - >>> with open('payload', 'wb') as fh: - ... fh.write(b'upgrade this-is-some-token proto=exp-ssh-v2-0001\n') - ... fh.write(b'hello\n') - ... fh.write(b'between\n') - ... fh.write(b'pairs 81\n') - ... fh.write(b'0000000000000000000000000000000000000000-0000000000000000000000000000000000000000') - ... fh.write(b'hello\n') - $ hg -R server serve --stdio < payload - upgraded this-is-some-token exp-ssh-v2-0001 - 383 - capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN - 384 - capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN + $ cd server + + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > upgrade this-is-some-token proto=exp-ssh-v2-0001\n + > hello\n + > between\n + > pairs 81\n + > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + > readline + > readline + > readline + > raw + > hello\n + > readline + > readline + > EOF + using raw connection to peer + i> write(153) -> None: + i> upgrade this-is-some-token proto=exp-ssh-v2-0001\n + i> hello\n + i> between\n + i> pairs 81\n + i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + o> readline() -> 44: + o> upgraded this-is-some-token exp-ssh-v2-0001\n + o> readline() -> 4: + o> 383\n + o> readline() -> 384: + o> capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN\n + i> write(6) -> None: + i> hello\n + o> readline() -> 4: + o> 384\n + o> readline() -> 384: + o> capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN\n Multiple upgrades is not allowed - >>> with open('payload', 'wb') as fh: - ... fh.write(b'upgrade this-is-some-token proto=exp-ssh-v2-0001\n') - ... fh.write(b'hello\n') - ... fh.write(b'between\n') - ... fh.write(b'pairs 81\n') - ... fh.write(b'0000000000000000000000000000000000000000-0000000000000000000000000000000000000000') - ... fh.write(b'upgrade another-token proto=irrelevant\n') - ... fh.write(b'hello\n') - $ hg -R server serve --stdio < payload - upgraded this-is-some-token exp-ssh-v2-0001 - 383 - capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN - cannot upgrade protocols multiple times - - - + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > upgrade this-is-some-token proto=exp-ssh-v2-0001\n + > hello\n + > between\n + > pairs 81\n + > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + > readline + > readline + > readline + > raw + > upgrade another-token proto=irrelevant\n + > hello\n + > readline + > readavailable + > EOF + using raw connection to peer + i> write(153) -> None: + i> upgrade this-is-some-token proto=exp-ssh-v2-0001\n + i> hello\n + i> between\n + i> pairs 81\n + i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + o> readline() -> 44: + o> upgraded this-is-some-token exp-ssh-v2-0001\n + o> readline() -> 4: + o> 383\n + o> readline() -> 384: + o> capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN\n + i> write(45) -> None: + i> upgrade another-token proto=irrelevant\n + i> hello\n + o> readline() -> 1: + o> \n + e> read(-1) -> 42: + e> cannot upgrade protocols multiple times\n + e> -\n Malformed upgrade request line (not exactly 3 space delimited tokens) - $ hg -R server serve --stdio << EOF - > upgrade + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > upgrade\n + > readline > EOF - 0 + using raw connection to peer + i> write(8) -> None: + i> upgrade\n + o> readline() -> 2: + o> 0\n - $ hg -R server serve --stdio << EOF - > upgrade token + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > upgrade token\n + > readline > EOF - 0 + using raw connection to peer + i> write(14) -> None: + i> upgrade token\n + o> readline() -> 2: + o> 0\n - $ hg -R server serve --stdio << EOF - > upgrade token foo=bar extra-token + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > upgrade token foo=bar extra-token\n + > readline > EOF - 0 + using raw connection to peer + i> write(34) -> None: + i> upgrade token foo=bar extra-token\n + o> readline() -> 2: + o> 0\n Upgrade request to unsupported protocol is ignored - $ hg -R server serve --stdio << EOF - > upgrade this-is-some-token proto=unknown1,unknown2 - > hello - > between - > pairs 81 - > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > upgrade this-is-some-token proto=unknown1,unknown2\n + > readline + > raw + > hello\n + > readline + > readline + > raw + > between\n + > pairs 81\n + > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + > readline + > readline > EOF - 0 - 384 - capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN - 1 - + using raw connection to peer + i> write(51) -> None: + i> upgrade this-is-some-token proto=unknown1,unknown2\n + o> readline() -> 2: + o> 0\n + i> write(6) -> None: + i> hello\n + o> readline() -> 4: + o> 384\n + o> readline() -> 384: + o> capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN\n + i> write(98) -> None: + i> between\n + i> pairs 81\n + i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 + o> readline() -> 2: + o> 1\n + o> readline() -> 1: + o> \n Upgrade request must be followed by hello + between - $ hg -R server serve --stdio << EOF - > upgrade token proto=exp-ssh-v2-0001 - > invalid + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > upgrade token proto=exp-ssh-v2-0001\n + > invalid\n + > readline + > readavailable > EOF - malformed handshake protocol: missing hello - - - + using raw connection to peer + i> write(44) -> None: + i> upgrade token proto=exp-ssh-v2-0001\n + i> invalid\n + o> readline() -> 1: + o> \n + e> read(-1) -> 46: + e> malformed handshake protocol: missing hello\n + e> -\n - $ hg -R server serve --stdio << EOF - > upgrade token proto=exp-ssh-v2-0001 - > hello - > invalid + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > upgrade token proto=exp-ssh-v2-0001\n + > hello\n + > invalid\n + > readline + > readavailable > EOF - malformed handshake protocol: missing between - - - + using raw connection to peer + i> write(50) -> None: + i> upgrade token proto=exp-ssh-v2-0001\n + i> hello\n + i> invalid\n + o> readline() -> 1: + o> \n + e> read(-1) -> 48: + e> malformed handshake protocol: missing between\n + e> -\n - $ hg -R server serve --stdio << EOF - > upgrade token proto=exp-ssh-v2-0001 - > hello - > between - > invalid + $ hg debugwireproto --localssh --peer raw << EOF + > raw + > upgrade token proto=exp-ssh-v2-0001\n + > hello\n + > between\n + > invalid\n + > readline + > readavailable > EOF - malformed handshake protocol: missing pairs 81 - - - + using raw connection to peer + i> write(58) -> None: + i> upgrade token proto=exp-ssh-v2-0001\n + i> hello\n + i> between\n + i> invalid\n + o> readline() -> 1: + o> \n + e> read(-1) -> 49: + e> malformed handshake protocol: missing pairs 81\n + e> -\n