Gregory Szorc <gregory.szorc@gmail.com> [Tue, 27 Feb 2018 14:26:00 -0800] rev 36536
wireprotoserver: move SSHV1 and SSHV2 constants to wireprototypes
To avoid a cycle between modules in an upcoming commit.
Differential Revision: https://phab.mercurial-scm.org/D2482
Gregory Szorc <gregory.szorc@gmail.com> [Tue, 27 Feb 2018 14:21:29 -0800] rev 36535
wireproto: use named arguments for commandentry
We'll be adding more arguments in upcoming commits. Using named
arguments will make the code easier to read.
Differential Revision: https://phab.mercurial-scm.org/D2481
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 26 Feb 2018 18:01:13 -0800] rev 36534
debugcommands: support for triggering push protocol
The mechanism for pushing to a remote is a bit more complicated
than other commands. On SSH, we wait for a positive reply from
the server before we start sending the bundle payload.
This commit adds a mechanism to the "command" action in
`hg debugwireproto` to trigger the "push protocol" and to
specify a file whose contents should be submitted as the command
payload.
With this new feature, we implement a handful of tests for the
"unbundle" command. We try to cover various server failures and
hook/output scenarios so protocol behavior is as comprehensively
tested as possible. Even with so much test output, we only cover
bundle1 with Python hooks. There's still a lot of test coverage
that needs to be implemented. But this is certainly a good start.
Because there are so many new tests, we split these tests into their
own test file.
In order to make output deterministic, we need to disable the
doublepipe primitive. We add an option to `hg debugwireproto`
to do that. Because something in the bowels of the peer does a
read of stderr, we still capture read I/O from stderr. So there
is test coverage of what the server emits.
The tests around I/O capture some wonkiness. For example,
interleaved ui.write() and ui.write_err() calls are emitted in
order. However, (presumably due to buffering), print() to
sys.stdout and sys.stderr aren't in order.
We currently only test bundle1 because bundle2 is substantially
harder to test because it is more complicated (the server responds
with a stream containing a bundle2 instead of a frame).
Differential Revision: https://phab.mercurial-scm.org/D2471
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 26 Feb 2018 13:12:03 -0800] rev 36533
sshpeer: support not reading and forwarding stderr
The "doublepipe" primitive as used by sshpeer will automatically read
from stderr and forward output to the local ui.
This poses problems for deterministic testing because reads may not
be consistent. For example, the server may not be done sending all
output to stderr and the client will perform different numbers of
read operations or will read from stderr and stdout at different times.
To make tests deterministic, we'll need to disable the "doublepipe"
primitive and perform stderr I/O explicitly. We add an argument to the
sshpeer constructor to disable the use of the doublepipe.
Differential Revision: https://phab.mercurial-scm.org/D2467
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 23 Feb 2018 16:03:27 -0800] rev 36532
tests: add wire protocol tests for pushkey
Let's get the wire format of some pushkey requests in test-ssh-proto.t.
Differential Revision: https://phab.mercurial-scm.org/D2466
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 23 Feb 2018 12:50:59 -0800] rev 36531
debugcommands: support for sending "batch" requests
Let's teach `hg debugwireproto` to send "batch" requests.
The easiest way to implement this was as a pair of instructions to
begin and end a batched operation. Otherwise, we would have to reinvent
the parsing wheel or factor out the parsing code.
To prove it works, we add a batched request to test-ssh-proto.t.
Differential Revision: https://phab.mercurial-scm.org/D2408
Gregory Szorc <gregory.szorc@gmail.com> [Thu, 01 Mar 2018 08:27:30 -0800] rev 36530
debugcommands: allow sending of simple commands with debugwireproto
Previously, we only had support for low-level "raw" operations.
A goal of `hg debugwireproto` is to allow easily performing
higher-level primitives, such as sending a wire protocol command
and reading its response.
We implement a "command" action that does just this.
Currently, we only support simple commands (those without payloads).
We have basic support for sending command arguments. We don't yet
support sending dictionary arguments. This will be implemented later.
To prove it works, we add tests to test-ssh-proto.t that send some
"listkeys" commands.
Note: we don't observe/report os.read() events because these may not be
deterministic. We instead observe/report the read() and readline()
operations on the bufferedinputpipe. These *should* be deterministic.
Differential Revision: https://phab.mercurial-scm.org/D2406