Sha256: 75fd44c762dc7d120c1fd7951a7ffb093503b9a228c0a55977206a23d0403cab

Contents?: true

Size: 1.35 KB

Versions: 11

Compression:

Stored size: 1.35 KB

Contents

# frozen_string_literal: true

module Msgr
  class TestPool
    def initialize(*)
      @queue = []
      @mutex = Mutex.new
      @event = ConditionVariable.new
    end

    def post(message, &block)
      @mutex.synchronize do
        @queue << [block, message]
        @event.signal
      end
    end

    def run(**kwargs)
      @mutex.synchronize do
        ns_run(**kwargs)
      end
    end

    def clear
      @mutex.synchronize do
        @queue.clear
      end
    end

    alias reset clear

    private

    # rubocop:disable Metrics/AbcSize
    # rubocop:disable Metrics/MethodLength
    def ns_run(count: 1, timeout: 5)
      received = 0

      while received < count
        if (item = @queue.pop)
          item[0].call item[1]
          received += 1
        else
          start = Time.now.to_f

          @event.wait(@mutex, timeout)

          stop = Time.now.to_f
          diff = stop - start
          timeout -= diff

          if timeout <= 0
            raise TimeoutError.new \
              "Expected to receive #{count} messages but received #{received}."
          end
        end
      end
    end

    class << self
      def new(*args)
        @instance ||= super(*args)
      end

      def run(*args)
        new.run(*args)
      end

      def clear
        @instance ? @instance.clear : nil
      end

      alias reset clear
    end
  end
end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
msgr-0.15.2.1.b169 lib/msgr/test_pool.rb
msgr-0.15.2.1.b167 lib/msgr/test_pool.rb
msgr-0.15.2.1.b166 lib/msgr/test_pool.rb
msgr-0.15.2.1.b165 lib/msgr/test_pool.rb
msgr-0.15.2.1.b164 lib/msgr/test_pool.rb
msgr-0.15.2.1.b163 lib/msgr/test_pool.rb
msgr-0.15.2.1.b162 lib/msgr/test_pool.rb
msgr-0.15.2.1.b161 lib/msgr/test_pool.rb
msgr-0.15.2.1.b160 lib/msgr/test_pool.rb
msgr-0.15.2.1.b159 lib/msgr/test_pool.rb
msgr-0.15.2.1.b158 lib/msgr/test_pool.rb