2011-06-06 14:17:44 -04:00
|
|
|
require "cases/helper"
|
2012-01-16 06:36:41 -05:00
|
|
|
require "rack"
|
2009-02-25 04:29:22 -05:00
|
|
|
|
2011-03-28 19:08:42 -04:00
|
|
|
module ActiveRecord
|
|
|
|
module ConnectionAdapters
|
|
|
|
class ConnectionManagementTest < ActiveRecord::TestCase
|
2011-03-28 19:22:37 -04:00
|
|
|
class App
|
|
|
|
attr_reader :calls
|
|
|
|
def initialize
|
|
|
|
@calls = []
|
|
|
|
end
|
|
|
|
|
|
|
|
def call(env)
|
|
|
|
@calls << env
|
2011-03-29 18:37:07 -04:00
|
|
|
[200, {}, ['hi mom']]
|
2011-03-28 19:22:37 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2011-03-28 19:08:42 -04:00
|
|
|
def setup
|
|
|
|
@env = {}
|
2011-03-28 19:22:37 -04:00
|
|
|
@app = App.new
|
2011-03-28 19:08:42 -04:00
|
|
|
@management = ConnectionManagement.new(@app)
|
2010-07-16 16:50:58 -04:00
|
|
|
|
2011-03-28 20:47:46 -04:00
|
|
|
# make sure we have an active connection
|
|
|
|
assert ActiveRecord::Base.connection
|
|
|
|
assert ActiveRecord::Base.connection_handler.active_connections?
|
2011-03-28 19:08:42 -04:00
|
|
|
end
|
2010-07-16 16:50:58 -04:00
|
|
|
|
2013-11-08 10:57:51 -05:00
|
|
|
if Process.respond_to?(:fork)
|
|
|
|
def test_connection_pool_per_pid
|
|
|
|
object_id = ActiveRecord::Base.connection.object_id
|
2012-02-16 17:33:12 -05:00
|
|
|
|
2013-11-08 10:57:51 -05:00
|
|
|
rd, wr = IO.pipe
|
2014-01-17 16:49:10 -05:00
|
|
|
rd.binmode
|
|
|
|
wr.binmode
|
2012-02-16 17:33:12 -05:00
|
|
|
|
2013-11-08 10:57:51 -05:00
|
|
|
pid = fork {
|
|
|
|
rd.close
|
|
|
|
wr.write Marshal.dump ActiveRecord::Base.connection.object_id
|
|
|
|
wr.close
|
|
|
|
exit!
|
|
|
|
}
|
2012-02-16 17:33:12 -05:00
|
|
|
|
|
|
|
wr.close
|
|
|
|
|
2013-11-08 10:57:51 -05:00
|
|
|
Process.waitpid pid
|
|
|
|
assert_not_equal object_id, Marshal.load(rd.read)
|
|
|
|
rd.close
|
|
|
|
end
|
2012-02-16 17:33:12 -05:00
|
|
|
end
|
|
|
|
|
2011-03-28 19:22:37 -04:00
|
|
|
def test_app_delegation
|
|
|
|
manager = ConnectionManagement.new(@app)
|
|
|
|
|
|
|
|
manager.call @env
|
|
|
|
assert_equal [@env], @app.calls
|
|
|
|
end
|
|
|
|
|
2011-03-29 18:37:07 -04:00
|
|
|
def test_connections_are_active_after_call
|
2011-03-28 19:08:42 -04:00
|
|
|
@management.call(@env)
|
2011-03-29 18:37:07 -04:00
|
|
|
assert ActiveRecord::Base.connection_handler.active_connections?
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_body_responds_to_each
|
|
|
|
_, _, body = @management.call(@env)
|
|
|
|
bits = []
|
|
|
|
body.each { |bit| bits << bit }
|
|
|
|
assert_equal ['hi mom'], bits
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_connections_are_cleared_after_body_close
|
|
|
|
_, _, body = @management.call(@env)
|
|
|
|
body.close
|
2011-03-28 20:47:46 -04:00
|
|
|
assert !ActiveRecord::Base.connection_handler.active_connections?
|
2011-03-28 19:08:42 -04:00
|
|
|
end
|
2010-07-16 16:50:58 -04:00
|
|
|
|
2011-03-29 18:37:07 -04:00
|
|
|
def test_active_connections_are_not_cleared_on_body_close_during_test
|
|
|
|
@env['rack.test'] = true
|
|
|
|
_, _, body = @management.call(@env)
|
|
|
|
body.close
|
|
|
|
assert ActiveRecord::Base.connection_handler.active_connections?
|
|
|
|
end
|
|
|
|
|
2011-03-29 18:42:32 -04:00
|
|
|
def test_connections_closed_if_exception
|
2013-07-21 16:11:41 -04:00
|
|
|
app = Class.new(App) { def call(env); raise NotImplementedError; end }.new
|
2011-03-29 18:42:32 -04:00
|
|
|
explosive = ConnectionManagement.new(app)
|
2013-07-21 16:11:41 -04:00
|
|
|
assert_raises(NotImplementedError) { explosive.call(@env) }
|
2011-03-29 18:42:32 -04:00
|
|
|
assert !ActiveRecord::Base.connection_handler.active_connections?
|
|
|
|
end
|
|
|
|
|
2011-03-29 18:47:16 -04:00
|
|
|
def test_connections_not_closed_if_exception_and_test
|
|
|
|
@env['rack.test'] = true
|
|
|
|
app = Class.new(App) { def call(env); raise; end }.new
|
|
|
|
explosive = ConnectionManagement.new(app)
|
|
|
|
assert_raises(RuntimeError) { explosive.call(@env) }
|
|
|
|
assert ActiveRecord::Base.connection_handler.active_connections?
|
|
|
|
end
|
|
|
|
|
2014-09-22 22:26:54 -04:00
|
|
|
def test_connections_closed_if_exception_and_explicitly_not_test
|
|
|
|
@env['rack.test'] = false
|
|
|
|
app = Class.new(App) { def call(env); raise NotImplementedError; end }.new
|
|
|
|
explosive = ConnectionManagement.new(app)
|
|
|
|
assert_raises(NotImplementedError) { explosive.call(@env) }
|
|
|
|
assert !ActiveRecord::Base.connection_handler.active_connections?
|
|
|
|
end
|
|
|
|
|
2011-03-28 19:08:42 -04:00
|
|
|
test "doesn't clear active connections when running in a test case" do
|
|
|
|
@env['rack.test'] = true
|
|
|
|
@management.call(@env)
|
2011-03-28 20:47:46 -04:00
|
|
|
assert ActiveRecord::Base.connection_handler.active_connections?
|
2011-03-28 19:08:42 -04:00
|
|
|
end
|
2011-06-18 17:30:01 -04:00
|
|
|
|
|
|
|
test "proxy is polite to it's body and responds to it" do
|
|
|
|
body = Class.new(String) { def to_path; "/path"; end }.new
|
2012-01-16 06:36:41 -05:00
|
|
|
app = lambda { |_| [200, {}, body] }
|
|
|
|
response_body = ConnectionManagement.new(app).call(@env)[2]
|
|
|
|
assert response_body.respond_to?(:to_path)
|
|
|
|
assert_equal response_body.to_path, "/path"
|
2011-06-18 17:30:01 -04:00
|
|
|
end
|
2011-03-28 19:08:42 -04:00
|
|
|
end
|
2009-02-25 04:29:22 -05:00
|
|
|
end
|
2010-07-16 16:50:58 -04:00
|
|
|
end
|