aboutsummaryrefslogtreecommitdiffstats
path: root/test/plum/test_stream.rb
diff options
context:
space:
mode:
authorKazuki Yamaguchi <k@rhe.jp>2015-08-05 21:49:34 +0900
committerKazuki Yamaguchi <k@rhe.jp>2015-08-05 21:49:34 +0900
commit6443b550a2ad175e1f8e0a6199d14ded7c58239b (patch)
treec4c0722b0582dc63a9922718add6b7d3529b60c0 /test/plum/test_stream.rb
parentbdff11203a31559f0b22751681011b207adb2175 (diff)
downloadplum-6443b550a2ad175e1f8e0a6199d14ded7c58239b.tar.gz
test: reorganize directory structure
Diffstat (limited to 'test/plum/test_stream.rb')
-rw-r--r--test/plum/test_stream.rb201
1 files changed, 201 insertions, 0 deletions
diff --git a/test/plum/test_stream.rb b/test/plum/test_stream.rb
new file mode 100644
index 0000000..9e0cebc
--- /dev/null
+++ b/test/plum/test_stream.rb
@@ -0,0 +1,201 @@
+require "test_helper"
+
+using Plum::BinaryString
+
+class StreamTest < Minitest::Test
+ def test_stream_reserve
+ open_new_stream {|stream|
+ stream.reserve
+ assert_equal(:reserved_local, stream.state)
+ }
+ open_new_stream(:open) {|stream|
+ assert_connection_error(:protocol_error) {
+ stream.reserve
+ }
+ }
+ end
+
+ def test_stream_state_illegal_frame_type
+ open_new_stream {|stream|
+ assert_connection_error(:protocol_error) {
+ stream.process_frame(Frame.new(type: :rst_stream, stream_id: stream.id, payload: "\x00\x00\x00\x00"))
+ }
+ }
+ end
+
+ def test_stream_handle_data
+ payload = "ABC" * 5
+
+ open_new_stream(:open) {|stream|
+ data = nil
+ stream.on(:data) {|_data| data = _data }
+ stream.process_frame(Frame.new(type: :data, stream_id: stream.id,
+ flags: [], payload: payload))
+ assert_equal(payload, data)
+ }
+
+ open_new_stream(:open) {|stream|
+ data = nil
+ stream.on(:data) {|_data| data = _data }
+ stream.process_frame(Frame.new(type: :data, stream_id: stream.id,
+ flags: [:padded], payload: "".push_uint8(6).push(payload).push("\x00"*6)))
+ assert_equal(payload, data)
+ }
+
+ open_new_stream(:open) {|stream|
+ assert_connection_error(:protocol_error) {
+ stream.process_frame(Frame.new(type: :data, stream_id: stream.id,
+ flags: [:padded], payload: "".push_uint8(100).push(payload).push("\x00"*6)))
+ }
+ }
+
+ open_new_stream(:open) {|stream|
+ stream.process_frame(Frame.new(type: :data, stream_id: stream.id,
+ flags: [:end_stream], payload: payload))
+ assert_equal(:half_closed_remote, stream.state)
+ }
+
+ open_new_stream(:half_closed_remote) {|stream|
+ stream.process_frame(Frame.new(type: :data, stream_id: stream.id,
+ flags: [:end_stream], payload: payload))
+ last = sent_frames.last
+ assert_equal(:rst_stream, last.type)
+ assert_equal(StreamError.new(:stream_closed).http2_error_code, last.payload.uint32)
+ }
+ end
+
+ def test_stream_handle_headers_single
+ open_new_stream {|stream|
+ headers = nil
+ stream.on(:headers) {|_headers|
+ headers = _headers
+ }
+ stream.process_frame(Frame.new(type: :headers,
+ stream_id: stream.id,
+ flags: [:end_headers],
+ payload: HPACK::Encoder.new(0).encode([[":path", "/"]])))
+ assert_equal(:open, stream.state)
+ assert_equal([[":path", "/"]], headers)
+ }
+ end
+
+ def test_stream_handle_headers_continuation
+ open_new_stream {|stream|
+ payload = HPACK::Encoder.new(0).encode([[":path", "/"]])
+ headers = nil
+ stream.on(:headers) {|_headers|
+ headers = _headers
+ }
+ stream.process_frame(Frame.new(type: :headers,
+ stream_id: stream.id,
+ flags: [:end_stream],
+ payload: payload[0..4]))
+ assert_equal(nil, headers) # wait CONTINUATION
+ stream.process_frame(Frame.new(type: :continuation,
+ stream_id: stream.id,
+ flags: [:end_headers],
+ payload: payload[5..-1]))
+ assert_equal(:half_closed_remote, stream.state)
+ assert_equal([[":path", "/"]], headers)
+ }
+ end
+
+ def test_stream_handle_headers_padded
+ open_new_stream {|stream|
+ payload = HPACK::Encoder.new(0).encode([[":path", "/"]])
+ headers = nil
+ stream.on(:headers) {|_headers|
+ headers = _headers
+ }
+ stream.process_frame(Frame.new(type: :headers,
+ stream_id: stream.id,
+ flags: [:end_headers, :padded],
+ payload: "".push_uint8(payload.bytesize).push(payload).push("\x00"*payload.bytesize)))
+ assert_equal([[":path", "/"]], headers)
+ }
+ end
+
+ def test_stream_handle_headers_too_long_padding
+ open_new_stream {|stream|
+ payload = HPACK::Encoder.new(0).encode([[":path", "/"]])
+ assert_connection_error(:protocol_error) {
+ stream.process_frame(Frame.new(type: :headers,
+ stream_id: stream.id,
+ flags: [:end_headers, :padded],
+ payload: "".push_uint8(payload.bytesize+1).push(payload).push("\x00"*(payload.bytesize+1))))
+ }
+ }
+ end
+
+ def test_stream_handle_headers_broken
+ open_new_stream {|stream|
+ payload = "\x00\x01\x02"
+ assert_connection_error(:compression_error) {
+ stream.process_frame(Frame.new(type: :headers,
+ stream_id: stream.id,
+ flags: [:end_headers],
+ payload: payload))
+ }
+ }
+ end
+
+ def test_stream_handle_headers_state
+ _payload = HPACK::Encoder.new(0).encode([[":path", "/"]])
+ open_new_stream(:reserved_local) {|stream|
+ assert_connection_error(:protocol_error) {
+ stream.process_frame(Frame.new(type: :headers, stream_id: stream.id, flags: [:end_headers, :end_stream], payload: _payload))
+ }
+ }
+ open_new_stream(:closed) {|stream|
+ assert_connection_error(:stream_closed) {
+ stream.process_frame(Frame.new(type: :headers, stream_id: stream.id, flags: [:end_headers, :end_stream], payload: _payload))
+ }
+ }
+ open_new_stream(:half_closed_remote) {|stream|
+ stream.process_frame(Frame.new(type: :headers, stream_id: stream.id, flags: [:end_headers, :end_stream], payload: _payload))
+ last = sent_frames.last
+ assert_equal(:rst_stream, last.type)
+ assert_equal(StreamError.new(:stream_closed).http2_error_code, last.payload.uint32)
+ }
+ end
+
+ def test_stream_handle_headers_priority
+ open_new_stream {|stream|
+ skip "HEADERS with priority" # TODO
+ }
+ end
+
+ def test_stream_promise
+ open_new_stream {|stream|
+ push_stream = stream.promise([])
+
+ assert(push_stream.id % 2 == 0)
+ assert(push_stream.id > stream.id)
+ assert_equal(stream, push_stream.parent)
+ assert_includes(stream.children, push_stream)
+ }
+ end
+
+ def test_stream_window_update
+ open_new_stream {|stream|
+ before_ws = stream.recv_remaining_window
+ stream.window_update(500)
+
+ last = sent_frames.last
+ assert_equal(:window_update, last.type)
+ assert_equal(500, last.payload.uint32)
+ assert_equal(before_ws + 500, stream.recv_remaining_window)
+ }
+ end
+
+ def test_stream_close
+ open_new_stream(:half_closed_local) {|stream|
+ stream.close(StreamError.new(:frame_size_error).http2_error_code)
+
+ last = sent_frames.last
+ assert_equal(:rst_stream, last.type)
+ assert_equal(StreamError.new(:frame_size_error).http2_error_code, last.payload.uint32)
+ assert_equal(:closed, stream.state)
+ }
+ end
+end