From bb89b920d9937963cc7045e7345ec15990339c31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Mon, 13 Apr 2015 16:21:37 +0300 Subject: Even more SPDY tests --- test/spdy_SUITE.erl | 23 +++++++++++++++++++++-- test/spdy_server.erl | 7 +++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/test/spdy_SUITE.erl b/test/spdy_SUITE.erl index b19146f..d2a6d43 100644 --- a/test/spdy_SUITE.erl +++ b/test/spdy_SUITE.erl @@ -91,7 +91,7 @@ reject_data_on_non_existing_stream(_) -> [{rst_stream, 1, invalid_stream}] = spdy_server:stop(ServerPid). %% @todo This probably applies to HEADERS frame or SYN_STREAM from server push. -reject_data_on_non_existing_stream_after_goaway(_) -> +ignore_data_on_non_existing_stream_after_goaway(_) -> %% Note: this is not explicitly written in the specification. %% However the HTTP/2 draft tells us that we can discard frames %% with identifiers higher than the identified last stream, @@ -285,7 +285,7 @@ goaway_last_good_streamid(_) -> {syn_reply, 0, true, <<"200">>, <<"HTTP/1.1">>, []} ]), wait(), - [{goaway, 6, protocol_error}] = spdy_server:stop(ServerPid), + [_, {goaway, 6, protocol_error}] = spdy_server:stop(ServerPid), down(). dont_send_rst_stream_on_rst_stream(_) -> @@ -313,3 +313,22 @@ coalesce_multiple_identical_rst_stream(_) -> ]), wait(), [{rst_stream, 1, invalid_stream}] = spdy_server:stop(ServerPid). + +%% @todo I am not sure how to adequately test that we don't send bad flags. +syn_stream_ignore_unknown_flags(_) -> + doc("Unknown flags must be ignored. (spdy-protocol-draft3-1 2.6.1)"), + {ok, ServerPid, Port} = spdy_server:start_link(), + {ok, ConnPid} = gun:open("localhost", Port, #{transport=>ssl}), + {ok, spdy} = gun:await_up(ConnPid), + _ = gun:get(ConnPid, "/"), + %% Build a SYN_STREAM frame with all flag bits set to 1. + << Before:32/bits, _:8, After/bits >> = iolist_to_binary(cow_spdy:syn_stream(cow_spdy:deflate_init(), + 2, 1, true, true, 0, <<"GET">>, <<"https">>, ["localhost:", integer_to_binary(Port)], "/a", <<"HTTP/1.1">>, [])), + Frame = << Before/bits, 1:1, 1:1, 1:1, 1:1, 1:1, 1:1, 1:1, 1:1, After/bits >>, + spdy_server:send_raw(ServerPid, Frame), + spdy_server:send(ServerPid, [ + {syn_reply, 1, true, <<"200">>, <<"HTTP/1.1">>, []} + ]), + wait(), + [_] = spdy_server:stop(ServerPid), + down(). diff --git a/test/spdy_server.erl b/test/spdy_server.erl index 4690270..deec356 100644 --- a/test/spdy_server.erl +++ b/test/spdy_server.erl @@ -19,6 +19,7 @@ -export([start_link/0]). -export([stop/1]). -export([send/2]). +-export([send_raw/2]). %% gen_server. -export([init/1]). @@ -58,6 +59,9 @@ stop(Pid) -> send(Pid, Frames) -> gen_server:call(Pid, {send, Frames}). +send_raw(Pid, Data) -> + gen_server:call(Pid, {send_raw, Data}). + %% gen_server. init([Owner]) -> @@ -74,6 +78,9 @@ init([Owner]) -> handle_call({send, Frames}, {Owner, _}, State=#state{owner=Owner, socket=Socket, zdef=Zdef}) -> do_send(Frames, Socket, Zdef), {reply, ok, State}; +handle_call({send_raw, Data}, {Owner, _}, State=#state{owner=Owner, socket=Socket}) -> + ssl:send(Socket, Data), + {reply, ok, State}; handle_call(stop, {Owner, _}, State=#state{owner=Owner, recording=Recording}) -> {stop, normal, lists:reverse(Recording), State}; handle_call(_Request, _From, State) -> -- cgit v1.2.3