mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
aaff1a4101
Connection pools are 1:1 with pids.
112 lines
3.3 KiB
Ruby
112 lines
3.3 KiB
Ruby
require "cases/helper"
|
|
require "rack"
|
|
|
|
module ActiveRecord
|
|
module ConnectionAdapters
|
|
class ConnectionManagementTest < ActiveRecord::TestCase
|
|
class App
|
|
attr_reader :calls
|
|
def initialize
|
|
@calls = []
|
|
end
|
|
|
|
def call(env)
|
|
@calls << env
|
|
[200, {}, ['hi mom']]
|
|
end
|
|
end
|
|
|
|
def setup
|
|
@env = {}
|
|
@app = App.new
|
|
@management = ConnectionManagement.new(@app)
|
|
|
|
# make sure we have an active connection
|
|
assert ActiveRecord::Base.connection
|
|
assert ActiveRecord::Base.connection_handler.active_connections?
|
|
end
|
|
|
|
def test_connection_pool_per_pid
|
|
return skip('must support fork') unless Process.respond_to?(:fork)
|
|
|
|
object_id = ActiveRecord::Base.connection.object_id
|
|
|
|
rd, wr = IO.pipe
|
|
|
|
pid = fork {
|
|
rd.close
|
|
wr.write Marshal.dump ActiveRecord::Base.connection.object_id
|
|
wr.close
|
|
exit!
|
|
}
|
|
|
|
wr.close
|
|
|
|
Process.waitpid pid
|
|
assert_not_equal object_id, Marshal.load(rd.read)
|
|
rd.close
|
|
end
|
|
|
|
def test_app_delegation
|
|
manager = ConnectionManagement.new(@app)
|
|
|
|
manager.call @env
|
|
assert_equal [@env], @app.calls
|
|
end
|
|
|
|
def test_connections_are_active_after_call
|
|
@management.call(@env)
|
|
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
|
|
assert !ActiveRecord::Base.connection_handler.active_connections?
|
|
end
|
|
|
|
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
|
|
|
|
def test_connections_closed_if_exception
|
|
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
|
|
|
|
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
|
|
|
|
test "doesn't clear active connections when running in a test case" do
|
|
@env['rack.test'] = true
|
|
@management.call(@env)
|
|
assert ActiveRecord::Base.connection_handler.active_connections?
|
|
end
|
|
|
|
test "proxy is polite to it's body and responds to it" do
|
|
body = Class.new(String) { def to_path; "/path"; end }.new
|
|
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"
|
|
end
|
|
end
|
|
end
|
|
end
|