summaryrefslogtreecommitdiff
path: root/test/fiber
diff options
context:
space:
mode:
Diffstat (limited to 'test/fiber')
-rw-r--r--test/fiber/scheduler.rb8
-rw-r--r--test/fiber/test_scheduler.rb18
-rw-r--r--test/fiber/test_sleep.rb22
-rw-r--r--test/fiber/test_thread.rb20
4 files changed, 66 insertions, 2 deletions
diff --git a/test/fiber/scheduler.rb b/test/fiber/scheduler.rb
index 69299b04e6..c844200935 100644
--- a/test/fiber/scheduler.rb
+++ b/test/fiber/scheduler.rb
@@ -230,3 +230,11 @@ class Scheduler
end.value
end
end
+
+class BrokenUnblockScheduler < Scheduler
+ def unblock(blocker, fiber)
+ super
+
+ raise "Broken unblock!"
+ end
+end
diff --git a/test/fiber/test_scheduler.rb b/test/fiber/test_scheduler.rb
index eeb0d67ec5..f0f5b79f36 100644
--- a/test/fiber/test_scheduler.rb
+++ b/test/fiber/test_scheduler.rb
@@ -66,9 +66,23 @@ class TestFiberScheduler < Test::Unit::TestCase
RUBY
end
- def test_optional_close
+ def test_minimal_interface
+ scheduler = Object.new
+
+ def scheduler.block
+ end
+
+ def scheduler.unblock
+ end
+
+ def scheduler.io_wait
+ end
+
+ def scheduler.kernel_sleep
+ end
+
thread = Thread.new do
- Fiber.set_scheduler Object.new
+ Fiber.set_scheduler scheduler
end
thread.join
diff --git a/test/fiber/test_sleep.rb b/test/fiber/test_sleep.rb
index e882766345..844369740f 100644
--- a/test/fiber/test_sleep.rb
+++ b/test/fiber/test_sleep.rb
@@ -43,4 +43,26 @@ class TestFiberSleep < Test::Unit::TestCase
assert_operator seconds, :>=, 2, "actual: %p" % seconds
end
+
+ def test_broken_sleep
+ thread = Thread.new do
+ Thread.current.report_on_exception = false
+
+ scheduler = Scheduler.new
+
+ def scheduler.kernel_sleep(duration = nil)
+ raise "Broken sleep!"
+ end
+
+ Fiber.set_scheduler scheduler
+
+ Fiber.schedule do
+ sleep 0
+ end
+ end
+
+ assert_raise(RuntimeError) do
+ thread.join
+ end
+ end
end
diff --git a/test/fiber/test_thread.rb b/test/fiber/test_thread.rb
index 5fc80f0e6c..b7323d7237 100644
--- a/test/fiber/test_thread.rb
+++ b/test/fiber/test_thread.rb
@@ -42,4 +42,24 @@ class TestFiberThread < Test::Unit::TestCase
assert_equal :done, thread.value
end
+
+ def test_broken_unblock
+ thread = Thread.new do
+ Thread.current.report_on_exception = false
+
+ scheduler = BrokenUnblockScheduler.new
+
+ Fiber.set_scheduler scheduler
+
+ Fiber.schedule do
+ Thread.new{}.join
+ end
+
+ scheduler.run
+ end
+
+ assert_raise(RuntimeError) do
+ thread.join
+ end
+ end
end