diff --git a/lib/capybara/server.rb b/lib/capybara/server.rb index f59ddee0..dc04d615 100644 --- a/lib/capybara/server.rb +++ b/lib/capybara/server.rb @@ -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" diff --git a/lib/capybara/session.rb b/lib/capybara/session.rb index f6b69c60..7e4571e6 100644 --- a/lib/capybara/session.rb +++ b/lib/capybara/session.rb @@ -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 diff --git a/spec/server_spec.rb b/spec/server_spec.rb index 83f5d103..d4c83ae7 100644 --- a/spec/server_spec.rb +++ b/spec/server_spec.rb @@ -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!"]}