em-websocket 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,5 @@
1
1
  require 'helper'
2
+ require 'integration/shared_examples'
2
3
 
3
4
  describe "draft05" do
4
5
  include EM::SpecHelper
@@ -22,26 +23,30 @@ describe "draft05" do
22
23
  end
23
24
 
24
25
  def start_server
25
- EM::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws|
26
- yield ws
26
+ EM::WebSocket.run(:host => "0.0.0.0", :port => 12345) { |ws|
27
+ yield ws if block_given?
27
28
  }
28
29
  end
29
30
 
30
31
  def start_client
31
- client = EM.connect('0.0.0.0', 12345, Draft03FakeWebSocketClient)
32
+ client = EM.connect('0.0.0.0', 12345, Draft05FakeWebSocketClient)
32
33
  client.send_data(format_request(@request))
33
34
  yield client if block_given?
35
+ return client
34
36
  end
35
37
 
36
- it "should open connection" do
38
+ it_behaves_like "a websocket server" do
39
+ let(:version) { 5 }
40
+ end
41
+
42
+ it "should report that close codes are not supported" do
37
43
  em {
38
- start_server { |server|
39
- server.onopen {
40
- server.instance_variable_get(:@handler).class.should == EventMachine::WebSocket::Handler05
44
+ start_server { |ws|
45
+ ws.onopen {
46
+ ws.supports_close_codes?.should == false
41
47
  done
42
48
  }
43
49
  }
44
-
45
50
  start_client
46
51
  }
47
52
  end
@@ -1,4 +1,5 @@
1
1
  require 'helper'
2
+ require 'integration/shared_examples'
2
3
 
3
4
  describe "draft06" do
4
5
  include EM::SpecHelper
@@ -31,17 +32,22 @@ describe "draft06" do
31
32
  end
32
33
 
33
34
  def start_server
34
- EM::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws|
35
- yield ws
35
+ EM::WebSocket.run(:host => "0.0.0.0", :port => 12345) { |ws|
36
+ yield ws if block_given?
36
37
  }
37
38
  end
38
39
 
39
40
  def start_client
40
- client = EM.connect('0.0.0.0', 12345, Draft03FakeWebSocketClient)
41
+ client = EM.connect('0.0.0.0', 12345, Draft05FakeWebSocketClient)
41
42
  client.send_data(format_request(@request))
42
43
  yield client if block_given?
44
+ return client
43
45
  end
44
46
 
47
+ it_behaves_like "a websocket server" do
48
+ let(:version) { 6 }
49
+ end
50
+
45
51
  it "should open connection" do
46
52
  em {
47
53
  start_server { |server|
@@ -82,4 +88,60 @@ describe "draft06" do
82
88
  }
83
89
  }
84
90
  end
91
+
92
+ it "should return close code and reason if closed via handshake" do
93
+ em {
94
+ start_server { |ws|
95
+ ws.onclose { |event|
96
+ # 2. Receive close event in server
97
+ event.should == {
98
+ :code => 4004,
99
+ :reason => "close reason",
100
+ :was_clean => true,
101
+ }
102
+ done
103
+ }
104
+ }
105
+ start_client { |client|
106
+ client.onopen {
107
+ # 1: Send close handshake
108
+ close_data = [4004].pack('n')
109
+ close_data << "close reason"
110
+ client.send_frame(:close, close_data)
111
+ }
112
+ }
113
+ }
114
+ end
115
+
116
+ it "should return close code 1005 if no code was specified" do
117
+ em {
118
+ start_server { |ws|
119
+ ws.onclose { |event|
120
+ event.should == {
121
+ :code => 1005,
122
+ :reason => "",
123
+ :was_clean => true,
124
+ }
125
+ done
126
+ }
127
+ }
128
+ start_client { |client|
129
+ client.onopen {
130
+ client.send_frame(:close, '')
131
+ }
132
+ }
133
+ }
134
+ end
135
+
136
+ it "should report that close codes are supported" do
137
+ em {
138
+ start_server { |ws|
139
+ ws.onopen {
140
+ ws.supports_close_codes?.should == true
141
+ done
142
+ }
143
+ }
144
+ start_client
145
+ }
146
+ end
85
147
  end
@@ -1,3 +1,5 @@
1
+ # encoding: BINARY
2
+
1
3
  require 'helper'
2
4
  require 'integration/shared_examples'
3
5
 
@@ -31,29 +33,28 @@ describe "draft13" do
31
33
  }
32
34
  end
33
35
 
34
- it_behaves_like "a websocket server" do
35
- let(:version) { 13 }
36
+ def start_server
37
+ EM::WebSocket.run(:host => "0.0.0.0", :port => 12345) { |ws|
38
+ yield ws if block_given?
39
+ }
40
+ end
36
41
 
37
- def start_server
38
- EM::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws|
39
- yield ws
40
- }
41
- end
42
+ def start_client
43
+ client = EM.connect('0.0.0.0', 12345, Draft07FakeWebSocketClient)
44
+ client.send_data(format_request(@request))
45
+ yield client if block_given?
46
+ return client
47
+ end
42
48
 
