spec/integration/draft76_spec.rb in em-websocket-0.4.0 vs spec/integration/draft76_spec.rb in em-websocket-0.5.0

- old
+ new

@@ -1,5 +1,7 @@ +# encoding: BINARY + require 'helper' require 'integration/shared_examples' describe "WebSocket server draft76" do include EM::SpecHelper @@ -32,49 +34,46 @@ }, :body => "8jKS\'y:G*Co,Wxa-" } end - it_behaves_like "a websocket server" do - let(:version) { 76 } + def start_server + EM::WebSocket.run(:host => "0.0.0.0", :port => 12345) { |ws| + yield ws if block_given? + } + end - def start_server - EM::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws| - yield ws - } - end + def start_client + client = EM.connect('0.0.0.0', 12345, FakeWebSocketClient) + client.send_data(format_request(@request)) + yield client if block_given? + return client + end - def start_client - client = EM.connect('0.0.0.0', 12345, FakeWebSocketClient) - client.send_data(format_request(@request)) - yield client if block_given? - end + it_behaves_like "a websocket server" do + let(:version) { 76 } end it "should send back the correct handshake response" do em { - EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { } + start_server - # Create a fake client which sends draft 76 handshake - connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient) - connection.send_data(format_request(@request)) - - connection.onopen { - connection.handshake_response.lines.sort. - should == format_response(@response).lines.sort - done + start_client { |connection| + connection.onopen { + connection.handshake_response.lines.sort. + should == format_response(@response).lines.sort + done + } } } end it "should send closing frame back and close the connection after recieving closing frame" do em { - EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { } + start_server - # Create a fake client which sends draft 76 handshake - connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient) - connection.send_data(format_request(@request)) + connection = start_client # Send closing frame after handshake complete connection.onopen { connection.send_data(EM::WebSocket::Handler76::TERMINATE_STRING) } @@ -89,20 +88,18 @@ } end it "should ignore any data received after the closing frame" do em { - EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws| + start_server { |ws| # Fail if foobar message is received ws.onmessage { |msg| fail } } - # Create a fake client which sends draft 76 handshake - connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient) - connection.send_data(format_request(@request)) + connection = start_client # Send closing frame after handshake complete, followed by another msg connection.onopen { connection.send_data(EM::WebSocket::Handler76::TERMINATE_STRING) connection.send('foobar') @@ -114,19 +111,17 @@ } end it "should accept null bytes within the frame after a line return" do em { - EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws| + start_server { |ws| ws.onmessage { |msg| msg.should == "\n\000" } } - # Create a fake client which sends draft 76 handshake - connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient) - connection.send_data(format_request(@request)) + connection = start_client # Send closing frame after handshake complete connection.onopen { connection.send_data("\000\n\000\377") connection.send_data(EM::WebSocket::Handler76::TERMINATE_STRING) @@ -138,21 +133,19 @@ } end it "should handle unreasonable frame lengths by calling onerror callback" do em { - EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |server| + start_server { |server| server.onerror { |error| error.should be_an_instance_of EM::WebSocket::WSMessageTooBigError error.message.should == "Frame length too long (1180591620717411303296 bytes)" done } } - # Create a fake client which sends draft 76 handshake - client = EM.connect('0.0.0.0', 12345, FakeWebSocketClient) - client.send_data(format_request(@request)) + client = start_client # This particular frame indicates a message length of # 1180591620717411303296 bytes. Such a message would previously cause # a "bignum too big to convert into `long'" error. # However it is clearly unreasonable and should be rejected. @@ -162,31 +155,29 @@ } end it "should handle impossible frames by calling onerror callback" do em { - EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |server| + start_server { |server| server.onerror { |error| error.should be_an_instance_of EM::WebSocket::WSProtocolError error.message.should == "Invalid frame received" done } } - # Create a fake client which sends draft 76 handshake - client = EM.connect('0.0.0.0', 12345, FakeWebSocketClient) - client.send_data(format_request(@request)) + client = start_client client.onopen { client.send_data("foobar") # Does not start with \x00 or \xff } } end it "should handle invalid http requests by raising HandshakeError passed to onerror callback" do em { - EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |server| + start_server { |server| server.onerror { |error| error.should be_an_instance_of EM::WebSocket::HandshakeError error.message.should == "Invalid HTTP header: Could not parse data entirely" done } @@ -197,11 +188,11 @@ } end it "should handle handshake request split into two TCP packets" do em { - EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { } + start_server # Create a fake client which sends draft 76 handshake connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient) data = format_request(@request) # Sends first half of the request @@ -215,8 +206,36 @@ EM.add_timer(0.1) do # Sends second half of the request connection.send_data(data[(data.length / 2)..-1]) end + } + end + + it "should report that close codes are not supported" do + em { + start_server { |ws| + ws.onopen { + ws.supports_close_codes?.should == false + done + } + } + start_client + } + end + + it "should call onclose when the server closes the connection [antiregression]" do + em { + start_server { |ws| + ws.onopen { + EM.add_timer(0.1) { + ws.close() + } + } + ws.onclose { + done + } + } + start_client } end end