Sha256: 0b8d0669f49e45274bcffa02aa0270f01429003d14df93f07968777a8863ca4c

Contents?: true

Size: 1.82 KB

Versions: 55

Compression:

Stored size: 1.82 KB

Contents

require "spec_helper"
require "bunny/concurrent/condition"

describe Bunny::Concurrent::Condition do

  describe "#wait" do
    100.times do |i|
      it "blocks current thread until notified (take #{i})" do
        condition = described_class.new
        xs        = []

        t = Thread.new do
          xs << :notified

          sleep 0.25
          condition.notify
        end
        t.abort_on_exception = true

        condition.wait
        xs.should == [:notified]
      end
    end
  end

  describe "#notify" do
    100.times do |i|
      it "notifies a single thread waiting on the latch (take #{i})" do
        mutex     = Mutex.new
        condition = described_class.new
        xs        = []

        t1 = Thread.new do
          condition.wait
          mutex.synchronize { xs << :notified1 }
        end
        t1.abort_on_exception = true

        t2 = Thread.new do
          condition.wait
          mutex.synchronize { xs << :notified2 }
        end
        t2.abort_on_exception = true

        sleep 0.25
        condition.notify
        sleep 0.5
        xs.should satisfy { |ys| ys.size == 1 && (ys.include?(:notified1) || ys.include?(:notified2)) }
      end
    end
  end

  describe "#notify_all" do
    let(:n) { 30 }

    100.times do |i|
      it "notifies all the threads waiting on the latch (take #{i})" do
        mutex     = Mutex.new
        condition = described_class.new
        @xs       = []

        n.times do |i|
          t = Thread.new do
            condition.wait
            mutex.synchronize { @xs << "notified#{i + 1}".to_sym }
          end
          t.abort_on_exception = true
        end

        sleep 0.5
        condition.notify_all
        sleep 0.5

        n.times do |i|
          item = "notified#{i + 1}".to_sym

          @xs.should include(item)
        end
      end
    end
  end
end

Version data entries

55 entries across 55 versions & 1 rubygems

Version Path
bunny-1.7.1 spec/unit/concurrent/condition_spec.rb
bunny-1.7.0 spec/unit/concurrent/condition_spec.rb
bunny-1.6.3 spec/unit/concurrent/condition_spec.rb
bunny-1.6.2 spec/unit/concurrent/condition_spec.rb
bunny-1.6.1 spec/unit/concurrent/condition_spec.rb
bunny-1.6.0 spec/unit/concurrent/condition_spec.rb
bunny-1.5.1 spec/unit/concurrent/condition_spec.rb
bunny-1.6.0.rc2 spec/unit/concurrent/condition_spec.rb
bunny-1.6.0.rc1 spec/unit/concurrent/condition_spec.rb
bunny-1.6.0.pre1 spec/unit/concurrent/condition_spec.rb
bunny-1.5.0 spec/unit/concurrent/condition_spec.rb
bunny-1.5.0.pre2 spec/unit/concurrent/condition_spec.rb
bunny-1.5.0.pre1 spec/unit/concurrent/condition_spec.rb
bunny-1.4.1 spec/unit/concurrent/condition_spec.rb
bunny-1.4.0 spec/unit/concurrent/condition_spec.rb
bunny-1.3.1 spec/unit/concurrent/condition_spec.rb
bunny-1.3.0 spec/unit/concurrent/condition_spec.rb
bunny-1.2.2 spec/unit/concurrent/condition_spec.rb
bunny-1.2.1 spec/unit/concurrent/condition_spec.rb
bunny-1.2.0 spec/unit/concurrent/condition_spec.rb