Sha256: 6571aa61a9338c53e0f2354abc9688abdcd2da3c493797c00d5e0f7425c7d9c0

Contents?: true

Size: 1.33 KB

Versions: 4

Compression:

Stored size: 1.33 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

    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 Timeout::Error.new \
              "Expected to receive #{count} messages but received #{received}."
          end
        end
      end
    end

    class << self
      def new(*args)
        @instance ||= super(*args) # rubocop:disable Naming/MemoizedInstanceVariableName
      end

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

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

      alias reset clear
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
msgr-1.4.0 lib/msgr/test_pool.rb
msgr-1.3.2 lib/msgr/test_pool.rb
msgr-1.3.1 lib/msgr/test_pool.rb
msgr-1.3.0 lib/msgr/test_pool.rb