rubysl-socket 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +70 -16
  3. data/lib/rubysl/socket.rb +201 -1396
  4. data/lib/rubysl/socket/ancillary_data.rb +56 -0
  5. data/lib/rubysl/socket/bsd.rb +28 -0
  6. data/lib/rubysl/socket/error.rb +67 -0
  7. data/lib/rubysl/socket/foreign.rb +324 -0
  8. data/lib/rubysl/socket/foreign/addrinfo.rb +10 -0
  9. data/lib/rubysl/socket/foreign/hostent.rb +36 -0
  10. data/lib/rubysl/socket/foreign/ifaddrs.rb +129 -0
  11. data/lib/rubysl/socket/foreign/iovec.rb +18 -0
  12. data/lib/rubysl/socket/foreign/linger.rb +41 -0
  13. data/lib/rubysl/socket/foreign/msghdr.rb +41 -0
  14. data/lib/rubysl/socket/foreign/servent.rb +17 -0
  15. data/lib/rubysl/socket/foreign/sockaddr.rb +21 -0
  16. data/lib/rubysl/socket/foreign/sockaddr_in.rb +25 -0
  17. data/lib/rubysl/socket/foreign/sockaddr_in6.rb +25 -0
  18. data/lib/rubysl/socket/foreign/sockaddr_un.rb +29 -0
  19. data/lib/rubysl/socket/ipv6.rb +38 -0
  20. data/lib/rubysl/socket/linux.rb +16 -0
  21. data/lib/rubysl/socket/socket_options.rb +84 -0
  22. data/lib/rubysl/socket/version.rb +1 -1
  23. data/lib/socket.rb +45 -1
  24. data/lib/socket/addrinfo.rb +453 -0
  25. data/lib/socket/ancillary_data.rb +114 -0
  26. data/lib/socket/basic_socket.rb +295 -0
  27. data/lib/socket/constants.rb +41 -0
  28. data/lib/socket/ifaddr.rb +29 -0
  29. data/lib/socket/ip_socket.rb +37 -0
  30. data/lib/socket/mri.rb +928 -0
  31. data/lib/socket/option.rb +96 -0
  32. data/lib/socket/socket.rb +353 -0
  33. data/lib/socket/socket_error.rb +2 -0
  34. data/lib/socket/tcp_server.rb +78 -0
  35. data/lib/socket/tcp_socket.rb +109 -0
  36. data/lib/socket/udp_socket.rb +73 -0
  37. data/lib/socket/unix_server.rb +35 -0
  38. data/lib/socket/unix_socket.rb +78 -0
  39. data/rubysl-socket.gemspec +15 -10
  40. metadata +78 -293
  41. data/.gitignore +0 -17
  42. data/.travis.yml +0 -9
  43. data/Gemfile +0 -4
  44. data/Rakefile +0 -1
  45. data/spec/addrinfo/afamily_spec.rb +0 -5
  46. data/spec/addrinfo/bind_spec.rb +0 -5
  47. data/spec/addrinfo/canonname_spec.rb +0 -5
  48. data/spec/addrinfo/connect_from_spec.rb +0 -5
  49. data/spec/addrinfo/connect_spec.rb +0 -5
  50. data/spec/addrinfo/connect_to_spec.rb +0 -5
  51. data/spec/addrinfo/family_addrinfo_spec.rb +0 -5
  52. data/spec/addrinfo/foreach_spec.rb +0 -5
  53. data/spec/addrinfo/getaddrinfo_spec.rb +0 -5
  54. data/spec/addrinfo/getnameinfo_spec.rb +0 -5
  55. data/spec/addrinfo/inspect_sockaddr_spec.rb +0 -5
  56. data/spec/addrinfo/inspect_spec.rb +0 -5
  57. data/spec/addrinfo/ip_address_spec.rb +0 -5
  58. data/spec/addrinfo/ip_port_spec.rb +0 -5
  59. data/spec/addrinfo/ip_spec.rb +0 -9
  60. data/spec/addrinfo/ip_unpack_spec.rb +0 -5
  61. data/spec/addrinfo/ipv4_loopback_spec.rb +0 -5
  62. data/spec/addrinfo/ipv4_multicast_spec.rb +0 -5
  63. data/spec/addrinfo/ipv4_private_spec.rb +0 -5
  64. data/spec/addrinfo/ipv4_spec.rb +0 -5
  65. data/spec/addrinfo/ipv6_linklocal_spec.rb +0 -5
  66. data/spec/addrinfo/ipv6_loopback_spec.rb +0 -5
  67. data/spec/addrinfo/ipv6_mc_global_spec.rb +0 -5
  68. data/spec/addrinfo/ipv6_mc_linklocal_spec.rb +0 -5
  69. data/spec/addrinfo/ipv6_mc_nodelocal_spec.rb +0 -5
  70. data/spec/addrinfo/ipv6_mc_orglocal_spec.rb +0 -5
  71. data/spec/addrinfo/ipv6_mc_sitelocal_spec.rb +0 -5
  72. data/spec/addrinfo/ipv6_multicast_spec.rb +0 -5
  73. data/spec/addrinfo/ipv6_sitelocal_spec.rb +0 -5
  74. data/spec/addrinfo/ipv6_spec.rb +0 -5
  75. data/spec/addrinfo/ipv6_to_ipv4_spec.rb +0 -5
  76. data/spec/addrinfo/ipv6_unspecified_spec.rb +0 -5
  77. data/spec/addrinfo/ipv6_v4compat_spec.rb +0 -5
  78. data/spec/addrinfo/ipv6_v4mapped_spec.rb +0 -5
  79. data/spec/addrinfo/listen_spec.rb +0 -5
  80. data/spec/addrinfo/marshal_dump_spec.rb +0 -5
  81. data/spec/addrinfo/marshal_load_spec.rb +0 -5
  82. data/spec/addrinfo/pfamily_spec.rb +0 -5
  83. data/spec/addrinfo/protocol_spec.rb +0 -5
  84. data/spec/addrinfo/socktype_spec.rb +0 -5
  85. data/spec/addrinfo/tcp_spec.rb +0 -5
  86. data/spec/addrinfo/to_s_spec.rb +0 -5
  87. data/spec/addrinfo/to_sockaddr_spec.rb +0 -5
  88. data/spec/addrinfo/udp_spec.rb +0 -5
  89. data/spec/addrinfo/unix_path_spec.rb +0 -5
  90. data/spec/addrinfo/unix_spec.rb +0 -9
  91. data/spec/basicsocket/close_read_spec.rb +0 -42
  92. data/spec/basicsocket/close_write_spec.rb +0 -42
  93. data/spec/basicsocket/do_not_reverse_lookup_spec.rb +0 -78
  94. data/spec/basicsocket/for_fd_spec.rb +0 -37
  95. data/spec/basicsocket/getpeername_spec.rb +0 -24
  96. data/spec/basicsocket/getsockname_spec.rb +0 -27
  97. data/spec/basicsocket/getsockopt_spec.rb +0 -54
  98. data/spec/basicsocket/ioctl_spec.rb +0 -22
  99. data/spec/basicsocket/recv_nonblock_spec.rb +0 -6
  100. data/spec/basicsocket/recv_spec.rb +0 -76
  101. data/spec/basicsocket/send_spec.rb +0 -81
  102. data/spec/basicsocket/setsockopt_spec.rb +0 -333
  103. data/spec/basicsocket/shutdown_spec.rb +0 -5
  104. data/spec/constants/constants_spec.rb +0 -63
  105. data/spec/fixtures/classes.rb +0 -174
  106. data/spec/fixtures/send_io.txt +0 -1
  107. data/spec/ipsocket/addr_spec.rb +0 -72
  108. data/spec/ipsocket/getaddress_spec.rb +0 -26
  109. data/spec/ipsocket/peeraddr_spec.rb +0 -79
  110. data/spec/ipsocket/recvfrom_spec.rb +0 -64
  111. data/spec/option/int_spec.rb +0 -27
  112. data/spec/option/linger_spec.rb +0 -52
  113. data/spec/option/new_spec.rb +0 -32
  114. data/spec/shared/pack_sockaddr.rb +0 -26
  115. data/spec/shared/partially_closable_sockets.rb +0 -13
  116. data/spec/shared/recv_nonblock.rb +0 -33
  117. data/spec/shared/socketpair.rb +0 -35
  118. data/spec/socket/accept_nonblock_spec.rb +0 -27
  119. data/spec/socket/accept_spec.rb +0 -1
  120. data/spec/socket/bind_spec.rb +0 -80
  121. data/spec/socket/connect_nonblock_spec.rb +0 -62
  122. data/spec/socket/connect_spec.rb +0 -1
  123. data/spec/socket/for_fd_spec.rb +0 -29
  124. data/spec/socket/getaddrinfo_spec.rb +0 -120
  125. data/spec/socket/gethostbyaddr_spec.rb +0 -1
  126. data/spec/socket/gethostbyname_spec.rb +0 -26
  127. data/spec/socket/gethostname_spec.rb +0 -9
  128. data/spec/socket/getnameinfo_spec.rb +0 -57
  129. data/spec/socket/getservbyname_spec.rb +0 -24
  130. data/spec/socket/listen_spec.rb +0 -21
  131. data/spec/socket/new_spec.rb +0 -109
  132. data/spec/socket/pack_sockaddr_in_spec.rb +0 -6
  133. data/spec/socket/pack_sockaddr_un_spec.rb +0 -6
  134. data/spec/socket/pair_spec.rb +0 -6
  135. data/spec/socket/recvfrom_nonblock_spec.rb +0 -1
  136. data/spec/socket/recvfrom_spec.rb +0 -1
  137. data/spec/socket/sockaddr_in_spec.rb +0 -6
  138. data/spec/socket/sockaddr_un_spec.rb +0 -6
  139. data/spec/socket/socket_spec.rb +0 -37
  140. data/spec/socket/socketpair_spec.rb +0 -6
  141. data/spec/socket/sysaccept_spec.rb +0 -1
  142. data/spec/socket/unpack_sockaddr_in_spec.rb +0 -16
  143. data/spec/socket/unpack_sockaddr_un_spec.rb +0 -2
  144. data/spec/tcpserver/accept_nonblock_spec.rb +0 -30
  145. data/spec/tcpserver/accept_spec.rb +0 -60
  146. data/spec/tcpserver/gets_spec.rb +0 -17
  147. data/spec/tcpserver/listen_spec.rb +0 -1
  148. data/spec/tcpserver/new_spec.rb +0 -88
  149. data/spec/tcpserver/output_spec.rb +0 -8
  150. data/spec/tcpserver/readpartial_spec.rb +0 -8
  151. data/spec/tcpserver/sysaccept_spec.rb +0 -1
  152. data/spec/tcpsocket/gethostbyname_spec.rb +0 -62
  153. data/spec/tcpsocket/new_spec.rb +0 -5
  154. data/spec/tcpsocket/open_spec.rb +0 -5
  155. data/spec/tcpsocket/partially_closable_spec.rb +0 -20
  156. data/spec/tcpsocket/recv_nonblock_spec.rb +0 -31
  157. data/spec/tcpsocket/setsockopt_spec.rb +0 -49
  158. data/spec/tcpsocket/shared/new.rb +0 -85
  159. data/spec/udpsocket/bind_spec.rb +0 -33
  160. data/spec/udpsocket/connect_spec.rb +0 -1
  161. data/spec/udpsocket/new_spec.rb +0 -1
  162. data/spec/udpsocket/open_spec.rb +0 -12
  163. data/spec/udpsocket/recvfrom_nonblock_spec.rb +0 -1
  164. data/spec/udpsocket/send_spec.rb +0 -57
  165. data/spec/unixserver/accept_nonblock_spec.rb +0 -33
  166. data/spec/unixserver/accept_spec.rb +0 -64
  167. data/spec/unixserver/for_fd_spec.rb +0 -32
  168. data/spec/unixserver/new_spec.rb +0 -5
  169. data/spec/unixserver/open_spec.rb +0 -25
  170. data/spec/unixserver/shared/new.rb +0 -23
  171. data/spec/unixsocket/addr_spec.rb +0 -37
  172. data/spec/unixsocket/new_spec.rb +0 -5
  173. data/spec/unixsocket/open_spec.rb +0 -26
  174. data/spec/unixsocket/pair_spec.rb +0 -38
  175. data/spec/unixsocket/partially_closable_spec.rb +0 -25
  176. data/spec/unixsocket/path_spec.rb +0 -29
  177. data/spec/unixsocket/peeraddr_spec.rb +0 -29
  178. data/spec/unixsocket/recv_io_spec.rb +0 -40
  179. data/spec/unixsocket/recvfrom_spec.rb +0 -48
  180. data/spec/unixsocket/send_io_spec.rb +0 -30
  181. data/spec/unixsocket/shared/new.rb +0 -25