43
- def start_client
44
- client = EM.connect('0.0.0.0', 12345, Draft07FakeWebSocketClient)
45
- client.send_data(format_request(@request))
46
- yield client if block_given?
47
- end
49
+ it_behaves_like "a websocket server" do
50
+ let(:version) { 13 }
48
51
  end
49
52
 
50
53
  it "should send back the correct handshake response" do
51
54
  em {
52
- EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { }
55
+ start_server
53
56
 
54
- # Create a fake client which sends draft 13 handshake
55
- connection = EM.connect('0.0.0.0', 12345, Draft07FakeWebSocketClient)
56
- connection.send_data(format_request(@request))
57
+ connection = start_client
57
58
 
58
59
  connection.onopen {
59
60
  connection.handshake_response.lines.sort.
@@ -66,7 +67,7 @@ describe "draft13" do
66
67
  # TODO: This test would be much nicer with a real websocket client...
67
68
  it "should support sending pings and binding to onpong" do
68
69
  em {
69
- EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws|
70
+ start_server { |ws|
70
71
  ws.onopen {
71
72
  ws.should be_pingable
72
73
  EM.next_tick {
@@ -80,9 +81,7 @@ describe "draft13" do
80
81
  }
81
82
  }
82
83
 
83
- # Create a fake client which sends draft 13 handshake
84
- connection = EM.connect('0.0.0.0', 12345, Draft07FakeWebSocketClient)
85
- connection.send_data(format_request(@request))
84
+ connection = start_client
86
85
 
87
86
  # Confusing, fake onmessage means any data after the handshake
88
87
  connection.onmessage { |data|
@@ -93,4 +92,16 @@ describe "draft13" do
93
92
  }
94
93
  }
95
94
  end
95
+
96
+ it "should report that close codes are supported" do
97
+ em {
98
+ start_server { |ws|
99
+ ws.onopen {
100
+ ws.supports_close_codes?.should == true
101
+ done
102
+ }
103
+ }
104
+ start_client
105
+ }
106
+ end
96
107
  end
@@ -9,19 +9,20 @@ describe "WebSocket server draft75" do
9
9
  include EM::SpecHelper
10
10
  default_timeout 1
11
11
 
12
- it_behaves_like "a websocket server" do
13
- let(:version) { 75 }
12
+ def start_server
13
+ EM::WebSocket.run(:host => "0.0.0.0", :port => 12345) { |ws|
14
+ yield ws if block_given?
15
+ }
16
+ end
14
17
 
15
- def start_server
16
- EM::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws|
17
- yield ws
18
- }
19
- end
18
+ def start_client
19
+ client = Draft75WebSocketClient.new
20
+ yield client if block_given?
21
+ return client
22
+ end
20
23
 
21
- def start_client
22
- client = Draft75WebSocketClient.new
23
- yield client if block_given?
24
- end
24
+ it_behaves_like "a websocket server" do
25
+ let(:version) { 75 }
25
26
  end
26
27
 
27
28
  it "should automatically complete WebSocket handshake" do
@@ -38,11 +39,11 @@ describe "WebSocket server draft75" do
38
39
  }
39
40
  end
40
41
 
41
- EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) do |ws|
42
+ start_server { |ws|
42
43
  ws.onopen {
43
44
  ws.send MSG
44
45
  }
45
- end
46
+ }
46
47
  }
47
48
  end
48
49
 
