aboutsummaryrefslogtreecommitdiffstats
path: root/actioncable/test/connection/client_socket_test.rb
diff options
context:
space:
mode:
Diffstat (limited to 'actioncable/test/connection/client_socket_test.rb')
-rw-r--r--actioncable/test/connection/client_socket_test.rb40
1 files changed, 29 insertions, 11 deletions
diff --git a/actioncable/test/connection/client_socket_test.rb b/actioncable/test/connection/client_socket_test.rb
index 4af071b4da..bc3ff6a3d7 100644
--- a/actioncable/test/connection/client_socket_test.rb
+++ b/actioncable/test/connection/client_socket_test.rb
@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'stubs/test_server'
+require "test_helper"
+require "stubs/test_server"
class ActionCable::Connection::ClientSocketTest < ActionCable::TestCase
class Connection < ActionCable::Connection::Base
@@ -32,28 +32,46 @@ class ActionCable::Connection::ClientSocketTest < ActionCable::TestCase
@server.config.allowed_request_origins = %w( http://rubyonrails.com )
end
- test 'delegate socket errors to on_error handler' do
- skip if ENV['FAYE'].present?
-
+ test "delegate socket errors to on_error handler" do
run_in_eventmachine do
connection = open_connection
# Internal hax = :(
client = connection.websocket.send(:websocket)
- client.instance_variable_get('@stream').expects(:write).raises('foo')
+ client.instance_variable_get("@stream").expects(:write).raises("foo")
client.expects(:client_gone).never
- client.write('boo')
+ client.write("boo")
assert_equal %w[ foo ], connection.errors
end
end
+ test "closes hijacked i/o socket at shutdown" do
+ run_in_eventmachine do
+ connection = open_connection
+
+ client = connection.websocket.send(:websocket)
+ event = Concurrent::Event.new
+ client.instance_variable_get("@stream")
+ .instance_variable_get("@rack_hijack_io")
+ .define_singleton_method(:close) { event.set }
+ connection.close
+ event.wait
+ end
+ end
+
private
def open_connection
- env = Rack::MockRequest.env_for '/test',
- 'HTTP_CONNECTION' => 'upgrade', 'HTTP_UPGRADE' => 'websocket',
- 'HTTP_HOST' => 'localhost', 'HTTP_ORIGIN' => 'http://rubyonrails.com'
- env['rack.hijack'] = -> { env['rack.hijack_io'] = StringIO.new }
+ env = Rack::MockRequest.env_for "/test",
+ "HTTP_CONNECTION" => "upgrade", "HTTP_UPGRADE" => "websocket",
+ "HTTP_HOST" => "localhost", "HTTP_ORIGIN" => "http://rubyonrails.com"
+ io = \
+ begin
+ Socket.pair(Socket::AF_UNIX, Socket::SOCK_STREAM, 0).first
+ rescue
+ StringIO.new
+ end
+ env["rack.hijack"] = -> { env["rack.hijack_io"] = io }
Connection.new(@server, env).tap do |connection|
connection.process