Sha256: 5602a819b46882aa4cad971a9be8bbb083d89482f7d39233dc04bee99f1360f6

Contents?: true

Size: 1.76 KB

Versions: 9

Compression:

Stored size: 1.76 KB

Contents

require 'thread'

module Waterpig

  # This Rack middleware is designed to resolve common timing problems with
  # end-to-end tests. Without it, specs will often finish and :after hooks will
  # get executed while a request is still "in flight". The result can be, for
  # example, specs failing because the database has been wiped before a request
  # truly finishes.
  #
  # This middleware counts requests and allows other processes (e.g. testing
  # processes) to block via RequestWaitMiddle.wait_for_idle() so that they do
  # not proceed until all requests have completed.
  class RequestWaitMiddleware
    @@idle_mutex = Mutex.new

    @@waiting_requests = {}
    @@block_requests = false

    # This is the only method one would normally call: wrap calls that e.g. drop
    # the test database in wait_for_idle{ <code> } in order to be sure that
    # outstanding requests are complete
    def self.wait_for_idle
      @@block_requests = true

      @@idle_mutex.synchronize do
        yield
      end

      @@block_requests = false
    end

    def block_requests?
      @@block_requests
    end

    def initialize(app)
      @app = app
    end

    def call(env)
      increment_active_requests(env)
      if block_requests?
        block_request
      else
        @app.call(env)
      end
    ensure
      decrement_active_requests(env)
    end

    BLOCKED = [503, {}, ["Test is over - server no longer available"]].freeze

    def block_request
      BLOCKED
    end

    def increment_active_requests(env)
      @@idle_mutex.lock unless @@idle_mutex.owned?
      @@waiting_requests[env.object_id] = true
    end

    def decrement_active_requests(env)
      @@waiting_requests.delete(env.object_id)
      if @@waiting_requests.empty?
        @@idle_mutex.unlock
      end
    end
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
waterpig-0.12.1 lib/waterpig/request-wait-middleware.rb
waterpig-0.12.0 lib/waterpig/request-wait-middleware.rb
waterpig-0.11.0 lib/waterpig/request-wait-middleware.rb
waterpig-0.10.0 lib/waterpig/request-wait-middleware.rb
waterpig-0.9.3 lib/waterpig/request-wait-middleware.rb
waterpig-0.9.2 lib/waterpig/request-wait-middleware.rb
waterpig-0.9.1 lib/waterpig/request-wait-middleware.rb
waterpig-0.9.0 lib/waterpig/request-wait-middleware.rb
waterpig-0.8.1 lib/waterpig/request-wait-middleware.rb