2012-05-04 15:50:30 -04:00
|
|
|
require 'spec_helper'
|
2012-07-08 15:17:08 -04:00
|
|
|
require 'capybara/webkit/connection'
|
2012-05-04 15:50:30 -04:00
|
|
|
|
2012-07-08 15:17:08 -04:00
|
|
|
describe Capybara::Webkit::Connection do
|
2014-06-29 22:53:01 -04:00
|
|
|
it "kills the process when the parent process dies", skip_on_windows: true, skip_on_jruby: true do
|
|
|
|
read_io, write_io = IO.pipe
|
|
|
|
|
|
|
|
fork_pid = fork do
|
|
|
|
read_io.close
|
|
|
|
connection = Capybara::Webkit::Connection.new
|
|
|
|
write_io.write(connection.pid)
|
|
|
|
write_io.close
|
|
|
|
Process.wait(connection.pid)
|
|
|
|
end
|
|
|
|
|
|
|
|
write_io.close
|
|
|
|
|
|
|
|
webkit_pid = read_io.read.to_i
|
|
|
|
webkit_pid.should be > 1
|
|
|
|
read_io.close
|
|
|
|
Process.kill(9, fork_pid)
|
2015-04-09 18:44:30 -04:00
|
|
|
eventually { expect { Process.getpgid(webkit_pid) }.to raise_error Errno::ESRCH }
|
|
|
|
end
|
|
|
|
|
|
|
|
def eventually
|
|
|
|
polling_interval = 0.1
|
|
|
|
time_limit = Time.now + 3
|
|
|
|
loop do
|
|
|
|
begin
|
|
|
|
yield
|
|
|
|
return
|
|
|
|
rescue RSpec::Expectations::ExpectationNotMetError => error
|
|
|
|
raise error if Time.now >= time_limit
|
|
|
|
sleep polling_interval
|
|
|
|
end
|
|
|
|
end
|
2014-06-29 22:53:01 -04:00
|
|
|
end
|
|
|
|
|
2014-07-02 20:46:03 -04:00
|
|
|
it "raises an error if the server has stopped", skip_on_windows: true do
|
|
|
|
path = 'false'
|
|
|
|
stub_const("Capybara::Webkit::Connection::SERVER_PATH", path)
|
|
|
|
|
|
|
|
expect { Capybara::Webkit::Connection.new }.
|
|
|
|
to raise_error(
|
|
|
|
Capybara::Webkit::ConnectionError,
|
|
|
|
"#{path} failed to start.")
|
|
|
|
end
|
|
|
|
|
|
|
|
it "raises an error if the server is not ready", skip_on_windows: true do
|
|
|
|
server_path = 'sleep 1'
|
|
|
|
stub_const("Capybara::Webkit::Connection::SERVER_PATH", server_path)
|
|
|
|
start_timeout = 0.5
|
|
|
|
stub_const("Capybara::Webkit::Connection::WEBKIT_SERVER_START_TIMEOUT", start_timeout)
|
|
|
|
|
|
|
|
error_string =
|
|
|
|
if defined?(::JRUBY_VERSION)
|
|
|
|
"#{server_path} failed to start."
|
|
|
|
else
|
|
|
|
"#{server_path} failed to start after #{start_timeout} seconds."
|
|
|
|
end
|
|
|
|
|
|
|
|
expect { Capybara::Webkit::Connection.new }.
|
|
|
|
to raise_error(Capybara::Webkit::ConnectionError, error_string)
|
|
|
|
end
|
|
|
|
|
2012-05-04 15:50:30 -04:00
|
|
|
it "boots a server to talk to" do
|
2012-11-16 23:44:03 -05:00
|
|
|
url = "http://#{@rack_server.host}:#{@rack_server.port}/"
|
2012-05-04 15:50:30 -04:00
|
|
|
connection.puts "Visit"
|
|
|
|
connection.puts 1
|
|
|
|
connection.puts url.to_s.bytesize
|
|
|
|
connection.print url
|
2013-08-11 10:36:53 -04:00
|
|
|
connection.gets.should eq "ok\n"
|
|
|
|
connection.gets.should eq "0\n"
|
2012-05-04 15:50:30 -04:00
|
|
|
connection.puts "Body"
|
|
|
|
connection.puts 0
|
2013-08-11 10:36:53 -04:00
|
|
|
connection.gets.should eq "ok\n"
|
2012-05-04 15:50:30 -04:00
|
|
|
response_length = connection.gets.to_i
|
|
|
|
response = connection.read(response_length)
|
|
|
|
response.should include("Hey there")
|
|
|
|
end
|
|
|
|
|
2013-02-02 18:32:20 -05:00
|
|
|
it 'forwards stderr to the given IO object' do
|
2014-02-13 12:28:38 -05:00
|
|
|
read_io, write_io = IO.pipe
|
|
|
|
redirected_connection = Capybara::Webkit::Connection.new(:stderr => write_io)
|
2012-11-22 10:30:43 -05:00
|
|
|
redirected_connection.puts "EnableLogging"
|
|
|
|
redirected_connection.puts 0
|
2014-02-13 12:28:38 -05:00
|
|
|
|
|
|
|
script = 'console.log("hello world")'
|
2012-05-04 15:50:30 -04:00
|
|
|
redirected_connection.puts "Execute"
|
|
|
|
redirected_connection.puts 1
|
|
|
|
redirected_connection.puts script.to_s.bytesize
|
|
|
|
redirected_connection.print script
|
2014-02-13 12:28:38 -05:00
|
|
|
|
2014-06-30 20:25:55 -04:00
|
|
|
expect(read_io).to include_response "\nhello world"
|
2012-05-04 15:50:30 -04:00
|
|
|
end
|
|
|
|
|
2013-02-02 18:38:10 -05:00
|
|
|
it 'does not forward stderr to nil' do
|
|
|
|
IO.should_not_receive(:copy_stream)
|
|
|
|
Capybara::Webkit::Connection.new(:stderr => nil)
|
|
|
|
end
|
|
|
|
|
2013-02-06 20:16:51 -05:00
|
|
|
it 'prints a deprecation warning if the stdout option is used' do
|
|
|
|
Capybara::Webkit::Connection.any_instance.should_receive(:warn)
|
|
|
|
Capybara::Webkit::Connection.new(:stdout => nil)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'does not forward stdout to nil if the stdout option is used' do
|
|
|
|
Capybara::Webkit::Connection.any_instance.stub(:warn)
|
|
|
|
IO.should_not_receive(:copy_stream)
|
|
|
|
Capybara::Webkit::Connection.new(:stdout => nil)
|
|
|
|
end
|
2013-02-02 18:38:10 -05:00
|
|
|
|
2012-05-04 15:50:30 -04:00
|
|
|
it "returns the server port" do
|
|
|
|
connection.port.should be_between 0x400, 0xffff
|
|
|
|
end
|
|
|
|
|
2012-07-16 10:52:10 -04:00
|
|
|
it 'sets appropriate options on its socket' do
|
2013-08-11 10:38:19 -04:00
|
|
|
socket = double('socket')
|
2012-08-10 13:30:34 -04:00
|
|
|
TCPSocket.stub(:open).and_return(socket)
|
2012-07-16 10:52:10 -04:00
|
|
|
if defined?(Socket::TCP_NODELAY)
|
2012-11-22 14:20:58 -05:00
|
|
|
socket.should_receive(:setsockopt).with(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, true)
|
2012-07-16 10:52:10 -04:00
|
|
|
else
|
2012-08-10 13:30:34 -04:00
|
|
|
socket.should_not_receive(:setsockopt)
|
2012-07-16 10:52:10 -04:00
|
|
|
end
|
|
|
|
Capybara::Webkit::Connection.new
|
|
|
|
end
|
|
|
|
|
2012-05-04 15:50:30 -04:00
|
|
|
it "chooses a new port number for a new connection" do
|
2012-07-08 15:17:08 -04:00
|
|
|
new_connection = Capybara::Webkit::Connection.new
|
2012-05-04 15:50:30 -04:00
|
|
|
new_connection.port.should_not == connection.port
|
|
|
|
end
|
|
|
|
|
2012-07-08 15:17:08 -04:00
|
|
|
let(:connection) { Capybara::Webkit::Connection.new }
|
2012-05-04 15:50:30 -04:00
|
|
|
|
|
|
|
before(:all) do
|
|
|
|
@app = lambda do |env|
|
|
|
|
body = "<html><body>Hey there</body></html>"
|
|
|
|
[200,
|
|
|
|
{ 'Content-Type' => 'text/html', 'Content-Length' => body.size.to_s },
|
|
|
|
[body]]
|
|
|
|
end
|
|
|
|
@rack_server = Capybara::Server.new(@app)
|
|
|
|
@rack_server.boot
|
|
|
|
end
|
|
|
|
end
|