@@ -62,7 +63,7 @@ describe "WebSocket server draft75" do
62
63
  }
63
64
  end
64
65
 
65
- EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) do |ws|
66
+ start_server { |ws|
66
67
  ws.onopen {}
67
68
  ws.onclose {}
68
69
  ws.onmessage {|msg|
@@ -71,7 +72,7 @@ describe "WebSocket server draft75" do
71
72
 
72
73
  EventMachine.stop if received.size == messages.size
73
74
  }
74
- end
75
+ }
75
76
  }
76
77
  end
77
78
 
@@ -87,13 +88,13 @@ describe "WebSocket server draft75" do
87
88
  http.stream{|msg|}
88
89
  end
89
90
 
90
- EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) do |ws|
91
+ start_server { |ws|
91
92
  ws.onopen {}
92
93
  ws.onclose {
93
94
  ws.state.should == :closed
94
95
  EventMachine.stop
95
96
  }
96
- end
97
+ }
97
98
  }
98
99
  end
99
100
 
@@ -105,7 +106,7 @@ describe "WebSocket server draft75" do
105
106
  http.callback { fail }
106
107
  end
107
108
 
108
- EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) do |ws|
109
+ start_server { |ws|
109
110
  ws.onopen { fail }
110
111
  ws.onclose { EventMachine.stop }
111
112
  ws.onerror {|e|
@@ -113,7 +114,19 @@ describe "WebSocket server draft75" do
113
114
  e.message.should match('Not an upgrade request')
114
115
  EventMachine.stop
115
116
  }
116
- end
117
+ }
118
+ }
119
+ end
120
+
121
+ it "should report that close codes are not supported" do
122
+ em {
123
+ start_server { |ws|
124
+ ws.onopen {
125
+ ws.supports_close_codes?.should == false
126
+ done
127
+ }
128
+ }
129
+ start_client
117
130
  }
118
131
  end
119
132
  end
@@ -1,3 +1,5 @@
1
+ # encoding: BINARY
2
+
1
3
  require 'helper'
2
4
  require 'integration/shared_examples'
3
5
 
@@ -34,45 +36,42 @@ describe "WebSocket server draft76" do
34
36
  }
35
37
  end
36
38
 
37
- it_behaves_like "a websocket server" do
38
- let(:version) { 76 }
39
+ def start_server
40
+ EM::WebSocket.run(:host => "0.0.0.0", :port => 12345) { |ws|
41
+ yield ws if block_given?
42
+ }
43
+ end
39
44
 
40
- def start_server
41
- EM::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws|
42
- yield ws
43
- }
44
- end
45
+ def start_client
46
+ client = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
47
+ client.send_data(format_request(@request))
48
+ yield client if block_given?
49
+ return client
50
+ end
45
51
 
46
- def start_client
47
- client = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
48
- client.send_data(format_request(@request))
49
- yield client if block_given?
50
- end
52
+ it_behaves_like "a websocket server" do
53
+ let(:version) { 76 }
51
54
  end
52
55
 
53
56
  it "should send back the correct handshake response" do
