async-io 1.29.0 → 1.30.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/lib/async/io/host_endpoint.rb +1 -1
  3. data/lib/async/io/trap.rb +4 -3
  4. data/lib/async/io/version.rb +1 -1
  5. metadata +39 -91
  6. data/.editorconfig +0 -6
  7. data/.github/workflows/development.yml +0 -55
  8. data/.gitignore +0 -13
  9. data/.rspec +0 -3
  10. data/.yardopts +0 -2
  11. data/Gemfile +0 -13
  12. data/README.md +0 -171
  13. data/async-io.gemspec +0 -30
  14. data/examples/allocations/byteslice.rb +0 -29
  15. data/examples/allocations/memory.rb +0 -16
  16. data/examples/allocations/read_chunks.rb +0 -18
  17. data/examples/chat/client.rb +0 -58
  18. data/examples/chat/server.rb +0 -83
  19. data/examples/defer/worker.rb +0 -29
  20. data/examples/echo/client.rb +0 -23
  21. data/examples/echo/server.rb +0 -58
  22. data/examples/issues/broken_ssl.rb +0 -15
  23. data/examples/issues/pipes.rb +0 -34
  24. data/examples/millions/client.rb +0 -44
  25. data/examples/millions/server.rb +0 -41
  26. data/examples/udp/client.rb +0 -14
  27. data/examples/udp/server.rb +0 -16
  28. data/gems/nio4r-2.3.gemfile +0 -3
  29. data/spec/addrinfo.rb +0 -16
  30. data/spec/async/io/buffer_spec.rb +0 -48
  31. data/spec/async/io/c10k_spec.rb +0 -138
  32. data/spec/async/io/echo_spec.rb +0 -75
  33. data/spec/async/io/endpoint_spec.rb +0 -105
  34. data/spec/async/io/generic_examples.rb +0 -73
  35. data/spec/async/io/generic_spec.rb +0 -107
  36. data/spec/async/io/notification_spec.rb +0 -46
  37. data/spec/async/io/protocol/line_spec.rb +0 -81
  38. data/spec/async/io/shared_endpoint/server_spec.rb +0 -72
  39. data/spec/async/io/shared_endpoint_spec.rb +0 -65
  40. data/spec/async/io/socket/tcp_spec.rb +0 -101
  41. data/spec/async/io/socket/udp_spec.rb +0 -65
  42. data/spec/async/io/socket_spec.rb +0 -149
  43. data/spec/async/io/ssl_server_spec.rb +0 -133
  44. data/spec/async/io/ssl_socket_spec.rb +0 -96
  45. data/spec/async/io/standard_spec.rb +0 -47
  46. data/spec/async/io/stream_context.rb +0 -30
  47. data/spec/async/io/stream_spec.rb +0 -337
  48. data/spec/async/io/tcp_socket_spec.rb +0 -84
  49. data/spec/async/io/threads_spec.rb +0 -59
  50. data/spec/async/io/trap_spec.rb +0 -52
  51. data/spec/async/io/udp_socket_spec.rb +0 -56
  52. data/spec/async/io/unix_endpoint_spec.rb +0 -106
  53. data/spec/async/io/unix_socket_spec.rb +0 -66
  54. data/spec/async/io/wrap/http_rb_spec.rb +0 -47
  55. data/spec/async/io/wrap/tcp_spec.rb +0 -79
  56. data/spec/spec_helper.rb +0 -15
