-
Notifications
You must be signed in to change notification settings - Fork 54
/
reel_spec.rb
76 lines (68 loc) · 2.2 KB
/
reel_spec.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
require 'spec_helper'
require 'webmachine/spec/adapter_lint'
describe Webmachine::Adapters::Reel do
context 'lint' do
it_should_behave_like :adapter_lint
end
context 'websockets' do
let(:application) { Webmachine::Application.new }
let(:adapter) do
server = TCPServer.new('0.0.0.0', 0)
application.configuration.port = server.addr[1]
server.close
described_class.new(application)
end
let(:example_host) { "www.example.com" }
let(:example_path) { "/example"}
let(:example_url) { "ws://#{example_host}#{example_path}" }
let :handshake_headers do
{
"Host" => example_host,
"Upgrade" => "websocket",
"Connection" => "Upgrade",
"Sec-WebSocket-Key" => "dGhlIHNhbXBsZSBub25jZQ==",
"Origin" => "http://example.com",
"Sec-WebSocket-Protocol" => "chat, superchat",
"Sec-WebSocket-Version" => "13"
}
end
let(:client_message) { "Hi server!" }
let(:server_message) { "Hi client!" }
it 'supports websockets' do
application.configuration.adapter_options[:websocket_handler] = proc do |socket|
expect(socket.read).to eq client_message
socket << server_message
end
reel_server(adapter) do |client|
client << WebSocket::ClientHandshake.new(:get, example_url, handshake_headers).to_data
# Discard handshake response
# FIXME: hax
client.readpartial(4096)
client << WebSocket::Message.new(client_message).to_data
parser = WebSocket::Parser.new
parser.append client.readpartial(4096) until message = parser.next_message
expect(message).to eq server_message
end
end
end
def reel_server(adptr = adapter)
thread = Thread.new { adptr.run }
begin
timeout(5) do
begin
sock = TCPSocket.new(adptr.application.configuration.ip, adptr.application.configuration.port)
begin
yield(sock)
ensure
sock.close
end
rescue Errno::ECONNREFUSED
Thread.pass
retry
end
end
ensure
thread.kill if thread
end
end
end