tcp-client 0.0.11 → 0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: afd4d9a8cc41724a9d20fbdf0794dd8d7d4ed7103728d749ee6d823a49e03866
4
- data.tar.gz: f63e5da4f6cdcfb449d918bddc79a0826fc6cf9c35017a6f1762dcc881f37c79
3
+ metadata.gz: bb5546419b47d6680b576f39d8c4b382c39d74f07ca43f6e782160122b6ba524
4
+ data.tar.gz: 3e563cd2db3efc765e491ece2fc37a784cb55ef05f6390eb23d1322a926be49e
5
5
  SHA512:
6
- metadata.gz: 8da7b4a3a87585b206341d1aa770ecf08ebc937fcd5117a594804d6bb8d0fd1a8f12cf3e29e2fa2d8841e78496fa7b48ee4041edd4bff15b12cd1ecd43399106
7
- data.tar.gz: 7b61d7ad8d26120a5a39414a93c51bd8fb0dc11eeb7008ea647b5bb8b2ac51af855539f41929f92c3374766765c3588f02009348c216d24dea2d88c4beab5a3c
6
+ metadata.gz: 712f24a4dc3427cf37126681ba50d53f0aefc9f839920283f611ef22e923f65f53f09fc83ca66cb45930536ca3c13d630dc7b0c5a5f40c6fc6f91f82bf123c3c
7
+ data.tar.gz: e97e52fc2aa1ad3cc548d2f561df97678e00c0e7e617c08afdbb9c6537709fc2743a07f26679cc8007124348cb32f1e8481d6417b7d3e28d247b504fcc951805
data/README.md CHANGED
@@ -8,20 +8,26 @@ This gem implements a TCP client with (optional) SSL support. The motivation of
8
8
  ## Sample
9
9
 
10
10
  ```ruby
11
- configuration = TCPClient::Configuration.create do |cfg|
11
+ require 'tcp-client'
12
+
13
+ TCPClient.configure do |cfg|
12
14
  cfg.connect_timeout = 1 # second to connect the server
13
15
  cfg.write_timeout = 0.25 # seconds to write a single data junk
14
16
  cfg.read_timeout = 0.5 # seconds to read some bytes
15
- cfg.ssl_params = {ssl_version: :TLSv1_2} # use TLS 1.2
17
+ cfg.ssl_params = { ssl_version: :TLSv1_2 } # use TLS 1.2
16
18
  end
17
19
 
18
20
  # the following request sequence is not allowed to last longer than 2 seconds:
19
21
  # 1 second to connect (incl. SSL handshake etc.)
20
22
  # + 0.25 seconds to write data
21
23
  # + 0.5 seconds to read a response
22
- TCPClient.open('www.google.com:443', configuration) do |client|
23
- pp client.write("GET / HTTP/1.1\r\nHost: google.com\r\n\r\n") # simple HTTP get request
24
- pp client.read(12) # "HTTP/1.1 " + 3 byte HTTP status code
24
+
25
+ TCPClient.open('www.google.com:443') do |client|
26
+ # simple HTTP get request
27
+ pp client.write("GET / HTTP/1.1\r\nHost: google.com\r\n\r\n")
28
+
29
+ # read "HTTP/1.1 " + 3 byte HTTP status code
30
+ pp client.read(12)
25
31
  end
26
32
  ```
27
33
 
data/gems.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- source('https://rubygems.org'){ gemspec }
3
+ source('https://rubygems.org') { gemspec }
data/lib/tcp-client.rb CHANGED
@@ -4,6 +4,7 @@ require_relative 'tcp-client/address'
4
4
  require_relative 'tcp-client/tcp_socket'
5
5
  require_relative 'tcp-client/ssl_socket'
6
6
  require_relative 'tcp-client/configuration'
7
+ require_relative 'tcp-client/default_configuration'
7
8
  require_relative 'tcp-client/version'
8
9
 
9
10
  class TCPClient
@@ -19,9 +20,15 @@ class TCPClient
19
20
  end
20
21
  end
21
22
 
22
- Timeout = Class.new(IOError)
23
+ TimeoutError = Class.new(IOError)
24
+ ConnectTimeoutError = Class.new(TimeoutError)
25
+ ReadTimeoutError = Class.new(TimeoutError)
26
+ WriteTimeoutError = Class.new(TimeoutError)
23
27
 
