tcp-client 0.7.0 → 0.8.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.
- checksums.yaml +4 -4
- data/README.md +18 -16
- data/lib/tcp-client/address.rb +6 -2
- data/lib/tcp-client/configuration.rb +16 -6
- data/lib/tcp-client/errors.rb +4 -2
- data/lib/tcp-client/ssl_socket.rb +19 -2
- data/lib/tcp-client/version.rb +1 -1
- data/lib/tcp-client.rb +43 -22
- data/rakefile.rb +2 -5
- data/sample/google_ssl.rb +7 -6
- data/spec/helper.rb +12 -0
- data/spec/tcp-client/address_spec.rb +158 -0
- data/spec/tcp-client/configuration_spec.rb +308 -0
- data/spec/tcp-client/default_configuration_spec.rb +22 -0
- data/spec/tcp-client/version_spec.rb +13 -0
- data/spec/tcp_client_spec.rb +596 -0
- data/tcp-client.gemspec +2 -2
- metadata +16 -18
- data/test/helper.rb +0 -41
- data/test/tcp-client/address_test.rb +0 -65
- data/test/tcp-client/configuration_test.rb +0 -141
- data/test/tcp-client/deadline_test.rb +0 -26
- data/test/tcp-client/default_configuration_test.rb +0 -59
- data/test/tcp-client/version_test.rb +0 -9
- data/test/tcp_client_test.rb +0 -184
@@ -0,0 +1,308 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../helper'
|
4
|
+
|
5
|
+
RSpec.describe TCPClient::Configuration do
|
6
|
+
describe '.create' do
|
7
|
+
it 'yields a configuration' do
|
8
|
+
TCPClient::Configuration.create do |cfg|
|
9
|
+
expect(cfg).to be_a TCPClient::Configuration
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'returns the configuration' do
|
14
|
+
yielded_cfg = nil
|
15
|
+
result = TCPClient::Configuration.create { |cfg| yielded_cfg = cfg }
|
16
|
+
expect(result).to be yielded_cfg
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '.new' do
|
21
|
+
context 'without any parameter' do
|
22
|
+
subject(:configuration) { TCPClient::Configuration.new }
|
23
|
+
|
24
|
+
it 'allows buffering' do
|
25
|
+
expect(configuration.buffered).to be true
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'allows keep alive signals' do
|
29
|
+
expect(configuration.keep_alive).to be true
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'allows reverse address lokup' do
|
33
|
+
expect(configuration.reverse_lookup).to be true
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'does not allow to normalize network errors' do
|
37
|
+
expect(configuration.normalize_network_errors).to be false
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'does not allow SSL connections' do
|
41
|
+
expect(configuration.ssl?).to be false
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'configures no timeout values' do
|
45
|
+
expect(configuration.connect_timeout).to be_nil
|
46
|
+
expect(configuration.read_timeout).to be_nil
|
47
|
+
expect(configuration.write_timeout).to be_nil
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'configures default errors' do
|
51
|
+
expect(
|
52
|
+
configuration.connect_timeout_error
|
53
|
+
).to be TCPClient::ConnectTimeoutError
|
54
|
+
expect(
|
55
|
+
configuration.read_timeout_error
|
56
|
+
).to be TCPClient::ReadTimeoutError
|
57
|
+
expect(
|
58
|
+
configuration.write_timeout_error
|
59
|
+
).to be TCPClient::WriteTimeoutError
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'with valid options' do
|
64
|
+
subject(:configuration) do
|
65
|
+
TCPClient::Configuration.new(
|
66
|
+
buffered: false,
|
67
|
+
keep_alive: false,
|
68
|
+
reverse_lookup: false,
|
69
|
+
normalize_network_errors: true,
|
70
|
+
ssl: true,
|
71
|
+
timeout: 60,
|
72
|
+
timeout_error: custom_error
|
73
|
+
)
|
74
|
+
end
|
75
|
+
let(:custom_error) { Class.new(StandardError) }
|
76
|
+
|
77
|
+
it 'allows to configure buffering' do
|
78
|
+
expect(configuration.buffered).to be false
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'allows to configure keep alive signals' do
|
82
|
+
expect(configuration.keep_alive).to be false
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'allows to configure reverse address lokup' do
|
86
|
+
expect(configuration.reverse_lookup).to be false
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'allows to configure to normalize network errors' do
|
90
|
+
expect(configuration.normalize_network_errors).to be true
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'allows to configures SSL connections' do
|
94
|
+
expect(configuration.ssl?).to be true
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'allows to configure no timeout values' do
|
98
|
+
expect(configuration.connect_timeout).to be 60
|
99
|
+
expect(configuration.read_timeout).to be 60
|
100
|
+
expect(configuration.write_timeout).to be 60
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'allows to configure timeout errors' do
|
104
|
+
expect(configuration.connect_timeout_error).to be custom_error
|
105
|
+
expect(configuration.read_timeout_error).to be custom_error
|
106
|
+
expect(configuration.write_timeout_error).to be custom_error
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'allows to configure dedicated timeout values' do
|
110
|
+
config =
|
111
|
+
TCPClient::Configuration.new(
|
112
|
+
connect_timeout: 21,
|
113
|
+
read_timeout: 42,
|
114
|
+
write_timeout: 84
|
115
|
+
)
|
116
|
+
expect(config.connect_timeout).to be 21
|
117
|
+
expect(config.read_timeout).to be 42
|
118
|
+
expect(config.write_timeout).to be 84
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'allows to configure dedicated timeout errors' do
|
122
|
+
custom_connect = Class.new(StandardError)
|
123
|
+
custom_read = Class.new(StandardError)
|
124
|
+
custom_write = Class.new(StandardError)
|
125
|
+
config =
|
126
|
+
TCPClient::Configuration.new(
|
127
|
+
connect_timeout_error: custom_connect,
|
128
|
+
read_timeout_error: custom_read,
|
129
|
+
write_timeout_error: custom_write
|
130
|
+
)
|
131
|
+
expect(config.connect_timeout_error).to be custom_connect
|
132
|
+
expect(config.read_timeout_error).to be custom_read
|
133
|
+
expect(config.write_timeout_error).to be custom_write
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'raises when no exception class is used to configure a timeout error' do
|
137
|
+
expect do
|
138
|
+
TCPClient::Configuration.new(
|
139
|
+
connect_timeout_error: double(:something)
|
140
|
+
)
|
141
|
+
end.to raise_error(TCPClient::NotAnExceptionError)
|
142
|
+
expect do
|
143
|
+
TCPClient::Configuration.new(read_timeout_error: double(:something))
|
144
|
+
end.to raise_error(TCPClient::NotAnExceptionError)
|
145
|
+
expect do
|
146
|
+
TCPClient::Configuration.new(write_timeout_error: double(:something))
|
147
|
+
end.to raise_error(TCPClient::NotAnExceptionError)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
context 'with invalid attribte' do
|
152
|
+
it 'raises an error' do
|
153
|
+
expect { TCPClient::Configuration.new(invalid: :value) }.to raise_error(
|
154
|
+
TCPClient::UnknownAttributeError
|
155
|
+
)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
describe '#to_hash' do
|
161
|
+
subject(:configuration) do
|
162
|
+
TCPClient::Configuration.new(
|
163
|
+
buffered: false,
|
164
|
+
connect_timeout: 1,
|
165
|
+
read_timeout: 2,
|
166
|
+
write_timeout: 3,
|
167
|
+
ssl: {
|
168
|
+
min_version: :TLS1_2,
|
169
|
+
max_version: :TLS1_3
|
170
|
+
}
|
171
|
+
)
|
172
|
+
end
|
173
|
+
|
174
|
+
it 'returns itself as an Hash' do
|
175
|
+
expect(configuration.to_hash).to eq(
|
176
|
+
buffered: false,
|
177
|
+
keep_alive: true,
|
178
|
+
reverse_lookup: true,
|
179
|
+
connect_timeout: 1,
|
180
|
+
connect_timeout_error: TCPClient::ConnectTimeoutError,
|
181
|
+
read_timeout: 2,
|
182
|
+
read_timeout_error: TCPClient::ReadTimeoutError,
|
183
|
+
write_timeout: 3,
|
184
|
+
write_timeout_error: TCPClient::WriteTimeoutError,
|
185
|
+
ssl_params: {
|
186
|
+
min_version: :TLS1_2,
|
187
|
+
max_version: :TLS1_3
|
188
|
+
}
|
189
|
+
)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
describe '#to_h' do
|
194
|
+
subject(:configuration) do
|
195
|
+
TCPClient::Configuration.new(
|
196
|
+
buffered: false,
|
197
|
+
connect_timeout: 1,
|
198
|
+
read_timeout: 2,
|
199
|
+
write_timeout: 3,
|
200
|
+
ssl: {
|
201
|
+
min_version: :TLS1_2,
|
202
|
+
max_version: :TLS1_3
|
203
|
+
}
|
204
|
+
)
|
205
|
+
end
|
206
|
+
|
207
|
+
it 'returns itself as an Hash' do
|
208
|
+
expect(configuration.to_h).to eq(
|
209
|
+
buffered: false,
|
210
|
+
keep_alive: true,
|
211
|
+
reverse_lookup: true,
|
212
|
+
connect_timeout: 1,
|
213
|
+
connect_timeout_error: TCPClient::ConnectTimeoutError,
|
214
|
+
read_timeout: 2,
|
215
|
+
read_timeout_error: TCPClient::ReadTimeoutError,
|
216
|
+
write_timeout: 3,
|
217
|
+
write_timeout_error: TCPClient::WriteTimeoutError,
|
218
|
+
ssl_params: {
|
219
|
+
min_version: :TLS1_2,
|
220
|
+
max_version: :TLS1_3
|
221
|
+
}
|
222
|
+
)
|
223
|
+
end
|
224
|
+
|
225
|
+
it 'allows to specify the keys the result should contain' do
|
226
|
+
expect(
|
227
|
+
configuration.to_h(:keep_alive, :read_timeout, :write_timeout)
|
228
|
+
).to eq(keep_alive: true, read_timeout: 2, write_timeout: 3)
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
describe '#dup' do
|
233
|
+
subject(:duplicate) { configuration.dup }
|
234
|
+
let(:configuration) do
|
235
|
+
TCPClient::Configuration.new(
|
236
|
+
buffered: false,
|
237
|
+
connect_timeout: 1,
|
238
|
+
read_timeout: 2,
|
239
|
+
write_timeout: 3,
|
240
|
+
ssl: {
|
241
|
+
min_version: :TLS1_2,
|
242
|
+
max_version: :TLS1_3
|
243
|
+
}
|
244
|
+
)
|
245
|
+
end
|
246
|
+
|
247
|
+
it 'returns a new instance' do
|
248
|
+
expect(duplicate).to be_a TCPClient::Configuration
|
249
|
+
expect(duplicate.__id__).not_to eq configuration.__id__
|
250
|
+
end
|
251
|
+
|
252
|
+
it 'contains same values as the original' do
|
253
|
+
expect(duplicate.buffered).to be false
|
254
|
+
expect(duplicate.connect_timeout).to be 1
|
255
|
+
expect(duplicate.read_timeout).to be 2
|
256
|
+
expect(duplicate.write_timeout).to be 3
|
257
|
+
expect(duplicate.ssl?).to be true
|
258
|
+
expect(duplicate.ssl_params).to eq(
|
259
|
+
min_version: :TLS1_2,
|
260
|
+
max_version: :TLS1_3
|
261
|
+
)
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
describe 'comparison' do
|
266
|
+
context 'comparing two equal instances' do
|
267
|
+
let(:config_a) { TCPClient::Configuration.new(timeout: 10) }
|
268
|
+
let(:config_b) { TCPClient::Configuration.new(timeout: 10) }
|
269
|
+
|
270
|
+
it 'compares to equal' do
|
271
|
+
expect(config_a).to eq config_b
|
272
|
+
end
|
273
|
+
|
274
|
+
context 'using the == opperator' do
|
275
|
+
it 'compares to equal' do
|
276
|
+
expect(config_a == config_b).to be true
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
context 'using the === opperator' do
|
281
|
+
it 'compares to equal' do
|
282
|
+
expect(config_a === config_b).to be true
|
283
|
+
end
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
context 'comparing two non-equal instances' do
|
288
|
+
let(:config_a) { TCPClient::Configuration.new(timeout: 10) }
|
289
|
+
let(:config_b) { TCPClient::Configuration.new(timeout: 20) }
|
290
|
+
|
291
|
+
it 'compares not to equal' do
|
292
|
+
expect(config_a).not_to eq config_b
|
293
|
+
end
|
294
|
+
|
295
|
+
context 'using the == opperator' do
|
296
|
+
it 'compares not to equal' do
|
297
|
+
expect(config_a == config_b).to be false
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
context 'using the === opperator' do
|
302
|
+
it 'compares not to equal' do
|
303
|
+
expect(config_a === config_b).to be false
|
304
|
+
end
|
305
|
+
end
|
306
|
+
end
|
307
|
+
end
|
308
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../helper'
|
4
|
+
|
5
|
+
RSpec.describe 'TCPClient.configure' do
|
6
|
+
it 'is the default configuration' do
|
7
|
+
expect(TCPClient.configure).to be TCPClient::Configuration.default
|
8
|
+
end
|
9
|
+
|
10
|
+
context 'called with parameters' do
|
11
|
+
it 'creates a new configuratiion' do
|
12
|
+
expect(TCPClient::Configuration).to receive(:create).once.with(a: 1, b: 2)
|
13
|
+
TCPClient.configure(a: 1, b: 2)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'returns the new configuratiion' do
|
17
|
+
expect(TCPClient::Configuration).to receive(:create).and_return(:a_result)
|
18
|
+
TCPClient.configure(something: :new)
|
19
|
+
expect(TCPClient::Configuration.default).to be :a_result
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../helper'
|
4
|
+
|
5
|
+
RSpec.describe 'TCPClient::VERSION' do
|
6
|
+
it 'is a valid version string' do
|
7
|
+
expect(TCPClient::VERSION).to match(/\d+\.\d+\.\d+/)
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'is frozen' do
|
11
|
+
expect(TCPClient::VERSION.frozen?).to be true
|
12
|
+
end
|
13
|
+
end
|