aboutsummaryrefslogtreecommitdiffstats
path: root/test/fiber/test_io_buffer.rb
diff options
context:
space:
mode:
authorSamuel Williams <samuel.williams@oriontransfer.co.nz>2023-03-31 00:48:55 +1300
committerGitHub <noreply@github.com>2023-03-31 00:48:55 +1300
commit648870b5c577239b3274b0b48c82fb74910dfabf (patch)
treef944e0a1919bcb46537e1f3bd522beee9e72288c /test/fiber/test_io_buffer.rb
parent6f122965cf8704f019445faead58040e9be2effb (diff)
downloadruby-648870b5c577239b3274b0b48c82fb74910dfabf.tar.gz
Support `IO#pread` / `IO#pwrite` using fiber scheduler. (#7594)
* Skip test if non-blocking file IO is not supported.
Diffstat (limited to 'test/fiber/test_io_buffer.rb')
-rw-r--r--test/fiber/test_io_buffer.rb41
1 files changed, 41 insertions, 0 deletions
diff --git a/test/fiber/test_io_buffer.rb b/test/fiber/test_io_buffer.rb
index 3de70200d5..a08b1ce1a9 100644
--- a/test/fiber/test_io_buffer.rb
+++ b/test/fiber/test_io_buffer.rb
@@ -155,4 +155,45 @@ class TestFiberIOBuffer < Test::Unit::TestCase
i&.close
o&.close
end
+
+ def nonblockable?(io)
+ io.nonblock{}
+ true
+ rescue
+ false
+ end
+
+ def test_io_buffer_pread_pwrite
+ file = Tempfile.new("test_io_buffer_pread_pwrite")
+
+ omit "Non-blocking file IO is not supported" unless nonblockable?(file)
+
+ source_buffer = IO::Buffer.for("Hello World!")
+ destination_buffer = IO::Buffer.new(source_buffer.size)
+
+ # Test non-scheduler code path:
+ source_buffer.pwrite(file, 1, source_buffer.size)
+ destination_buffer.pread(file, 1, source_buffer.size)
+ assert_equal source_buffer, destination_buffer
+
+ # Test scheduler code path:
+ destination_buffer.clear
+ file.truncate(0)
+
+ thread = Thread.new do
+ scheduler = IOBufferScheduler.new
+ Fiber.set_scheduler scheduler
+
+ Fiber.schedule do
+ source_buffer.pwrite(file, 1, source_buffer.size)
+ destination_buffer.pread(file, 1, source_buffer.size)
+ end
+ end
+
+ thread.join
+
+ assert_equal source_buffer, destination_buffer
+ ensure
+ file&.close!
+ end
end