24
- def self.open(addr, configuration = Configuration.new)
28
+ Timeout = TimeoutError # backward compatibility
29
+ deprecate_constant(:Timeout)
30
+
31
+ def self.open(addr, configuration = Configuration.default)
25
32
  addr = Address.new(addr)
26
33
  client = new
27
34
  client.connect(addr, configuration)
@@ -44,10 +51,10 @@ class TCPClient
44
51
  close
45
52
  NoOpenSSL.raise! if configuration.ssl? && !defined?(SSLSocket)
46
53
  @address = Address.new(addr)
47
- @socket = TCPSocket.new(@address, configuration, Timeout)
48
- configuration.ssl? && @socket = SSLSocket.new(
49
- @socket, @address, configuration, Timeout
50
- )
54
+ @socket = TCPSocket.new(@address, configuration, ConnectTimeoutError)
55
+ configuration.ssl? &&
56
+ @socket =
57
+ SSLSocket.new(@socket, @address, configuration, ConnectTimeoutError)
51
58
  @write_timeout = configuration.write_timeout
52
59
  @read_timeout = configuration.read_timeout
53
60
  self
@@ -67,12 +74,12 @@ class TCPClient
67
74
 
68
75
  def read(nbytes, timeout: @read_timeout)
69
76
  NotConnected.raise!(self) if closed?
70
- @socket.read(nbytes, timeout: timeout, exception: Timeout)
77
+ @socket.read(nbytes, timeout: timeout, exception: ReadTimeoutError)
71
78
  end
72
79
 
73
80
  def write(*msg, timeout: @write_timeout)
74
81
  NotConnected.raise!(self) if closed?
75
- @socket.write(*msg, timeout: timeout, exception: Timeout)
82
+ @socket.write(*msg, timeout: timeout, exception: WriteTimeoutError)
76
83
  end
77
84
 
78
85
  def flush
@@ -44,7 +44,7 @@ class TCPClient
44
44
  end
45
45
 
46
46
  def from_string(str)
47
- return [nil, str.to_i] unless idx = str.rindex(':')
47
+ return nil, str.to_i unless idx = str.rindex(':')
48
48
  name = str[0, idx]
49
49
  name = name[1, name.size - 2] if name[0] == '[' && name[-1] == ']'
50
50
  [name, str[idx + 1, str.size - idx].to_i]
@@ -1,7 +1,7 @@
1
1
  class TCPClient
2
2
  class Configuration
3
- def self.create
4
- ret = new
3
+ def self.create(options = {})
4
+ ret = new(options)
5
5
  yield(ret) if block_given?
6
6
  ret
7
7
  end
@@ -9,9 +9,10 @@ class TCPClient
9
9
  attr_reader :buffered, :keep_alive, :reverse_lookup
10
10
  attr_accessor :ssl_params
11
11
 
12
- def initialize
12
+ def initialize(options = {})
13
13
  @buffered = @keep_alive = @reverse_lookup = true
14
14
  self.timeout = @ssl_params = nil
15
+ options.each_pair { |attribute, value| set(attribute, value) }
15
16
  end
16
17
 
17
18
  def ssl?
@@ -67,6 +68,12 @@ class TCPClient
67
68
 
68
69
  private
69
70
 
71
+ def set(attribute, value)
72
+ public_send("#{attribute}=", value)
73
+ rescue NoMethodError
74
+ raise(ArgumentError, "unknown attribute - #{attribute}")
75
+ end
76
+
70
77
  def seconds(value)
71
78
  value&.positive? ? value : nil
72
79
  end
@@ -0,0 +1,21 @@
1
+ require_relative 'configuration'
2
+
3
+ class TCPClient
4
+ @default_configuration = Configuration.new
5
+
6
+ class << self
7
+ attr_reader :default_configuration
8
+
9
+ def configure(options = {})
10
+ cfg = Configuration.new(options)
11
+ yield(cfg) if block_given?
12
+ @default_configuration = cfg
13
+ end
14
+ end
15
+
16
+ class Configuration
17
+ def self.default
18
+ TCPClient.default_configuration
19
+ end
20
+ end
21
+ end
@@ -12,7 +12,7 @@ module IOTimeoutMixin
12
12
 
