Sha256: b214c26f32589fac6ca774ad1499e4da8a055f13ecbf1b6fed8ea69e999e3a21

Contents?: true

Size: 1.24 KB

Versions: 1

Compression:

Stored size: 1.24 KB

Contents

require 'calliper/config'

module Calliper
  def self.server
    @server ||= Server.new(Config.application)
  end

  def self.server?
    !!@server
  end

  # NOTE: Borrows code from the fantastic Teaspoon gem:
  #   http://github.com/modeset/teaspoon
  class Server
    attr_reader :application, :port, :logger

    def initialize(application, port = Config.port, logger = nil)
      @application = application
      @port = port
      @logger = logger
    end

    def start
      @thread = Thread.new do
        server = Rack::Server.new(rack_options)
        server.start
      end

      Timeout.timeout(60) do
        @thread.join(0.1) until responsive?
      end
    rescue Timeout::Error
      raise "Server failed to start within 60 seconds."
    rescue => e
      raise "Cannot start server: #{e.message}"
    end

    def responsive?
      return false if @thread && @thread.join(0)
      TCPSocket.new('127.0.0.1', port).close
      return true
    rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
      return false
    end

    def rack_options
      {
        app: application,
        environment: 'test',
        Port: port,
        AccessLog: [],
        Logger: logger
      }
    end

    def url
      "http://127.0.0.1:#{port}"
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
calliper-0.0.1 lib/calliper/server.rb