@@ -1,101 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com>
4
- #
5
- # Permission is hereby granted, free of charge, to any person obtaining a copy
6
- # of this software and associated documentation files (the "Software"), to deal
7
- # in the Software without restriction, including without limitation the rights
8
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- # copies of the Software, and to permit persons to whom the Software is
10
- # furnished to do so, subject to the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be included in
13
- # all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- # THE SOFTWARE.
22
-
23
- require 'async/io/tcp_socket'
24
-
25
- RSpec.describe Async::IO::Socket do
26
- include_context Async::RSpec::Reactor
27
-
28
- # Shared port for localhost network tests.
29
- let(:server_address) {Async::IO::Address.tcp("127.0.0.1", 6788)}
30
- let(:local_address) {Async::IO::Address.tcp("127.0.0.1", 0)}
31
- let(:data) {"The quick brown fox jumped over the lazy dog."}
32
-
33
- let!(:server_task) do
34
- # Accept a single incoming connection and then finish.
35
- reactor.async do |task|
36
- Async::IO::Socket.bind(server_address) do |server|
37
- server.listen(10)
38
-
39
- server.accept do |peer, address|
40
- data = peer.read(512)
41
- peer.write(data)
42
- end
43
- end
44
- end
45
- end
46
-
47
- describe 'basic tcp server' do
48
- it "should start server and send data" do
49
- reactor.async do
50
- Async::IO::Socket.connect(server_address) do |client|
51
- client.write(data)
52
- client.close_write
53
-
54
- expect(client.read(512)).to be == data
55
- end
56
- end
57
- end
58
- end
59
-
60
- describe 'non-blocking tcp connect' do
61
- it "can specify local address" do
62
- reactor.async do |task|
63
- Async::IO::Socket.connect(server_address, local_address: local_address) do |client|
64
- client.write(data)
65
- client.close_write
66
-
67
- expect(client.read(512)).to be == data
68
- end
69
- end
70
- end
71
-
72
- it "should start server and send data" do
73
- reactor.async do |task|
74
- Async::IO::Socket.connect(server_address) do |client|
75
- client.write(data)
76
- client.close_write
77
-
78
- expect(client.read(512)).to be == data
79
- end
80
- end
81
- end
82
-
83
- it "can connect socket and read/write in a different task" do
84
- reactor.async do |task|
85
- socket = Async::IO::Socket.connect(server_address)
86
-
87
- expect(socket).to_not be_nil
88
- expect(socket).to be_kind_of Async::Wrapper
89
-
90
- reactor.async do
91
- socket.write(data)
92
- socket.close_write
93
-
94
- expect(socket.read(512)).to be == data
95
-
96
- socket.close
97
- end
98
- end
99
- end
100
- end
101
- end
@@ -1,65 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com>
4
- #
5
- # Permission is hereby granted, free of charge, to any person obtaining a copy
6
- # of this software and associated documentation files (the "Software"), to deal
7
- # in the Software without restriction, including without limitation the rights
8
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- # copies of the Software, and to permit persons to whom the Software is
10
- # furnished to do so, subject to the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be included in
13
- # all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- # THE SOFTWARE.
22
-
23
- require 'async/io/udp_socket'
24
-
25
- RSpec.describe Async::IO::Socket do
26
- include_context Async::RSpec::Reactor
27
-
28
- # Shared port for localhost network tests.
29
- let(:server_address) {Async::IO::Address.udp("127.0.0.1", 6778)}
30
- let(:data) {"The quick brown fox jumped over the lazy dog."}
31
-
32
- let!(:server_task) do
33
- reactor.async do
34
- Async::IO::Socket.bind(server_address) do |server|
35
- packet, address = server.recvfrom(512)
36
-
37
- server.send(packet, 0, address)
38
- end
39
- end
40
- end
41
-
42
- describe 'basic udp server' do
43
- it "should echo data back to peer" do
44
- reactor.async do
45
- Async::IO::Socket.connect(server_address) do |client|
46
- client.send(data)
47
- response = client.recv(512)
48
-
49
- expect(response).to be == data
50
- end
51
- end
52
- end
53
-
54
- it "should use unconnected socket" do
55
- reactor.async do
56
- Async::IO::UDPSocket.wrap(server_address.afamily) do |client|
57
- client.send(data, 0, server_address)
58
- response, address = client.recvfrom(512)
59
-
60
- expect(response).to be == data
61
- end
62
- end
63
- end
64
- end
65
- end
@@ -1,149 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com>
4
- #
5
- # Permission is hereby granted, free of charge, to any person obtaining a copy
6
- # of this software and associated documentation files (the "Software"), to deal
7
- # in the Software without restriction, including without limitation the rights
8
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- # copies of the Software, and to permit persons to whom the Software is
10
- # furnished to do so, subject to the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be included in
13
- # all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- # THE SOFTWARE.
22
-
23
- require 'async/io/socket'
24
- require 'async/io/address'
25
-
26
- require_relative 'generic_examples'
27
-
28
- RSpec.describe Async::IO::BasicSocket do
29
- it_should_behave_like Async::IO::Generic
30
- end
31
-
32
- RSpec.describe Async::IO::Socket do
33
- include_context Async::RSpec::Reactor
34
-
35
- it_should_behave_like Async::IO::Generic
36
-
37
- describe '#connect' do
38
- let(:address) {Async::IO::Address.tcp('127.0.0.1', 12345)}
39
-
40
- it "should fail to connect if no listening server" do
41
- expect do
42
- Async::IO::Socket.connect(address)
43
- end.to raise_exception(Errno::ECONNREFUSED)
44
- end
45
-
46
- it "should close the socket when interrupted by a timeout" do
47
- wrapper = double()
48
- expect(Async::IO::Socket).to receive(:build).and_return(wrapper)
49
- expect(wrapper).to receive(:connect).and_raise Async::TimeoutError
50
- expect(wrapper).to receive(:close)
51
- expect do
52
- Async::IO::Socket.connect(address)
53
- end.to raise_exception(Async::TimeoutError)
54
- end
55
- end
56
-
57
- describe '#bind' do
58
- it "should fail to bind to port < 1024" do
59
- address = Async::IO::Address.tcp('127.0.0.1', 1)
60
-
61
- expect do
62
- Async::IO::Socket.bind(address)
63
- end.to raise_exception(Errno::EACCES)
64
- end
65
-
66
- it "can bind to port 0" do
67
- address = Async::IO::Address.tcp('127.0.0.1', 0)
68
-
69
- Async::IO::Socket.bind(address) do |socket|
70
- expect(socket.local_address.ip_port).to be > 10000
71
-
72
- expect(Async::Task.current.annotation).to include("#{socket.local_address.ip_port}")
73
- end
74
- end
75
- end
76
-
77
- describe '#sync' do
78
- it "should set TCP_NODELAY" do
79
- address = Async::IO::Address.tcp('127.0.0.1', 0)
80
-
81
- socket = Async::IO::Socket.wrap(::Socket::AF_INET, ::Socket::SOCK_STREAM, ::Socket::IPPROTO_TCP)
82
-
83
- socket.sync = true
84
- expect(socket.getsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY).bool).to be true
85
-
86
- socket.close
87
- end
88
- end
89
-
90
- describe '#timeout' do
91
- subject{described_class.pair(:UNIX, :STREAM, 0)}
92
-
93
- it "should timeout while waiting to receive data" do
94
- s1, s2 = *subject
95
-
96
- s2.timeout = 1
97
-
98
- expect{s2.recv(32)}.to raise_exception(Async::TimeoutError, "execution expired")
99
-
100
- s1.close
101
- s2.close
102
- end
103
- end
104
-
105
- describe '.pair' do
106
- subject{described_class.pair(:UNIX, :STREAM, 0)}
107
-
108
- it "should be able to send and recv" do
109
- s1, s2 = *subject
110
-
111
- s1.send "Hello World", 0
112
- s1.close
113
-
114
- expect(s2.recv(32)).to be == "Hello World"
115
- s2.close
116
- end
117
-
118
- it "should be connected" do
119
- s1, s2 = *subject
120
-
121
- expect(s1).to be_connected
122
-
123
- s1.close
124
-
125
- expect(s2).to_not be_connected
126
-
127
- s2.close
128
- end
129
- end
130
-
131
- context '.pipe' do
132
- let(:sockets) do
133
- @sockets = described_class.pair(Socket::AF_UNIX, Socket::SOCK_STREAM)
134
- end
135
-
136
- after do
137
- @sockets&.each(&:close)
138
- end
139
-
140
- let(:io) {sockets.first}
141
- subject {sockets.last}
142
-
143
- it_should_behave_like Async::IO
144
- end
145
- end
146
-
147
- RSpec.describe Async::IO::IPSocket do
148
- it_should_behave_like Async::IO::Generic, [:inspect]
149
- end
@@ -1,133 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright, 2018, by Samuel G. D. Williams. <http://www.codeotaku.com>
4
- #
5
- # Permission is hereby granted, free of charge, to any person obtaining a copy
6
- # of this software and associated documentation files (the "Software"), to deal
7
- # in the Software without restriction, including without limitation the rights
8
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- # copies of the Software, and to permit persons to whom the Software is
10
- # furnished to do so, subject to the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be included in
13
- # all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- # THE SOFTWARE.
22
-
23
- require 'async/io/ssl_socket'
24
- require 'async/io/ssl_endpoint'
25
-
26
- require 'async/rspec/ssl'
27
- require_relative 'generic_examples'
28
-
29
- RSpec.describe Async::IO::SSLServer do
30
- include_context Async::RSpec::Reactor
31
-
32
- context 'single host' do
33
- include_context Async::RSpec::SSL::VerifiedContexts
34
- include_context Async::RSpec::SSL::ValidCertificate
35
-
36
- let(:endpoint) {Async::IO::Endpoint.tcp("127.0.0.1", 6780, reuse_port: true)}
37
- let(:server_endpoint) {Async::IO::SSLEndpoint.new(endpoint, ssl_context: server_context)}
38
- let(:client_endpoint) {Async::IO::SSLEndpoint.new(endpoint, ssl_context: client_context)}
39
-
40
- let(:data) {"What one programmer can do in one month, two programmers can do in two months."}
41
-
42
- it "can see through to address" do
43
- expect(server_endpoint.address).to be == endpoint.address
44
- end
45
-
46
- it 'can accept_each connections' do
47
- # Accept a single incoming connection and then finish.
48
- server_task = reactor.async do |task|
49
- server_endpoint.bind do |server|
50
- server.listen(10)
51
-
52
- server.accept_each do |peer, address|
53
- data = peer.read(512)
54
- peer.write(data)
55
- end
56
- end
57
- end
58
-
59
- reactor.async do
60
- client_endpoint.connect do |client|
61
- client.write(data)
62
- client.close_write
63
-
64
- expect(client.read(512)).to be == data
65
- end
66
-
67
- server_task.stop
68
- end
69
- end
70
- end
71
-
72
- context 'multiple hosts' do
73
- let(:hosts) {['test.com', 'example.com']}
74
-
75
- include_context Async::RSpec::SSL::HostCertificates
76
-
77
- let(:endpoint) {Async::IO::Endpoint.tcp("127.0.0.1", 6782, reuse_port: true)}
78
- let(:server_endpoint) {Async::IO::SSLEndpoint.new(endpoint, ssl_context: server_context)}
79
- let(:valid_client_endpoint) {Async::IO::SSLEndpoint.new(endpoint, hostname: 'example.com', ssl_context: client_context)}
80
- let(:invalid_client_endpoint) {Async::IO::SSLEndpoint.new(endpoint, hostname: 'fleeb.com', ssl_context: client_context)}
81
-
82
- let(:data) {"What one programmer can do in one month, two programmers can do in two months."}
83
-
84
- it 'can select correct host' do
85
- # Accept a single incoming connection and then finish.
86
- server_task = reactor.async do |task|
87
- server_endpoint.bind do |server|
88
- server.listen(10)
89
-
90
- server.accept_each do |peer, address|
91
- expect(peer.hostname).to be == 'example.com'
92
-
93
- data = peer.read(512)
94
- peer.write(data)
95
- end
96
- end
97
- end
98
-
99
- reactor.async do
100
- valid_client_endpoint.connect do |client|
101
- client.write(data)
102
- client.close_write
103
-
104
- expect(client.read(512)).to be == data
105
- end
106
-
107
- server_task.stop
108
- end
109
- end
110
-
111
- it 'it fails with invalid host' do
112
- # Accept a single incoming connection and then finish.
113
- server_task = reactor.async do |task|
114
- server_endpoint.bind do |server|
115
- server.listen(10)
116
-
117
- server.accept_each do |peer, address|
118
- peer.close
119
- end
120
- end
121
- end
122
-
123
- reactor.async do
124
- expect do
125
- invalid_client_endpoint.connect do |client|
126
- end
127
- end.to raise_exception(OpenSSL::SSL::SSLError, /handshake failure/)
128
-
129
- server_task.stop
130
- end.wait
131
- end
132
- end
133
- end