summaryrefslogtreecommitdiff
path: root/spec/ruby/core/threadgroup
diff options
context:
space:
mode:
Diffstat (limited to 'spec/ruby/core/threadgroup')
-rw-r--r--spec/ruby/core/threadgroup/add_spec.rb39
-rw-r--r--spec/ruby/core/threadgroup/default_spec.rb11
-rw-r--r--spec/ruby/core/threadgroup/enclose_spec.rb24
-rw-r--r--spec/ruby/core/threadgroup/enclosed_spec.rb14
-rw-r--r--spec/ruby/core/threadgroup/list_spec.rb23
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