From 873ca0c2bf3dd0b4b0b6dbcda0eb789fd550ad07 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 20 Apr 2021 16:39:08 -0400 Subject: [PATCH] test: add coverage for thread-safety of Concurrent::Set#each Related to #900 --- spec/concurrent/set_spec.rb | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/spec/concurrent/set_spec.rb b/spec/concurrent/set_spec.rb index 7c69b4bec..8b817a94f 100644 --- a/spec/concurrent/set_spec.rb +++ b/spec/concurrent/set_spec.rb @@ -42,7 +42,7 @@ module Concurrent end context 'concurrency' do - it do + it '#add and #delete' do (1..Concurrent::ThreadSafe::Test::THREADS).map do |i| in_thread do 1000.times do @@ -55,6 +55,36 @@ module Concurrent end.map(&:join) expect(set).to be_empty end + + it '#each' do + threads = [] + ("a".."z").inject(set, &:<<) # setup a non-empty set + + threads << in_thread do + 2000.times do + size = nil + set.each do |member| + if size.nil? + size = set.length + else + expect(set.length).to eq(size) + end + end + end + end + + threads += (1..19).map do |i| + in_thread do + v = i * 1000 + 10.times do + 200.times { |j| set << (v+j) } + 200.times { |j| set.delete(v+j) } + end + end + end + + threads.map(&:join) + end end end end