13
13
  def read(nbytes, timeout: nil, exception: IOTimeoutError)
14
14
  timeout = timeout.to_f
15
- return read_all(nbytes){ |junk_size| super(junk_size) } if timeout <= 0
15
+ return read_all(nbytes) { |junk_size| super(junk_size) } if timeout <= 0
16
16
  deadline = Time.now + timeout
17
17
  read_all(nbytes) do |junk_size|
18
18
  with_deadline(deadline, exception) do
@@ -23,9 +23,9 @@ module IOTimeoutMixin
23
23
 
24
24
  def write(*msgs, timeout: nil, exception: IOTimeoutError)
25
25
  timeout = timeout.to_f
26
- return write_all(msgs.join){ |junk| super(junk) } if timeout <= 0
26
+ return write_all(msgs.join.b) { |junk| super(junk) } if timeout <= 0
27
27
  deadline = Time.now + timeout
28
- write_all(msgs.join) do |junk|
28
+ write_all(msgs.join.b) do |junk|
29
29
  with_deadline(deadline, exception) do
30
30
  write_nonblock(junk, exception: false)
31
31
  end
@@ -14,9 +14,11 @@ class TCPClient
14
14
  private
15
15
 
16
16
  def connect_to(address, timeout, exception)
17
- addr = ::Socket.pack_sockaddr_in(
18
- address.addrinfo.ip_port, address.addrinfo.ip_address
19
- )
17
+ addr =
18
+ ::Socket.pack_sockaddr_in(
19
+ address.addrinfo.ip_port,
20
+ address.addrinfo.ip_address
21
+ )
20
22
  return connect(addr) unless timeout
21
23
  with_deadline(Time.now + timeout, exception) do
22
24
  connect_nonblock(addr, exception: false)
@@ -1,3 +1,3 @@
1
1
  class TCPClient
2
- VERSION = '0.0.11'.freeze
2
+ VERSION = '0.1.0'.freeze
3
3
  end
data/sample/google.rb CHANGED
@@ -1,16 +1,21 @@
1
1
  require_relative '../lib/tcp-client'
2
2
 
3
- configuration = TCPClient::Configuration.create do |cfg|
4
- cfg.connect_timeout = 0.5 # seconds to connect the server
5
- cfg.write_timeout = 0.25 # seconds to write a single data junk
6
- cfg.read_timeout = 0.5 # seconds to read some bytes
7
- end
3
+ TCPClient.configure(
4
+ connect_timeout: 0.5, # seconds to connect the server
5
+ write_timeout: 0.25, # seconds to write a single data junk
6
+ read_timeout: 0.5 # seconds to read some bytes
7
+ )
8
8
 
9
- # the following request sequence is not allowed to last longer than 1.25 seconds:
10
- # 0.5 seconds to connect
9
+ # the following request sequence is not allowed
10
+ # to last longer than 1.25 seconds:
11
+ # 0.5 seconds to connect
11
12
  # + 0.25 seconds to write data
12
13
  # + 0.5 seconds to read a response
13
- TCPClient.open('www.google.com:80', configuration) do |client|
14
- pp client.write("GET / HTTP/1.1\r\nHost: google.com\r\n\r\n") # simple HTTP get request
15
- pp client.read(12) # "HTTP/1.1 " + 3 byte HTTP status code
14
+
15
+ TCPClient.open('www.google.com:80') do |client|
16
+ # simple HTTP get request
17
+ pp client.write("GET / HTTP/1.1\r\nHost: google.com\r\n\r\n")
18
+
19
+ # read "HTTP/1.1 " + 3 byte HTTP status code
20
+ pp client.read(12)
16
21
  end
data/sample/google_ssl.rb CHANGED
@@ -1,17 +1,21 @@
1
1
  require_relative '../lib/tcp-client'
2
2
 
3
- configuration = TCPClient::Configuration.create do |cfg|
3
+ TCPClient.configure do |cfg|
4
4
  cfg.connect_timeout = 1 # second to connect the server
5
5
  cfg.write_timeout = 0.25 # seconds to write a single data junk
6
6
  cfg.read_timeout = 0.5 # seconds to read some bytes