54
57
  em {
55
- EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { }
56
-
57
- # Create a fake client which sends draft 76 handshake
58
- connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
59
- connection.send_data(format_request(@request))
58
+ start_server
60
59
 
61
- connection.onopen {
62
- connection.handshake_response.lines.sort.
63
- should == format_response(@response).lines.sort
64
- done
60
+ start_client { |connection|
61
+ connection.onopen {
62
+ connection.handshake_response.lines.sort.
63
+ should == format_response(@response).lines.sort
64
+ done
65
+ }
65
66
  }
66
67
  }
67
68
  end
68
69
 
69
70
  it "should send closing frame back and close the connection after recieving closing frame" do
70
71
  em {
71
- EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { }
72
+ start_server
72
73
 
73
- # Create a fake client which sends draft 76 handshake
74
- connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
75
- connection.send_data(format_request(@request))
74
+ connection = start_client
76
75
 
77
76
  # Send closing frame after handshake complete
78
77
  connection.onopen {
@@ -91,16 +90,14 @@ describe "WebSocket server draft76" do
91
90
 
92
91
  it "should ignore any data received after the closing frame" do
93
92
  em {
94
- EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws|
93
+ start_server { |ws|
95
94
  # Fail if foobar message is received
96
95
  ws.onmessage { |msg|
97
96
  fail
98
97
  }
99
98
  }
100
99
 
101
- # Create a fake client which sends draft 76 handshake
102
- connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
103
- connection.send_data(format_request(@request))
100
+ connection = start_client
104
101
 
105
102
  # Send closing frame after handshake complete, followed by another msg
106
103
  connection.onopen {
@@ -116,15 +113,13 @@ describe "WebSocket server draft76" do
116
113
 
117
114
  it "should accept null bytes within the frame after a line return" do
118
115
  em {
119
- EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws|
116
+ start_server { |ws|
120
117
  ws.onmessage { |msg|
121
118
  msg.should == "\n\000"
122
119
  }
123
120
  }
124
121
 
125
- # Create a fake client which sends draft 76 handshake
126
- connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
127
- connection.send_data(format_request(@request))
122
+ connection = start_client
128
123
 
129
124
  # Send closing frame after handshake complete
130
125
  connection.onopen {
@@ -140,7 +135,7 @@ describe "WebSocket server draft76" do
140
135
 
141
136
  it "should handle unreasonable frame lengths by calling onerror callback" do
142
137
  em {
143
- EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |server|
138
+ start_server { |server|
144
139
  server.onerror { |error|
145
140
  error.should be_an_instance_of EM::WebSocket::WSMessageTooBigError
146
141
  error.message.should == "Frame length too long (1180591620717411303296 bytes)"
@@ -148,9 +143,7 @@ describe "WebSocket server draft76" do
148
143
  }
149
144
  }
150
145
 
151
- # Create a fake client which sends draft 76 handshake
152
- client = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
153
- client.send_data(format_request(@request))
146
+ client = start_client
154
147
 
155
148
  # This particular frame indicates a message length of
156
149
  # 1180591620717411303296 bytes. Such a message would previously cause
@@ -164,7 +157,7 @@ describe "WebSocket server draft76" do
164
157
 
165
158
  it "should handle impossible frames by calling onerror callback" do
166
159
  em {
167
- EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |server|
160
+ start_server { |server|
168
161
  server.onerror { |error|
169
162
  error.should be_an_instance_of EM::WebSocket::WSProtocolError
170
163
  error.message.should == "Invalid frame received"
@@ -172,9 +165,7 @@ describe "WebSocket server draft76" do
172
165
  }
173
166
  }
174
167
 
175
- # Create a fake client which sends draft 76 handshake
176
- client = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
177
- client.send_data(format_request(@request))
168
+ client = start_client
178
169
 
179
170
  client.onopen {
180
171
  client.send_data("foobar") # Does not start with \x00 or \xff
@@ -184,7 +175,7 @@ describe "WebSocket server draft76" do
184
175
 
185
176
  it "should handle invalid http requests by raising HandshakeError passed to onerror callback" do
186
177
  em {
187
- EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |server|
178
+ start_server { |server|
188
179
  server.onerror { |error|
189
180
  error.should be_an_instance_of EM::WebSocket::HandshakeError
190
181
  error.message.should == "Invalid HTTP header: Could not parse data entirely"
@@ -199,7 +190,7 @@ describe "WebSocket server draft76" do
199
190
 
200
191
  it "should handle handshake request split into two TCP packets" do
201
192
  em {
202
- EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { }
193
+ start_server
203
194
 
204
195
  # Create a fake client which sends draft 76 handshake
205
196
  connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
@@ -219,4 +210,32 @@ describe "WebSocket server draft76" do
219
210
  end
220
211
  }
221
212
  end
213
+
214
+ it "should report that close codes are not supported" do
215
+ em {
216
+ start_server { |ws|
217
+ ws.onopen {
218
+ ws.supports_close_codes?.should == false
219
+ done
220
+ }
221
+ }
222
+ start_client
223
+ }
224
+ end
225
+
226
+ it "should call onclose when the server closes the connection [antiregression]" do
227
+ em {
228
+ start_server { |ws|
229
+ ws.onopen {
230
+ EM.add_timer(0.1) {
231
+ ws.close()
232
+ }
233
+ }
234
+ ws.onclose {
235
+ done
236
+ }
237
+ }
238
+ start_client
239
+ }
240
+ end
222
241
  end