diff options
author | Kazuki Yamaguchi <k@rhe.jp> | 2015-08-05 21:49:34 +0900 |
---|---|---|
committer | Kazuki Yamaguchi <k@rhe.jp> | 2015-08-05 21:49:34 +0900 |
commit | 6443b550a2ad175e1f8e0a6199d14ded7c58239b (patch) | |
tree | c4c0722b0582dc63a9922718add6b7d3529b60c0 | |
parent | bdff11203a31559f0b22751681011b207adb2175 (diff) | |
download | plum-6443b550a2ad175e1f8e0a6199d14ded7c58239b.tar.gz |
test: reorganize directory structure
-rw-r--r-- | Guardfile | 14 | ||||
-rw-r--r-- | Rakefile | 2 | ||||
-rw-r--r-- | test/plum/hpack/test_context.rb (renamed from test/hpack_context_test.rb) | 0 | ||||
-rw-r--r-- | test/plum/hpack/test_decoder.rb (renamed from test/hpack_decoder_test.rb) | 0 | ||||
-rw-r--r-- | test/plum/hpack/test_encoder.rb (renamed from test/hpack_encoder_test.rb) | 0 | ||||
-rw-r--r-- | test/plum/hpack/test_huffman.rb (renamed from test/hpack_huffman_test.rb) | 0 | ||||
-rw-r--r-- | test/plum/server_connection/test_handle.rb | 49 | ||||
-rw-r--r-- | test/plum/server_connection/test_negotiation.rb | 36 | ||||
-rw-r--r-- | test/plum/test_error.rb (renamed from test/error_test.rb) | 0 | ||||
-rw-r--r-- | test/plum/test_frame.rb (renamed from test/frame_test.rb) | 0 | ||||
-rw-r--r-- | test/plum/test_frame_helper.rb (renamed from test/frame_helper_test.rb) | 0 | ||||
-rw-r--r-- | test/plum/test_server_connection.rb | 66 | ||||
-rw-r--r-- | test/plum/test_stream.rb (renamed from test/stream_test.rb) | 2 | ||||
-rw-r--r-- | test/server_connection_test.rb | 150 | ||||
-rw-r--r-- | test/server_state_test.rb | 7 | ||||
-rw-r--r-- | test/test_helper.rb | 12 | ||||
-rw-r--r-- | test/utils/assertions.rb | 34 | ||||
-rw-r--r-- | test/utils/server.rb (renamed from test/utils.rb) | 42 |
18 files changed, 205 insertions, 209 deletions
@@ -1,13 +1,7 @@ guard :minitest, env: { "SKIP_COVERAGE" => true } do # with Minitest::Unit - watch(%r{^test/(.*)_test\.rb$}) - watch(%r{^test/test_helper\.rb$}) { "test" } - watch(%r{^test/utils\.rb$}) { "test" } - watch(%r{^lib/plum.rb$}) { "test" } - watch(%r{^lib/plum/(.+)\.rb$}) {|m| "test/" + m[1].gsub("/", "_") + "_test.rb" } - - # with Minitest::Spec - # watch(%r{^spec/(.*)_spec\.rb$}) - # watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" } - # watch(%r{^spec/spec_helper\.rb$}) { 'spec' } + watch(%r{^test/(.*)\/?test_(.*)\.rb$}) + watch(%r{^lib/(.*/)?([^/]+)\.rb$}) {|m| ["test/#{m[1]}test_#{m[2]}.rb", "test/#{m[1]}#{m[2]}"] } + watch(%r{^test/test_helper\.rb$}) { "test" } + watch(%r{^test/utils/.*\.rb}) { "test" } end @@ -4,7 +4,7 @@ require "yard" Rake::TestTask.new do |t| t.libs << "test" << "lib" - t.pattern = "test/*_test.rb" + t.pattern = "test/**/test_*.rb" end YARD::Rake::YardocTask.new do |t| diff --git a/test/hpack_context_test.rb b/test/plum/hpack/test_context.rb index cb92361..cb92361 100644 --- a/test/hpack_context_test.rb +++ b/test/plum/hpack/test_context.rb diff --git a/test/hpack_decoder_test.rb b/test/plum/hpack/test_decoder.rb index d8f5d10..d8f5d10 100644 --- a/test/hpack_decoder_test.rb +++ b/test/plum/hpack/test_decoder.rb diff --git a/test/hpack_encoder_test.rb b/test/plum/hpack/test_encoder.rb index 9c64942..9c64942 100644 --- a/test/hpack_encoder_test.rb +++ b/test/plum/hpack/test_encoder.rb diff --git a/test/hpack_huffman_test.rb b/test/plum/hpack/test_huffman.rb index 5fbda63..5fbda63 100644 --- a/test/hpack_huffman_test.rb +++ b/test/plum/hpack/test_huffman.rb diff --git a/test/plum/server_connection/test_handle.rb b/test/plum/server_connection/test_handle.rb new file mode 100644 index 0000000..8832a63 --- /dev/null +++ b/test/plum/server_connection/test_handle.rb @@ -0,0 +1,49 @@ +require "test_helper" + +using Plum::BinaryString + +class ServerConnectionHandleTest < Minitest::Test + ## SETTINGS + 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 + assert_equal(0x1010, con.remote_settings[:header_table_size]) + } + end + + def test_server_handle_settings_invalid + open_server_connection {|con| + refute_raises { + con << Frame.new(type: :settings, stream_id: 0, payload: "\xff\x01\x00\x00\x10\x10").assemble + } + } + end + + ## PING + def test_server_handle_ping + open_server_connection {|con| + con << Frame.new(type: :ping, flags: [], stream_id: 0, payload: "AAAAAAAA").assemble + last = sent_frames.last + assert_equal(:ping, last.type) + assert_equal([:ack], last.flags) + assert_equal("AAAAAAAA", last.payload) + } + end + + 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 + } + } + 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 + last = sent_frames.last + refute_equal(:ping, last.type) if last + } + end +end diff --git a/test/plum/server_connection/test_negotiation.rb b/test/plum/server_connection/test_negotiation.rb new file mode 100644 index 0000000..fc9287e --- /dev/null +++ b/test/plum/server_connection/test_negotiation.rb @@ -0,0 +1,36 @@ +require "test_helper" + +using Plum::BinaryString + +class ServerConnectionNegotiationTest < Minitest::Test + def test_server_must_raise_cprotocol_error_invalid_magic_short + con = ServerConnection.new(nil) + assert_connection_error(:protocol_error) { + con << "HELLO" + } + end + + def test_server_must_raise_cprotocol_error_invalid_magic_long + con = ServerConnection.new(nil) + assert_connection_error(:protocol_error) { + con << ("HELLO" * 100) # over 24 + } + end + + def test_server_must_raise_cprotocol_error_non_settings_after_magic + con = ServerConnection.new(nil) + con << ServerConnection::CLIENT_CONNECTION_PREFACE + assert_connection_error(:protocol_error) { + con << Frame.new(type: :window_update, stream_id: 0, payload: "".push_uint32(1)).assemble + } + end + + def test_server_accept_fragmented_magic + io = StringIO.new + magic = ServerConnection::CLIENT_CONNECTION_PREFACE + con = ServerConnection.new(io) + con << magic[0...5] + con << magic[5..-1] + con << Frame.new(type: :settings, stream_id: 0).assemble + end +end diff --git a/test/error_test.rb b/test/plum/test_error.rb index 167538a..167538a 100644 --- a/test/error_test.rb +++ b/test/plum/test_error.rb diff --git a/test/frame_test.rb b/test/plum/test_frame.rb index ecb2b88..ecb2b88 100644 --- a/test/frame_test.rb +++ b/test/plum/test_frame.rb diff --git a/test/frame_helper_test.rb b/test/plum/test_frame_helper.rb index 3a463ab..3a463ab 100644 --- a/test/frame_helper_test.rb +++ b/test/plum/test_frame_helper.rb diff --git a/test/plum/test_server_connection.rb b/test/plum/test_server_connection.rb new file mode 100644 index 0000000..032275a --- /dev/null +++ b/test/plum/test_server_connection.rb @@ -0,0 +1,66 @@ +require "test_helper" + +using Plum::BinaryString + +class ServerConnectionTest < Minitest::Test + def test_server_must_raise_cframe_size_error_when_exeeeded_max_size + _settings = "".push_uint16(Frame::SETTINGS_TYPE[:max_frame_size]).push_uint32(2**14) + con = open_server_connection + con.settings(max_frame_size: 2**14) + refute_raises { + con << Frame.new(type: :settings, stream_id: 0, payload: _settings*(2**14/6)).assemble + } + assert_connection_error(:frame_size_error) { + con << Frame.new(type: :settings, stream_id: 0, payload: _settings*((2**14)/6+1)).assemble + } + end + + def test_server_raise_cprotocol_error_illegal_control_stream + [: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 + } + end + end + + 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 + } + 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 + assert_connection_error(:protocol_error) { + con << Frame.new(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 + blk.call(con) + } + + prepare.call {|con| + assert_connection_error(:protocol_error) { + con << Frame.new(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 + } + } + prepare.call {|con| + assert_equal(:waiting_continuation, con.state) + con << Frame.new(type: :continuation, flags: [:end_headers], stream_id: 3, payload: "hello").assemble + assert_equal(:open, con.state) + } + end +end diff --git a/test/stream_test.rb b/test/plum/test_stream.rb index 48c0f46..9e0cebc 100644 --- a/test/stream_test.rb +++ b/test/plum/test_stream.rb @@ -3,8 +3,6 @@ require "test_helper" using Plum::BinaryString class StreamTest < Minitest::Test - include ServerTestUtils - def test_stream_reserve open_new_stream {|stream| stream.reserve diff --git a/test/server_connection_test.rb b/test/server_connection_test.rb deleted file mode 100644 index 1b72080..0000000 --- a/test/server_connection_test.rb +++ /dev/null @@ -1,150 +0,0 @@ -require "test_helper" - -using Plum::BinaryString - -class ServerConnectionTest < Minitest::Test - include ServerTestUtils - - def test_server_must_raise_cprotocol_error_invalid_magic_short - con = ServerConnection.new(nil) - assert_connection_error(:protocol_error) { - con << "HELLO" - } - end - - def test_server_must_raise_cprotocol_error_invalid_magic_long - con = ServerConnection.new(nil) - assert_connection_error(:protocol_error) { - con << ("HELLO" * 100) # over 24 - } - end - - def test_server_must_raise_cprotocol_error_non_settings_after_magic - con = ServerConnection.new(nil) - con << ServerConnection::CLIENT_CONNECTION_PREFACE - assert_connection_error(:protocol_error) { - con << Frame.new(type: :window_update, stream_id: 0, payload: "".push_uint32(1)).assemble - } - end - - def test_server_must_raise_cframe_size_error_when_exeeeded_max_size - _settings = "".push_uint16(Frame::SETTINGS_TYPE[:max_frame_size]).push_uint32(2**14) - con = open_server_connection - con.settings(max_frame_size: 2**14) - refute_raises { - con << Frame.new(type: :settings, stream_id: 0, payload: _settings*(2**14/6)).assemble - } - assert_connection_error(:frame_size_error) { - con << Frame.new(type: :settings, stream_id: 0, payload: _settings*((2**14)/6+1)).assemble - } - end - - def test_server_accept_fragmented_magic - io = StringIO.new - magic = ServerConnection::CLIENT_CONNECTION_PREFACE - con = ServerConnection.new(io) - con << magic[0...5] - con << magic[5..-1] - con << Frame.new(type: :settings, stream_id: 0).assemble - end - - def test_server_accept_client_preface_and_return_ack - io = StringIO.new - con = ServerConnection.new(io) - con << ServerConnection::CLIENT_CONNECTION_PREFACE - con << Frame.new(type: :settings, stream_id: 0).assemble - assert_equal(:open, con.state) - - last = sent_frames(con).last - assert_equal(:settings, last.type) - assert_includes(last.flags, :ack) - end - - def test_server_accept_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 - assert_equal(0x1010, con.remote_settings[:header_table_size]) - } - open_server_connection {|con| - refute_raises { - con << Frame.new(type: :settings, stream_id: 0, payload: "\xff\x01\x00\x00\x10\x10").assemble - } - } - end - - def test_server_raise_cprotocol_error_illegal_control_stream - [: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 - } - end - end - - 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 - } - 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 - assert_connection_error(:protocol_error) { - con << Frame.new(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 - blk.call(con) - } - - prepare.call {|con| - assert_connection_error(:protocol_error) { - con << Frame.new(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 - } - } - prepare.call {|con| - assert_equal(:waiting_continuation, con.state) - con << Frame.new(type: :continuation, flags: [:end_headers], stream_id: 3, payload: "hello").assemble - assert_equal(:open, con.state) - } - end - - def test_server_ping - prepare = -> &blk { - con = open_server_connection - con << Frame.new(type: :headers, flags: [:end_headers], stream_id: 1).assemble - blk.call(con) - } - - prepare.call {|con| - con << Frame.new(type: :ping, flags: [], stream_id: 0, payload: "AAAAAAAA").assemble - last = sent_frames.last - assert_equal(:ping, last.type) - assert_equal([:ack], last.flags) - assert_equal("AAAAAAAA", last.payload) - } - prepare.call {|con| - assert_connection_error(:frame_size_error) { - con << Frame.new(type: :ping, stream_id: 0, payload: "A" * 7).assemble - } - } - prepare.call {|con| - con << Frame.new(type: :ping, flags: [:ack], stream_id: 0, payload: "A" * 8).assemble - last = sent_frames.last - refute_equal(:ping, last.type) if last - } - end -end diff --git a/test/server_state_test.rb b/test/server_state_test.rb deleted file mode 100644 index fb7d948..0000000 --- a/test/server_state_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require "test_helper" - -using Plum::BinaryString - -class ServerStateTest < Minitest::Test - include ServerTestUtils -end diff --git a/test/test_helper.rb b/test/test_helper.rb index de01442..fb5aa91 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,3 +1,5 @@ +LISTEN_PORT = ENV["PLUM_LISTEN_PORT"] || 40444 + unless ENV["SKIP_COVERAGE"] begin require "simplecov" @@ -13,13 +15,13 @@ unless ENV["SKIP_COVERAGE"] end end -require "plum" -require "timeout" require "minitest" require "minitest/unit" require "minitest/autorun" require "minitest/pride" -require "utils" - +require "plum" include Plum -LISTEN_PORT = ENV["PLUM_LISTEN_PORT"] || 40444 + +Dir.glob(File.expand_path("../utils/*.rb", __FILE__)).each do |file| + require file +end diff --git a/test/utils/assertions.rb b/test/utils/assertions.rb new file mode 100644 index 0000000..7c4b094 --- /dev/null +++ b/test/utils/assertions.rb @@ -0,0 +1,34 @@ +module CustomAssertions + def assert_http_error(klass, type, &blk) + begin + blk.call + rescue klass => e + assert_equal(type, e.http2_error_type) + else + flunk "#{klass.name} type: #{type} expected but nothing was raised." + end + end + + def assert_connection_error(type, &blk) + assert_http_error(Plum::ConnectionError, type, &blk) + end + + def assert_stream_error(type, &blk) + assert_http_error(Plum::StreamError, type, &blk) + end + + def refute_raises(&blk) + begin + blk.call + rescue + a = $! + else + a = nil + end + assert(!a, "No exceptions expected but raised: #{a}:\n#{a && a.backtrace.join("\n")}") + end +end + +class Minitest::Test + include CustomAssertions +end diff --git a/test/utils.rb b/test/utils/server.rb index cf0e0e5..246afe9 100644 --- a/test/utils.rb +++ b/test/utils/server.rb @@ -1,36 +1,6 @@ -module Minitest::Assertions - def assert_http_error(klass, type, &blk) - begin - blk.call - rescue klass => e - assert_equal(type, e.http2_error_type) - else - flunk "#{klass.name} type: #{type} expected but nothing was raised." - end - end - - def assert_connection_error(type, &blk) - assert_http_error(Plum::ConnectionError, type, &blk) - end - - def assert_stream_error(type, &blk) - assert_http_error(Plum::StreamError, type, &blk) - end +require "timeout" - def refute_raises(&blk) - begin - blk.call - rescue - a = $! - else - a = nil - end - assert(!a, "No exceptions expected but raised: #{a}:\n#{a && a.backtrace.join("\n")}") - end -end - -module ServerTestUtils - private +module ServerUtils def open_server_connection io = StringIO.new @_con = ServerConnection.new(io) @@ -66,8 +36,8 @@ module ServerTestUtils def start_server(&blk) ctx = OpenSSL::SSL::SSLContext.new ctx.alpn_select_cb = -> protocols { "h2" } - ctx.cert = OpenSSL::X509::Certificate.new File.read(File.expand_path("../server.crt", __FILE__)) - ctx.key = OpenSSL::PKey::RSA.new File.read(File.expand_path("../server.key", __FILE__)) + ctx.cert = OpenSSL::X509::Certificate.new File.read(File.expand_path("../../server.crt", __FILE__)) + ctx.key = OpenSSL::PKey::RSA.new File.read(File.expand_path("../../server.key", __FILE__)) tcp_server = TCPServer.new("127.0.0.1", LISTEN_PORT) ssl_server = OpenSSL::SSL::SSLServer.new(tcp_server, ctx) @@ -111,3 +81,7 @@ module ServerTestUtils ssl.close end end + +class Minitest::Test + include ServerUtils +end |