Skip to content

Commit

Permalink
fix race condition
Browse files Browse the repository at this point in the history
  • Loading branch information
Jammjammjamm committed May 9, 2024
1 parent 150ff4d commit a71aa5c
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 98 deletions.
1 change: 0 additions & 1 deletion config.ru
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,5 @@ use Rack::Static,
Inferno::Application.finalize!

use Inferno::Utils::Middleware::RequestLogger
use Inferno::Utils::Middleware::RequestRecorder

run Inferno::Web.app
1 change: 0 additions & 1 deletion lib/inferno/config/boot/web.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
end

require 'inferno/utils/middleware/request_logger'
require 'inferno/utils/middleware/request_recorder'
require 'inferno/apps/web/application'
end
end
62 changes: 61 additions & 1 deletion lib/inferno/dsl/suite_endpoint.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
require 'hanami/controller'
require 'rack/request'
require_relative '../ext/rack'

module Inferno
Expand Down Expand Up @@ -210,6 +211,11 @@ def test
@test ||= tests_repo.find(result.test_id)
end

# @return [Logger] Inferno's logger
def logger
@logger ||= Application['logger']
end

# @private
def find_test_run_identifier
@test_run_identifier ||= test_run_identifier
Expand All @@ -228,11 +234,12 @@ def find_result
# to include response headers added by other parts of the rack stack
# rather than only the response headers explicitly added in the endpoint.
def persist_request
req.env['inferno.persist_request'] = true
req.env['inferno.test_session_id'] = test_run.test_session_id
req.env['inferno.result_id'] = result.id
req.env['inferno.tags'] = tags
req.env['inferno.name'] = name if name.present?

add_persistence_callback
end

# @private
Expand Down Expand Up @@ -265,6 +272,59 @@ def handle(req, res)
rescue StandardError => e
halt 500, e.full_message
end

# @private
def add_persistence_callback # rubocop:disable Metrics/CyclomaticComplexity
logger = Application['logger']
env = req.env
env['rack.after_reply'] ||= []
env['rack.after_reply'] << proc do
repo = Inferno::Repositories::Requests.new

uri = URI('http://example.com')
uri.scheme = env['rack.url_scheme']
uri.host = env['SERVER_NAME']
uri.port = env['SERVER_PORT']
uri.path = env['REQUEST_PATH'] || ''
uri.query = env['rack.request.query_string'] if env['rack.request.query_string'].present?
url = uri&.to_s
verb = env['REQUEST_METHOD']
logger.info('get body')
request_body = env['rack.input']
request_body.rewind if env['rack.input'].respond_to? :rewind
request_body = request_body.instance_of?(Puma::NullIO) ? nil : request_body.string

request_headers = ::Rack::Request.new(env).headers.to_h.map { |name, value| { name:, value: } }

status, response_headers, response_body = env['inferno.response']

response_headers = response_headers.map { |name, value| { name:, value: } }

repo.create(
verb:,
url:,
direction: 'incoming',
name: env['inferno.name'],
status:,
request_body:,
response_body: response_body.join,
result_id: env['inferno.result_id'],
test_session_id: env['inferno.test_session_id'],
request_headers:,
response_headers:,
tags: env['inferno.tags']
)

if env['inferno.resume_test_run']
test_run_id = env['inferno.test_run_id']
Inferno::Repositories::TestRuns.new.mark_as_no_longer_waiting(test_run_id)

Inferno::Jobs.perform(Jobs::ResumeTestRun, test_run_id)
end
rescue StandardError => e
logger.error(e.full_message)
end
end
end
end
end
8 changes: 8 additions & 0 deletions lib/inferno/utils/middleware/request_logger.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
require 'puma/null_io'

module Inferno
module Utils
# @private
Expand Down Expand Up @@ -28,6 +30,12 @@ def call(env)
raise e
end

env['inferno.response'] = response

# rack.after_reply is handled by puma, which doesn't process requests
# in unit tests, so we manually run them when in the test environment
env['rack.after_reply']&.each(&:call) if (ENV['APP_ENV'] = 'test')

response
end

Expand Down
93 changes: 0 additions & 93 deletions lib/inferno/utils/middleware/request_recorder.rb

This file was deleted.

4 changes: 2 additions & 2 deletions spec/request_helper.rb
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
require 'spec_helper'
require 'rack/test'
require_relative '../lib/inferno/apps/web/application'
require_relative '../lib/inferno/utils/middleware/request_recorder'
require_relative '../lib/inferno/utils/middleware/request_logger'

module RequestHelpers
def app
Rack::Builder.new do
use Inferno::Utils::Middleware::RequestRecorder
use Inferno::Utils::Middleware::RequestLogger
run Inferno::Web.app
end
end
Expand Down

0 comments on commit a71aa5c

Please sign in to comment.