2012-02-14 11:21:07 -05:00
|
|
|
require 'socket'
|
2012-12-16 13:45:26 -05:00
|
|
|
require 'open3'
|
2012-02-14 11:21:07 -05:00
|
|
|
|
2014-04-30 04:30:51 -04:00
|
|
|
if ENV['OS']==/Windows.*/ then
|
|
|
|
TERMSIGNAL='TERM'
|
|
|
|
else
|
|
|
|
TERMSIGNAL=9
|
|
|
|
end
|
|
|
|
|
2012-12-17 13:27:18 -05:00
|
|
|
OSRM_ROUTED_LOG_FILE = 'osrm-routed.log'
|
2012-12-15 06:34:53 -05:00
|
|
|
|
2014-03-19 14:28:24 -04:00
|
|
|
class OSRMBackgroundLauncher
|
2013-08-19 16:41:46 -04:00
|
|
|
def initialize input_file, &block
|
|
|
|
@input_file = input_file
|
2012-02-14 11:21:07 -05:00
|
|
|
Dir.chdir TEST_FOLDER do
|
2012-12-15 06:34:53 -05:00
|
|
|
begin
|
2012-12-15 11:01:24 -05:00
|
|
|
launch
|
2012-12-15 06:34:53 -05:00
|
|
|
yield
|
|
|
|
ensure
|
2012-12-15 11:01:24 -05:00
|
|
|
shutdown
|
2012-12-15 06:34:53 -05:00
|
|
|
end
|
2012-02-14 11:21:07 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-12-15 11:01:24 -05:00
|
|
|
private
|
2013-08-29 13:32:11 -04:00
|
|
|
|
2012-12-15 11:01:24 -05:00
|
|
|
def launch
|
2014-03-31 10:05:09 -04:00
|
|
|
Timeout.timeout(OSRM_TIMEOUT) do
|
2012-12-15 11:01:24 -05:00
|
|
|
osrm_up
|
|
|
|
wait_for_connection
|
|
|
|
end
|
|
|
|
rescue Timeout::Error
|
2012-12-17 13:27:18 -05:00
|
|
|
raise RoutedError.new "Launching osrm-routed timed out."
|
2012-12-15 11:01:24 -05:00
|
|
|
end
|
2013-08-29 13:32:11 -04:00
|
|
|
|
2012-12-15 11:01:24 -05:00
|
|
|
def shutdown
|
2014-03-31 10:05:09 -04:00
|
|
|
Timeout.timeout(OSRM_TIMEOUT) do
|
2012-12-15 11:01:24 -05:00
|
|
|
osrm_down
|
|
|
|
end
|
|
|
|
rescue Timeout::Error
|
|
|
|
kill
|
2012-12-17 13:27:18 -05:00
|
|
|
raise RoutedError.new "Shutting down osrm-routed timed out."
|
2012-12-15 11:01:24 -05:00
|
|
|
end
|
2013-08-29 13:32:11 -04:00
|
|
|
|
|
|
|
|
2012-12-15 11:01:24 -05:00
|
|
|
def osrm_up?
|
2012-12-16 13:45:26 -05:00
|
|
|
if @pid
|
2014-04-30 04:30:51 -04:00
|
|
|
begin
|
|
|
|
if Process.waitpid(@pid, Process::WNOHANG) then
|
|
|
|
false
|
|
|
|
else
|
|
|
|
true
|
|
|
|
end
|
|
|
|
rescue Errno::ESRCH, Errno::ECHILD
|
|
|
|
false
|
|
|
|
end
|
2012-02-14 11:21:07 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-12-15 11:01:24 -05:00
|
|
|
def osrm_up
|
|
|
|
return if osrm_up?
|
2013-08-19 16:41:46 -04:00
|
|
|
@pid = Process.spawn("#{BIN_PATH}/osrm-routed #{@input_file} --port #{OSRM_PORT}",:out=>OSRM_ROUTED_LOG_FILE, :err=>OSRM_ROUTED_LOG_FILE)
|
2014-03-19 13:03:38 -04:00
|
|
|
Process.detach(@pid) # avoid zombie processes
|
2012-12-15 11:01:24 -05:00
|
|
|
end
|
2012-02-14 11:21:07 -05:00
|
|
|
|
2012-12-15 11:01:24 -05:00
|
|
|
def osrm_down
|
2012-12-16 13:45:26 -05:00
|
|
|
if @pid
|
2014-04-30 04:30:51 -04:00
|
|
|
Process.kill TERMSIGNAL, @pid
|
2012-12-15 11:01:24 -05:00
|
|
|
wait_for_shutdown
|
|
|
|
end
|
2012-12-15 06:34:53 -05:00
|
|
|
end
|
2012-02-14 11:21:07 -05:00
|
|
|
|
2012-12-15 11:01:24 -05:00
|
|
|
def kill
|
2012-12-16 13:45:26 -05:00
|
|
|
if @pid
|
|
|
|
Process.kill 'KILL', @pid
|
2012-12-15 11:01:24 -05:00
|
|
|
end
|
2012-12-15 06:34:53 -05:00
|
|
|
end
|
|
|
|
|
2012-12-15 11:01:24 -05:00
|
|
|
def wait_for_connection
|
|
|
|
while true
|
|
|
|
begin
|
2014-04-30 04:30:51 -04:00
|
|
|
socket = TCPSocket.new('127.0.0.1', OSRM_PORT)
|
2012-12-15 11:01:24 -05:00
|
|
|
return
|
|
|
|
rescue Errno::ECONNREFUSED
|
|
|
|
sleep 0.1
|
|
|
|
end
|
2012-02-14 11:21:07 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-12-15 11:01:24 -05:00
|
|
|
def wait_for_shutdown
|
|
|
|
while osrm_up?
|
|
|
|
sleep 0.1
|
|
|
|
end
|
2012-02-14 11:21:07 -05:00
|
|
|
end
|
|
|
|
end
|