aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ruby/spec
diff options
context:
space:
mode:
authorGravatar Alexander Polcyn <apolcyn@google.com>2017-04-10 16:45:02 -0700
committerGravatar Alexander Polcyn <apolcyn@google.com>2017-04-10 16:47:03 -0700
commitd6dd46a1d9558c32ed17f1e9ce1726b272b06404 (patch)
treed236fdc864ad565cca4ac5595a350e065bf9b760 /src/ruby/spec
parent2dfc3af405f3cca65291d239755be0c5e6ed13e7 (diff)
fix flakey race in ruby tests
Diffstat (limited to 'src/ruby/spec')
-rw-r--r--src/ruby/spec/generic/rpc_server_pool_spec.rb41
1 files changed, 25 insertions, 16 deletions
diff --git a/src/ruby/spec/generic/rpc_server_pool_spec.rb b/src/ruby/spec/generic/rpc_server_pool_spec.rb
index 69e8222cb9..75b4022568 100644
--- a/src/ruby/spec/generic/rpc_server_pool_spec.rb
+++ b/src/ruby/spec/generic/rpc_server_pool_spec.rb
@@ -52,27 +52,36 @@ describe GRPC::Pool do
expect(p.ready_for_work?).to be(false)
end
- it 'it stops being ready after all workers jobs waiting or running' do
+ it 'it stops being ready after all workers are busy, ' \
+ 'and it becomes ready again after jobs complete' do
p = Pool.new(5)
p.start
- job = proc { sleep(3) } # sleep so workers busy when done scheduling
- 5.times do
- expect(p.ready_for_work?).to be(true)
- p.schedule(&job)
+
+ wait_mu = Mutex.new
+ wait_cv = ConditionVariable.new
+ wait = true
+
+ job = proc do
+ wait_mu.synchronize do
+ wait_cv.wait(wait_mu) while wait
+ end
end
- expect(p.ready_for_work?).to be(false)
- end
- it 'it becomes ready again after jobs complete' do
- p = Pool.new(5)
- p.start
- job = proc {}
5.times do
expect(p.ready_for_work?).to be(true)
p.schedule(&job)
end
+
expect(p.ready_for_work?).to be(false)
- sleep 5 # give the pool time do get at least one task done
+
+ wait_mu.synchronize do
+ wait = false
+ wait_cv.broadcast
+ end
+
+ # There's a potential race here but it shouldn't ever be
+ # reached with a 5 second sleep.
+ sleep 5
expect(p.ready_for_work?).to be(true)
end
end
@@ -105,13 +114,13 @@ describe GRPC::Pool do
it 'stops jobs when there are long running jobs' do
p = Pool.new(1)
p.start
- o, q = Object.new, Queue.new
+ job_running = Queue.new
job = proc do
- sleep(5) # long running
- q.push(o)
+ job_running.push(Object.new)
+ sleep(5000)
end
p.schedule(&job)
- sleep(1) # should ensure the long job gets scheduled
+ job_running.pop
expect { p.stop }.not_to raise_error
end
end