112 lines
3.0 KiB
Ruby
112 lines
3.0 KiB
Ruby
require 'helper'
|
|
|
|
# These tests are not specific to any particular draft of the specification
|
|
#
|
|
describe "WebSocket server" do
|
|
include EM::SpecHelper
|
|
default_timeout 1
|
|
|
|
it "should fail on non WebSocket requests" do
|
|
em {
|
|
EM.add_timer(0.1) do
|
|
http = EM::HttpRequest.new('http://127.0.0.1:12345/').get :timeout => 0
|
|
http.errback { done }
|
|
http.callback { fail }
|
|
end
|
|
|
|
start_server
|
|
}
|
|
end
|
|
|
|
it "should expose the WebSocket request headers, path and query params" do
|
|
em {
|
|
EM.add_timer(0.1) do
|
|
ws = EventMachine::WebSocketClient.connect('ws://127.0.0.1:12345/',
|
|
:origin => 'http://example.com')
|
|
ws.errback { fail }
|
|
ws.callback { ws.close_connection }
|
|
ws.stream { |msg| }
|
|
end
|
|
|
|
start_server do |ws|
|
|
ws.onopen { |handshake|
|
|
headers = handshake.headers
|
|
headers["Connection"].should == "Upgrade"
|
|
headers["Upgrade"].should == "websocket"
|
|
headers["Host"].to_s.should == "127.0.0.1:12345"
|
|
handshake.path.should == "/"
|
|
handshake.query.should == {}
|
|
handshake.origin.should == 'http://example.com'
|
|
}
|
|
ws.onclose {
|
|
ws.state.should == :closed
|
|
done
|
|
}
|
|
end
|
|
}
|
|
end
|
|
|
|
it "should expose the WebSocket path and query params when nonempty" do
|
|
em {
|
|
EM.add_timer(0.1) do
|
|
ws = EventMachine::WebSocketClient.connect('ws://127.0.0.1:12345/hello?foo=bar&baz=qux')
|
|
ws.errback { fail }
|
|
ws.callback {
|
|
ws.close_connection
|
|
}
|
|
ws.stream { |msg| }
|
|
end
|
|
|
|
start_server do |ws|
|
|
ws.onopen { |handshake|
|
|
handshake.path.should == '/hello'
|
|
handshake.query_string.split('&').sort.
|
|
should == ["baz=qux", "foo=bar"]
|
|
handshake.query.should == {"foo"=>"bar", "baz"=>"qux"}
|
|
}
|
|
ws.onclose {
|
|
ws.state.should == :closed
|
|
done
|
|
}
|
|
end
|
|
}
|
|
end
|
|
|
|
it "should raise an exception if frame sent before handshake complete" do
|
|
em {
|
|
# 1. Start WebSocket server
|
|
start_server { |ws|
|
|
# 3. Try to send a message to the socket
|
|
lambda {
|
|
ws.send('early message')
|
|
}.should raise_error('Cannot send data before onopen callback')
|
|
done
|
|
}
|
|
|
|
# 2. Connect a dumb TCP connection (will not send handshake)
|
|
EM.connect('0.0.0.0', 12345, EM::Connection)
|
|
}
|
|
end
|
|
|
|
it "should allow the server to be started inside an existing EM" do
|
|
em {
|
|
EM.add_timer(0.1) do
|
|
http = EM::HttpRequest.new('http://127.0.0.1:12345/').get :timeout => 0
|
|
http.errback { |e| done }
|
|
http.callback { fail }
|
|
end
|
|
|
|
start_server do |ws|
|
|
ws.onopen { |handshake|
|
|
headers = handshake.headers
|
|
headers["Host"].to_s.should == "127.0.0.1:12345"
|
|
}
|
|
ws.onclose {
|
|
ws.state.should == :closed
|
|
done
|
|
}
|
|
end
|
|
}
|
|
end
|
|
end
|