class DerailSpecs::Server
Constants
- App
Attributes
app[R]
host[R]
port[R]
Public Class Methods
new(reportable_errors: [Exception], extra_middleware: [])
click to toggle source
# File lib/derail_specs/server.rb, line 24 def initialize(reportable_errors: [Exception], extra_middleware: []) @app = Server::App @extra_middleware = extra_middleware @server_thread = nil # suppress warnings @host = DerailSpecs.configuration.host @reportable_errors = reportable_errors @port = DerailSpecs.configuration.port @port ||= Server.ports[port_key] @port ||= find_available_port(host) @checker = Checker.new(@host, @port) end
ports()
click to toggle source
# File lib/derail_specs/server.rb, line 17 def ports @ports ||= {} end
Public Instance Methods
boot()
click to toggle source
# File lib/derail_specs/server.rb, line 67 def boot unless responsive? Server.ports[port_key] = port @server_thread = Thread.new do Puma.create(middleware, port, host) end timer = Timer.new(60) until responsive? raise "Rack application timed out during boot" if timer.expired? @server_thread.join(0.1) end end self end
error()
click to toggle source
# File lib/derail_specs/server.rb, line 40 def error middleware.error end
reset_error!()
click to toggle source
# File lib/derail_specs/server.rb, line 36 def reset_error! middleware.clear_error end
responsive?()
click to toggle source
# File lib/derail_specs/server.rb, line 48 def responsive? return false if @server_thread&.join(0) res = @checker.request { |http| http.get("/__identify__") } return res.body == app.object_id.to_s if res.is_a?(Net::HTTPSuccess) || res.is_a?(Net::HTTPRedirection) rescue SystemCallError, Net::ReadTimeout, OpenSSL::SSL::SSLError false end
using_ssl?()
click to toggle source
# File lib/derail_specs/server.rb, line 44 def using_ssl? @checker.ssl? end
wait_for_pending_requests()
click to toggle source
# File lib/derail_specs/server.rb, line 58 def wait_for_pending_requests timer = Timer.new(60) while pending_requests? raise "Requests did not finish in 60 seconds: #{middleware.pending_requests}" if timer.expired? sleep 0.01 end end
Private Instance Methods
find_available_port(host)
click to toggle source
# File lib/derail_specs/server.rb, line 100 def find_available_port(host) server = TCPServer.new(host, 0) port = server.addr[1] server.close # Workaround issue where some platforms (mac, ???) when passed a host # of '0.0.0.0' will return a port that is only available on one of the # ip addresses that resolves to, but the next binding to that port requires # that port to be available on all ips server = TCPServer.new(host, port) port rescue Errno::EADDRINUSE retry ensure server&.close end
middleware()
click to toggle source
# File lib/derail_specs/server.rb, line 88 def middleware @middleware ||= Middleware.new(app, @reportable_errors, @extra_middleware) end
pending_requests?()
click to toggle source
# File lib/derail_specs/server.rb, line 96 def pending_requests? middleware.pending_requests? end
port_key()
click to toggle source
# File lib/derail_specs/server.rb, line 92 def port_key app.object_id # as opposed to middleware.object_id if multiple instances end