7
- cfg.ssl_params = {ssl_version: :TLSv1_2} # use TLS 1.2
7
+ cfg.ssl_params = { ssl_version: :TLSv1_2 } # use TLS 1.2
8
8
  end
9
9
 
10
10
  # the following request sequence is not allowed to last longer than 2 seconds:
11
11
  # 1 second to connect (incl. SSL handshake etc.)
12
12
  # + 0.25 seconds to write data
13
13
  # + 0.5 seconds to read a response
14
- TCPClient.open('www.google.com:443', configuration) do |client|
15
- pp client.write("GET / HTTP/1.1\r\nHost: google.com\r\n\r\n") # simple HTTP get request
16
- pp client.read(12) # "HTTP/1.1 " + 3 byte HTTP status code
14
+
15
+ TCPClient.open('www.google.com:443') do |client|
16
+ # simple HTTP get request
17
+ pp client.write("GET / HTTP/1.1\r\nHost: google.com\r\n\r\n")
18
+
19
+ # read "HTTP/1.1 " + 3 byte HTTP status code
20
+ pp client.read(12)
17
21
  end
@@ -1,6 +1,8 @@
1
1
  require_relative '../test_helper'
2
2
 
3
- class AddressTest < Test
3
+ class AddressTest < MiniTest::Test
4
+ parallelize_me!
5
+
4
6
  def test_create_from_integer
5
7
  subject = TCPClient::Address.new(42)
6
8
  assert_equal('localhost:42', subject.to_s)
@@ -1,6 +1,8 @@
1
1
  require_relative '../test_helper'
2
2
 
3
- class ConfigurationTest < Test
3
+ class ConfigurationTest < MiniTest::Test
4
+ parallelize_me!
5
+
4
6
  def test_defaults
5
7
  subject = TCPClient::Configuration.new
6
8
  assert(subject.buffered)
@@ -13,11 +15,12 @@ class ConfigurationTest < Test
13
15
  end
14
16
 
15
17
  def test_configure
16
- subject = TCPClient::Configuration.create do |cfg|
17
- cfg.buffered = cfg.keep_alive = cfg.reverse_lookup = false
18
- cfg.timeout = 42
19
- cfg.ssl = true
20
- end
18
+ subject =
19
+ TCPClient::Configuration.create do |cfg|
20
+ cfg.buffered = cfg.keep_alive = cfg.reverse_lookup = false
21
+ cfg.timeout = 42
22
+ cfg.ssl = true
23
+ end
21
24
  refute(subject.buffered)
22
25
  refute(subject.keep_alive)
23
26
  refute(subject.reverse_lookup)
@@ -27,6 +30,35 @@ class ConfigurationTest < Test
27
30
  assert(subject.ssl?)
28
31
  end
29
32
 
33
+ def test_options
34
+ subject =
35
+ TCPClient::Configuration.new(
36
+ buffered: false,
37
+ keep_alive: false,
38
+ reverse_lookup: false,
39
+ connect_timeout: 1,
40
+ read_timeout: 2,
41
+ write_timeout: 3,
42
+ ssl: true
43
+ )
44
+ refute(subject.buffered)
45
+ refute(subject.keep_alive)
46
+ refute(subject.reverse_lookup)
47
+ assert_same(1, subject.connect_timeout)
48
+ assert_same(2, subject.read_timeout)
49
+ assert_same(3, subject.write_timeout)
50
+ assert(subject.ssl?)
51
+ end
52
+
53
+ def test_invalid_option
54
+ err =
55
+ assert_raises(ArgumentError) do
56
+ TCPClient::Configuration.new(unknown_attr: :argument)
57
+ end
58
+ assert_includes(err.message, 'attribute')
59
+ assert_includes(err.message, 'unknown_attr')
60
+ end
61
+
30
62
  def test_ssl_params
31
63
  subject = TCPClient::Configuration.new
32
64
  refute(subject.ssl?)
@@ -40,11 +72,12 @@ class ConfigurationTest < Test
40
72
  end
41
73
 
42
74
  def test_timeout_overwrite
