Skip to content

Commit 0f748cf

Browse files
committed
internal/http3: clean up stream I/O methods usages in tests
In CL 796400, I/O methods were added to the internal/http3.stream. As a follow-up to that CL, modify our tests to stop calling I/O methods from internal/quic.stream. Also add internal/http.stream.WriteByte method for symmetry. For golang/go#70914 Change-Id: I2036589d89ceac97f80e3f34a29cea786a6a6964 Reviewed-on: https://go-review.googlesource.com/c/net/+/797280 LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Nicholas Husin <husin@google.com> Reviewed-by: Damien Neil <dneil@google.com>
1 parent 0bb961e commit 0f748cf

7 files changed

Lines changed: 48 additions & 34 deletions

File tree

internal/http3/body_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ func TestReadData(t *testing.T) {
224224
case receiveData:
225225
t.Logf("receive DATA frame content: size=%v", step.size)
226226
for range step.size {
227-
st.stream.stream.WriteByte(byte(bytesSent))
227+
st.WriteByte(byte(bytesSent))
228228
bytesSent++
229229
}
230230
st.Flush()
@@ -239,7 +239,7 @@ func TestReadData(t *testing.T) {
239239
st.Flush()
240240
case receiveEOF:
241241
t.Logf("receive EOF on request stream")
242-
st.stream.stream.CloseWrite()
242+
st.CloseWrite()
243243
case wantBody:
244244
t.Logf("read %v bytes from response body", step.size)
245245
want := make([]byte, step.size)

internal/http3/conn_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ func TestConnPeerCreatesBadUnidirectionalStream(t *testing.T) {
132132
t.Fatal(err)
133133
}
134134
st := newTestQUICStream(tc.t, newStream(qs))
135-
st.stream.stream.Close()
135+
st.Close()
136136

137137
tc.wantClosed("after peer creates and closes uni stream", errH3StreamCreationError)
138138
})

internal/http3/roundtrip_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ func TestRoundTripExpect100Continue(t *testing.T) {
429429
":status": []string{"200"},
430430
})
431431
st.writeData(serverBody)
432-
st.stream.stream.CloseWrite()
432+
st.CloseWrite()
433433

434434
// Client receives the response from server.
435435
rt.wantStatus(200)
@@ -478,7 +478,7 @@ func TestRoundTripExpect100ContinueRejected(t *testing.T) {
478478
st.wantIdle("client does not send its body without getting status 100")
479479
serverBody := []byte("server's body")
480480
st.writeData(serverBody)
481-
st.stream.stream.CloseWrite()
481+
st.CloseWrite()
482482

483483
rt.wantStatus(200)
484484
rt.wantBody(serverBody)
@@ -518,7 +518,7 @@ func TestRoundTripReadRespWithNoBody(t *testing.T) {
518518
st.writeHeaders(http.Header{
519519
":status": {"200"},
520520
})
521-
st.stream.stream.CloseWrite()
521+
st.CloseWrite()
522522
rt.wantStatus(200)
523523
st.wantClosed("request is complete")
524524

@@ -760,7 +760,7 @@ func TestRoundTrip103EarlyHints(t *testing.T) {
760760
})
761761
body := []byte("some body")
762762
st.writeData(body)
763-
st.stream.stream.CloseWrite()
763+
st.CloseWrite()
764764

765765
rt.wantStatus(200)
766766
rt.wantBody(body)
@@ -810,7 +810,7 @@ func TestRoundTripGzipEnabled(t *testing.T) {
810810
"content-length": []string{strconv.Itoa(buf.Len())},
811811
})
812812
st.writeData(buf.Bytes())
813-
st.stream.stream.CloseWrite()
813+
st.CloseWrite()
814814

815815
rt.wantStatus(200)
816816

