Синхронизировать потоки с запуском сервера WEBrick - PullRequest
1 голос
/ 13 января 2012

Я пытаюсь запустить небольшой WEBrick-сервер, чтобы смоделировать настоящий API, для тестирования клиента Ruby http, который я разрабатываю.Я использую модифицированное решение, основанное на этом комментариях к блогу.

Это работает нормально, но проблема в том, что при каждом запуске сервера родительский поток должен ждать произвольныйколичество времени для загрузки сервера.И после добавления нескольких тестов это становится очень медленным.

Так что мой вопрос: есть ли способ синхронизировать родительский поток для продолжения сразу после того, как поток сервера завершил запуск WEBRick?

Я пытался просмотреть ссылку на WEBrick, искал в Интернете и даже заглянул в код WEBrick, но у меня не было ничего, что я мог бы использовать без каких-либо действительно неприятных исправлений обезьяны.другие подходы к проблеме, но я хотел бы сохранить ее как можно более независимой от гемов и библиотек.Кроме того, решения должны работать в Ruby 1.9.2 , в Linux .

Заранее спасибо за ответы!

require "rack"
class ApiMockServer
  def initialize(port = 4000, pause = 1)
    @block = nil
    @parent_thread = Thread.current
    @thread = Thread.new do
      Rack::Handler::WEBrick.run(self, :Port => port, :Host => "127.0.0.1")
    end

    sleep pause # give the server time to fire up… YUK!
  end

  def stop
    Thread.kill(@thread)
  end

  def attach(&block)
    @block = block
  end

  def detach()
    @block = nil
  end

  def call(env)
    begin
      unless @block
        raise "Specify a handler for the request using attach(block). The " +
          "block should return a valid rack response and can test expectations"
      end
      @block.call(env)
    rescue Exception => e
      @parent_thread.raise e
      [ 500, { 'Content-Type' => 'text/plain', 'Content-Length' => '13' }, [ 'Bad test code' ]]
    end
  end
end

1 Ответ

0 голосов
/ 13 января 2012

Если вы что-то тестируете в Rack, почему бы не использовать Rack :: Test, который это делает?

...