* io.c (rb_open_file): encoding in mode string was ignored if perm is
[ruby-svn.git] / test / socket / test_nonblock.rb
blobed6487b49f83520b2075209370b3af1645890627
1 begin
2   require "socket"
3 rescue LoadError
4 end
6 require "test/unit"
7 require "tempfile"
8 require "timeout"
10 class TestNonblockSocket < Test::Unit::TestCase
11   def test_accept_nonblock
12     serv = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
13     serv.bind(Socket.sockaddr_in(0, "127.0.0.1"))
14     serv.listen(5)
15     assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { serv.accept_nonblock }
16     c = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
17     c.connect(serv.getsockname)
18     s, sockaddr = serv.accept_nonblock
19     assert_equal(Socket.unpack_sockaddr_in(c.getsockname), Socket.unpack_sockaddr_in(sockaddr))
20   ensure
21     serv.close if serv
22     c.close if c
23     s.close if s
24   end
26   def test_connect_nonblock
27     serv = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
28     serv.bind(Socket.sockaddr_in(0, "127.0.0.1"))
29     serv.listen(5)
30     c = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
31     servaddr = serv.getsockname
32     begin
33       c.connect_nonblock(servaddr)
34     rescue Errno::EINPROGRESS
35       IO.select nil, [c]
36       assert_nothing_raised {
37         begin
38           c.connect_nonblock(servaddr)
39         rescue Errno::EISCONN
40         end
41       }
42     end
43     s, sockaddr = serv.accept
44     assert_equal(Socket.unpack_sockaddr_in(c.getsockname), Socket.unpack_sockaddr_in(sockaddr))
45   ensure
46     serv.close if serv
47     c.close if c
48     s.close if s
49   end
51   def test_udp_recvfrom_nonblock
52     u1 = UDPSocket.new
53     u2 = UDPSocket.new
54     u1.bind("127.0.0.1", 0)
55     assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { u1.recvfrom_nonblock(100) }
56     assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK, Errno::EINVAL) { u2.recvfrom_nonblock(100) }
57     u2.send("aaa", 0, u1.getsockname)
58     IO.select [u1]
59     mesg, inet_addr = u1.recvfrom_nonblock(100)
60     assert_equal(4, inet_addr.length)
61     assert_equal("aaa", mesg)
62     af, port, host, addr = inet_addr
63     u2_port, u2_addr = Socket.unpack_sockaddr_in(u2.getsockname)
64     assert_equal(u2_port, port)
65     assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { u1.recvfrom_nonblock(100) }
66     u2.send("", 0, u1.getsockname)
67     assert_nothing_raised("cygwin 1.5.19 has a problem to send an empty UDP packet. [ruby-dev:28915]") {
68       timeout(1) { IO.select [u1] }
69     }
70     mesg, inet_addr = u1.recvfrom_nonblock(100)
71     assert_equal("", mesg)
72   ensure
73     u1.close if u1
74     u2.close if u2
75   end
77   def test_udp_recv_nonblock
78     u1 = UDPSocket.new
79     u2 = UDPSocket.new
80     u1.bind("127.0.0.1", 0)
81     assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { u1.recv_nonblock(100) }
82     assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK, Errno::EINVAL) { u2.recv_nonblock(100) }
83     u2.send("aaa", 0, u1.getsockname)
84     IO.select [u1]
85     mesg = u1.recv_nonblock(100)
86     assert_equal("aaa", mesg)
87     assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { u1.recv_nonblock(100) }
88     u2.send("", 0, u1.getsockname)
89     assert_nothing_raised("cygwin 1.5.19 has a problem to send an empty UDP packet. [ruby-dev:28915]") {
90       timeout(1) { IO.select [u1] }
91     }
92     mesg = u1.recv_nonblock(100)
93     assert_equal("", mesg)
94   ensure
95     u1.close if u1
96     u2.close if u2
97   end
99   def test_socket_recvfrom_nonblock
100     s1 = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM, 0)
101     s1.bind(Socket.sockaddr_in(0, "127.0.0.1"))
102     s2 = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM, 0)
103     assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { s1.recvfrom_nonblock(100) }
104     assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK, Errno::EINVAL) { s2.recvfrom_nonblock(100) }
105     s2.send("aaa", 0, s1.getsockname)
106     IO.select [s1]
107     mesg, sockaddr = s1.recvfrom_nonblock(100) 
108     assert_equal("aaa", mesg)
109     port, addr = Socket.unpack_sockaddr_in(sockaddr)
110     s2_port, s2_addr = Socket.unpack_sockaddr_in(s2.getsockname)
111     assert_equal(s2_port, port)
112   ensure
113     s1.close if s1
114     s2.close if s2
115   end
117   def tcp_pair
118     serv = TCPServer.new("127.0.0.1", 0)
119     af, port, host, addr = serv.addr
120     c = TCPSocket.new(addr, port)
121     s = serv.accept
122     return c, s
123   ensure
124     serv.close if serv
125   end
127   def test_tcp_recv_nonblock
128     c, s = tcp_pair
129     assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { c.recv_nonblock(100) }
130     assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { s.recv_nonblock(100) }
131     c.write("abc")
132     IO.select [s]
133     assert_equal("a", s.recv_nonblock(1))
134     assert_equal("bc", s.recv_nonblock(100))
135     assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { s.recv_nonblock(100) }
136   ensure
137     c.close if c
138     s.close if s
139   end
141   def test_read_nonblock
142     c, s = tcp_pair
143     assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { c.read_nonblock(100) }
144     assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { s.read_nonblock(100) }
145     c.write("abc")
146     IO.select [s]
147     assert_equal("a", s.read_nonblock(1))
148     assert_equal("bc", s.read_nonblock(100))
149     assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { s.read_nonblock(100) }
150   ensure
151     c.close if c
152     s.close if s
153   end
155 =begin
156   def test_write_nonblock
157     c, s = tcp_pair
158     str = "a" * 10000
159     _, ws, _ = IO.select(nil, [c], nil)
160     assert_equal([c], ws)
161     ret = c.write_nonblock(str)
162     assert_operator(ret, :>, 0)
163     loop {
164       assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) {
165         loop {
166           ret = c.write_nonblock(str)
167           assert_operator(ret, :>, 0)
168         }
169       }
170       _, ws, _ = IO.select(nil, [c], nil, 0)
171       break if !ws
172     }
173   ensure
174     c.close if c
175     s.close if s
176   end
177 =end
179 end if defined?(Socket)