[前][次][番号順一覧][スレッド一覧]

ruby-changes:51217

From: normal <ko1@a...>
Date: Tue, 15 May 2018 09:08:39 +0900 (JST)
Subject: [ruby-changes:51217] normal:r63423 (trunk): test_io_wait_uncommon: new test for uncommon file types

normal	2018-05-15 09:08:33 +0900 (Tue, 15 May 2018)

  New Revision: 63423

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=63423

  Log:
    test_io_wait_uncommon: new test for uncommon file types
    
    This should make portability problems more apparent when we try
    using ppoll with rb_wait_for_single_fd on FreeBSD or other
    non-Linux platforms.

  Added files:
    trunk/test/io/wait/test_io_wait_uncommon.rb
Index: test/io/wait/test_io_wait_uncommon.rb
===================================================================
--- test/io/wait/test_io_wait_uncommon.rb	(nonexistent)
+++ test/io/wait/test_io_wait_uncommon.rb	(revision 63423)
@@ -0,0 +1,72 @@ https://github.com/ruby/ruby/blob/trunk/test/io/wait/test_io_wait_uncommon.rb#L1
+# frozen_string_literal: true
+require 'test/unit'
+require 'io/wait'
+
+# test uncommon device types to check portability problems
+# We may optimize IO#wait_*able for non-Linux kernels in the future
+class TestIOWaitUncommon < Test::Unit::TestCase
+  def test_tty_wait
+    begin
+      tty = File.open('/dev/tty', 'w+')
+    rescue Errno::ENOENT, Errno::ENXIO => e
+      skip "/dev/tty: #{e.message} (#{e.class})"
+    end
+    assert_include [ nil, tty ], tty.wait_readable(0)
+    assert_equal tty, tty.wait_writable(0), 'portability test'
+  ensure
+    tty&.close
+  end
+
+  def test_fifo_wait
+    skip 'no mkfifo' unless File.respond_to?(:mkfifo) && IO.const_defined?(:NONBLOCK)
+    Dir.mktmpdir('rubytest-fifo') do |dir|
+      fifo = "#{dir}/fifo"
+      assert_equal 0, File.mkfifo(fifo)
+      rd = Thread.new { File.open(fifo, IO::RDONLY|IO::NONBLOCK) }
+      begin
+        wr = File.open(fifo, IO::WRONLY|IO::NONBLOCK)
+      rescue Errno::ENXIO
+        Thread.pass
+      end until wr
+      assert_instance_of File, rd.value
+      assert_instance_of File, wr
+      rd = rd.value
+      assert_nil rd.wait_readable(0)
+      assert_same wr, wr.wait_writable(0)
+      wr.syswrite 'hi'
+      assert_same rd, rd.wait_readable(1)
+      wr.close
+      assert_equal 'hi', rd.gets
+      rd.close
+    end
+  end
+
+  # used to find portability problems because some ppoll implementations
+  # are incomplete and do not work for certain "file" types
+  def check_dev(dev, m = :wait_readable)
+    begin
+      fp = File.open("/dev/#{dev}", m == :wait_readable ? 'r' : 'w')
+    rescue SystemCallError => e
+      skip "#{dev} could not be opened #{e.message} (#{e.class})"
+    end
+    assert_same fp, fp.__send__(m)
+  ensure
+    fp&.close
+  end
+
+  def test_wait_readable_urandom
+    check_dev 'urandom'
+  end
+
+  def test_wait_readable_random
+    check_dev 'random'
+  end
+
+  def test_wait_readable_zero
+    check_dev 'zero'
+  end
+
+  def test_wait_writable_null
+    check_dev 'null', :wait_writable
+  end
+end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]