rubysl-socket 0.0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +0 -1
  3. data/.travis.yml +7 -0
  4. data/README.md +2 -2
  5. data/Rakefile +0 -1
  6. data/lib/rubysl/socket.rb +2 -0
  7. data/lib/rubysl/socket/socket.rb +1210 -0
  8. data/lib/{rubysl-socket → rubysl/socket}/version.rb +1 -1
  9. data/lib/socket.rb +1 -0
  10. data/rubysl-socket.gemspec +17 -18
  11. data/spec/addrinfo/afamily_spec.rb +5 -0
  12. data/spec/addrinfo/bind_spec.rb +5 -0
  13. data/spec/addrinfo/canonname_spec.rb +5 -0
  14. data/spec/addrinfo/connect_from_spec.rb +5 -0
  15. data/spec/addrinfo/connect_spec.rb +5 -0
  16. data/spec/addrinfo/connect_to_spec.rb +5 -0
  17. data/spec/addrinfo/family_addrinfo_spec.rb +5 -0
  18. data/spec/addrinfo/foreach_spec.rb +5 -0
  19. data/spec/addrinfo/getaddrinfo_spec.rb +5 -0
  20. data/spec/addrinfo/getnameinfo_spec.rb +5 -0
  21. data/spec/addrinfo/inspect_sockaddr_spec.rb +5 -0
  22. data/spec/addrinfo/inspect_spec.rb +5 -0
  23. data/spec/addrinfo/ip_address_spec.rb +5 -0
  24. data/spec/addrinfo/ip_port_spec.rb +5 -0
  25. data/spec/addrinfo/ip_spec.rb +9 -0
  26. data/spec/addrinfo/ip_unpack_spec.rb +5 -0
  27. data/spec/addrinfo/ipv4_loopback_spec.rb +5 -0
  28. data/spec/addrinfo/ipv4_multicast_spec.rb +5 -0
  29. data/spec/addrinfo/ipv4_private_spec.rb +5 -0
  30. data/spec/addrinfo/ipv4_spec.rb +5 -0
  31. data/spec/addrinfo/ipv6_linklocal_spec.rb +5 -0
  32. data/spec/addrinfo/ipv6_loopback_spec.rb +5 -0
  33. data/spec/addrinfo/ipv6_mc_global_spec.rb +5 -0
  34. data/spec/addrinfo/ipv6_mc_linklocal_spec.rb +5 -0
  35. data/spec/addrinfo/ipv6_mc_nodelocal_spec.rb +5 -0
  36. data/spec/addrinfo/ipv6_mc_orglocal_spec.rb +5 -0
  37. data/spec/addrinfo/ipv6_mc_sitelocal_spec.rb +5 -0
  38. data/spec/addrinfo/ipv6_multicast_spec.rb +5 -0
  39. data/spec/addrinfo/ipv6_sitelocal_spec.rb +5 -0
  40. data/spec/addrinfo/ipv6_spec.rb +5 -0
  41. data/spec/addrinfo/ipv6_to_ipv4_spec.rb +5 -0
  42. data/spec/addrinfo/ipv6_unspecified_spec.rb +5 -0
  43. data/spec/addrinfo/ipv6_v4compat_spec.rb +5 -0
  44. data/spec/addrinfo/ipv6_v4mapped_spec.rb +5 -0
  45. data/spec/addrinfo/listen_spec.rb +5 -0
  46. data/spec/addrinfo/marshal_dump_spec.rb +5 -0
  47. data/spec/addrinfo/marshal_load_spec.rb +5 -0
  48. data/spec/addrinfo/pfamily_spec.rb +5 -0
  49. data/spec/addrinfo/protocol_spec.rb +5 -0
  50. data/spec/addrinfo/socktype_spec.rb +5 -0
  51. data/spec/addrinfo/tcp_spec.rb +5 -0
  52. data/spec/addrinfo/to_s_spec.rb +5 -0
  53. data/spec/addrinfo/to_sockaddr_spec.rb +5 -0
  54. data/spec/addrinfo/udp_spec.rb +5 -0
  55. data/spec/addrinfo/unix_path_spec.rb +5 -0
  56. data/spec/addrinfo/unix_spec.rb +9 -0
  57. data/spec/basicsocket/close_read_spec.rb +42 -0
  58. data/spec/basicsocket/close_write_spec.rb +42 -0
  59. data/spec/basicsocket/do_not_reverse_lookup_spec.rb +78 -0
  60. data/spec/basicsocket/for_fd_spec.rb +37 -0
  61. data/spec/basicsocket/getpeername_spec.rb +24 -0
  62. data/spec/basicsocket/getsockname_spec.rb +27 -0
  63. data/spec/basicsocket/getsockopt_spec.rb +54 -0
  64. data/spec/basicsocket/ioctl_spec.rb +22 -0
  65. data/spec/basicsocket/recv_nonblock_spec.rb +6 -0
  66. data/spec/basicsocket/recv_spec.rb +76 -0
  67. data/spec/basicsocket/send_spec.rb +81 -0
  68. data/spec/basicsocket/setsockopt_spec.rb +333 -0
  69. data/spec/basicsocket/shutdown_spec.rb +5 -0
  70. data/spec/constants/constants_spec.rb +63 -0
  71. data/spec/fixtures/classes.rb +174 -0
  72. data/spec/fixtures/send_io.txt +1 -0
  73. data/spec/ipsocket/addr_spec.rb +72 -0
  74. data/spec/ipsocket/getaddress_spec.rb +26 -0
  75. data/spec/ipsocket/peeraddr_spec.rb +79 -0
  76. data/spec/ipsocket/recvfrom_spec.rb +64 -0
  77. data/spec/option/int_spec.rb +27 -0
  78. data/spec/option/linger_spec.rb +52 -0
  79. data/spec/option/new_spec.rb +32 -0
  80. data/spec/shared/pack_sockaddr.rb +26 -0
  81. data/spec/shared/partially_closable_sockets.rb +13 -0
  82. data/spec/shared/recv_nonblock.rb +33 -0
  83. data/spec/shared/socketpair.rb +35 -0
  84. data/spec/socket/accept_nonblock_spec.rb +27 -0
  85. data/spec/socket/accept_spec.rb +1 -0
  86. data/spec/socket/bind_spec.rb +80 -0
  87. data/spec/socket/connect_nonblock_spec.rb +62 -0
  88. data/spec/socket/connect_spec.rb +1 -0
  89. data/spec/socket/for_fd_spec.rb +29 -0
  90. data/spec/socket/getaddrinfo_spec.rb +120 -0
  91. data/spec/socket/gethostbyaddr_spec.rb +1 -0
  92. data/spec/socket/gethostbyname_spec.rb +26 -0
  93. data/spec/socket/gethostname_spec.rb +9 -0
  94. data/spec/socket/getnameinfo_spec.rb +57 -0
  95. data/spec/socket/getservbyname_spec.rb +24 -0
  96. data/spec/socket/listen_spec.rb +21 -0
  97. data/spec/socket/new_spec.rb +109 -0
  98. data/spec/socket/pack_sockaddr_in_spec.rb +6 -0
  99. data/spec/socket/pack_sockaddr_un_spec.rb +6 -0
  100. data/spec/socket/pair_spec.rb +6 -0
  101. data/spec/socket/recvfrom_nonblock_spec.rb +1 -0
  102. data/spec/socket/recvfrom_spec.rb +1 -0
  103. data/spec/socket/sockaddr_in_spec.rb +6 -0
  104. data/spec/socket/sockaddr_un_spec.rb +6 -0
  105. data/spec/socket/socket_spec.rb +37 -0
  106. data/spec/socket/socketpair_spec.rb +6 -0
  107. data/spec/socket/sysaccept_spec.rb +1 -0
  108. data/spec/socket/unpack_sockaddr_in_spec.rb +16 -0
  109. data/spec/socket/unpack_sockaddr_un_spec.rb +2 -0
  110. data/spec/tcpserver/accept_nonblock_spec.rb +30 -0
  111. data/spec/tcpserver/accept_spec.rb +60 -0
  112. data/spec/tcpserver/gets_spec.rb +17 -0
  113. data/spec/tcpserver/listen_spec.rb +1 -0
  114. data/spec/tcpserver/new_spec.rb +88 -0
  115. data/spec/tcpserver/output_spec.rb +8 -0
  116. data/spec/tcpserver/readpartial_spec.rb +8 -0
  117. data/spec/tcpserver/sysaccept_spec.rb +1 -0
  118. data/spec/tcpsocket/gethostbyname_spec.rb +62 -0
  119. data/spec/tcpsocket/new_spec.rb +5 -0
  120. data/spec/tcpsocket/open_spec.rb +5 -0
  121. data/spec/tcpsocket/partially_closable_spec.rb +20 -0
  122. data/spec/tcpsocket/recv_nonblock_spec.rb +31 -0
  123. data/spec/tcpsocket/setsockopt_spec.rb +49 -0
  124. data/spec/tcpsocket/shared/new.rb +85 -0
  125. data/spec/udpsocket/bind_spec.rb +33 -0
  126. data/spec/udpsocket/connect_spec.rb +1 -0
  127. data/spec/udpsocket/new_spec.rb +1 -0
  128. data/spec/udpsocket/open_spec.rb +12 -0
  129. data/spec/udpsocket/recvfrom_nonblock_spec.rb +1 -0
  130. data/spec/udpsocket/send_spec.rb +57 -0
  131. data/spec/unixserver/accept_nonblock_spec.rb +33 -0
  132. data/spec/unixserver/accept_spec.rb +64 -0
  133. data/spec/unixserver/for_fd_spec.rb +32 -0
  134. data/spec/unixserver/new_spec.rb +5 -0
  135. data/spec/unixserver/open_spec.rb +25 -0
  136. data/spec/unixserver/shared/new.rb +23 -0
  137. data/spec/unixsocket/addr_spec.rb +37 -0
  138. data/spec/unixsocket/new_spec.rb +5 -0
  139. data/spec/unixsocket/open_spec.rb +26 -0
  140. data/spec/unixsocket/pair_spec.rb +38 -0
  141. data/spec/unixsocket/partially_closable_spec.rb +25 -0
  142. data/spec/unixsocket/path_spec.rb +29 -0
  143. data/spec/unixsocket/peeraddr_spec.rb +29 -0
  144. data/spec/unixsocket/recv_io_spec.rb +40 -0
  145. data/spec/unixsocket/recvfrom_spec.rb +48 -0
  146. data/spec/unixsocket/send_io_spec.rb +30 -0
  147. data/spec/unixsocket/shared/new.rb +25 -0
  148. metadata +328 -89
  149. data/lib/rubysl-socket.rb +0 -7
