class Hub::LocalServer
Attributes
app[R]
host[R]
port[R]
server[RW]
Public Class Methods
new(app, host = '127.0.0.1')
click to toggle source
# File features/support/local_server.rb, line 88 def initialize(app, host = '127.0.0.1') @app = app @host = host @server = nil @server_thread = nil end
ports()
click to toggle source
# File features/support/local_server.rb, line 17 def self.ports @ports ||= {} end
start_sinatra(&block)
click to toggle source
# File features/support/local_server.rb, line 41 def self.start_sinatra(&block) require 'json' require 'sinatra/base' klass = Class.new(Sinatra::Base) klass.use JsonParamsParser klass.set :environment, :test klass.disable :protection klass.class_eval(&block) klass.helpers do def json(value) content_type :json JSON.generate value end def assert(expected) expected.each do |key, value| if params[key] != value halt 422, json( :message => "expected %s to be %s; got %s" % [ key.inspect, value.inspect, params[key].inspect ] ) end end end def assert_basic_auth(*expected) require 'rack/auth/basic' auth = Rack::Auth::Basic::Request.new(env) if auth.credentials != expected halt 401, json( :message => "expected %p; got %p" % [ expected, auth.credentials ] ) end end end new(klass.new).start end
Public Instance Methods
assert(expected)
click to toggle source
# File features/support/local_server.rb, line 55 def assert(expected) expected.each do |key, value| if params[key] != value halt 422, json( :message => "expected %s to be %s; got %s" % [ key.inspect, value.inspect, params[key].inspect ] ) end end end
assert_basic_auth(*expected)
click to toggle source
# File features/support/local_server.rb, line 69 def assert_basic_auth(*expected) require 'rack/auth/basic' auth = Rack::Auth::Basic::Request.new(env) if auth.credentials != expected halt 401, json( :message => "expected %p; got %p" % [ expected, auth.credentials ] ) end end
json(value)
click to toggle source
# File features/support/local_server.rb, line 50 def json(value) content_type :json JSON.generate value end
responsive?()
click to toggle source
# File features/support/local_server.rb, line 95 def responsive? return false if @server_thread && @server_thread.join(0) res = Net::HTTP.start(host, port) { |http| http.get('/__identify__') } res.is_a?(Net::HTTPSuccess) and res.body == app.object_id.to_s rescue Errno::ECONNREFUSED, Errno::EBADF return false end
server_options()
click to toggle source
# File features/support/local_server.rb, line 130 def server_options { :Port => 0, :BindAddress => '127.0.0.1', :ShutdownSocketWithoutClose => true, :ServerType => Thread, :AccessLog => [], :Logger => WEBrick::Log::new(nil, 0) } end
start()
click to toggle source
# File features/support/local_server.rb, line 105 def start @port = self.class.ports[app.object_id] if not @port or not responsive? @server_thread = start_handler(Identify.new(app)) do |server, host, port| self.server = server @port = self.class.ports[app.object_id] = port end Timeout.timeout(60) { @server_thread.join(0.01) until responsive? } end rescue TimeoutError raise "Rack application timed out during boot" else self end
start_handler(app) { |server, addr, addr| ... }
click to toggle source
# File features/support/local_server.rb, line 122 def start_handler(app) server = nil thread = Rack::Handler::WEBrick.run(app, server_options) { |s| server = s } addr = server.listeners[0].addr yield server, addr[3], addr[1] return thread end
stop()
click to toggle source
# File features/support/local_server.rb, line 140 def stop server.shutdown @server_thread.join end