Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
http2: add testClientConn for testing client RoundTrips
Many RoundTrip tests involve testing against a test-defined server with specific behaviors. For example: Testing RoundTrip's behavior when the server violates flow control limits. Existing tests mostly use the clientTester type, which starts separate goroutines for the Transport and a fake server. This results in tests where the control flow bounces around the test function, and requires each test to manage its own synchronization. Introduce a new framework for writing RoundTrip tests. testClientConn allows client tests to be written linearly, with synchronization provided by the test framework. For example, a testClientConn test can, as a linear sequence of actions: - start RoundTrip; - check the request headers sent; - provide data to the request body; - check that a DATA frame is sent; - send response headers from the server to the client; - check that RoundTrip returns. See TestTestClientConn at the top of clientconn_test.go for a full example. To enable synchronization with tests, this CL instruments the RoundTrip path to record when goroutines start, exit, and block waiting for events. This adds a certain amount of noise and bookkeeping to the client implementation, but (in my opinion) this is more than repaid in improved testability. The testClientConn also permits use of synthetic time in tests. At the moment, this is limited to the response header timeout, but extending it to other timeouts (read, 100-continue) should be straightforward. This CL converts a number of existing clientTester tests to use the new framework, but not all. Change-Id: Ief963889969363ec8469cd3c3de0becb2fc548f9 Reviewed-on: https://go-review.googlesource.com/c/net/+/563540 LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Jonathan Amsterdam <[email protected]>
- Loading branch information