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