diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/fiber/scheduler.rb | 28 | ||||
-rw-r--r-- | test/fiber/test_timeout.rb | 30 |
2 files changed, 54 insertions, 4 deletions
diff --git a/test/fiber/scheduler.rb b/test/fiber/scheduler.rb index f2fb304e19..8a8585fcbe 100644 --- a/test/fiber/scheduler.rb +++ b/test/fiber/scheduler.rb @@ -81,10 +81,12 @@ class Scheduler waiting, @waiting = @waiting, {} waiting.each do |fiber, timeout| - if timeout <= time - fiber.resume - else - @waiting[fiber] = timeout + if fiber.alive? + if timeout <= time + fiber.resume + else + @waiting[fiber] = timeout + end end end end @@ -127,6 +129,24 @@ class Scheduler Process.clock_gettime(Process::CLOCK_MONOTONIC) end + def timeout_raise(duration, klass, message, &block) + fiber = Fiber.current + + self.fiber do + sleep(duration) + + if fiber&.alive? + fiber.raise(klass, message) + end + end + + begin + yield(duration) + ensure + fiber = nil + end + end + def process_wait(pid, flags) # $stderr.puts [__method__, pid, flags, Fiber.current].inspect diff --git a/test/fiber/test_timeout.rb b/test/fiber/test_timeout.rb new file mode 100644 index 0000000000..b974aa0e35 --- /dev/null +++ b/test/fiber/test_timeout.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true +require 'test/unit' +require_relative 'scheduler' + +require 'timeout' + +class TestFiberTimeout < Test::Unit::TestCase + def test_timeout_raise + error = nil + + thread = Thread.new do + scheduler = Scheduler.new + Fiber.set_scheduler scheduler + + Fiber.schedule do + begin + Timeout.timeout(0.01) do + sleep(1) + end + rescue + error = $! + end + end + end + + thread.join + + assert_kind_of(Timeout::Error, error) + end +end |