diff options
Diffstat (limited to 'spec/ruby/core/thread')
-rw-r--r-- | spec/ruby/core/thread/backtrace_spec.rb | 8 | ||||
-rw-r--r-- | spec/ruby/core/thread/current_spec.rb | 16 | ||||
-rw-r--r-- | spec/ruby/core/thread/fetch_spec.rb | 38 | ||||
-rw-r--r-- | spec/ruby/core/thread/priority_spec.rb | 20 |
4 files changed, 74 insertions, 8 deletions
diff --git a/spec/ruby/core/thread/backtrace_spec.rb b/spec/ruby/core/thread/backtrace_spec.rb index a20fdee956..532d7a8f4e 100644 --- a/spec/ruby/core/thread/backtrace_spec.rb +++ b/spec/ruby/core/thread/backtrace_spec.rb @@ -24,4 +24,12 @@ describe "Thread#backtrace" do t.join t.backtrace.should == nil end + + it "returns an array (which may be empty) immediately after the thread is created" do + t = Thread.new { sleep } + backtrace = t.backtrace + t.kill + t.join + backtrace.should be_kind_of(Array) + end end diff --git a/spec/ruby/core/thread/current_spec.rb b/spec/ruby/core/thread/current_spec.rb index cc969b71c4..6c4dcfae43 100644 --- a/spec/ruby/core/thread/current_spec.rb +++ b/spec/ruby/core/thread/current_spec.rb @@ -12,4 +12,20 @@ describe "Thread.current" do t.value.should equal(t) Thread.current.should_not equal(t.value) end + + it "returns the correct thread in a Fiber" do + # This catches a bug where Fibers are running on a thread-pool + # and Fibers from a different Ruby Thread reuse the same native thread. + # Caching the Ruby Thread based on the native thread is not correct in that case. + 2.times do + t = Thread.new { + cur = Thread.current + Fiber.new { + Thread.current + }.resume.should equal cur + cur + } + t.value.should equal t + end + end end diff --git a/spec/ruby/core/thread/fetch_spec.rb b/spec/ruby/core/thread/fetch_spec.rb new file mode 100644 index 0000000000..33ac3e0433 --- /dev/null +++ b/spec/ruby/core/thread/fetch_spec.rb @@ -0,0 +1,38 @@ +require File.expand_path('../../../spec_helper', __FILE__) + +ruby_version_is '2.5' do + describe 'Thread#fetch' do + describe 'with 2 arguments' do + it 'returns the value of the fiber-local variable if value has been assigned' do + th = Thread.new { Thread.current[:cat] = 'meow' } + th.join + th.fetch(:cat, true).should == 'meow' + end + + it "returns the default value if fiber-local variable hasn't been assigned" do + th = Thread.new {} + th.join + th.fetch(:cat, true).should == true + end + end + + describe 'with 1 argument' do + it 'raises a KeyError when the Thread does not have a fiber-local variable of the same name' do + th = Thread.new {} + th.join + -> { th.fetch(:cat) }.should raise_error(KeyError) + end + + it 'returns the value of the fiber-local variable if value has been assigned' do + th = Thread.new { Thread.current[:cat] = 'meow' } + th.join + th.fetch(:cat).should == 'meow' + end + end + + it 'raises an ArgumentError when not passed one or two arguments' do + -> { Thread.current.fetch() }.should raise_error(ArgumentError) + -> { Thread.current.fetch(1, 2, 3) }.should raise_error(ArgumentError) + end + end +end diff --git a/spec/ruby/core/thread/priority_spec.rb b/spec/ruby/core/thread/priority_spec.rb index b986fb7a0d..40022da80d 100644 --- a/spec/ruby/core/thread/priority_spec.rb +++ b/spec/ruby/core/thread/priority_spec.rb @@ -2,13 +2,14 @@ require File.expand_path('../../../spec_helper', __FILE__) require File.expand_path('../fixtures/classes', __FILE__) describe "Thread#priority" do - before do + before :each do @current_priority = Thread.current.priority ThreadSpecs.clear_state @thread = Thread.new { Thread.pass until ThreadSpecs.state == :exit } + Thread.pass until @thread.alive? end - after do + after :each do ThreadSpecs.state = :exit @thread.join end @@ -31,12 +32,14 @@ describe "Thread#priority" do end describe "Thread#priority=" do - before do + before :each do ThreadSpecs.clear_state - @thread = Thread.new {} + @thread = Thread.new { Thread.pass until ThreadSpecs.state == :exit } + Thread.pass until @thread.alive? end - after do + after :each do + ThreadSpecs.state = :exit @thread.join end @@ -61,8 +64,9 @@ describe "Thread#priority=" do end it "sets priority even when the thread has died" do - @thread.join - @thread.priority = 3 - @thread.priority.should == 3 + thread = Thread.new {} + thread.join + thread.priority = 3 + thread.priority.should == 3 end end |