Skip to content

Commit 6a03e70

Browse files
committed
tests: Fix RST_STREAM asserts not conforming to RFC
1 parent 53feb0e commit 6a03e70

4 files changed

+45
-41
lines changed

test/test_closed_streams.py

+21-17
Original file line numberDiff line numberDiff line change
@@ -390,17 +390,22 @@ def test_resets_further_frames_after_recv_reset(self,
390390
assert not events
391391
assert c.data_to_send() == rst_frame.serialize()
392392

393+
# "An endpoint MUST ignore frames that it receives on closed streams
394+
# after it has sent a RST_STREAM frame."
395+
# The initial RST_STREAM was seen in the previous assert. Additional
396+
# frames should be ignored.
393397
events = c.receive_data(f.serialize() * 3)
394398
assert not events
395-
assert c.data_to_send() == rst_frame.serialize() * 3
399+
assert c.data_to_send() == b""
396400

397401
# Iterate over the streams to make sure it's gone, then confirm the
398402
# behaviour is unchanged.
399403
c.open_outbound_streams
400404

405+
# Additional frames should continue to be ignored
401406
events = c.receive_data(f.serialize() * 3)
402407
assert not events
403-
assert c.data_to_send() == rst_frame.serialize() * 3
408+
assert c.data_to_send() == b""
404409

405410
def test_resets_further_data_frames_after_recv_reset(self,
406411
frame_factory):
@@ -445,15 +450,15 @@ def test_resets_further_data_frames_after_recv_reset(self,
445450

446451
events = c.receive_data(f.serialize() * 3)
447452
assert not events
448-
assert c.data_to_send() == expected * 3
453+
assert c.data_to_send() == b""
449454

450455
# Iterate over the streams to make sure it's gone, then confirm the
451456
# behaviour is unchanged.
452457
c.open_outbound_streams
453458

454459
events = c.receive_data(f.serialize() * 3)
455460
assert not events
456-
assert c.data_to_send() == expected * 3
461+
assert c.data_to_send() == b""
457462

458463
@pytest.mark.parametrize(
459464
"frame",
@@ -486,6 +491,7 @@ def test_resets_further_frames_after_send_reset(self,
486491
end_stream=False
487492
)
488493

494+
# Send initial RST_STREAM
489495
c.reset_stream(1, h2.errors.ErrorCodes.INTERNAL_ERROR)
490496

491497
rst_frame = frame_factory.build_rst_stream_frame(
@@ -496,23 +502,24 @@ def test_resets_further_frames_after_send_reset(self,
496502
f = frame(self, frame_factory)
497503
events = c.receive_data(f.serialize())
498504

499-
rst_frame = frame_factory.build_rst_stream_frame(
500-
1, h2.errors.ErrorCodes.STREAM_CLOSED
501-
)
505+
# "An endpoint MUST ignore frames that it receives on closed streams
506+
# after it has sent a RST_STREAM frame."
507+
# The initial RST_STREAM was sent in the test setup. Additional frames
508+
# should be ignored.
502509
assert not events
503-
assert c.data_to_send() == rst_frame.serialize()
510+
assert c.data_to_send() == b""
504511

505512
events = c.receive_data(f.serialize() * 3)
506513
assert not events
507-
assert c.data_to_send() == rst_frame.serialize() * 3
514+
assert c.data_to_send() == b""
508515

509516
# Iterate over the streams to make sure it's gone, then confirm the
510517
# behaviour is unchanged.
511518
c.open_outbound_streams
512519

513520
events = c.receive_data(f.serialize() * 3)
514521
assert not events
515-
assert c.data_to_send() == rst_frame.serialize() * 3
522+
assert c.data_to_send() == b""
516523

517524
def test_resets_further_data_frames_after_send_reset(self,
518525
frame_factory):
@@ -535,6 +542,7 @@ def test_resets_further_data_frames_after_send_reset(self,
535542
end_stream=False
536543
)
537544

545+
# Send initial RST_STREAM
538546
c.reset_stream(1, h2.errors.ErrorCodes.INTERNAL_ERROR)
539547

540548
c.clear_outbound_data_buffer()
@@ -544,20 +552,16 @@ def test_resets_further_data_frames_after_send_reset(self,
544552
)
545553
events = c.receive_data(f.serialize())
546554
assert not events
547-
expected = frame_factory.build_rst_stream_frame(
548-
stream_id=1,
549-
error_code=h2.errors.ErrorCodes.STREAM_CLOSED,
550-
).serialize()
551-
assert c.data_to_send() == expected
555+
assert c.data_to_send() == b""
552556

553557
events = c.receive_data(f.serialize() * 3)
554558
assert not events
555-
assert c.data_to_send() == expected * 3
559+
assert c.data_to_send() == b""
556560

557561
# Iterate over the streams to make sure it's gone, then confirm the
558562
# behaviour is unchanged.
559563
c.open_outbound_streams
560564

561565
events = c.receive_data(f.serialize() * 3)
562566
assert not events
563-
assert c.data_to_send() == expected * 3
567+
assert c.data_to_send() == b""

test/test_flow_control_window.py

+3-12
Original file line numberDiff line numberDiff line change
@@ -652,27 +652,18 @@ def test_send_update_on_closed_streams(self, frame_factory):
652652
events = c.receive_data(f.serialize()*3)
653653
assert not events
654654

655-
expected = frame_factory.build_rst_stream_frame(
656-
stream_id=1,
657-
error_code=h2.errors.ErrorCodes.STREAM_CLOSED,
658-
).serialize() * 2 + frame_factory.build_window_update_frame(
655+
expected = frame_factory.build_window_update_frame(
659656
stream_id=0,
660657
increment=40500,
661-
).serialize() + frame_factory.build_rst_stream_frame(
662-
stream_id=1,
663-
error_code=h2.errors.ErrorCodes.STREAM_CLOSED,
664658
).serialize()
665659
assert c.data_to_send() == expected
666660

667661
f = frame_factory.build_data_frame(b'')
668662
events = c.receive_data(f.serialize())
669663
assert not events
670664

671-
expected = frame_factory.build_rst_stream_frame(
672-
stream_id=1,
673-
error_code=h2.errors.ErrorCodes.STREAM_CLOSED,
674-
).serialize()
675-
assert c.data_to_send() == expected
665+
# RST_STREAM has already been sent. Expect no data here.
666+
assert c.data_to_send() == b""
676667

677668

678669
class TestAutomaticFlowControl(object):

test/test_invalid_frame_sequences.py

+14-3
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ def test_reject_data_on_closed_streams(self, frame_factory):
153153
bad_frame = frame_factory.build_data_frame(
154154
data=b'some data'
155155
)
156+
156157
c.receive_data(bad_frame.serialize())
157158

158159
expected = frame_factory.build_rst_stream_frame(
@@ -349,15 +350,25 @@ def test_one_one_stream_reset(self, frame_factory):
349350
bad_frame = frame_factory.build_data_frame(
350351
data=b'some data'
351352
)
352-
# Receive 5 frames.
353-
events = c.receive_data(bad_frame.serialize() * 5)
353+
354+
rst_frame = frame_factory.build_rst_stream_frame(
355+
stream_id=1,
356+
error_code=h2.errors.ErrorCodes.STREAM_CLOSED,
357+
)
354358

355359
expected = frame_factory.build_rst_stream_frame(
356360
stream_id=1,
357361
error_code=h2.errors.ErrorCodes.STREAM_CLOSED,
358362
).serialize()
359-
assert c.data_to_send() == expected * 5
360363

364+
# Receive 5 frames.
365+
events = c.receive_data(bad_frame.serialize())
366+
assert len(events) == 1
367+
assert c.data_to_send() == expected
368+
369+
events += c.receive_data(rst_frame.serialize() * 4)
370+
371+
assert c.data_to_send() == b""
361372
assert len(events) == 1
362373
event = events[0]
363374
assert isinstance(event, h2.events.StreamReset)

test/test_stream_reset.py

+7-9
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,19 @@ def test_reset_stream_keeps_header_state_correct(self, frame_factory):
3939
c = h2.connection.H2Connection()
4040
c.initiate_connection()
4141
c.send_headers(stream_id=1, headers=self.example_request_headers)
42+
# Send initial RST_STREAM
4243
c.reset_stream(stream_id=1)
4344
c.send_headers(stream_id=3, headers=self.example_request_headers)
4445
c.clear_outbound_data_buffer()
4546

4647
f = frame_factory.build_headers_frame(
4748
headers=self.example_response_headers, stream_id=1
4849
)
49-
rst_frame = frame_factory.build_rst_stream_frame(
50-
1, h2.errors.ErrorCodes.STREAM_CLOSED
51-
)
50+
51+
# RST_STREAM already sent. Expect no data here.
5252
events = c.receive_data(f.serialize())
5353
assert not events
54-
assert c.data_to_send() == rst_frame.serialize()
54+
assert c.data_to_send() == b""
5555

5656
# This works because the header state should be intact from the headers
5757
# frame that was send on stream 1, so they should decode cleanly.
@@ -85,6 +85,7 @@ def test_reset_stream_keeps_flow_control_correct(self,
8585
headers=self.example_response_headers, stream_id=close_id
8686
)
8787
c.receive_data(f.serialize())
88+
# Send initial reset
8889
c.reset_stream(stream_id=close_id)
8990
c.clear_outbound_data_buffer()
9091

@@ -94,11 +95,8 @@ def test_reset_stream_keeps_flow_control_correct(self,
9495
)
9596
c.receive_data(f.serialize())
9697

97-
expected = frame_factory.build_rst_stream_frame(
98-
stream_id=close_id,
99-
error_code=h2.errors.ErrorCodes.STREAM_CLOSED,
100-
).serialize()
101-
assert c.data_to_send() == expected
98+
# RST_STREAM already sent. Expect no data here.
99+
assert c.data_to_send() == b""
102100

103101
new_window = c.remote_flow_control_window(stream_id=other_id)
104102
assert initial_window - len(b'some data') == new_window

0 commit comments

Comments
 (0)