43
- subject = TCPClient::Configuration.create do |cfg|
44
- cfg.connect_timeout = 1
45
- cfg.read_timeout = 2
46
- cfg.write_timeout = 3
47
- end
75
+ subject =
76
+ TCPClient::Configuration.create do |cfg|
77
+ cfg.connect_timeout = 1
78
+ cfg.read_timeout = 2
79
+ cfg.write_timeout = 3
80
+ end
48
81
  assert_same(1, subject.connect_timeout)
49
82
  assert_same(2, subject.read_timeout)
50
83
  assert_same(3, subject.write_timeout)
@@ -0,0 +1,59 @@
1
+ require_relative '../test_helper'
2
+
3
+ class DefauktConfigurationTest < MiniTest::Test
4
+ def test_default
5
+ subject = TCPClient.configure # reset to defaults
6
+
7
+ assert_same(
8
+ TCPClient.default_configuration,
9
+ TCPClient::Configuration.default
10
+ )
11
+ assert(subject.buffered)
12
+ assert(subject.keep_alive)
13
+ assert(subject.reverse_lookup)
14
+ refute(subject.ssl?)
15
+ assert_nil(subject.connect_timeout)
16
+ assert_nil(subject.read_timeout)
17
+ assert_nil(subject.write_timeout)
18
+ end
19
+
20
+ def test_configure_options
21
+ TCPClient.configure(
22
+ buffered: false,
23
+ keep_alive: false,
24
+ reverse_lookup: false,
25
+ ssl: true,
26
+ connect_timeout: 1,
27
+ read_timeout: 2,
28
+ write_timeout: 3
29
+ )
30
+ subject = TCPClient.default_configuration
31
+ refute(subject.buffered)
32
+ refute(subject.keep_alive)
33
+ refute(subject.reverse_lookup)
34
+ assert(subject.ssl?)
35
+ assert_same(1, subject.connect_timeout)
36
+ assert_same(2, subject.read_timeout)
37
+ assert_same(3, subject.write_timeout)
38
+ end
39
+
40
+ def test_configure_block
41
+ TCPClient.configure do |cfg|
42
+ cfg.buffered = false
43
+ cfg.keep_alive = false
44
+ cfg.reverse_lookup = false
45
+ cfg.ssl = true
46
+ cfg.connect_timeout = 1
47
+ cfg.read_timeout = 2
48
+ cfg.write_timeout = 3
49
+ end
50
+ subject = TCPClient.default_configuration
51
+ refute(subject.buffered)
52
+ refute(subject.keep_alive)
53
+ refute(subject.reverse_lookup)
54
+ assert(subject.ssl?)
55
+ assert_same(1, subject.connect_timeout)
56
+ assert_same(2, subject.read_timeout)
57
+ assert_same(3, subject.write_timeout)
58
+ end
59
+ end
@@ -1,6 +1,8 @@
1
1
  require_relative '../test_helper'
2
2
 
3
- class VersionTest < Test
3
+ class VersionTest < MiniTest::Test
4
+ parallelize_me!
5
+
4
6
  def test_format
5
7
  assert_match(/\d+\.\d+\.\d+/, TCPClient::VERSION)
6
8
  end
@@ -1,23 +1,27 @@
1
1
  require_relative 'test_helper'
2
2
 
3
- class TCPClientTest < Test
3
+ class TCPClientTest < MiniTest::Test
4
+ parallelize_me!
5
+
6
+ attr_reader :config
7
+
8
+ def setup
9
+ @config = TCPClient::Configuration.create(buffered: false)
10
+ end
11
+
4
12
  def test_defaults
5
13
  subject = TCPClient.new
6
14
  assert(subject.closed?)
7
15
  assert_equal('', subject.to_s)
8
16
  assert_nil(subject.address)
9
17
  subject.close
10
- assert_raises(TCPClient::NotConnected) do
11
- subject.write('hello world!')
12
- end
13
- assert_raises(TCPClient::NotConnected) do
14
- subject.read(42)
15
- end
18
+ assert_raises(TCPClient::NotConnected) { subject.write('hello world!') }
19
+ assert_raises(TCPClient::NotConnected) { subject.read(42) }
16
20
  end
17
21
 
18
22
  def create_nonconnected_client
19
23
  client = TCPClient.new
20
- client.connect('', TCPClient::Configuration.new)
24
+ client.connect('', config)
21
25
  rescue Errno::EADDRNOTAVAIL
