net_tcp_client 2.0.1 → 2.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,245 +0,0 @@
1
- require 'socket'
2
- require_relative 'test_helper'
3
- require_relative 'simple_tcp_server'
4
- require 'securerandom'
5
-
6
- # Unit Test for Net::TCPClient
7
- class TCPClientTest < Minitest::Test
8
- describe Net::TCPClient do
9
- [false, true].each do |with_ssl|
10
- describe (with_ssl ? 'ssl' : 'non-ssl') do
11
- describe '#connect' do
12
- it 'raises an exception when cannot reach server after 5 retries' do
13
- exception = assert_raises Net::TCPClient::ConnectionFailure do
14
- new_net_tcp_client(with_ssl,
15
- server: 'localhost:3300',
16
- connect_retry_interval: 0.1,
17
- connect_retry_count: 5
18
- )
19
- end
20
- assert_match(/Failed to connect to any of localhost:3300 after 5 retries/, exception.message)
21
- assert_match Errno::ECONNREFUSED.to_s, exception.cause.class.to_s
22
- end
23
-
24
- it 'times out on connect' do
25
- # Create a TCP Server, but do not respond to connections
26
- server = TCPServer.open(2001)
27
-
28
- exception = assert_raises Net::TCPClient::ConnectionFailure do
29
- 1000.times do
30
- new_net_tcp_client(with_ssl,
31
- server: 'localhost:2001',
32
- connect_timeout: 0.5,
33
- connect_retry_count: 3
34
- )
35
- end
36
- end
37
- assert_match(/Failed to connect to any of localhost:2001 after 3 retries/, exception.message)
38
- server.close
39
- end
40
- end
41
-
42
- describe 'with server' do
43
- before do
44
- @port = 2000 + SecureRandom.random_number(1000)
45
- options = {port: @port}
46
- if with_ssl
47
- options[:ssl] = {
48
- cert: OpenSSL::X509::Certificate.new(File.open(ssl_file_path('localhost-server.pem'))),
49
- key: OpenSSL::PKey::RSA.new(File.open(ssl_file_path('localhost-server-key.pem'))),
50
- ca_file: ssl_file_path('ca.pem')
51
- }
52
- end
53
- count = 0
54
- begin
55
- @server = SimpleTCPServer.new(options)
56
- rescue Errno::EADDRINUSE => exc
57
- @server.stop if @server
58
- # Give previous test server time to stop
59
- count += 1
60
- sleep 1
61
- retry if count <= 30
62
- raise exc
63
- end
64
-
65
- @server_name = "localhost:#{@port}"
66
- end
67
-
68
- after do
69
- @client.close if @client
70
- @server.stop if @server
71
- end
72
-
73
- describe '#read' do
74
- it 'read timeout, followed by successful read' do
75
- @read_timeout = 3.0
76
- # Need a custom client that does not auto close on error:
77
- @client = new_net_tcp_client(with_ssl,
78
- server: @server_name,
79
- read_timeout: @read_timeout,
80
- close_on_error: false
81
- )
82
-
83
- request = {'action' => 'sleep', 'duration' => @read_timeout + 0.5}
84
- @client.write(BSON.serialize(request))
85
-
86
- exception = assert_raises Net::TCPClient::ReadTimeout do
87
- # Read 4 bytes from server
88
- @client.read(4)
89
- end
90
- assert_equal false, @client.close_on_error
91
- assert @client.alive?, 'The client connection is not alive after the read timed out with close_on_error: false'
92
- assert_equal "Timed out after #{@read_timeout} seconds trying to read from localhost[127.0.0.1]:#{@port}", exception.message
93
- reply = read_bson_document(@client)
94
- assert_equal 'sleep', reply['result']
95
- @client.close
96
- end
97
-
98
- it 'infinite timeout' do
99
- @client = new_net_tcp_client(with_ssl,
100
- server: @server_name,
101
- connect_timeout: -1
102
- )
103
- request = {'action' => 'test1'}
104
- @client.write(BSON.serialize(request))
105
- reply = read_bson_document(@client)
106
- assert_equal 'test1', reply['result']
107
- @client.close
108
- end
109
- end
110
-
111
- describe '#connect' do
112
- it 'calls on_connect after connection' do
113
- @client = new_net_tcp_client(with_ssl,
114
- server: @server_name,
115
- read_timeout: 3,
116
- on_connect: Proc.new do |socket|
117
- # Reset user_data on each connection
118
- socket.user_data = {sequence: 1}
119
- end
120
- )
121
- assert_equal "localhost[127.0.0.1]:#{@port}", @client.address.to_s
122
- assert_equal 1, @client.user_data[:sequence]
123
-
124
- request = {'action' => 'test1'}
125
- @client.write(BSON.serialize(request))
126
- reply = read_bson_document(@client)
127
- assert_equal 'test1', reply['result']
128
- end
129
- end
130
-
131
- describe 'failover' do
132
- it 'connects to second server when the first is down' do
133
- @client = new_net_tcp_client(with_ssl,
134
- servers: ['localhost:1999', @server_name],
135
- read_timeout: 3
136
- )
137
- assert_equal "localhost[127.0.0.1]:#{@port}", @client.address.to_s
138
-
139
- request = {'action' => 'test1'}
140
- @client.write(BSON.serialize(request))
141
- reply = read_bson_document(@client)
142
- assert_equal 'test1', reply['result']
143
- end
144
- end
145
-
146
- describe 'with client' do
147
- before do
148
- @read_timeout = 3.0
149
- @client = new_net_tcp_client(with_ssl,
150
- server: @server_name,
151
- read_timeout: @read_timeout
152
- )
153
- assert @client.alive?, @client.ai
154
- assert_equal true, @client.close_on_error
155
- end
156
-
157
- describe '#alive?' do
158
- it 'returns false once the connection is closed' do
159
- assert @client.alive?
160
- @client.close
161
- refute @client.alive?
162
- end
163
- end
164
-
165
- describe '#closed?' do
166
- it 'returns true once the connection is closed' do
167
- refute @client.closed?
168
- @client.close
169
- assert @client.closed?
170
- end
171
- end
172
-
173
- describe '#close' do
174
- it 'closes the connection, repeatedly without error' do
175
- @client.close
176
- @client.close
177
- end
178
- end
179
-
180
- describe '#write' do
181
- it 'writes data' do
182
- request = {'action' => 'test1'}
183
- @client.write(BSON.serialize(request))
184
- end
185
- end
186
-
187
- describe '#read' do
188
- it 'reads a response' do
189
- request = {'action' => 'test1'}
190
- @client.write(BSON.serialize(request))
191
- reply = read_bson_document(@client)
192
- assert_equal 'test1', reply['result']
193
- end
194
-
195
- it 'times out on receive' do
196
- request = {'action' => 'sleep', 'duration' => @read_timeout + 0.5}
197
- @client.write(BSON.serialize(request))
198
-
199
- exception = assert_raises Net::TCPClient::ReadTimeout do
200
- # Read 4 bytes from server
201
- @client.read(4)
202
- end
203
- # Due to close_on_error: true, a timeout will close the connection
204
- # to prevent use of a socket connection in an inconsistent state
205
- assert_equal false, @client.alive?
206
- assert_equal "Timed out after #{@read_timeout} seconds trying to read from localhost[127.0.0.1]:#{@port}", exception.message
207
- end
208
- end
209
-
210
- describe '#retry_on_connection_failure' do
211
- it 'retries on connection failure' do
212
- attempt = 0
213
- reply = @client.retry_on_connection_failure do
214
- request = {'action' => 'fail', 'attempt' => (attempt+=1)}
215
- @client.write(BSON.serialize(request))
216
- read_bson_document(@client)
217
- end
218
- assert_equal 'fail', reply['result']
219
- end
220
- end
221
- end
222
- end
223
- end
224
-
225
- end
226
-
227
- def ssl_file_path(name)
228
- File.join(File.dirname(__FILE__), 'ssl_files', name)
229
- end
230
-
231
- def new_net_tcp_client(with_ssl, params)
232
- params = params.dup
233
- if with_ssl
234
- params.merge!(
235
- ssl: {
236
- ca_file: ssl_file_path('ca.pem'),
237
- verify_mode: OpenSSL::SSL::VERIFY_NONE
238
- }
239
- )
240
- end
241
- Net::TCPClient.new(params)
242
- end
243
-
244
- end
245
- end
data/test/test_helper.rb DELETED
@@ -1,14 +0,0 @@
1
- # Allow test to be run in-place without requiring a gem install
2
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
3
-
4
- # Configure Rails Environment
5
- ENV['RAILS_ENV'] = 'test'
6
-
7
- require 'minitest/autorun'
8
- require 'minitest/reporters'
9
- require 'net/tcp_client'
10
-
11
- Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
12
-
13
- SemanticLogger.default_level = :trace
14
- SemanticLogger.add_appender(file_name: 'test.log', formatter: :color)