Allow port to be specified on initialize, closes #685

This commit is contained in:
Jonas Nicklas 2012-07-13 15:19:20 +02:00
parent 6f145fb069
commit 6d68242d1a
3 changed files with 22 additions and 14 deletions

View File

@ -33,10 +33,13 @@ module Capybara
attr_reader :app, :port
def initialize(app)
def initialize(app, port=Capybara.server_port)
@app = app
@middleware = Middleware.new(@app)
@server_thread = nil # supress warnings
@port = port
@port ||= Capybara::Server.ports[@app.object_id]
@port ||= find_available_port
end
def reset_error!
@ -64,19 +67,14 @@ module Capybara
end
def boot
if @app
@port = Capybara::Server.ports[@app.object_id]
unless responsive?
Capybara::Server.ports[@app.object_id] = @port
if not @port or not responsive?
@port = Capybara.server_port || find_available_port
Capybara::Server.ports[@app.object_id] = @port
@server_thread = Thread.new do
Capybara.server.call(@middleware, @port)
end
Timeout.timeout(60) { @server_thread.join(0.1) until responsive? }
@server_thread = Thread.new do
Capybara.server.call(@middleware, @port)
end
Timeout.timeout(60) { @server_thread.join(0.1) until responsive? }
end
rescue TimeoutError
raise "Rack application timed out during boot"

View File

@ -50,8 +50,8 @@ module Capybara
def initialize(mode, app=nil)
@mode = mode
@app = app
if Capybara.run_server and driver.needs_server?
@server = Capybara::Server.new(@app).tap(&:boot)
if Capybara.run_server and @app and driver.needs_server?
@server = Capybara::Server.new(@app).boot
end
end

View File

@ -39,6 +39,16 @@ describe Capybara::Server do
Capybara.server_port = nil
end
it "should use given port" do
@app = proc { |env| [200, {}, "Hello Server!"]}
@server = Capybara::Server.new(@app, 22790).boot
@res = Net::HTTP.start(@server.host, 22790) { |http| http.get('/') }
@res.body.should include('Hello Server')
Capybara.server_port = nil
end
it "should find an available port" do
@app1 = proc { |env| [200, {}, "Hello Server!"]}
@app2 = proc { |env| [200, {}, "Hello Second Server!"]}