22
26
  ensure
23
27
  return client
@@ -32,52 +36,32 @@ class TCPClientTest < Test
32
36
  assert_equal('localhost', subject.address.hostname)
33
37
  assert_instance_of(Addrinfo, subject.address.addrinfo)
34
38
  assert_same(0, subject.address.addrinfo.ip_port)
35
- assert_raises(TCPClient::NotConnected) do
36
- subject.write('hello world!')
37
- end
38
- assert_raises(TCPClient::NotConnected) do
39
- subject.read(42)
40
- end
41
- end
42
-
43
- def with_dummy_server(port)
44
- # this server will never receive or send any data
45
- server = TCPServer.new('localhost', port)
46
- yield
47
- ensure
48
- server&.close
39
+ assert_raises(TCPClient::NotConnected) { subject.write('hello world!') }
40
+ assert_raises(TCPClient::NotConnected) { subject.read(42) }
49
41
  end
50
42
 
51
43
  def test_connected_state
52
- with_dummy_server(1234) do
53
- TCPClient.open('localhost:1234') do |subject|
54
- refute(subject.closed?)
55
- assert_equal('localhost:1234', subject.to_s)
56
- refute_nil(subject.address)
57
- address_when_opened = subject.address
58
- assert_equal('localhost:1234', subject.address.to_s)
59
- assert_equal('localhost', subject.address.hostname)
60
- assert_instance_of(Addrinfo, subject.address.addrinfo)
61
- assert_same(1234, subject.address.addrinfo.ip_port)
62
-
63
- subject.close
64
- assert(subject.closed?)
65
- assert_same(address_when_opened, subject.address)
66
- end
44
+ TCPClient.open('localhost:1234') do |subject|
45
+ refute(subject.closed?)
46
+ assert_equal('localhost:1234', subject.to_s)
47
+ refute_nil(subject.address)
48
+ address_when_opened = subject.address
49
+ assert_equal('localhost:1234', subject.address.to_s)
50
+ assert_equal('localhost', subject.address.hostname)
51
+ assert_instance_of(Addrinfo, subject.address.addrinfo)
52
+ assert_same(1234, subject.address.addrinfo.ip_port)
53
+
54
+ subject.close
55
+ assert(subject.closed?)
56
+ assert_same(address_when_opened, subject.address)
67
57
  end
68
58
  end
69
59
 
70
- def check_read_write_timeout(addr, timeout)
71
- TCPClient.open(addr) do |subject|
60
+ def check_read_timeout(timeout)
61
+ TCPClient.open('localhost:1234', config) do |subject|
72
62
  refute(subject.closed?)
73
63
  start_time = nil
74
- assert_raises(TCPClient::Timeout) do
75
- start_time = Time.now
76
- # send 1MB to avoid any TCP stack buffering
77
- subject.write('?' * (1024 * 1024), timeout: timeout)
78
- end
79
- assert_in_delta(timeout, Time.now - start_time, 0.02)
80
- assert_raises(TCPClient::Timeout) do
64
+ assert_raises(TCPClient::ReadTimeoutError) do
81
65
  start_time = Time.now
82
66
  subject.read(42, timeout: timeout)
83
67
  end
@@ -85,31 +69,51 @@ class TCPClientTest < Test
85
69
  end
86
70
  end
87
71
 
88
- def test_read_write_timeout
89
- with_dummy_server(1235) do
90
- [0.5, 1, 1.5].each do |timeout|
91
- check_read_write_timeout('localhost:1235', timeout)
72
+ def test_read_timeout
73
+ check_read_timeout(0.5)
74
+ check_read_timeout(1)
75
+ check_read_timeout(1.5)
76
+ end
77
+
78
+ def check_write_timeout(timeout)
79
+ TCPClient.open('localhost:1234', config) do |subject|
80
+ refute(subject.closed?)
81
+ start_time = nil
82
+ assert_raises(TCPClient::WriteTimeoutError) do
83
+ start_time = Time.now
84
+
85
+ # send 1MB to avoid any TCP stack buffering
86
+ args = Array.new(2024, '?' * 1024)
87
+ subject.write(*args, timeout: timeout)
92
88
  end
