Respect timeout when doing get_file_data
[ruby-mogilefs-client.git] / test / test_util.rb
blob55cac66b8bc397ff5dd9c1c5db18527ad69b5ad7
1 require 'test/setup'
3 class TestMogileFS__Util < Test::Unit::TestCase
4   include MogileFS::Util
6   def test_mogilefs_write
7     rd, wr = IO.pipe
9     svr = Proc.new do |serv, port|
10       client, client_addr = serv.accept
11       client.sync = true
12       nr = 0
13       loop do
14         begin
15           nr += client.readpartial(16384).length
16         rescue EOFError
17           break
18         end
19       end
20       wr.syswrite("#{nr}\n")
21       client.close rescue nil
22     end
23     t = TempServer.new(svr)
24     s = Socket.mogilefs_new('127.0.0.1', t.port)
25     tmp = s.getsockopt(Socket::SOL_SOCKET, Socket::SO_SNDBUF)
26     sndbuf_bytes = tmp.unpack('i')[0]
27     big_string = ' ' * (sndbuf_bytes * 10)
29     sent = s.send(big_string, 0)
30     assert(sent < big_string.length)
32     syswrite_full(s, big_string)
33     s.close rescue nil
34     IO.select([rd])
35     assert_equal((sent + big_string.length), rd.sysread(4096).to_i)
36     ensure
37       t.destroy!
38   end
40   def test_write_timeout
41     svr = Proc.new do |serv, port|
42       client, client_addr = serv.accept
43       client.sync = true
44       readed = client.readpartial(16384)
45       sleep
46     end
47     t = TempServer.new(svr)
48     s = Socket.mogilefs_new('127.0.0.1', t.port)
49     tmp = s.getsockopt(Socket::SOL_SOCKET, Socket::SO_SNDBUF)
50     sndbuf_bytes = tmp.unpack('i')[0]
51     big_string = ' ' * (sndbuf_bytes * 10)
53     assert_raises(MogileFS::Timeout) { syswrite_full(s, big_string, 0.1) }
54     s.close rescue nil
55     ensure
56       t.destroy!
57   end
59   def test_sysread_slowly
60     nr = 10
61     str = 'abcde'
62     expect = str * nr
63     rd, wr = IO.pipe
64     pid = fork do
65       rd.close
66       nr.times do
67         syswrite_full(wr, str)
68         sleep(0.1)
69       end
70     end
71     wr.close
72     buf = sysread_full(rd, expect.size)
73     assert_equal expect, buf
74     rd.close
75     ensure
76       Process.kill('TERM', pid) rescue nil
77       Process.waitpid(pid) rescue nil
78   end
80   def test_sysread_timeout
81     nr = 10
82     str = 'abcde'
83     expect = str * nr
84     rd, wr = IO.pipe
85     pid = fork do
86       rd.close
87       nr.times do
88         syswrite_full(wr, str)
89         sleep 1
90       end
91     end
92     wr.close
93     assert_raises(MogileFS::Timeout) { sysread_full(rd, expect.size, 0.1) }
94     rd.close
95     ensure
96       Process.kill('TERM', pid) rescue nil
97       Process.waitpid(pid) rescue nil
98   end
100   def test_sysread_full_timeout
101     nr = 100
102     str = 'abcde'
103     expect = str * nr
104     rd, wr = IO.pipe
105     pid = fork do
106       rd.close
107       nr.times do
108         syswrite_full(wr, str)
109         sleep 0.01
110       end
111     end
112     wr.close
113     assert_raises(MogileFS::Timeout) { sysread_full(rd,expect.size,0.1,true) }
114     rd.close
115     ensure
116       Process.kill('TERM', pid) rescue nil
117       Process.waitpid(pid) rescue nil
118   end