From 7be98b6090baf6d67be53977bcd0fc87d83737cb Mon Sep 17 00:00:00 2001 From: Kazuki Yamaguchi Date: Sun, 8 May 2016 21:03:25 +0900 Subject: frame: create subclasses for each frame type This improves code readability. --- test/plum/client/test_upgrade_client_session.rb | 8 +-- test/plum/connection/test_handle_frame.rb | 16 +++--- test/plum/server/test_connection.rb | 15 +++--- test/plum/server/test_http_connection.rb | 6 +-- test/plum/stream/test_handle_frame.rb | 44 ++++++++-------- test/plum/test_connection.rb | 34 ++++++------ test/plum/test_connection_utils.rb | 6 +-- test/plum/test_flow_control.rb | 70 ++++++++----------------- test/plum/test_frame.rb | 22 ++++---- test/plum/test_frame_factory.rb | 20 +++---- test/plum/test_frame_utils.rb | 29 ++++++---- test/plum/test_stream.rb | 10 ++-- test/utils/client.rb | 4 +- test/utils/server.rb | 2 +- 14 files changed, 132 insertions(+), 154 deletions(-) (limited to 'test') diff --git a/test/plum/client/test_upgrade_client_session.rb b/test/plum/client/test_upgrade_client_session.rb index 3cc97b4..446462c 100644 --- a/test/plum/client/test_upgrade_client_session.rb +++ b/test/plum/client/test_upgrade_client_session.rb @@ -21,11 +21,11 @@ class UpgradeClientSessionTest < Minitest::Test def test_request sock = StringSocket.new("HTTP/1.1 101\r\n\r\n") session = UpgradeClientSession.new(sock, Client::DEFAULT_CONFIG) - sock.rio.string << Frame.settings().assemble - sock.rio.string << Frame.settings(:ack).assemble + sock.rio.string << Frame::Settings.new.assemble + sock.rio.string << Frame::Settings.new(:ack).assemble res = session.request({ ":method" => "GET", ":path" => "/aa" }, "aa", {}) - sock.rio.string << Frame.headers(3, HPACK::Encoder.new(3).encode(":status" => "200", "content-length" => "3"), end_headers: true).assemble - sock.rio.string << Frame.data(3, "aaa", end_stream: true).assemble + sock.rio.string << Frame::Headers.new(3, HPACK::Encoder.new(3).encode(":status" => "200", "content-length" => "3"), end_headers: true).assemble + sock.rio.string << Frame::Data.new(3, "aaa", end_stream: true).assemble session.succ until res.finished? assert(res.finished?) assert_equal("aaa", res.body) diff --git a/test/plum/connection/test_handle_frame.rb b/test/plum/connection/test_handle_frame.rb index 704c128..ca4ef18 100644 --- a/test/plum/connection/test_handle_frame.rb +++ b/test/plum/connection/test_handle_frame.rb @@ -7,7 +7,7 @@ class ServerConnectionHandleFrameTest < Minitest::Test def test_server_handle_settings open_server_connection { |con| assert_equal(4096, con.remote_settings[:header_table_size]) - con << Frame.new(type: :settings, stream_id: 0, payload: "\x00\x01\x00\x00\x10\x10").assemble + con << Frame.craft(type: :settings, stream_id: 0, payload: "\x00\x01\x00\x00\x10\x10").assemble assert_equal(0x1010, con.remote_settings[:header_table_size]) } end @@ -15,10 +15,10 @@ class ServerConnectionHandleFrameTest < Minitest::Test def test_server_handle_settings open_server_connection { |con| assert_no_error { - con << Frame.new(type: :settings, stream_id: 0, flags: [:ack], payload: "").assemble + con << Frame.craft(type: :settings, stream_id: 0, flags: [:ack], payload: "").assemble } assert_connection_error(:frame_size_error) { - con << Frame.new(type: :settings, stream_id: 0, flags: [:ack], payload: "\x00").assemble + con << Frame.craft(type: :settings, stream_id: 0, flags: [:ack], payload: "\x00").assemble } } end @@ -26,7 +26,7 @@ class ServerConnectionHandleFrameTest < Minitest::Test def test_server_handle_settings_invalid open_server_connection { |con| assert_no_error { - con << Frame.new(type: :settings, stream_id: 0, payload: "\xff\x01\x00\x00\x10\x10").assemble + con << Frame.craft(type: :settings, stream_id: 0, payload: "\xff\x01\x00\x00\x10\x10").assemble } } end @@ -34,7 +34,7 @@ class ServerConnectionHandleFrameTest < Minitest::Test ## PING def test_server_handle_ping open_server_connection { |con| - con << Frame.new(type: :ping, flags: [], stream_id: 0, payload: "AAAAAAAA").assemble + con << Frame.craft(type: :ping, flags: [], stream_id: 0, payload: "AAAAAAAA").assemble last = sent_frames.last assert_equal(:ping, last.type) assert_equal([:ack], last.flags) @@ -45,14 +45,14 @@ class ServerConnectionHandleFrameTest < Minitest::Test def test_server_handle_ping_error open_server_connection { |con| assert_connection_error(:frame_size_error) { - con << Frame.new(type: :ping, stream_id: 0, payload: "A" * 7).assemble + con << Frame.craft(type: :ping, stream_id: 0, payload: "A" * 7).assemble } } end def test_server_handle_ping_ack open_server_connection { |con| - con << Frame.new(type: :ping, flags: [:ack], stream_id: 0, payload: "A" * 8).assemble + con << Frame.craft(type: :ping, flags: [:ack], stream_id: 0, payload: "A" * 8).assemble last = sent_frames.last refute_equal(:ping, last.type) if last } @@ -63,7 +63,7 @@ class ServerConnectionHandleFrameTest < Minitest::Test open_server_connection { |con| assert_no_error { begin - con << Frame.goaway(1, :stream_closed).assemble + con << Frame::Goaway.new(1, :stream_closed).assemble rescue LocalHTTPError end } diff --git a/test/plum/server/test_connection.rb b/test/plum/server/test_connection.rb index 87e1893..ccc9dae 100644 --- a/test/plum/server/test_connection.rb +++ b/test/plum/server/test_connection.rb @@ -21,7 +21,7 @@ class HTTPSConnectionNegotiationTest < Minitest::Test con = ServerConnection.new(StringIO.new.method(:write)) con << Connection::CLIENT_CONNECTION_PREFACE assert_connection_error(:protocol_error) { - con << Frame.new(type: :window_update, stream_id: 0, payload: "".push_uint32(1)).assemble + con << Frame::WindowUpdate.new(0, 1).assemble } end @@ -31,7 +31,7 @@ class HTTPSConnectionNegotiationTest < Minitest::Test assert_no_error { con << magic[0...5] con << magic[5..-1] - con << Frame.new(type: :settings, stream_id: 0).assemble + con << Frame::Settings.new.assemble } end @@ -57,10 +57,9 @@ class HTTPSConnectionNegotiationTest < Minitest::Test end } } + rescue Errno::EPIPE rescue Timeout::Error flunk "server timeout" - rescue => e - flunk e ensure tcp_server.close end @@ -75,16 +74,14 @@ class HTTPSConnectionNegotiationTest < Minitest::Test ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx) ssl.connect ssl.write Connection::CLIENT_CONNECTION_PREFACE - ssl.write Frame.settings.assemble - sleep - rescue => e - flunk e + ssl.write Frame::Settings.new.assemble + rescue Errno::EPIPE ensure sock.close end } server_thread.join - client_thread.kill + client_thread.join flunk "test not run" unless run end diff --git a/test/plum/server/test_http_connection.rb b/test/plum/server/test_http_connection.rb index 1326deb..e03523b 100644 --- a/test/plum/server/test_http_connection.rb +++ b/test/plum/server/test_http_connection.rb @@ -9,7 +9,7 @@ class HTTPConnectionNegotiationTest < Minitest::Test con = HTTPServerConnection.new(io.method(:write)) con << Connection::CLIENT_CONNECTION_PREFACE assert_connection_error(:protocol_error) { - con << Frame.new(type: :window_update, stream_id: 0, payload: "".push_uint32(1)).assemble + con << Frame::WindowUpdate.new(0, 1).assemble } end @@ -20,7 +20,7 @@ class HTTPConnectionNegotiationTest < Minitest::Test assert_no_error { con << magic[0...5] con << magic[5..-1] - con << Frame.new(type: :settings, stream_id: 0).assemble + con << Frame::Settings.new.assemble } end @@ -41,7 +41,7 @@ class HTTPConnectionNegotiationTest < Minitest::Test assert(io.string.include?("HTTP/1.1 101 "), "Response is not HTTP/1.1 101: #{io.string}") assert_no_error { con << Connection::CLIENT_CONNECTION_PREFACE - con << Frame.new(type: :settings, stream_id: 0).assemble + con << Frame::Settings.new.assemble } assert_equal(:half_closed_remote, con.streams[1].state) assert_equal({ ":method" => "GET", ":path" => "/", ":authority" => "rhe.jp", "user-agent" => "nya"}, heads) diff --git a/test/plum/stream/test_handle_frame.rb b/test/plum/stream/test_handle_frame.rb index 2c14c26..6defb82 100644 --- a/test/plum/stream/test_handle_frame.rb +++ b/test/plum/stream/test_handle_frame.rb @@ -9,7 +9,7 @@ class StreamHandleFrameTest < Minitest::Test open_new_stream(state: :open) { |stream| data = nil stream.connection.on(:data) { |_, _data| data = _data } - stream.receive_frame(Frame.new(type: :data, stream_id: stream.id, + stream.receive_frame(Frame.craft(type: :data, stream_id: stream.id, flags: [], payload: payload)) assert_equal(payload, data) } @@ -20,7 +20,7 @@ class StreamHandleFrameTest < Minitest::Test open_new_stream(state: :open) { |stream| data = nil stream.connection.on(:data) { |_, _data| data = _data } - stream.receive_frame(Frame.new(type: :data, stream_id: stream.id, + stream.receive_frame(Frame.craft(type: :data, stream_id: stream.id, flags: [:padded], payload: "".push_uint8(6).push(payload).push("\x00"*6))) assert_equal(payload, data) } @@ -30,7 +30,7 @@ class StreamHandleFrameTest < Minitest::Test payload = "ABC" * 5 open_new_stream(state: :open) { |stream| assert_connection_error(:protocol_error) { - stream.receive_frame(Frame.new(type: :data, stream_id: stream.id, + stream.receive_frame(Frame.craft(type: :data, stream_id: stream.id, flags: [:padded], payload: "".push_uint8(100).push(payload).push("\x00"*6))) } } @@ -39,7 +39,7 @@ class StreamHandleFrameTest < Minitest::Test def test_stream_handle_data_end_stream payload = "ABC" * 5 open_new_stream(state: :open) { |stream| - stream.receive_frame(Frame.new(type: :data, stream_id: stream.id, + stream.receive_frame(Frame.craft(type: :data, stream_id: stream.id, flags: [:end_stream], payload: payload)) assert_equal(:half_closed_remote, stream.state) } @@ -49,7 +49,7 @@ class StreamHandleFrameTest < Minitest::Test payload = "ABC" * 5 open_new_stream(state: :half_closed_remote) { |stream| assert_stream_error(:stream_closed) { - stream.receive_frame(Frame.new(type: :data, stream_id: stream.id, + stream.receive_frame(Frame.craft(type: :data, stream_id: stream.id, flags: [:end_stream], payload: payload)) } } @@ -62,7 +62,7 @@ class StreamHandleFrameTest < Minitest::Test stream.connection.on(:headers) { |_, _headers| headers = _headers } - stream.receive_frame(Frame.new(type: :headers, + stream.receive_frame(Frame.craft(type: :headers, stream_id: stream.id, flags: [:end_headers], payload: HPACK::Encoder.new(0).encode([[":path", "/"]]))) @@ -78,12 +78,12 @@ class StreamHandleFrameTest < Minitest::Test stream.connection.on(:headers) { |_, _headers| headers = _headers } - stream.receive_frame(Frame.new(type: :headers, + stream.receive_frame(Frame.craft(type: :headers, stream_id: stream.id, flags: [:end_stream], payload: payload[0..4])) assert_equal(nil, headers) # wait CONTINUATION - stream.receive_frame(Frame.new(type: :continuation, + stream.receive_frame(Frame.craft(type: :continuation, stream_id: stream.id, flags: [:end_headers], payload: payload[5..-1])) @@ -99,7 +99,7 @@ class StreamHandleFrameTest < Minitest::Test stream.connection.on(:headers) { |_, _headers| headers = _headers } - stream.receive_frame(Frame.new(type: :headers, + stream.receive_frame(Frame.craft(type: :headers, stream_id: stream.id, flags: [:end_headers, :padded], payload: "".push_uint8(payload.bytesize).push(payload).push("\x00"*payload.bytesize))) @@ -111,7 +111,7 @@ class StreamHandleFrameTest < Minitest::Test open_new_stream { |stream| payload = HPACK::Encoder.new(0).encode([[":path", "/"]]) assert_connection_error(:protocol_error) { - stream.receive_frame(Frame.new(type: :headers, + stream.receive_frame(Frame.craft(type: :headers, stream_id: stream.id, flags: [:end_headers, :padded], payload: "".push_uint8(payload.bytesize+1).push(payload).push("\x00"*(payload.bytesize+1)))) @@ -123,7 +123,7 @@ class StreamHandleFrameTest < Minitest::Test open_new_stream { |stream| payload = "\x00\x01\x02" assert_connection_error(:compression_error) { - stream.receive_frame(Frame.new(type: :headers, + stream.receive_frame(Frame.craft(type: :headers, stream_id: stream.id, flags: [:end_headers], payload: payload)) @@ -135,17 +135,17 @@ class StreamHandleFrameTest < Minitest::Test _payload = HPACK::Encoder.new(0).encode([[":path", "/"]]) open_new_stream(state: :reserved_local) { |stream| assert_connection_error(:protocol_error) { - stream.receive_frame(Frame.new(type: :headers, stream_id: stream.id, flags: [:end_headers, :end_stream], payload: _payload)) + stream.receive_frame(Frame.craft(type: :headers, stream_id: stream.id, flags: [:end_headers, :end_stream], payload: _payload)) } } open_new_stream(state: :closed) { |stream| assert_connection_error(:stream_closed) { - stream.receive_frame(Frame.new(type: :headers, stream_id: stream.id, flags: [:end_headers, :end_stream], payload: _payload)) + stream.receive_frame(Frame.craft(type: :headers, stream_id: stream.id, flags: [:end_headers, :end_stream], payload: _payload)) } } open_new_stream(state: :half_closed_remote) { |stream| assert_stream_error(:stream_closed) { - stream.receive_frame(Frame.new(type: :headers, stream_id: stream.id, flags: [:end_headers, :end_stream], payload: _payload)) + stream.receive_frame(Frame.craft(type: :headers, stream_id: stream.id, flags: [:end_headers, :end_stream], payload: _payload)) } } end @@ -161,7 +161,7 @@ class StreamHandleFrameTest < Minitest::Test payload = "".push_uint32((1 << 31) | parent.id) .push_uint8(50) .push(header_block) - stream.receive_frame(Frame.new(type: :headers, + stream.receive_frame(Frame.craft(type: :headers, stream_id: stream.id, flags: [:end_headers, :priority], payload: payload)) @@ -180,7 +180,7 @@ class StreamHandleFrameTest < Minitest::Test payload = "".push_uint32((1 << 31) | parent.id) .push_uint8(50) - stream.receive_frame(Frame.new(type: :priority, + stream.receive_frame(Frame.craft(type: :priority, stream_id: stream.id, payload: payload)) assert_equal(true, stream.exclusive) @@ -193,7 +193,7 @@ class StreamHandleFrameTest < Minitest::Test open_server_connection { |con| stream = open_new_stream(con) payload = "".push_uint32((0 << 31) | stream.id).push_uint8(6) - stream.receive_frame(Frame.new(type: :priority, + stream.receive_frame(Frame.craft(type: :priority, stream_id: stream.id, payload: payload)) last = sent_frames.last @@ -210,7 +210,7 @@ class StreamHandleFrameTest < Minitest::Test stream2 = open_new_stream(con, parent: parent) payload = "".push_uint32((1 << 31) | parent.id).push_uint8(6) - stream0.receive_frame(Frame.new(type: :priority, + stream0.receive_frame(Frame.craft(type: :priority, stream_id: stream0.id, payload: payload)) assert_equal(parent, stream0.parent) @@ -222,7 +222,7 @@ class StreamHandleFrameTest < Minitest::Test def test_stream_handle_frame_size_error open_new_stream { |stream| assert_stream_error(:frame_size_error) { - stream.receive_frame(Frame.new(type: :priority, + stream.receive_frame(Frame.craft(type: :priority, stream_id: stream.id, payload: "\x00")) } @@ -232,7 +232,7 @@ class StreamHandleFrameTest < Minitest::Test ## RST_STREAM def test_stream_handle_rst_stream open_new_stream(state: :reserved_local) { |stream| - stream.receive_frame(Frame.new(type: :rst_stream, + stream.receive_frame(Frame.craft(type: :rst_stream, stream_id: stream.id, payload: "\x00\x00\x00\x00")) assert_equal(:closed, stream.state) @@ -242,7 +242,7 @@ class StreamHandleFrameTest < Minitest::Test def test_stream_handle_rst_stream_idle open_new_stream(state: :idle) { |stream| assert_connection_error(:protocol_error) { - stream.receive_frame(Frame.new(type: :rst_stream, + stream.receive_frame(Frame.craft(type: :rst_stream, stream_id: stream.id, payload: "\x00\x00\x00\x00")) } @@ -252,7 +252,7 @@ class StreamHandleFrameTest < Minitest::Test def test_stream_handle_rst_stream_frame_size open_new_stream(state: :reserved_local) { |stream| assert_connection_error(:frame_size_error) { - stream.receive_frame(Frame.new(type: :rst_stream, + stream.receive_frame(Frame.craft(type: :rst_stream, stream_id: stream.id, payload: "\x00\x00\x00")) } diff --git a/test/plum/test_connection.rb b/test/plum/test_connection.rb index fad70b4..a28672b 100644 --- a/test/plum/test_connection.rb +++ b/test/plum/test_connection.rb @@ -4,7 +4,7 @@ using Plum::BinaryString class ConnectionTest < Minitest::Test def test_server_must_raise_frame_size_error_when_exeeeded_max_size - _settings = "".push_uint16(Frame::SETTINGS_TYPE[:max_frame_size]).push_uint32(2**14) + _settings = "".push_uint16(Frame::Settings::SETTINGS_TYPE[:max_frame_size]).push_uint32(2**14) limit = 2 ** 14 new_con = -> (&blk) { @@ -15,23 +15,23 @@ class ConnectionTest < Minitest::Test new_con.call { |con| assert_no_error { - con << Frame.new(type: :settings, stream_id: 0, payload: _settings * (limit / 6)).assemble + con << Frame.craft(type: :settings, stream_id: 0, payload: _settings * (limit / 6)).assemble } } new_con.call { |con| assert_connection_error(:frame_size_error) { - con << Frame.new(type: :settings, stream_id: 0, payload: _settings * (limit / 6 + 1)).assemble + con << Frame.craft(type: :settings, stream_id: 0, payload: _settings * (limit / 6 + 1)).assemble } } new_con.call { |con| assert_connection_error(:frame_size_error) { - con << Frame.new(type: :headers, stream_id: 3, payload: "\x00" * (limit + 1)).assemble + con << Frame.craft(type: :headers, stream_id: 3, payload: "\x00" * (limit + 1)).assemble } } new_con.call { |con| assert_stream_error(:frame_size_error) { - con << Frame.new(type: :headers, stream_id: 3, flags: [:end_headers], payload: "").assemble - con << Frame.new(type: :data, stream_id: 3, payload: "\x00" * (limit + 1)).assemble + con << Frame.craft(type: :headers, stream_id: 3, flags: [:end_headers], payload: "").assemble + con << Frame.craft(type: :data, stream_id: 3, payload: "\x00" * (limit + 1)).assemble } } end @@ -40,7 +40,7 @@ class ConnectionTest < Minitest::Test [:data, :headers, :priority, :rst_stream, :push_promise, :continuation].each do |type| con = open_server_connection assert_connection_error(:protocol_error) { - con << Frame.new(type: type, stream_id: 0).assemble + con << Frame.craft(type: type, stream_id: 0).assemble } end end @@ -56,39 +56,39 @@ class ConnectionTest < Minitest::Test def test_server_raise_cprotocol_error_client_start_even_stream_id con = open_server_connection assert_connection_error(:protocol_error) { - con << Frame.new(type: :headers, flags: [:end_headers], stream_id: 2).assemble + con << Frame.craft(type: :headers, flags: [:end_headers], stream_id: 2).assemble } end def test_server_raise_cprotocol_error_client_start_small_stream_id con = open_server_connection - con << Frame.new(type: :headers, flags: [:end_headers], stream_id: 51).assemble + con << Frame.craft(type: :headers, flags: [:end_headers], stream_id: 51).assemble assert_connection_error(:protocol_error) { - con << Frame.new(type: :headers, flags: [:end_headers], stream_id: 31).assemble + con << Frame.craft(type: :headers, flags: [:end_headers], stream_id: 31).assemble } end def test_server_raise_cprotocol_error_invalid_continuation_state prepare = -> &blk { con = open_server_connection - con << Frame.new(type: :headers, flags: [:end_headers], stream_id: 1).assemble - con << Frame.new(type: :headers, flags: [:end_stream], stream_id: 3).assemble + con << Frame.craft(type: :headers, flags: [:end_headers], stream_id: 1).assemble + con << Frame.craft(type: :headers, flags: [:end_stream], stream_id: 3).assemble blk.call(con) } prepare.call { |con| assert_connection_error(:protocol_error) { - con << Frame.new(type: :data, stream_id: 1, payload: "hello").assemble + con << Frame.craft(type: :data, stream_id: 1, payload: "hello").assemble } } prepare.call { |con| assert_connection_error(:protocol_error) { - con << Frame.new(type: :data, stream_id: 3, payload: "hello").assemble + con << Frame.craft(type: :data, stream_id: 3, payload: "hello").assemble } } prepare.call { |con| assert_equal(:waiting_continuation, con.state) - con << Frame.new(type: :continuation, flags: [:end_headers], stream_id: 3, payload: "").assemble + con << Frame.craft(type: :continuation, flags: [:end_headers], stream_id: 3, payload: "").assemble assert_equal(:open, con.state) } end @@ -96,7 +96,7 @@ class ConnectionTest < Minitest::Test def test_connection_local_error open_server_connection { |con| assert_raises(LocalConnectionError) { - con << Frame.goaway(0, :frame_size_error).assemble + con << Frame::Goaway.new(0, :frame_size_error).assemble } } end @@ -105,7 +105,7 @@ class ConnectionTest < Minitest::Test io = StringIO.new con = Connection.new(io.method(:write)) fs = parse_frames(io) { - con.__send__(:send_immediately, Frame.new(type: :data, stream_id: 1, payload: "a"*16385)) + con.__send__(:send_immediately, Frame.craft(type: :data, stream_id: 1, payload: "a"*16385)) } assert_equal(2, fs.size) assert_equal(16384, fs.first.length) diff --git a/test/plum/test_connection_utils.rb b/test/plum/test_connection_utils.rb index 1147dd3..785c74c 100644 --- a/test/plum/test_connection_utils.rb +++ b/test/plum/test_connection_utils.rb @@ -16,7 +16,7 @@ class ServerConnectionUtilsTest < Minitest::Test def test_server_goaway open_server_connection { |con| - con << Frame.headers(3, "", end_stream: true, end_headers: true).assemble + con << Frame::Headers.new(3, "", end_stream: true, end_headers: true).assemble con.goaway(:stream_closed) last = sent_frames.last @@ -29,9 +29,9 @@ class ServerConnectionUtilsTest < Minitest::Test def test_push_enabled open_server_connection { |con| - con << Frame.settings(enable_push: 0).assemble + con << Frame::Settings.new(enable_push: 0).assemble assert_equal(false, con.push_enabled?) - con << Frame.settings(enable_push: 1).assemble + con << Frame::Settings.new(enable_push: 1).assemble assert_equal(true, con.push_enabled?) } end diff --git a/test/plum/test_flow_control.rb b/test/plum/test_flow_control.rb index 316361c..38958b7 100644 --- a/test/plum/test_flow_control.rb +++ b/test/plum/test_flow_control.rb @@ -32,9 +32,7 @@ class FlowControlTest < Minitest::Test def test_flow_control_window_update_zero open_new_stream { |stream| assert_stream_error(:protocol_error) { - stream.receive_frame Frame.new(type: :window_update, - stream_id: stream.id, - payload: "".push_uint32(0)) + stream.receive_frame Frame::WindowUpdate.new(stream.id, 0) } } end @@ -42,9 +40,9 @@ class FlowControlTest < Minitest::Test def test_flow_control_window_update_frame_size open_new_stream { |stream| assert_connection_error(:frame_size_error) { - stream.receive_frame Frame.new(type: :window_update, - stream_id: stream.id, - payload: "".push_uint16(0)) + stream.receive_frame Frame.craft(type: :window_update, + stream_id: stream.id, + payload: "".push_uint16(0)) } } end @@ -52,18 +50,11 @@ class FlowControlTest < Minitest::Test def test_flow_control_dont_send_data_exceeding_send_window open_new_stream { |stream| con = stream.connection - con << Frame.new(type: :settings, - stream_id: 0, - payload: "".push_uint16(Frame::SETTINGS_TYPE[:initial_window_size]) - .push_uint32(4*2+1)).assemble + con << Frame::Settings.new(initial_window_size: 4 * 2 + 1).assemble # only extend stream window size - con << Frame.new(type: :window_update, - stream_id: stream.id, - payload: "".push_uint32(100)).assemble + con << Frame::WindowUpdate.new(stream.id, 100).assemble 10.times { |i| - stream.send Frame.new(type: :data, - stream_id: stream.id, - payload: "".push_uint32(i)) + stream.send Frame::Data.new(stream.id, "".push_uint32(i)) } last = sent_frames.last @@ -74,23 +65,14 @@ class FlowControlTest < Minitest::Test def test_flow_control_dont_send_data_upto_updated_send_window open_new_stream { |stream| con = stream.connection - con << Frame.new(type: :settings, - stream_id: 0, - payload: "".push_uint16(Frame::SETTINGS_TYPE[:initial_window_size]) - .push_uint32(4*2+1)).assemble + con << Frame::Settings.new(initial_window_size: 4 * 2 + 1).assemble 10.times { |i| - stream.send Frame.new(type: :data, - stream_id: stream.id, - payload: "".push_uint32(i)) + stream.send Frame::Data.new(stream.id, "".push_uint32(i)) } # only extend stream window size - con << Frame.new(type: :window_update, - stream_id: stream.id, - payload: "".push_uint32(100)).assemble + con << Frame::WindowUpdate.new(stream.id, 100).assemble # and extend connection window size - con << Frame.new(type: :window_update, - stream_id: 0, - payload: "".push_uint32(4*2+1)).assemble + con << Frame::WindowUpdate.new(0, 4 * 2 + 1).assemble last = sent_frames.last assert_equal(3, last.payload.uint32) @@ -100,24 +82,14 @@ class FlowControlTest < Minitest::Test def test_flow_control_update_send_initial_window_size open_new_stream { |stream| con = stream.connection - con << Frame.new(type: :settings, - stream_id: 0, - payload: "".push_uint16(Frame::SETTINGS_TYPE[:initial_window_size]) - .push_uint32(4*2+1)).assemble + con << Frame::Settings.new(initial_window_size: 4 * 2 + 1).assemble 10.times { |i| - stream.send Frame.new(type: :data, - stream_id: stream.id, - payload: "".push_uint32(i)) + stream.send Frame::Data.new(stream.id, "".push_uint32(i)) } # only extend stream window size - con << Frame.new(type: :window_update, - stream_id: stream.id, - payload: "".push_uint32(100)).assemble + con << Frame::WindowUpdate.new(stream.id, 100).assemble # and update initial window size - con << Frame.new(type: :settings, - stream_id: 0, - payload: "".push_uint16(Frame::SETTINGS_TYPE[:initial_window_size]) - .push_uint32(4*4+1)).assemble + con << Frame::Settings.new(initial_window_size: 4 * 4 + 1).assemble last = sent_frames.reverse.find { |f| f.type == :data } assert_equal(3, last.payload.uint32) @@ -135,17 +107,17 @@ class FlowControlTest < Minitest::Test prepare.call { |con, stream| con.window_update(500) # extend only connection - con << Frame.headers(stream.id, "", end_headers: true).assemble + con << Frame::Headers.new(stream.id, "", end_headers: true).assemble assert_stream_error(:flow_control_error) { - con << Frame.data(stream.id, "\x00" * 30, end_stream: true).assemble + con << Frame::Data.new(stream.id, "\x00" * 30, end_stream: true).assemble } } prepare.call { |con, stream| stream.window_update(500) # extend only stream - con << Frame.headers(stream.id, "", end_headers: true).assemble + con << Frame::Headers.new(stream.id, "", end_headers: true).assemble assert_connection_error(:flow_control_error) { - con << Frame.data(stream.id, "\x00" * 30, end_stream: true).assemble + con << Frame::Data.new(stream.id, "\x00" * 30, end_stream: true).assemble } } end @@ -155,8 +127,8 @@ class FlowControlTest < Minitest::Test con = stream.connection con.settings(initial_window_size: 24) stream.window_update(1) - con << Frame.headers(stream.id, "", end_headers: true).assemble - con << Frame.data(stream.id, "\x00" * 20, end_stream: true).assemble + con << Frame::Headers.new(stream.id, "", end_headers: true).assemble + con << Frame::Data.new(stream.id, "\x00" * 20, end_stream: true).assemble assert_equal(4, con.recv_remaining_window) assert_equal(5, stream.recv_remaining_window) con.settings(initial_window_size: 60) diff --git a/test/plum/test_frame.rb b/test/plum/test_frame.rb index 4795627..40cde01 100644 --- a/test/plum/test_frame.rb +++ b/test/plum/test_frame.rb @@ -34,17 +34,17 @@ class FrameTest < Minitest::Test # Frame#assemble def test_assemble - frame = Plum::Frame.new(type: :push_promise, flags: [:end_headers, :padded], stream_id: 0x678, payload: "payl") + frame = Plum::Frame.craft(type: :push_promise, flags: [:end_headers, :padded], stream_id: 0x678, payload: "payl") bin = "\x00\x00\x04" << "\x05" << "\x0c" << "\x00\x00\x06\x78" << "payl" assert_equal(bin, frame.assemble) end - # Frame#generate - def test_new - frame = Plum::Frame.new(type: :data, - stream_id: 12345, - flags: [:end_stream, :padded], - payload: "ぺいろーど".encode(Encoding::UTF_8)) + # Frame.craft + def test_new_raw + frame = Plum::Frame.craft(type: :data, + stream_id: 12345, + flags: [:end_stream, :padded], + payload: "ぺいろーど".encode(Encoding::UTF_8)) assert_equal("ぺいろーど", frame.payload) assert_equal("ぺいろーど".bytesize, frame.length) assert_equal(:data, frame.type) # DATA @@ -53,10 +53,10 @@ class FrameTest < Minitest::Test end def test_inspect - frame = Plum::Frame.new(type: :data, - stream_id: 12345, - flags: [:end_stream, :padded], - payload: "ぺいろーど") + frame = Plum::Frame.craft(type: :data, + stream_id: 12345, + flags: [:end_stream, :padded], + payload: "ぺいろーど") frame.inspect end end diff --git a/test/plum/test_frame_factory.rb b/test/plum/test_frame_factory.rb index 109fb95..a4253ba 100644 --- a/test/plum/test_frame_factory.rb +++ b/test/plum/test_frame_factory.rb @@ -3,7 +3,7 @@ require "test_helper" using Plum::BinaryString class FrameFactoryTest < Minitest::Test def test_rst_stream - frame = Frame.rst_stream(123, :stream_closed) + frame = Frame::RstStream.new(123, :stream_closed) assert_frame(frame, type: :rst_stream, stream_id: 123) @@ -11,7 +11,7 @@ class FrameFactoryTest < Minitest::Test end def test_goaway - frame = Frame.goaway(0x55, :stream_closed, "debug") + frame = Frame::Goaway.new(0x55, :stream_closed, "debug") assert_frame(frame, type: :goaway, stream_id: 0, @@ -19,7 +19,7 @@ class FrameFactoryTest < Minitest::Test end def test_settings - frame = Frame.settings(header_table_size: 0x1010) + frame = Frame::Settings.new(header_table_size: 0x1010) assert_frame(frame, type: :settings, stream_id: 0, @@ -28,7 +28,7 @@ class FrameFactoryTest < Minitest::Test end def test_settings_ack - frame = Frame.settings(:ack) + frame = Frame::Settings.new(:ack) assert_frame(frame, type: :settings, stream_id: 0, @@ -37,7 +37,7 @@ class FrameFactoryTest < Minitest::Test end def test_ping - frame = Frame.ping("12345678") + frame = Frame::Ping.new("12345678") assert_frame(frame, type: :ping, stream_id: 0, @@ -46,7 +46,7 @@ class FrameFactoryTest < Minitest::Test end def test_ping_ack - frame = Frame.ping(:ack, "12345678") + frame = Frame::Ping.new(:ack, "12345678") assert_frame(frame, type: :ping, stream_id: 0, @@ -55,7 +55,7 @@ class FrameFactoryTest < Minitest::Test end def test_continuation - frame = Frame.continuation(123, "abc", end_headers: true) + frame = Frame::Continuation.new(123, "abc", end_headers: true) assert_frame(frame, type: :continuation, stream_id: 123, @@ -64,7 +64,7 @@ class FrameFactoryTest < Minitest::Test end def test_data - frame = Frame.data(123, "abc".force_encoding("UTF-8")) + frame = Frame::Data.new(123, "abc".force_encoding("UTF-8")) assert_frame(frame, type: :data, stream_id: 123, @@ -74,7 +74,7 @@ class FrameFactoryTest < Minitest::Test end def test_headers - frame = Frame.headers(123, "abc", end_stream: true) + frame = Frame::Headers.new(123, "abc", end_stream: true) assert_frame(frame, type: :headers, stream_id: 123, @@ -83,7 +83,7 @@ class FrameFactoryTest < Minitest::Test end def test_push_promise - frame = Frame.push_promise(345, 2, "abc", end_headers: true) + frame = Frame::PushPromise.new(345, 2, "abc", end_headers: true) assert_frame(frame, type: :push_promise, stream_id: 345, diff --git a/test/plum/test_frame_utils.rb b/test/plum/test_frame_utils.rb index 7ad869f..3851f6a 100644 --- a/test/plum/test_frame_utils.rb +++ b/test/plum/test_frame_utils.rb @@ -2,19 +2,14 @@ require "test_helper" class FrameUtilsTest < Minitest::Test def test_frame_enough_short - frame = Frame.new(type: :data, stream_id: 1, payload: "123") + frame = Frame::Data.new(1, "123") ret = frame.to_enum(:split, 3).to_a assert_equal(1, ret.size) assert_equal("123", ret.first.payload) end - def test_frame_unknown - frame = Frame.new(type: :settings, stream_id: 1, payload: "123") - assert_raises(NotImplementedError) { frame.split(2) } - end - def test_frame_data - frame = Frame.new(type: :data, flags: [:end_stream], stream_id: 1, payload: "12345") + frame = Frame::Data.new(1, "12345", end_stream: true) ret = frame.to_enum(:split, 2).to_a assert_equal(3, ret.size) assert_equal("12", ret.first.payload) @@ -23,8 +18,8 @@ class FrameUtilsTest < Minitest::Test assert_equal([:end_stream], ret.last.flags) end - def test_frame_headers - frame = Frame.new(type: :headers, flags: [:priority, :end_stream, :end_headers], stream_id: 1, payload: "1234567") + def test_headers_split + frame = Frame.craft(type: :headers, flags: [:priority, :end_stream, :end_headers], stream_id: 1, payload: "1234567") ret = frame.to_enum(:split, 3).to_a assert_equal(3, ret.size) assert_equal("123", ret[0].payload) @@ -35,9 +30,23 @@ class FrameUtilsTest < Minitest::Test assert_equal([:end_headers], ret[2].flags) end + def test_push_promise_split + frame = Frame::PushPromise.new(1, 2, "1234567", end_headers: true) + ret = frame.to_enum(:split, 3).to_a + assert_equal(4, ret.size) + assert_equal("\x00\x00\x00", ret[0].payload) + assert_equal([], ret[0].flags) + assert_equal("\x0212", ret[1].payload) + assert_equal([], ret[1].flags) + assert_equal("345", ret[2].payload) + assert_equal([], ret[2].flags) + assert_equal("67", ret[3].payload) + assert_equal([:end_headers], ret[3].flags) + end + def test_frame_parse_settings # :header_table_size => 0x1010, :enable_push => 0x00, :header_table_size => 0x1011 (overwrite) - frame = Frame.new(type: :settings, flags: [], stream_id: 0, payload: "\x00\x01\x00\x00\x10\x10\x00\x02\x00\x00\x00\x00\x00\x01\x00\x00\x10\x11") + frame = Frame.parse!("\x00\x00\x12\x04\x00\x00\x00\x00\x00" "\x00\x01\x00\x00\x10\x10\x00\x02\x00\x00\x00\x00\x00\x01\x00\x00\x10\x11") ret = frame.parse_settings assert_equal(0x1011, ret[:header_table_size]) assert_equal(0x0000, ret[:enable_push]) diff --git a/test/plum/test_stream.rb b/test/plum/test_stream.rb index fc1e94b..db681e7 100644 --- a/test/plum/test_stream.rb +++ b/test/plum/test_stream.rb @@ -6,7 +6,7 @@ class StreamTest < Minitest::Test def test_stream_illegal_frame_type open_new_stream { |stream| assert_connection_error(:protocol_error) { - stream.receive_frame(Frame.new(type: :goaway, stream_id: stream.id, payload: "\x00\x00\x00\x00")) + stream.receive_frame(Frame::Goaway.new(0, :no_error)) } } end @@ -14,7 +14,7 @@ class StreamTest < Minitest::Test def test_stream_unknown_frame_type open_new_stream { |stream| assert_no_error { - stream.receive_frame(Frame.new(type_value: 0x0f, stream_id: stream.id, payload: "\x00\x00\x00\x00")) + stream.receive_frame(Frame::Unknown.new(0x0f, flags_value: 0, stream_id: stream.id, payload: "\x00\x00\x00\x00")) } } end @@ -28,7 +28,7 @@ class StreamTest < Minitest::Test } assert_stream_error(:frame_size_error) { - con << Frame.headers(1, "", end_headers: true).assemble + con << Frame::Headers.new(1, "", end_headers: true).assemble } last = sent_frames.last @@ -43,8 +43,8 @@ class StreamTest < Minitest::Test stream = type = nil con.on(:rst_stream) { |s, t| stream = s; type = t } - con << Frame.headers(1, "", end_headers: true).assemble - con << Frame.rst_stream(1, :frame_size_error).assemble + con << Frame::Headers.new(1, "", end_headers: true).assemble + con << Frame::RstStream.new(1, :frame_size_error).assemble assert_equal(1, stream.id) assert_equal(:frame_size_error, type) diff --git a/test/utils/client.rb b/test/utils/client.rb index be8d78d..f8937e2 100644 --- a/test/utils/client.rb +++ b/test/utils/client.rb @@ -4,8 +4,8 @@ module ServerUtils def open_client_connection(scheme = :https) io = StringIO.new @_ccon = ClientConnection.new(io.method(:write)) - @_ccon << Frame.new(type: :settings, stream_id: 0, flags: [:ack]).assemble - @_ccon << Frame.new(type: :settings, stream_id: 0).assemble + @_ccon << Frame::Settings.new(:ack).assemble + @_ccon << Frame::Settings.new.assemble if block_given? yield @_ccon else diff --git a/test/utils/server.rb b/test/utils/server.rb index 5f1baa7..001a3fe 100644 --- a/test/utils/server.rb +++ b/test/utils/server.rb @@ -5,7 +5,7 @@ module ServerUtils @_io = StringIO.new @_con = (scheme == :https ? ServerConnection : HTTPServerConnection).new(@_io.method(:write)) @_con << Connection::CLIENT_CONNECTION_PREFACE - @_con << Frame.new(type: :settings, stream_id: 0).assemble + @_con << Frame::Settings.new.assemble if block_given? yield @_con else -- cgit v1.2.3