Sha256: 746ee55fd2d92772551de3ddb69aa92de30452b263da9624d27571dc6d42c747
Contents?: true
Size: 1.92 KB
Versions: 1
Compression:
Stored size: 1.92 KB
Contents
require "spec_helper" describe VCAP::Concurrency::Promise do let(:promise) { VCAP::Concurrency::Promise.new } describe "#deliver " do it "should deliver the supplied result to callers of resolve" do promise.deliver(:done) promise.resolve.should == :done end it "should raise an error if called more than once" do promise.deliver expect do promise.deliver end.to raise_error(/completed once/) end it "should wake up all threads that are resolving it" do lock = Mutex.new cond = ConditionVariable.new waiting = 0 threads = [] 5.times do |ii| threads << Thread.new do lock.synchronize do waiting += 1 cond.signal end promise.resolve end end done = false while !done lock.synchronize do if waiting == threads.length done = true else cond.wait(lock) end end end promise.deliver # join returns nil if timeout occurred and the thread hadn't finished threads.each { |t| t.join(1).should == t } end end describe "#fail" do it "should deliver the supplied exception to callers of resolve" do error_text = "test error" promise.fail(RuntimeError.new(error_text)) expect do promise.resolve end.to raise_error(/#{error_text}/) end it "should raise an error if called more than once" do e = RuntimeError.new("test") promise.fail(e) expect do promise.fail(e) end.to raise_error(/completed once/) end end describe "#resolve" do it "should raise an error when a timeout occurs" do start = Time.now expect do promise.resolve(0.5) end.to raise_error(VCAP::Concurrency::TimeoutError) elapsed = Time.now - start elapsed.should be_within(1).of(0.5) end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
vcap-concurrency-0.1.0 | spec/promise_spec.rb |