spec/reel/websocket_spec.rb in reel-0.5.0 vs spec/reel/websocket_spec.rb in reel-0.6.0.pre1
- old
+ new
@@ -1,8 +1,9 @@
require 'spec_helper'
+require 'websocket_parser'
-describe Reel::WebSocket do
+RSpec.describe Reel::WebSocket do
include WebSocketHelpers
let(:example_message) { "Hello, World!" }
let(:another_message) { "What's going on?" }
@@ -10,100 +11,174 @@
with_socket_pair do |client, peer|
connection = Reel::Connection.new(peer)
client << handshake.to_data
request = connection.request
- request.should be_websocket
+ expect(request).to be_websocket
websocket = request.websocket
- websocket.should be_a Reel::WebSocket
+ expect(websocket).to be_a Reel::WebSocket
- handshake.errors.should be_empty
+ expect(handshake.errors).to be_empty
end
end
it "raises an error if trying to close a connection upgraded to socket" do
with_socket_pair do |client, peer|
connection = Reel::Connection.new(peer)
client << handshake.to_data
websocket = connection.request.websocket
- websocket.should be_a Reel::WebSocket
+ expect(websocket).to be_a Reel::WebSocket
expect { connection.close }.to raise_error(Reel::StateError)
end
end
it "knows its URL" do
with_websocket_pair do |_, websocket|
- websocket.url.should == example_path
+ expect(websocket.url).to eq(example_path)
end
end
it "knows its headers" do
with_websocket_pair do |_, websocket|
- websocket['Host'].should == example_host
+ expect(websocket['Host']).to eq(example_host)
end
end
it "reads frames" do
with_websocket_pair do |client, websocket|
- client << WebSocket::Message.new(example_message).to_data
- client << WebSocket::Message.new(another_message).to_data
+ message = WebSocket::Message.new(example_message)
+ message.mask!
+ next_message = WebSocket::Message.new(another_message)
+ next_message.mask!
+ client << message.to_data
+ client << next_message.to_data
- websocket.read.should == example_message
- websocket.read.should == another_message
+ expect(websocket.read).to eq(example_message)
+ expect(websocket.read).to eq(another_message)
end
end
+ describe "WebSocket#next_message" do
+ it "triggers on the next sent message" do
+ with_websocket_pair do |client, websocket|
+ f = Celluloid::Future.new
+ websocket.on_message do |message|
+ f << Celluloid::SuccessResponse.new(:on_message, message)
+ end
+
+ message = WebSocket::Message.new(example_message)
+ message.mask!
+ client << message.to_data
+ websocket.read
+
+ message = f.value
+ expect(message).to eq(example_message)
+ end
+ end
+ end
+
+ describe "WebSocket#read_every" do
+ it "automatically executes read" do
+ with_websocket_pair do |client, websocket|
+ class MyActor
+ include Celluloid
+
+ def initialize(websocket)
+ websocket.read_every 0.1
+ end
+ end
+
+ f = Celluloid::Future.new
+ websocket.on_message do |message|
+ f << Celluloid::SuccessResponse.new(:on_message, message)
+ end
+
+ message = WebSocket::Message.new(example_message)
+ message.mask!
+ client << message.to_data
+ MyActor.new(websocket)
+
+ message = f.value
+ expect(message).to eq(example_message)
+ end
+ end
+ end
+
it "writes messages" do
with_websocket_pair do |client, websocket|
websocket.write example_message
websocket.write another_message
parser = WebSocket::Parser.new
parser.append client.readpartial(4096) until first_message = parser.next_message
- first_message.should == example_message
+ expect(first_message).to eq(example_message)
parser.append client.readpartial(4096) until next_message = parser.next_message
- next_message.should == another_message
+ expect(next_message).to eq(another_message)
end
end
it "closes" do
with_websocket_pair do |_, websocket|
- websocket.should_not be_closed
+ expect(websocket).not_to be_closed
websocket.close
- websocket.should be_closed
+ expect(websocket).to be_closed
end
end
+ it "exposes addr and peeraddr" do
+ with_websocket_pair do |client, websocket|
+ expect(websocket).to respond_to(:peeraddr)
+ expect(websocket.peeraddr.first).to eq "AF_INET"
+ expect(websocket).to respond_to(:addr)
+ expect(websocket.addr.first).to eq "AF_INET"
+ end
+ end
+
it "raises a RequestError when connection used after it was upgraded" do
with_socket_pair do |client, peer|
connection = Reel::Connection.new(peer)
client << handshake.to_data
remote_host = connection.remote_host
request = connection.request
- request.should be_websocket
+ expect(request).to be_websocket
websocket = request.websocket
- websocket.should be_a Reel::WebSocket
+ expect(websocket).to be_a Reel::WebSocket
expect { connection.remote_host }.to raise_error(Reel::StateError)
- websocket.remote_host.should == remote_host
+ expect(websocket.remote_host).to eq(remote_host)
end
end
+ it "performs websocket handshakes with header key case-insensitivity" do
+ with_socket_pair do |client, peer|
+ connection = Reel::Connection.new(peer)
+ client << case_handshake.to_data
+
+ request = connection.request
+ expect(request).to be_websocket
+
+ websocket = request.websocket
+ expect(websocket).to be_a Reel::WebSocket
+
+ expect(case_handshake.errors).to be_empty
+ end
+ end
+
def with_websocket_pair
with_socket_pair do |client, peer|
connection = Reel::Connection.new(peer)
client << handshake.to_data
request = connection.request
- request.should be_websocket
+ expect(request).to be_websocket
websocket = request.websocket
- websocket.should be_a Reel::WebSocket
+ expect(websocket).to be_a Reel::WebSocket
# Discard handshake
client.readpartial(4096)
yield client, websocket