|
6 | 6 | # We may optimize IO#wait_*able for non-Linux kernels in the future
|
7 | 7 | class TestIOWaitUncommon < Test::Unit::TestCase
|
8 | 8 | def test_tty_wait
|
9 |
| - begin |
10 |
| - tty = File.open('/dev/tty', 'w+') |
11 |
| - rescue Errno::ENOENT, Errno::ENXIO => e |
12 |
| - skip "/dev/tty: #{e.message} (#{e.class})" |
| 9 | + check_dev('/dev/tty', mode: 'w+') do |tty| |
| 10 | + assert_include [ nil, tty ], tty.wait_readable(0) |
| 11 | + assert_equal tty, tty.wait_writable(1), 'portability test' |
13 | 12 | end
|
14 |
| - assert_include [ nil, tty ], tty.wait_readable(0) |
15 |
| - assert_equal tty, tty.wait_writable(1), 'portability test' |
16 |
| - ensure |
17 |
| - tty&.close |
18 | 13 | end
|
19 | 14 |
|
20 | 15 | def test_fifo_wait
|
@@ -44,36 +39,40 @@ def test_fifo_wait
|
44 | 39 |
|
45 | 40 | # used to find portability problems because some ppoll implementations
|
46 | 41 | # are incomplete and do not work for certain "file" types
|
47 |
| - def check_dev(dev, m = :wait_readable) |
| 42 | + def check_dev(dev, m = :wait_readable, mode: m == :wait_readable ? 'r' : 'w', &block) |
48 | 43 | begin
|
49 |
| - fp = File.open("/dev/#{dev}", m == :wait_readable ? 'r' : 'w') |
| 44 | + fp = File.open(dev, mode) |
| 45 | + rescue Errno::ENOENT |
| 46 | + return # Ignore silently |
50 | 47 | rescue SystemCallError => e
|
51 | 48 | skip "#{dev} could not be opened #{e.message} (#{e.class})"
|
52 | 49 | end
|
53 |
| - assert_same fp, fp.__send__(m) |
| 50 | + if block |
| 51 | + yield fp |
| 52 | + else |
| 53 | + assert_same fp, fp.__send__(m) |
| 54 | + end |
54 | 55 | ensure
|
55 | 56 | fp&.close
|
56 | 57 | end
|
57 | 58 |
|
58 | 59 | def test_wait_readable_urandom
|
59 |
| - check_dev 'urandom' |
| 60 | + check_dev('/dev/urandom') |
60 | 61 | end
|
61 | 62 |
|
62 | 63 | def test_wait_readable_random
|
63 |
| - File.open('/dev/random') do |fp| |
| 64 | + check_dev('/dev/random') do |fp| |
64 | 65 | assert_nothing_raised do
|
65 | 66 | fp.wait_readable(0)
|
66 | 67 | end
|
67 | 68 | end
|
68 |
| - rescue SystemCallError => e |
69 |
| - skip "/dev/random could not be opened #{e.message} (#{e.class})" |
70 | 69 | end
|
71 | 70 |
|
72 | 71 | def test_wait_readable_zero
|
73 |
| - check_dev 'zero' |
| 72 | + check_dev('/dev/zero') |
74 | 73 | end
|
75 | 74 |
|
76 | 75 | def test_wait_writable_null
|
77 |
| - check_dev 'null', :wait_writable |
| 76 | + check_dev(IO::NULL, :wait_writable) |
78 | 77 | end
|
79 | 78 | end
|
0 commit comments