Голиаф прерывает em-synchrony/em-hiredis, когда в одном наборе RSpec вызывается несколько тестов with_api()
Я просто испытываю странное поведение при тестировании API Голиафа с RSpec. Один из моих тестов выглядит так:
require 'helper'
describe Scales::Dispatch do
it "should return a 404 if resource was not found" do
with_api(Scales::Server) do
get_request(:path => '/') do |client|
client.response_header.http_status.should == 404
end
end
end
it "should return a resource" do
Scales::Storage::Sync.set "/existing", "some content"
with_api(Scales::Server) do
get_request(:path => '/existing') do |client|
client.response_header.http_status.should == 200
client.response.should == "some content"
end
end
Scales::Storage::Sync.del "/existing"
end
end
API в основном просто ищет ключ в Redis с помощью em-synchrony/em-hiredis
как это:
module Scales
module Lookup
class << self
def request(env)
response = Storage::Async.get(path(env))
response.nil? ? render_not_found : render(response)
end
private
def path(env)
env["REQUEST_URI"]
end
def render_not_found
[404, {}, ""]
end
def render(response)
[200, {}, response]
end
end
end
end
Оба теста выполняются по отдельности, но не вместе. После первого выполнения вся система останавливается примерно на 10 секунд. Затем вызывается второй with_api, но get_request никогда не выполняется - и я думаю, что он работает в течение некоторого времени ожидания.
Я обнаружил то же поведение в другом, довольно похожем тесте, который выдвигает и выталкивает очередь следующим образом:
describe Scales::Queue::Async do
[Scales::Queue::Async::Request, Scales::Queue::Async::Response].each do |queue|
context queue.name.split("::").last do
it "should place a few jobs" do
async do
queue.add "job 1"
queue.add "job 2"
queue.add "job 3"
end
end
it "should take them out blocking" do
async do
queue.pop.should == "job 1"
queue.pop.should == "job 2"
queue.pop.should == "job 3"
end
end
end
end
end
Содержание второго async do ..
тоже не выполняется вообще. Без загруженного Голиафа довольно похожий тест работает отлично:
require 'eventmachine'
require 'em-synchrony'
require 'em-synchrony/em-hiredis'
module Helpers
def async
if EM.reactor_running?
yield
else
out = nil
EM.synchrony do
out = yield
EM.stop
end
out
end
end
end
RSpec.configure do |config|
config.include Helpers
config.treat_symbols_as_metadata_keys_with_true_values = true
end
describe "em-synchrony/em-hiredis" do
it "should lpush a job" do
async do
redis = EM::Hiredis.connect
redis.lpush("a_queue", "job1")
end
end
it "should block pop a job" do
async do
redis = EM::Hiredis.connect
redis.brpop("a_queue", 0).last.should == "job1"
end
end
end
async do ..
для предыдущей задачи это тот же помощник RSpec.
Я искал весь день как сумасшедший, но для меня это не имеет никакого смысла. Поскольку последний тест выполняется полностью нормально, я думаю, что это не em-synchrony
ни em-synchrony/em-hiredis
вещь.
Может быть, Голиаф не останавливается, занимая EM слишком долго или около того?
Спасибо за вашу помощь, это сводит меня с ума!
1 ответ
Хорошо, я нашел решение.
Я проверял соединение прямо перед каждым запросом, и если он был там, я не восстанавливал его. Но это происходит, когда каждая остановка машины событий закрывает соединение, поэтому в основном для каждого нового запроса был тайм-аут соединения, который молча завершался неудачей.
Спасибо за ваше время!