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"))
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))
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"))
30 c = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
31 servaddr = serv.getsockname
33 c.connect_nonblock(servaddr)
34 rescue Errno::EINPROGRESS
36 assert_nothing_raised {
38 c.connect_nonblock(servaddr)
43 s, sockaddr = serv.accept
44 assert_equal(Socket.unpack_sockaddr_in(c.getsockname), Socket.unpack_sockaddr_in(sockaddr))
51 def test_udp_recvfrom_nonblock
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)
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] }
70 mesg, inet_addr = u1.recvfrom_nonblock(100)
71 assert_equal("", mesg)
77 def test_udp_recv_nonblock
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)
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] }
92 mesg = u1.recv_nonblock(100)
93 assert_equal("", mesg)
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)
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)
118 serv = TCPServer.new("127.0.0.1", 0)
119 af, port, host, addr = serv.addr
120 c = TCPSocket.new(addr, port)
127 def test_tcp_recv_nonblock
129 assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { c.recv_nonblock(100) }
130 assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { s.recv_nonblock(100) }
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) }
141 def test_read_nonblock
143 assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { c.read_nonblock(100) }
144 assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { s.read_nonblock(100) }
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) }
156 def test_write_nonblock
159 _, ws, _ = IO.select(nil, [c], nil)
160 assert_equal([c], ws)
161 ret = c.write_nonblock(str)
162 assert_operator(ret, :>, 0)
164 assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) {
166 ret = c.write_nonblock(str)
167 assert_operator(ret, :>, 0)
170 _, ws, _ = IO.select(nil, [c], nil, 0)
179 end if defined?(Socket)