@@ -0,0 +1,5 @@
1
+ require File.expand_path('../../fixtures/classes', __FILE__)
2
+
3
+ describe "Socket::BasicSocket#shutdown" do
4
+
5
+ end
@@ -0,0 +1,63 @@
1
+ require File.expand_path('../../fixtures/classes', __FILE__)
2
+ include Socket::Constants
3
+
4
+ describe "Socket::Constants" do
5
+ it "defines socket types" do
6
+ consts = ["SOCK_DGRAM", "SOCK_RAW", "SOCK_RDM", "SOCK_SEQPACKET", "SOCK_STREAM"]
7
+ consts.each do |c|
8
+ Socket::Constants.should have_constant(c)
9
+ end
10
+ end
11
+
12
+ it "defines protocol families" do
13
+ consts = ["PF_INET6", "PF_INET", "PF_IPX", "PF_UNIX", "PF_UNSPEC"]
14
+ consts.each do |c|
15
+ Socket::Constants.should have_constant(c)
16
+ end
17
+ end
18
+
19
+ it "defines address families" do
20
+ consts = ["AF_INET6", "AF_INET", "AF_IPX", "AF_UNIX", "AF_UNSPEC"]
21
+ consts.each do |c|
22
+ Socket::Constants.should have_constant(c)
23
+ end
24
+ end
25
+
26
+ it "defines send/receive options" do
27
+ consts = ["MSG_DONTROUTE", "MSG_OOB", "MSG_PEEK"]
28
+ consts.each do |c|
29
+ Socket::Constants.should have_constant(c)
30
+ end
31
+ end
32
+
33
+ it "defines socket level options" do
34
+ consts = ["SOL_SOCKET"]
35
+ consts.each do |c|
36
+ Socket::Constants.should have_constant(c)
37
+ end
38
+ end
39
+
40
+ it "defines socket options" do
41
+ consts = ["SO_BROADCAST", "SO_DEBUG", "SO_DONTROUTE", "SO_ERROR", "SO_KEEPALIVE", "SO_LINGER",
42
+ "SO_OOBINLINE", "SO_RCVBUF", "SO_REUSEADDR", "SO_SNDBUF", "SO_TYPE"]
43
+ consts.each do |c|
44
+ Socket::Constants.should have_constant(c)
45
+ end
46
+
47
+ end
48
+
49
+ it "defines multicast options" do
50
+ consts = ["IP_ADD_MEMBERSHIP", "IP_DEFAULT_MULTICAST_LOOP", "IP_DEFAULT_MULTICAST_TTL",
51
+ "IP_MAX_MEMBERSHIPS", "IP_MULTICAST_LOOP", "IP_MULTICAST_TTL"]
52
+ consts.each do |c|
53
+ Socket::Constants.should have_constant(c)
54
+ end
55
+ end
56
+
57
+ it "defines TCP options" do
58
+ consts = ["TCP_MAXSEG", "TCP_NODELAY"]
59
+ consts.each do |c|
60
+ Socket::Constants.should have_constant(c)
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,174 @@
1
+ require 'socket'
2
+
3
+ module SocketSpecs
4
+ # helper to get the hostname associated to 127.0.0.1
5
+ def self.hostname
6
+ # Calculate each time, without caching, since the result might
7
+ # depend on things like do_not_reverse_lookup mode, which is
8
+ # changing from test to test
9
+ Socket.getaddrinfo("127.0.0.1", nil)[0][2]
10
+ end
11
+
12
+ def self.hostnamev6
13
+ Socket.getaddrinfo("::1", nil)[0][2]
14
+ end
15
+
16
+ def self.addr(which=:ipv4)
17
+ case which
18
+ when :ipv4
19
+ host = "127.0.0.1"
20
+ when :ipv6
21
+ host = "::1"
22
+ end
23
+ Socket.getaddrinfo(host, nil)[0][3]
24
+ end
25
+
26
+ def self.port
27
+ 43191
28
+ end
29
+
30
+ def self.str_port
31
+ "43191"
32
+ end
33
+
34
+ def self.local_port
35
+ @base ||= $$
36
+ @base += 1
37
+ local_port = (@base % (0xffff-1024)) + 1024
38
+ local_port += 1 if local_port == port
39
+ local_port
40
+ end
41
+
42
+ def self.sockaddr_in(port, host)
43
+ Socket::SockAddr_In.new(Socket.sockaddr_in(port, host))
44
+ end
45
+
46
+ def self.socket_path
47
+ tmp("unix_server_spec.socket", false)
48
+ end
49
+
50
+ # TCPServer that does not block waiting for connections. Each
51
+ # connection is serviced in a separate thread. The data read
52
+ # from the socket is echoed back. The server is shutdown when
53
+ # the spec process exits.
54
+ class SpecTCPServer
55
+ @spec_server = nil
56
+
57
+ def self.start(host=nil, port=nil, logger=nil)
58
+ return if @spec_server
59
+
60
+ @spec_server = new host, port, logger
61
+ @spec_server.start
62
+
63
+ at_exit do
64
+ SocketSpecs::SpecTCPServer.shutdown
65
+ end
66
+ end
67
+
68
+ def self.get
69
+ @spec_server
70
+ end
71
+
72
+ # Clean up any waiting handlers.
73
+ def self.cleanup
74
+ @spec_server.cleanup if @spec_server
75
+ end
76
+
77
+ # Exit completely.
78
+ def self.shutdown
79
+ @spec_server.shutdown if @spec_server
80
+ end
81
+
82
+ attr_accessor :hostname, :port, :logger
83
+
84
+ def initialize(host=nil, port=nil, logger=nil)
85
+ @hostname = host || SocketSpecs.hostname
86
+ @port = port || SocketSpecs.port
87
+ @logger = logger
88
+ @cleanup = false
89
+ @shutdown = false
90
+ @accepted = false
91
+ @main = nil
92
+ @server = nil
93
+ @threads = []
94
+ end
95
+
96
+ def start
97
+ @main = Thread.new do
98
+ log "SpecTCPServer starting on #{@hostname}:#{@port}"
99
+ @server = TCPServer.new @hostname, @port
100
+
101
+ wait_for @server do
102
+ socket = @server.accept
103
+ log "SpecTCPServer accepted connection: #{socket}"
104
+ service socket
105
+
106
+ @accepted = true
107
+ end
108
+ end
109
+
110
+ Thread.pass until @server
111
+ end
112
+
113
+ def service(socket)
114
+ thr = Thread.new do
115
+ begin
116
+ wait_for socket do
117
+ break if cleanup?
118
+
119
+ data = socket.recv(1024)
120
+ break if data.empty?
121
+ log "SpecTCPServer received: #{data.inspect}"
122
+
123
+ break if data == "QUIT"
124
+
125
+ socket.send data, 0
126
+ end
127
+ ensure
128
+ socket.close unless socket.closed?
129
+ end
130
+ end
131
+
132
+ @threads << thr
133
+ end
134
+
135
+ def wait_for(io)
136
+ return unless io
137
+
138
+ loop do
139
+ read, _, _ = IO.select([io], [], [], 0.25)
140
+ return false if shutdown?
141
+ yield if read
142
+ end
143
+ end
144
+
145
+ def shutdown?
146
+ @shutdown
147
+ end
148
+
149
+ def cleanup?
150
+ @cleanup
151
+ end
152
+
153
+ def cleanup
154
+ @cleanup = true
155
+ log "SpecTCPServer cleaning up"
156
+
157
+ @threads.each { |thr| thr.join }
158
+ @cleanup = false
159
+ end
160
+
161
+ def shutdown
162
+ @shutdown = true
163
+ log "SpecTCPServer shutting down"
164
+
165
+ @threads.each { |thr| thr.join }
166
+ @main.join
167
+ @server.close if @accepted and !@server.closed?
168
+ end
169
+
170
+ def log(message)
171
+ @logger.puts message if @logger
172
+ end
173
+ end
174
+ end
@@ -0,0 +1 @@
1
+ This data is magic.
@@ -0,0 +1,72 @@
1
+ require File.expand_path('../../fixtures/classes', __FILE__)
2
+
3
+ describe "Socket::IPSocket#addr" do
4
+ before :all do
5
+ @do_not_reverse_lookup = BasicSocket.do_not_reverse_lookup
6
+ end
7
+
8
+
9
+ before :each do
10
+ @socket = TCPServer.new("127.0.0.1", SocketSpecs.port)
11
+ end
12
+
13
+ after :each do
14
+ @socket.close unless @socket.closed?
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
+ ruby_version_is ""..."1.9" do
23
+ it "returns an array with the socket's information" do
24
+ BasicSocket.do_not_reverse_lookup = false
25
+
26
+ addrinfo = @socket.addr
27
+ addrinfo[0].should == "AF_INET"
28
+ addrinfo[1].should == SocketSpecs.port
29
+ addrinfo[2].should == SocketSpecs.hostname
30
+ addrinfo[3].should == "127.0.0.1"
31
+ end
32
+
33
+ it "returns an address in the array if do_not_reverse_lookup is true" do
34
+ BasicSocket.do_not_reverse_lookup = true
35
+ addrinfo = @socket.addr
36
+ addrinfo[0].should == "AF_INET"
37
+ addrinfo[1].should == SocketSpecs.port
38
+ addrinfo[2].should == "127.0.0.1"
39
+ addrinfo[3].should == "127.0.0.1"
40
+ end
41
+ end
42
+
43
+ ruby_version_is "1.9" do
44
+ it "returns an array with the socket's information" do
45
+ @socket.do_not_reverse_lookup = false
46
+ BasicSocket.do_not_reverse_lookup = false
47
+ addrinfo = @socket.addr
48
+ addrinfo[0].should == "AF_INET"
49
+ addrinfo[1].should == SocketSpecs.port
50
+ addrinfo[2].should == SocketSpecs.hostname
51
+ addrinfo[3].should == "127.0.0.1"
52
+ end
53
+
54
+ it "returns an address in the array if do_not_reverse_lookup is true" do
55
+ @socket.do_not_reverse_lookup = true
56
+ BasicSocket.do_not_reverse_lookup = true
57
+ addrinfo = @socket.addr
58
+ addrinfo[0].should == "AF_INET"
59
+ addrinfo[1].should == SocketSpecs.port
60
+ addrinfo[2].should == "127.0.0.1"
61
+ addrinfo[3].should == "127.0.0.1"
62
+ end
63
+
64
+ it "returns an address in the array if passed false" do
65
+ addrinfo = @socket.addr(false)
66
+ addrinfo[0].should == "AF_INET"
67
+ addrinfo[1].should == SocketSpecs.port
68
+ addrinfo[2].should == "127.0.0.1"
69
+ addrinfo[3].should == "127.0.0.1"
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,26 @@
1
+ require File.expand_path('../../fixtures/classes', __FILE__)
2
+
3
+ describe "Socket::IPSocket#getaddress" do
4
+
5
+ it "returns the IP address of hostname" do
6
+ addr_local = IPSocket.getaddress(SocketSpecs.hostname)
7
+ ["127.0.0.1", "::1"].include?(addr_local).should == true
8
+ end
9
+
10
+ it "returns the IP address when passed an IP" do
11
+ IPSocket.getaddress("127.0.0.1").should == "127.0.0.1"
12
+ IPSocket.getaddress("0.0.0.0").should == "0.0.0.0"
13
+ end
14
+
15
+ # There is no way to make this fail-proof on all machines, because
16
+ # DNS servers like opendns return A records for ANY host, including
17
+ # traditionally invalidly named ones.
18
+ quarantine! do
19
+ it "raises an error on unknown hostnames" do
20
+ lambda {
21
+ IPSocket.getaddress("rubyspecdoesntexist.fallingsnow.net")
22
+ }.should raise_error(SocketError)
23
+ end
24
+ end
25
+
26
+ end
@@ -0,0 +1,79 @@
1
+ require File.expand_path('../../fixtures/classes', __FILE__)
2
+
3
+ describe "Socket::IPSocket#peeraddr" do
4
+ before :all do
5
+ @do_not_reverse_lookup = BasicSocket.do_not_reverse_lookup
6
+ end
7
+
8
+ before :each do
9
+ @server = TCPServer.new("127.0.0.1", SocketSpecs.port)
10
+ @client = TCPSocket.new("127.0.0.1", SocketSpecs.port)
11
+ end
12
+
13
+ after :each do
14
+ @server.close unless @server.closed?
15
+ @client.close unless @client.closed?
16
+ BasicSocket.do_not_reverse_lookup = false
17
+ end
18
+
19
+ after :all do
20
+ BasicSocket.do_not_reverse_lookup = @do_not_reverse_lookup
21
+ end
22
+
23
+ it "raises error if socket is not connected" do
24
+ lambda { @server.peeraddr }.should raise_error
25
+ end
26
+
27
+
28
+ ruby_version_is ""..."1.9" do
29
+
30
+ it "returns an array of information on the peer" do
31
+ BasicSocket.do_not_reverse_lookup = false
32
+ addrinfo = @client.peeraddr
33
+ addrinfo[0].should == "AF_INET"
34
+ addrinfo[1].should == SocketSpecs.port
35
+ addrinfo[2].should == SocketSpecs.hostname
36
+ addrinfo[3].should == "127.0.0.1"
37
+ end
38
+
39
+ it "returns an IP instead of hostname if do_not_reverse_lookup is true" do
40
+ BasicSocket.do_not_reverse_lookup = true
41
+ addrinfo = @client.peeraddr
42
+ addrinfo[0].should == "AF_INET"
43
+ addrinfo[1].should == SocketSpecs.port
44
+ addrinfo[2].should == "127.0.0.1"
45
+ addrinfo[3].should == "127.0.0.1"
46
+ end
47
+ end
48
+
49
+ ruby_version_is "1.9" do
50
+
51
+ it "returns an array of information on the peer" do
52
+ @client.do_not_reverse_lookup = false
53
+ BasicSocket.do_not_reverse_lookup = false
54
+ addrinfo = @client.peeraddr
55
+ addrinfo[0].should == "AF_INET"
56
+ addrinfo[1].should == SocketSpecs.port
57
+ addrinfo[2].should == SocketSpecs.hostname
58
+ addrinfo[3].should == "127.0.0.1"
59
+ end
60
+
61
+ it "returns an IP instead of hostname if do_not_reverse_lookup is true" do
62
+ @client.do_not_reverse_lookup = true
63
+ BasicSocket.do_not_reverse_lookup = true
64
+ addrinfo = @client.peeraddr
65
+ addrinfo[0].should == "AF_INET"
66
+ addrinfo[1].should == SocketSpecs.port
67
+ addrinfo[2].should == "127.0.0.1"
68
+ addrinfo[3].should == "127.0.0.1"
69
+ end
70
+
71
+ it "returns an IP instead of hostname if passed false" do
72
+ addrinfo = @client.peeraddr(false)
73
+ addrinfo[0].should == "AF_INET"
74
+ addrinfo[1].should == SocketSpecs.port
75
+ addrinfo[2].should == "127.0.0.1"
76
+ addrinfo[3].should == "127.0.0.1"
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,64 @@
1
+ require File.expand_path('../../fixtures/classes', __FILE__)
2
+
3
+ describe "Socket::IPSocket#recvfrom" do
4
+
5
+ before :each do
6
+ @server = TCPServer.new("127.0.0.1", SocketSpecs.port)
7
+ @client = TCPSocket.new("127.0.0.1", SocketSpecs.port)
8
+ end
9
+
10
+ after :each do
11
+ @server.close unless @server.closed?
12
+ @client.close unless @client.closed?
13
+ end
14
+
15
+ it "reads data from the connection" do
16
+ data = nil
17
+ t = Thread.new do
18
+ client = @server.accept
19
+ data = client.recvfrom(6)
20
+ client.close
21
+ end
22
+
23
+ @client.send('hello', 0)
24
+ @client.shutdown rescue nil
25
+ # shutdown may raise Errno::ENOTCONN when sent data is pending.
26
+ t.join
27
+
28
+ data.first.should == 'hello'
29
+ end
30
+
31
+ it "reads up to len bytes" do
32
+ data = nil
33
+ t = Thread.new do
34
+ client = @server.accept
35
+ data = client.recvfrom(3)
36
+ client.close
37
+ end
38
+
39
+ @client.send('hello', 0)
40
+ @client.shutdown rescue nil
41
+ t.join
42
+
43
+ data.first.should == 'hel'
44
+ end
45
+
46
+ it "returns an array with the data and connection info" do
47
+ data = nil
48
+ t = Thread.new do
49
+ client = @server.accept
50
+ data = client.recvfrom(3)
51
+ client.close
52
+ end
53
+
54
+ @client.send('hello', 0)
55
+ @client.shutdown rescue nil
56
+ t.join
57
+
58
+ data.size.should == 2
59
+ data.first.should == "hel"
60
+ # This does not apply to every platform, dependant on recvfrom(2)
61
+ # data.last.should == nil
62
+ end
63
+
64
+ end