@@ -949,7 +949,7 @@ func TestRoundTripGzipWithTrailers(t *testing.T) {
949949
st.writeHeaders(http.Header{
950950
"server-trailer-a": {"valuea"},
951951
})
952-
st.stream.stream.CloseWrite()
952+
st.CloseWrite()
953953

954954
rt.wantStatus(200)
955955
rt.wantTrailers(http.Header{

internal/http3/server_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ func TestServerBody(t *testing.T) {
429429
reqStream.writeHeaders(requestHeader(nil))
430430
bodyContent := []byte("some body content that should be echoed")
431431
reqStream.writeData(bodyContent)
432-
reqStream.stream.stream.CloseWrite()
432+
reqStream.CloseWrite()
433433
reqStream.wantSomeHeaders(http.Header{":status": {"200"}})
434434
// Small multiple calls to Write will be coalesced into one DATA frame.
435435
reqStream.wantData(append([]byte("/"), bodyContent...))
@@ -672,7 +672,7 @@ func TestServerExpect100Continue(t *testing.T) {
672672
reqStream.wantSomeHeaders(http.Header{":status": {"100"}})
673673
body := []byte("body that will be echoed back if we get status 100")
674674
reqStream.writeData(body)
675-
reqStream.stream.stream.CloseWrite()
675+
reqStream.CloseWrite()
676676

677677
// Receive the server's response after sending the body.
678678
reqStream.wantSomeHeaders(http.Header{":status": {"200"}})
@@ -726,7 +726,7 @@ func TestServerNoExpect100ContinueAfterNormalResponse(t *testing.T) {
726726
// read the request body without hanging, which would normally cause an
727727
// HTTP 100 to be sent.
728728
reqStream.writeData([]byte("some body"))
729-
reqStream.stream.stream.CloseWrite()
729+
reqStream.CloseWrite()
730730

731731
// Verify that no HTTP 100 was sent.
732732
reqStream.wantSomeHeaders(http.Header{":status": {"200"}})
@@ -750,7 +750,7 @@ func TestServerHandlerReadReqWithNoBody(t *testing.T) {
750750
// client closes the write direction of the stream.
751751
reqStream := tc.newStream(streamTypeRequest)
752752
reqStream.writeHeaders(requestHeader(nil))
753-
reqStream.stream.stream.CloseWrite()
753+
reqStream.CloseWrite()
754754
reqStream.wantSomeHeaders(http.Header{":status": {"200"}})
755755
reqStream.wantData(serverBody)
756756
reqStream.wantClosed("request is complete")

internal/http3/stream.go

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,20 @@ func (st *stream) Flush() error {
338338
return st.writeDeadline.errOf(st.stream.Flush())
339339
}
340340

341+
// WriteByte writes one byte to the stream.
342+
func (st *stream) WriteByte(c byte) error {
343+
// Check the deadline before doing I/O operations on the QUIC layer. We do
344+
// this because the QUIC layer implements a fast path for I/O operations,
345+
// allowing Read & Write to succeed depending on the state of buffer, even
346+
// if its context has been canceled. By always checking the deadline here,
347+
// we make it so that I/O operations fail as soon as its relevant deadline
348+
// has been exceeded.
349+
if err := st.writeDeadline.err(); err != nil {
350+
return err
351+
}
352+
return st.writeDeadline.errOf(st.stream.WriteByte(c))
353+
}
354+
341355
// readVarint reads a QUIC variable-length integer from the stream.
342356
func (st *stream) readVarint() (v int64, err error) {
343357
b, err := st.ReadByte()
@@ -369,24 +383,24 @@ func readVarint[T ~int64 | ~uint64](st *stream) (T, error) {
369383
func (st *stream) writeVarint(v int64) {
370384
switch {
371385
case v <= (1<<6)-1:
372-
st.stream.WriteByte(byte(v))
386+
st.WriteByte(byte(v))
373387
case v <= (1<<14)-1:
374-
st.stream.WriteByte((1 << 6) | byte(v>>8))
375-
st.stream.WriteByte(byte(v))
388+
st.WriteByte((1 << 6) | byte(v>>8))
389+
st.WriteByte(byte(v))
376390
case v <= (1<<30)-1:
377-
st.stream.WriteByte((2 << 6) | byte(v>>24))
378-
st.stream.WriteByte(byte(v >> 16))
379-
st.stream.WriteByte(byte(v >> 8))
380-
st.stream.WriteByte(byte(v))
391+
st.WriteByte((2 << 6) | byte(v>>24))
392+
st.WriteByte(byte(v >> 16))
393+
st.WriteByte(byte(v >> 8))
394+
st.WriteByte(byte(v))
381395
case v <= (1<<62)-1:
382-
st.stream.WriteByte((3 << 6) | byte(v>>56))
383-
st.stream.WriteByte(byte(v >> 48))
384-
st.stream.WriteByte(byte(v >> 40))
385-
st.stream.WriteByte(byte(v >> 32))
386-
st.stream.WriteByte(byte(v >> 24))
387-
st.stream.WriteByte(byte(v >> 16))
388-
st.stream.WriteByte(byte(v >> 8))
389-
st.stream.WriteByte(byte(v))
396+
st.WriteByte((3 << 6) | byte(v>>56))
397+
st.WriteByte(byte(v >> 48))
398+
st.WriteByte(byte(v >> 40))
399+
st.WriteByte(byte(v >> 32))
400+
st.WriteByte(byte(v >> 24))
401+
st.WriteByte(byte(v >> 16))
402+
st.WriteByte(byte(v >> 8))
403+
st.WriteByte(byte(v))
390404
default:
391405
panic("varint too large")
392406
}

internal/http3/stream_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ func TestStreamReadFrameHeaderPartial(t *testing.T) {
193193
if err := st1.Flush(); err != nil {
194194
t.Fatal(err)
195195
}
196-
st1.stream.CloseWrite()
196+
st1.CloseWrite()
197197

198198
if _, err := st2.readFrameHeader(); err == nil {
199199
t.Fatalf("%v/%v bytes of frame available: st.readFrameHeader() succeeded; want error", i, len(frame))
@@ -206,7 +206,7 @@ func TestStreamReadFrameDataPartial(t *testing.T) {
206206
st1.writeVarint(1) // type
207207
st1.writeVarint(100) // size
208208
st1.Write(make([]byte, 50)) // data
209-
st1.stream.CloseWrite()
209+
st1.CloseWrite()
210210
if _, err := st2.readFrameHeader(); err != nil {
211211
t.Fatalf("st.readFrameHeader() = %v", err)
212212
}
@@ -219,7 +219,7 @@ func TestStreamReadByteFrameDataPartial(t *testing.T) {
219219
st1, st2 := newStreamPair(t)
220220
st1.writeVarint(1) // type
221221
st1.writeVarint(100) // size
222-
st1.stream.CloseWrite()
222+
st1.CloseWrite()
223223
if _, err := st2.readFrameHeader(); err != nil {
224224
t.Fatalf("st.readFrameHeader() = %v", err)
225225
}
@@ -242,7 +242,7 @@ func TestStreamReadFrameDataAtEOF(t *testing.T) {
242242
}
243243

244244
st1.Write(data) // data
245-
st1.stream.CloseWrite() // end stream
245+
st1.CloseWrite() // end stream
246246
got := make([]byte, len(data)+1)
247247
if n, err := st2.Read(got); err != nil || n != len(data) || !bytes.Equal(got[:n], data) {
248248
t.Fatalf("st.Read() = %v, %v (data=%x); want %v, nil (data=%x)", n, err, got[:n], len(data), data)
@@ -297,7 +297,7 @@ func TestStreamDiscardFrame(t *testing.T) {
297297
st1.writeVarint(typ) // type
298298
st1.writeVarint(int64(len(data))) // size
299299
st1.Write(data) // data
300-
st1.stream.CloseWrite()
300+
st1.CloseWrite()
301301

302302
if got, err := st2.readFrameHeader(); err != nil || got != typ {
303303
t.Fatalf("st.readFrameHeader() = %v, %v; want %v, nil", got, err, typ)

internal/http3/transport_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,7 @@ func (ts *testQUICStream) wantClosed(reason string) {
459459
func (ts *testQUICStream) wantError(want quic.StreamErrorCode) {
460460
ts.t.Helper()
461461
synctest.Wait()
462-
_, err := ts.stream.stream.ReadByte()
462+
_, err := ts.ReadByte()
463463
if err == nil {
464464
ts.t.Fatalf("successfully read from stream; want stream error code %v", want)
465465
}

0 commit comments

Comments
 (0)