diff options
Diffstat (limited to 'spec/ruby/core/threadgroup')
| -rw-r--r-- | spec/ruby/core/threadgroup/add_spec.rb | 39 | ||||
| -rw-r--r-- | spec/ruby/core/threadgroup/default_spec.rb | 11 | ||||
| -rw-r--r-- | spec/ruby/core/threadgroup/enclose_spec.rb | 24 | ||||
| -rw-r--r-- | spec/ruby/core/threadgroup/enclosed_spec.rb | 14 | ||||
| -rw-r--r-- | spec/ruby/core/threadgroup/list_spec.rb | 23 |
5 files changed, 111 insertions, 0 deletions
diff --git a/spec/ruby/core/threadgroup/add_spec.rb b/spec/ruby/core/threadgroup/add_spec.rb new file mode 100644 index 0000000000..2921c1ab22 --- /dev/null +++ b/spec/ruby/core/threadgroup/add_spec.rb @@ -0,0 +1,39 @@ +require_relative '../../spec_helper' + +describe "ThreadGroup#add" do + before :each do + @q1, @q2 = Queue.new, Queue.new + @thread = Thread.new { @q1 << :go; @q2.pop } + @q1.pop + end + + after :each do + @q2 << :done + @thread.join + end + + # This spec randomly kills mspec worker like: https://ci.appveyor.com/project/ruby/ruby/build/9806/job/37tx2atojy96227m + # TODO: Investigate the cause or at least print helpful logs, and remove this `platform_is_not` guard. + platform_is_not :mingw do + it "adds the given thread to a group and returns self" do + @thread.group.should_not == nil + + tg = ThreadGroup.new + tg.add(@thread).should == tg + @thread.group.should == tg + tg.list.include?(@thread).should == true + end + + it "removes itself from any other threadgroup" do + tg1 = ThreadGroup.new + tg2 = ThreadGroup.new + + tg1.add(@thread) + @thread.group.should == tg1 + tg2.add(@thread) + @thread.group.should == tg2 + tg2.list.include?(@thread).should == true + tg1.list.include?(@thread).should == false + end + end +end diff --git a/spec/ruby/core/threadgroup/default_spec.rb b/spec/ruby/core/threadgroup/default_spec.rb new file mode 100644 index 0000000000..d7d4726cc2 --- /dev/null +++ b/spec/ruby/core/threadgroup/default_spec.rb @@ -0,0 +1,11 @@ +require_relative '../../spec_helper' + +describe "ThreadGroup::Default" do + it "is a ThreadGroup instance" do + ThreadGroup::Default.should be_kind_of(ThreadGroup) + end + + it "is the ThreadGroup of the main thread" do + ThreadGroup::Default.should == Thread.main.group + end +end diff --git a/spec/ruby/core/threadgroup/enclose_spec.rb b/spec/ruby/core/threadgroup/enclose_spec.rb new file mode 100644 index 0000000000..dd9a7a362d --- /dev/null +++ b/spec/ruby/core/threadgroup/enclose_spec.rb @@ -0,0 +1,24 @@ +require_relative '../../spec_helper' + +describe "ThreadGroup#enclose" do + before :each do + @q1, @q2 = Queue.new, Queue.new + @thread = Thread.new { @q1 << :go; @q2.pop } + @q1.pop + end + + after :each do + @q2 << :done + @thread.join + end + + it "raises a ThreadError if attempting to move a Thread from an enclosed ThreadGroup" do + thread_group = ThreadGroup.new + default_group = @thread.group + thread_group.add(@thread) + thread_group.enclose + -> do + default_group.add(@thread) + end.should raise_error(ThreadError) + end +end diff --git a/spec/ruby/core/threadgroup/enclosed_spec.rb b/spec/ruby/core/threadgroup/enclosed_spec.rb new file mode 100644 index 0000000000..a734256a64 --- /dev/null +++ b/spec/ruby/core/threadgroup/enclosed_spec.rb @@ -0,0 +1,14 @@ +require_relative '../../spec_helper' + +describe "ThreadGroup#enclosed?" do + it "returns false when a ThreadGroup has not been enclosed (default state)" do + thread_group = ThreadGroup.new + thread_group.enclosed?.should be_false + end + + it "returns true when a ThreadGroup is enclosed" do + thread_group = ThreadGroup.new + thread_group.enclose + thread_group.enclosed?.should be_true + end +end diff --git a/spec/ruby/core/threadgroup/list_spec.rb b/spec/ruby/core/threadgroup/list_spec.rb new file mode 100644 index 0000000000..b2ac64324a --- /dev/null +++ b/spec/ruby/core/threadgroup/list_spec.rb @@ -0,0 +1,23 @@ +require_relative '../../spec_helper' + +describe "ThreadGroup#list" do + it "returns the list of threads in the group" do + q = Queue.new + th1 = Thread.new { q << :go; sleep } + q.pop.should == :go + tg = ThreadGroup.new + tg.add(th1) + tg.list.should include(th1) + + th2 = Thread.new { q << :go; sleep } + q.pop.should == :go + + tg.add(th2) + (tg.list & [th1, th2]).should include(th1, th2) + + Thread.pass while th1.status and th1.status != 'sleep' + Thread.pass while th2.status and th2.status != 'sleep' + th1.run; th1.join + th2.run; th2.join + end +end |