@@ -1,27 +0,0 @@
1
- require File.expand_path('../../fixtures/classes', __FILE__)
2
-
3
- ruby_version_is "1.9.2" do
4
- describe "Socket::Option.int" do
5
- it "creates a new Socket::Option for SO_LINGER" do
6
- so = Socket::Option.int(:INET, :SOCKET, :KEEPALIVE, 5)
7
- so.family.should == Socket::Constants::AF_INET
8
- so.level.should == Socket::Constants::SOL_SOCKET
9
- so.optname.should == Socket::Constants::SO_KEEPALIVE
10
- so.data.should == [5].pack('i')
11
- end
12
- end
13
-
14
- describe "Socket::Option#int" do
15
- it "returns int option" do
16
- so = Socket::Option.int(:INET, :SOCKET, :KEEPALIVE, 17)
17
- so.int.should == 17
18
-
19
- so = Socket::Option.int(:INET, :SOCKET, :KEEPALIVE, 32765)
20
- so.int.should == 32765
21
- end
22
- it "raises TypeError if option has not good size" do
23
- so = Socket::Option.new(:UNSPEC, :SOCKET, :KEEPALIVE, [0, 0].pack('i*'))
24
- lambda { so.int }.should raise_error(TypeError)
25
- end
26
- end
27
- end
@@ -1,52 +0,0 @@
1
- require File.expand_path('../../fixtures/classes', __FILE__)
2
-
3
- ruby_version_is "1.9.2" do
4
- describe "Socket::Option.linger" do
5
- it "creates a new Socket::Option for SO_LINGER" do
6
- so = Socket::Option.linger(1, 10)
7
- so.family.should == Socket::Constants::AF_UNSPEC
8
- so.level.should == Socket::Constants::SOL_SOCKET
9
- so.optname.should == Socket::Constants::SO_LINGER
10
- so.data.should == [1, 10].pack('i*')
11
- end
12
- it "accepts boolean as onoff argument" do
13
- so = Socket::Option.linger(false, 0)
14
- so.data.should == [0, 0].pack('i*')
15
-
16
- so = Socket::Option.linger(true, 1)
17
- so.data.should == [1, 1].pack('i*')
18
- end
19
- end
20
-
21
- describe "Socket::Option#linger" do
22
- it "returns linger option" do
23
- so = Socket::Option.linger(0, 5)
24
- ary = so.linger
25
- ary[0].should be_false
26
- ary[1].should == 5
27
-
28
- so = Socket::Option.linger(false, 4)
29
- ary = so.linger
30
- ary[0].should be_false
31
- ary[1].should == 4
32
-
33
- so = Socket::Option.linger(1, 10)
34
- ary = so.linger
35
- ary[0].should be_true
36
- ary[1].should == 10
37
-
38
- so = Socket::Option.linger(true, 9)
39
- ary = so.linger
40
- ary[0].should be_true
41
- ary[1].should == 9
42
- end
43
- it "raises TypeError if not a SO_LINGER" do
44
- so = Socket::Option.int(:AF_UNSPEC, :SOL_SOCKET, :KEEPALIVE, 1)
45
- lambda { so.linger }.should raise_error(TypeError)
46
- end
47
- it "raises TypeError if option has not good size" do
48
- so = Socket::Option.int(:AF_UNSPEC, :SOL_SOCKET, :LINGER, 1)
49
- lambda { so.linger }.should raise_error(TypeError)
50
- end
51
- end
52
- end
@@ -1,32 +0,0 @@
1
- require File.expand_path('../../fixtures/classes', __FILE__)
2
-
3
- ruby_version_is "1.9.2" do
4
- describe "Socket::Option.new" do
5
- it "should accept integers" do
6
- so = Socket::Option.new(Socket::AF_INET, Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, [0].pack('i'))
7
- so.family.should == Socket::AF_INET
8
- so.level.should == Socket::SOL_SOCKET
9
- so.optname.should == Socket::SO_KEEPALIVE
10
- end
11
- it "should accept symbols" do
12
- so = Socket::Option.new(:AF_INET, :SOL_SOCKET, :SO_KEEPALIVE, [0].pack('i'))
13
- so.family.should == Socket::AF_INET
14
- so.level.should == Socket::SOL_SOCKET
15
- so.optname.should == Socket::SO_KEEPALIVE
16
-
17
- so = Socket::Option.new(:INET, :SOCKET, :KEEPALIVE, [0].pack('i'))
18
- so.family.should == Socket::AF_INET
19
- so.level.should == Socket::SOL_SOCKET
20
- so.optname.should == Socket::SO_KEEPALIVE
21
- end
22
- it "should raise error on unknown family" do
23
- lambda { Socket::Option.new(:INET4, :SOCKET, :KEEPALIVE, [0].pack('i')) }.should raise_error(SocketError)
24
- end
25
- it "should raise error on unknown level" do
26
- lambda { Socket::Option.new(:INET, :ROCKET, :KEEPALIVE, [0].pack('i')) }.should raise_error(SocketError)
27
- end
28
- it "should raise error on unknown option name" do
29
- lambda { Socket::Option.new(:INET, :SOCKET, :ALIVE, [0].pack('i')) }.should raise_error(SocketError)
30
- end
31
- end
32
- end
@@ -1,26 +0,0 @@
1
- describe :socket_pack_sockaddr_in, :shared => true do
2
- it "packs and unpacks" do
3
- sockaddr_in = Socket.pack_sockaddr_in 0, nil
4
- port, addr = Socket.unpack_sockaddr_in(sockaddr_in)
5
- ["127.0.0.1", "::1"].include?(addr).should == true
6
- port.should == 0
7
-
8
- sockaddr_in = Socket.pack_sockaddr_in 0, ''
9
- Socket.unpack_sockaddr_in(sockaddr_in).should == [0, '0.0.0.0']
10
-
11
- sockaddr_in = Socket.pack_sockaddr_in 80, '127.0.0.1'
12
- Socket.unpack_sockaddr_in(sockaddr_in).should == [80, '127.0.0.1']
13
-
14
- sockaddr_in = Socket.pack_sockaddr_in '80', '127.0.0.1'
15
- Socket.unpack_sockaddr_in(sockaddr_in).should == [80, '127.0.0.1']
16
- end
17
- end
18
-
19
- describe :socket_pack_sockaddr_un, :shared => true do
20
- not_supported_on :jruby, :windows do
21
- it "packs and unpacks" do
22
- sockaddr_un = Socket.pack_sockaddr_un '/tmp/s'
23
- Socket.unpack_sockaddr_un(sockaddr_un).should == '/tmp/s'
24
- end
25
- end
26
- end
@@ -1,13 +0,0 @@
1
- describe "partially closable sockets", :shared => true do
2
- specify "if the write end is closed then the other side can read past EOF without blocking" do
3
- @s1.write("foo")
4
- @s1.close_write
5
- @s2.read("foo".size + 1).should == "foo"
6
- end
7
-
8
- specify "closing the write end ensures that the other side can read until EOF" do
9
- @s1.write("hello world")
10
- @s1.close_write
11
- @s2.read.should == "hello world"
12
- end
13
- end
@@ -1,33 +0,0 @@
1
- describe :socket_recv_nonblock, :shared => true do
2
- not_supported_on :jruby do
3
- before :each do
4
- @s1 = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM, 0)
5
- @s2 = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM, 0)
6
- end
7
-
8
- after :each do
9
- @s1.close unless @s1.closed?
10
- @s2.close unless @s2.closed?
11
- end
12
-
13
- it "raises EAGAIN if there's no data available" do
14
- @s1.bind(Socket.pack_sockaddr_in(SocketSpecs.port, "127.0.0.1"))
15
- lambda { @s1.recv_nonblock(5)}.should raise_error(Errno::EAGAIN)
16
- end
17
-
18
- it "receives data after it's ready" do
19
- @s1.bind(Socket.pack_sockaddr_in(SocketSpecs.port, "127.0.0.1"))
20
- @s2.send("aaa", 0, @s1.getsockname)
21
- IO.select([@s1], nil, nil, 2)
22
- @s1.recv_nonblock(5).should == "aaa"
23
- end
24
-
25
- it "does not block if there's no data available" do
26
- @s1.bind(Socket.pack_sockaddr_in(SocketSpecs.port, "127.0.0.1"))
27
- @s2.send("a", 0, @s1.getsockname)
28
- IO.select([@s1], nil, nil, 2)
29
- @s1.recv_nonblock(1).should == "a"
30
- lambda { @s1.recv_nonblock(5)}.should raise_error(Errno::EAGAIN)
31
- end
32
- end
33
- end
@@ -1,35 +0,0 @@
1
- describe :socket_socketpair, :shared => true do
2
- not_supported_on :jruby, :windows do
3
- it "ensures the returned sockets are connected" do
4
- s1, s2 = Socket.socketpair(Socket::AF_UNIX, 1, 0)
5
- s1.puts("test")
6
- s2.gets.should == "test\n"
7
- s1.close
8
- s2.close
9
- end
10
- end
11
-
12
- it "only allows Socket constants as strings" do
13
- [ :DGRAM, :RAW, :RDM, :SEQPACKET, :STREAM ].each do |socket_type|
14
- lambda { Socket.socketpair(Socket::AF_UNIX, "SOCK_#{socket_type}", 0) }.should_not raise_error(SocketError)
15
- end
16
- end
17
-
18
- ruby_version_is "1.9" do
19
- it "raises SocketError if given symbol is not a Socket constants reference" do
20
- lambda { Socket.socketpair(Socket::AF_UNIX, :NO_EXIST, 0) }.should raise_error(SocketError)
21
- end
22
-
23
- it "only allows Socket constants as symbols" do
24
- [ :DGRAM, :RAW, :RDM, :SEQPACKET, :STREAM ].each do |socket_type|
25
- lambda { Socket.socketpair(Socket::AF_UNIX, socket_type, 0) }.should_not raise_error(SocketError)
26
- end
27
- end
28
- end
29
-
30
- ruby_version_is ""..."1.9" do
31
- it "raises Errno::EPROTONOSUPPORT if socket type is not a String or Integer" do
32
- lambda { Socket.socketpair(Socket::AF_UNIX, :DGRAM, 0) }.should raise_error(Errno::EPROTONOSUPPORT)
33
- end
34
- end
35
- end
@@ -1,27 +0,0 @@
1
- require File.expand_path('../../fixtures/classes', __FILE__)
2
-
3
- require 'socket'
4
-
5
- describe "Socket#accept_nonblock" do
6
- before :each do
7
- @hostname = "127.0.0.1"
8
- @addr = Socket.sockaddr_in(0, @hostname)
9
- @socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
10
- @socket.bind(@addr)
11
- @socket.listen(1)
12
- end
13
-
14
- after :each do
15
- @socket.close
16
- end
17
-
18
- it "raises Errno::EAGAIN if the connection is not accepted yet" do
19
- lambda { @socket.accept_nonblock }.should raise_error(Errno::EAGAIN)
20
- end
21
-
22
- ruby_version_is "1.9.2" do
23
- it "raises IO::WaitReadable if the connection is not accepted yet" do
24
- lambda { @socket.accept_nonblock }.should raise_error(IO::WaitReadable)
25
- end
26
- end
27
- end
@@ -1 +0,0 @@
1
- require File.expand_path('../../fixtures/classes', __FILE__)
@@ -1,80 +0,0 @@
1
- require File.expand_path('../../fixtures/classes', __FILE__)
2
-
3
- include Socket::Constants
4
-
5
- describe "Socket#bind on SOCK_DGRAM socket" do
6
- before :each do
7
- @sock = Socket.new(AF_INET, SOCK_DGRAM, 0);
8
- @sockaddr = Socket.pack_sockaddr_in(SocketSpecs.port, "127.0.0.1");
9
- end
10
-
11
- after :each do
12
- @sock.closed?.should be_false
13
- @sock.close
14
- end
15
-
16
- it "binds to a port" do
17
- lambda { @sock.bind(@sockaddr) }.should_not raise_error
18
- end
19
-
20
- it "returns 0 if successful" do
21
- @sock.bind(@sockaddr).should == 0
22
- end
23
-
24
- it "raises Errno::EINVAL when binding to an already bound port" do
25
- @sock.bind(@sockaddr);
26
-
27
- lambda { @sock.bind(@sockaddr); }.should raise_error(Errno::EINVAL);
28
- end
29
-
30
- it "raises Errno::EADDRNOTAVAIL when the specified sockaddr is not available from the local machine" do
31
- sockaddr1 = Socket.pack_sockaddr_in(SocketSpecs.port, "4.3.2.1");
32
- lambda { @sock.bind(sockaddr1); }.should raise_error(Errno::EADDRNOTAVAIL)
33
- end
34
-
35
- platform_is_not :os => [:windows, :cygwin] do
36
- it "raises Errno::EACCES when the current user does not have permission to bind" do
37
- sockaddr1 = Socket.pack_sockaddr_in(1, "127.0.0.1");
38
- lambda { @sock.bind(sockaddr1); }.should raise_error(Errno::EACCES)
39
- end
40
- end
41
- end
42
-
43
- describe "Socket#bind on SOCK_STREAM socket" do
44
- before :each do
45
- @sock = Socket.new(AF_INET, SOCK_STREAM, 0);
46
- @sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, true)
47
- @sockaddr = Socket.pack_sockaddr_in(SocketSpecs.port, "127.0.0.1");
48
- end
49
-
50
- after :each do
51
- @sock.closed?.should be_false
52
- @sock.close
53
- end
54
-
55
- it "binds to a port" do
56
- lambda { @sock.bind(@sockaddr) }.should_not raise_error
57
- end
58
-
59
- it "returns 0 if successful" do
60
- @sock.bind(@sockaddr).should == 0
61
- end
62
-
63
- it "raises Errno::EINVAL when binding to an already bound port" do
64
- @sock.bind(@sockaddr);
65
-
66
- lambda { @sock.bind(@sockaddr); }.should raise_error(Errno::EINVAL);
67
- end
68
-
69
- it "raises Errno::EADDRNOTAVAIL when the specified sockaddr is not available from the local machine" do
70
- sockaddr1 = Socket.pack_sockaddr_in(SocketSpecs.port, "4.3.2.1");
71
- lambda { @sock.bind(sockaddr1); }.should raise_error(Errno::EADDRNOTAVAIL)
72
- end
73
-
74
- platform_is_not :os => [:windows, :cygwin] do
75
- it "raises Errno::EACCES when the current user does not have permission to bind" do
76
- sockaddr1 = Socket.pack_sockaddr_in(1, "127.0.0.1");
77
- lambda { @sock.bind(sockaddr1); }.should raise_error(Errno::EACCES)
78
- end
79
- end
80
- end
@@ -1,62 +0,0 @@
1
- require File.expand_path('../../fixtures/classes', __FILE__)
2
-
3
- require 'socket'
4
-
5
- describe "Socket#connect_nonblock" do
6
- before :each do
7
- @hostname = "127.0.0.1"
8
- @addr = Socket.sockaddr_in(SocketSpecs.port, @hostname)
9
- @socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
10
- @thread = nil
11
- end
12
-
13
- after :each do
14
- @socket.close
15
- @thread.join if @thread
16
- end
17
-
18
- it "connects the socket to the remote side" do
19
- ready = false
20
- @thread = Thread.new do
21
- server = TCPServer.new(@hostname, SocketSpecs.port)
22
- ready = true
23
- conn = server.accept
24
- conn << "hello!"
25
- conn.close
26
- server.close
27
- end
28
-
29
- Thread.pass while (@thread.status and @thread.status != 'sleep') or !ready
30
-
31
- begin
32
- @socket.connect_nonblock(@addr)
33
- rescue Errno::EINPROGRESS
34
- end
35
-
36
- IO.select nil, [@socket]
37
-
38
- begin
39
- @socket.connect_nonblock(@addr)
40
- rescue Errno::EISCONN
41
- # Not all OS's use this errno, so we trap and ignore it
42
- end
43
-
44
- @socket.read(6).should == "hello!"
45
- end
46
-
47
- platform_is_not :freebsd do
48
- it "raises Errno::EINPROGRESS when the connect would block" do
49
- lambda do
50
- @socket.connect_nonblock(@addr)
51
- end.should raise_error(Errno::EINPROGRESS)
52
- end
53
-
54
- ruby_version_is "1.9.2" do
55
- it "raises Errno::EINPROGRESS with IO::WaitWritable mixed in when the connect would block" do
56
- lambda do
57
- @socket.connect_nonblock(@addr)
58
- end.should raise_error(IO::WaitWritable)
59
- end
60
- end
61
- end
62
- end
@@ -1 +0,0 @@
1
- require File.expand_path('../../fixtures/classes', __FILE__)
@@ -1,29 +0,0 @@
1
- require File.expand_path('../../fixtures/classes', __FILE__)
2
- require 'socket'
3
-
4
- describe "Socket.for_fd" do
5
- before :each do
6
- @server = TCPServer.new("127.0.0.1", SocketSpecs.port)
7
- @client = TCPSocket.open("127.0.0.1", SocketSpecs.port)
8
- end
9
-
10
- after :each do
11
- @socket.shutdown Socket::SHUT_RD if @socket
12
- @client.shutdown Socket::SHUT_WR
13
-
14
- @host.close if @host
15
- @server.close
16
- end
17
-
18
- it "creates a new Socket that aliases the existing Socket's file descriptor" do
19
- @socket = Socket.for_fd(@client.fileno)
20
- @socket.fileno.should == @client.fileno
21
-
22
- @socket.send("foo", 0)
23
- @client.send("bar", 0)
24
-
25
- @host = @server.accept
26
- @host.read(3).should == "foo"
27
- @host.read(3).should == "bar"
28
- end
29
- end
@@ -1,120 +0,0 @@
1
- require File.expand_path('../../fixtures/classes', __FILE__)
2
-
3
- require 'socket'
4
-
5
- describe "Socket#getaddrinfo" do
6
- before :all do
7
- @do_not_reverse_lookup = BasicSocket.do_not_reverse_lookup
8
- end
9
-
10
- before :each do
11
- BasicSocket.do_not_reverse_lookup = true
12
- end
13
-
14
- after :each do
15
- BasicSocket.do_not_reverse_lookup = false
16
- end
17
-
18
- after :all do
19
- BasicSocket.do_not_reverse_lookup = @do_not_reverse_lookup
20
- end
21
-
22
- it "gets the address information" do
23
- expected = []
24
- # The check for AP_INET6's class is needed because ipaddr.rb adds
25
- # fake AP_INET6 even in case when IPv6 is not really supported.
26
- # Without such check, this test might fail when ipaddr was required
27
- # by some other specs.
28
- if (Socket.constants.include? 'AF_INET6') &&
29
- (Socket::AF_INET6.class != Object) then
30
- expected.concat [
31
- ['AF_INET6', 80, SocketSpecs.hostname, '::1', Socket::AF_INET6,
32
- Socket::SOCK_DGRAM, Socket::IPPROTO_UDP],
33
- ['AF_INET6', 80, SocketSpecs.hostname, '::1', Socket::AF_INET6,
34
- Socket::SOCK_STREAM, Socket::IPPROTO_TCP],
35
- ['AF_INET6', 80, SocketSpecs.hostname, 'fe80::1%lo0', Socket::AF_INET6,
36
- Socket::SOCK_DGRAM, Socket::IPPROTO_UDP],
37
- ['AF_INET6', 80, SocketSpecs.hostname, 'fe80::1%lo0', Socket::AF_INET6,
38
- Socket::SOCK_STREAM, Socket::IPPROTO_TCP],
39
- ]
40
- end
41
-
42
- expected.concat [
43
- ['AF_INET', 80, SocketSpecs.hostname, '127.0.0.1', Socket::AF_INET,
44
- Socket::SOCK_DGRAM, Socket::IPPROTO_UDP],
45
- ['AF_INET', 80, SocketSpecs.hostname, '127.0.0.1', Socket::AF_INET,
46
- Socket::SOCK_STREAM, Socket::IPPROTO_TCP],
47
- ]
48
-
49
- addrinfo = Socket.getaddrinfo SocketSpecs.hostname, 'http'
50
- addrinfo.each do |a|
51
- case a.last
52
- when Socket::IPPROTO_UDP, Socket::IPPROTO_TCP
53
- expected.should include(a)
54
- else
55
- # don't check this. It's some weird protocol we don't know about
56
- # so we can't spec it.
57
- end
58
- end
59
- end
60
-
61
- # #getaddrinfo will return a INADDR_ANY address (0.0.0.0
62
- # or "::") if it's a passive socket. In the case of non-passive
63
- # sockets (AI_PASSIVE not set) it should return the loopback
64
- # address (127.0.0.1 or "::1".
65
-
66
- it "accepts empty addresses for IPv4 passive sockets" do
67
- res = Socket::getaddrinfo(nil, "http",
68
- Socket::AF_INET,
69
- Socket::SOCK_STREAM,
70
- Socket::IPPROTO_TCP,
71
- Socket::AI_PASSIVE)
72
-
73
- expected = [["AF_INET", 80, "0.0.0.0", "0.0.0.0", Socket::AF_INET, Socket::SOCK_STREAM, Socket::IPPROTO_TCP],
74
- ["AF_INET", 80, "", "0.0.0.0", Socket::AF_INET, Socket::SOCK_STREAM, Socket::IPPROTO_TCP]]
75
- res.each do |a|
76
- expected.should include(a)
77
- end
78
- end
79
-
80
- it "accepts empty addresses for IPv4 non-passive sockets" do
81
- res = Socket::getaddrinfo(nil, "http",
82
- Socket::AF_INET,
83
- Socket::SOCK_STREAM,
84
- Socket::IPPROTO_TCP,
85
- 0)
86
-
87
- expected = [["AF_INET", 80, "127.0.0.1", "127.0.0.1", Socket::AF_INET, Socket::SOCK_STREAM, Socket::IPPROTO_TCP]]
88
- res.should == expected
89
- end
90
-
91
-
92
- it "accepts empty addresses for IPv6 passive sockets" do
93
- res = Socket::getaddrinfo(nil, "http",
94
- Socket::AF_INET6,
95
- Socket::SOCK_STREAM,
96
- Socket::IPPROTO_TCP,
97
- Socket::AI_PASSIVE)
98
-
99
- expected = [
100
- ["AF_INET6", 80, "::", "::", Socket::AF_INET6, Socket::SOCK_STREAM, Socket::IPPROTO_TCP],
101
- ["AF_INET6", 80, "0:0:0:0:0:0:0:0", "0:0:0:0:0:0:0:0", Socket::AF_INET6, Socket::SOCK_STREAM, Socket::IPPROTO_TCP]
102
- ]
103
- res.each { |a| expected.should include (a) }
104
- end
105
-
106
- it "accepts empty addresses for IPv6 non-passive sockets" do
107
- res = Socket::getaddrinfo(nil, "http",
108
- Socket::AF_INET6,
109
- Socket::SOCK_STREAM,
110
- Socket::IPPROTO_TCP,
111
- 0)
112
-
113
- expected = [
114
- ["AF_INET6", 80, "::1", "::1", Socket::AF_INET6, Socket::SOCK_STREAM, Socket::IPPROTO_TCP],
115
- ["AF_INET6", 80, "0:0:0:0:0:0:0:1", "0:0:0:0:0:0:0:1", Socket::AF_INET6, Socket::SOCK_STREAM, Socket::IPPROTO_TCP]
116
- ]
117
- res.each { |a| expected.should include (a) }
118
- end
119
- end
120
-