2012-03-07 21:17:58 +00:00
|
|
|
require 'sinatra/base'
|
|
|
|
require 'rbconfig'
|
|
|
|
require 'open-uri'
|
2014-02-12 00:17:06 +00:00
|
|
|
require 'sinatra/runner'
|
2012-03-07 21:17:58 +00:00
|
|
|
|
|
|
|
module IntegrationHelper
|
2014-02-12 00:17:06 +00:00
|
|
|
class BaseServer < Sinatra::Runner
|
2012-03-07 21:17:58 +00:00
|
|
|
extend Enumerable
|
2014-02-12 00:17:06 +00:00
|
|
|
attr_accessor :server, :port
|
2012-03-07 21:17:58 +00:00
|
|
|
alias name server
|
|
|
|
|
|
|
|
def self.all
|
|
|
|
@all ||= []
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.each(&block)
|
|
|
|
all.each(&block)
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.run(server, port)
|
|
|
|
new(server, port).run
|
|
|
|
end
|
|
|
|
|
|
|
|
def app_file
|
2021-10-18 16:40:01 +00:00
|
|
|
File.expand_path('integration/app.rb', __dir__)
|
2012-03-07 21:17:58 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def environment
|
|
|
|
"development"
|
|
|
|
end
|
|
|
|
|
|
|
|
def initialize(server, port)
|
|
|
|
@installed, @pipe, @server, @port = nil, nil, server, port
|
|
|
|
Server.all << self
|
|
|
|
end
|
|
|
|
|
|
|
|
def run
|
|
|
|
return unless installed?
|
2012-03-08 07:54:34 +00:00
|
|
|
kill
|
2012-03-07 21:17:58 +00:00
|
|
|
@log = ""
|
2014-02-12 00:17:06 +00:00
|
|
|
super
|
2012-03-07 21:17:58 +00:00
|
|
|
at_exit { kill }
|
|
|
|
end
|
|
|
|
|
|
|
|
def installed?
|
|
|
|
return @installed unless @installed.nil?
|
2023-02-10 17:35:35 +00:00
|
|
|
s = case server
|
|
|
|
when 'HTTP'
|
|
|
|
'net/http/server'
|
|
|
|
when 'puma'
|
|
|
|
'puma/rack/handler'
|
|
|
|
else
|
|
|
|
server
|
|
|
|
end
|
2013-03-10 19:56:21 +00:00
|
|
|
require s
|
2012-03-07 21:17:58 +00:00
|
|
|
@installed = true
|
|
|
|
rescue LoadError
|
|
|
|
warn "#{server} is not installed, skipping integration tests"
|
|
|
|
@installed = false
|
|
|
|
end
|
|
|
|
|
|
|
|
def command
|
|
|
|
@command ||= begin
|
2016-08-01 11:14:48 +00:00
|
|
|
cmd = ["APP_ENV=#{environment}", "exec"]
|
2012-03-07 21:17:58 +00:00
|
|
|
if RbConfig.respond_to? :ruby
|
|
|
|
cmd << RbConfig.ruby.inspect
|
|
|
|
else
|
|
|
|
file, dir = RbConfig::CONFIG.values_at('ruby_install_name', 'bindir')
|
|
|
|
cmd << File.expand_path(file, dir).inspect
|
|
|
|
end
|
2020-07-26 09:10:00 +00:00
|
|
|
cmd << "-w" unless net_http_server?
|
2021-10-18 16:40:01 +00:00
|
|
|
cmd << "-I" << File.expand_path('../lib', __dir__).inspect
|
2012-03-07 21:17:58 +00:00
|
|
|
cmd << app_file.inspect << '-s' << server << '-o' << '127.0.0.1' << '-p' << port
|
|
|
|
cmd << "-e" << environment.to_s << '2>&1'
|
|
|
|
cmd.join " "
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-03-08 08:08:14 +00:00
|
|
|
def webrick?
|
|
|
|
name.to_s == "webrick"
|
|
|
|
end
|
2012-03-18 09:18:00 +00:00
|
|
|
|
2020-07-26 09:10:00 +00:00
|
|
|
def rainbows?
|
|
|
|
name.to_s == "rainbows"
|
2012-03-18 12:25:06 +00:00
|
|
|
end
|
|
|
|
|
2012-04-26 06:42:53 +00:00
|
|
|
def puma?
|
|
|
|
name.to_s == "puma"
|
|
|
|
end
|
|
|
|
|
2021-01-08 17:47:42 +00:00
|
|
|
def falcon?
|
|
|
|
name.to_s == "falcon"
|
|
|
|
end
|
|
|
|
|
2012-05-13 20:32:18 +00:00
|
|
|
def trinidad?
|
|
|
|
name.to_s == "trinidad"
|
|
|
|
end
|
|
|
|
|
2013-03-10 19:56:21 +00:00
|
|
|
def net_http_server?
|
|
|
|
name.to_s == 'HTTP'
|
|
|
|
end
|
|
|
|
|
2012-03-18 09:18:00 +00:00
|
|
|
def warnings
|
|
|
|
log.scan(%r[(?:\(eval|lib/sinatra).*warning:.*$])
|
|
|
|
end
|
2012-03-18 13:33:48 +00:00
|
|
|
|
|
|
|
def run_test(target, &block)
|
|
|
|
retries ||= 3
|
|
|
|
target.server = self
|
2012-05-13 22:22:37 +00:00
|
|
|
run unless alive?
|
|
|
|
target.instance_eval(&block)
|
2012-03-18 13:33:48 +00:00
|
|
|
rescue Exception => error
|
|
|
|
retries -= 1
|
|
|
|
kill
|
|
|
|
retries < 0 ? retry : raise(error)
|
|
|
|
end
|
2012-03-07 21:17:58 +00:00
|
|
|
end
|
|
|
|
|
2022-02-21 15:40:59 +00:00
|
|
|
Server = BaseServer
|
2012-03-10 20:50:31 +00:00
|
|
|
|
2012-03-07 21:17:58 +00:00
|
|
|
def it(message, &block)
|
|
|
|
Server.each do |server|
|
|
|
|
next unless server.installed?
|
2012-03-18 13:33:48 +00:00
|
|
|
super("with #{server.name}: #{message}") { server.run_test(self, &block) }
|
2012-03-07 21:17:58 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.extend_object(obj)
|
|
|
|
super
|
|
|
|
|
2012-03-07 21:26:54 +00:00
|
|
|
base_port = 5000 + Process.pid % 100
|
2022-11-14 13:51:26 +00:00
|
|
|
servers = Sinatra::Base.server.dup
|
|
|
|
|
|
|
|
# TruffleRuby doesn't support `Fiber.set_scheduler` yet
|
2022-12-26 11:23:00 +00:00
|
|
|
if RUBY_ENGINE == "truffleruby" && !Fiber.respond_to?(:set_scheduler)
|
2022-11-14 13:51:26 +00:00
|
|
|
warn "skip falcon server"
|
|
|
|
servers.delete('falcon')
|
|
|
|
end
|
|
|
|
|
|
|
|
servers.each_with_index do |server, index|
|
2013-07-02 05:37:39 +00:00
|
|
|
Server.run(server, base_port+index)
|
2012-03-07 21:17:58 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|