89
+ assert_in_delta(timeout, Time.now - start_time, 0.02)
93
90
  end
94
91
  end
95
92
 
96
- def check_connect_timeout(addr, config)
93
+ def test_write_timeout
94
+ check_write_timeout(0.1)
95
+ check_write_timeout(0.25)
96
+ end
97
+
98
+ def check_connect_timeout(ssl_config)
97
99
  start_time = nil
98
- assert_raises(TCPClient::Timeout) do
100
+ assert_raises(TCPClient::ConnectTimeoutError) do
99
101
  start_time = Time.now
100
- TCPClient.new.connect(addr, config)
102
+ TCPClient.new.connect('localhost:1234', ssl_config)
101
103
  end
102
- assert_in_delta(config.connect_timeout, Time.now - start_time, 0.02)
104
+ assert_in_delta(ssl_config.connect_timeout, Time.now - start_time, 0.02)
103
105
  end
104
106
 
105
107
  def test_connect_ssl_timeout
106
- with_dummy_server(1236) do
107
- config = TCPClient::Configuration.new
108
- config.ssl = true
109
- [0.5, 1, 1.5].each do |timeout|
110
- config.timeout = timeout
111
- check_connect_timeout('localhost:1236', config)
112
- end
113
- end
108
+ ssl_config = TCPClient::Configuration.new(ssl: true)
109
+
110
+ ssl_config.connect_timeout = 0.5
111
+ check_connect_timeout(ssl_config)
112
+
113
+ ssl_config.connect_timeout = 1
114
+ check_connect_timeout(ssl_config)
115
+
116
+ ssl_config.connect_timeout = 1.5
117
+ check_connect_timeout(ssl_config)
114
118
  end
115
119
  end
data/test/test_helper.rb CHANGED
@@ -4,6 +4,6 @@ require_relative '../lib/tcp-client'
4
4
 
5
5
  $stdout.sync = $stderr.sync = true
6
6
 
7
- class Test < Minitest::Test
8
- parallelize_me!
9
- end
7
+ # this pseudo-server never reads or writes anything
8
+ DummyServer = TCPServer.new('localhost', 1234)
9
+ Minitest.after_run { DummyServer.close }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tcp-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Blumtritt
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-19 00:00:00.000000000 Z
11
+ date: 2021-02-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -70,6 +70,7 @@ files:
70
70
  - lib/tcp-client.rb
71
71
  - lib/tcp-client/address.rb
72
72
  - lib/tcp-client/configuration.rb
73
+ - lib/tcp-client/default_configuration.rb
73
74
  - lib/tcp-client/mixin/io_timeout.rb
74
75
  - lib/tcp-client/ssl_socket.rb
75
76
  - lib/tcp-client/tcp_socket.rb
@@ -81,6 +82,7 @@ files:
81
82
  - tcp-client.gemspec
82
83
  - test/tcp-client/address_test.rb
83
84
  - test/tcp-client/configuration_test.rb
85
+ - test/tcp-client/default_configuration_test.rb
84
86
  - test/tcp-client/version_test.rb
85
87
  - test/tcp_client_test.rb
86
88
  - test/test_helper.rb
@@ -89,7 +91,7 @@ licenses: []
89
91
  metadata:
90
92
  source_code_uri: https://github.com/mblumtritt/tcp-client
91
93
  bug_tracker_uri: https://github.com/mblumtritt/tcp-client/issues
92
- post_install_message:
94
+ post_install_message:
93
95
  rdoc_options: []
94
96
  require_paths:
95
97
  - lib
@@ -104,13 +106,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
106
  - !ruby/object:Gem::Version
105
107
  version: 1.3.6
106
108
  requirements: []
107
- rubygems_version: 3.0.3
108
- signing_key:
109
+ rubygems_version: 3.2.9
110
+ signing_key:
109
111
  specification_version: 4
110
112
  summary: A TCP client implementation with working timeout support.
111
113
  test_files:
112
114
  - test/tcp-client/address_test.rb
113
115
  - test/tcp-client/configuration_test.rb
116
+ - test/tcp-client/default_configuration_test.rb
114
117
  - test/tcp-client/version_test.rb
115
118
  - test/tcp_client_test.rb
116
119
  - test/test_helper.rb