forked from eventmachine/eventmachine
-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_inactivity_timeout.rb
102 lines (88 loc) · 2.81 KB
/
test_inactivity_timeout.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
require_relative 'em_test_helper'
class TestInactivityTimeout < Test::Unit::TestCase
if EM.respond_to? :get_comm_inactivity_timeout
def test_default
EM.run {
c = EM.connect("127.0.0.1", 54321)
assert_equal 0.0, c.comm_inactivity_timeout
EM.stop
}
end
def test_set_and_get
EM.run {
c = EM.connect("127.0.0.1", 54321)
c.comm_inactivity_timeout = 2.5
assert_equal 2.5, c.comm_inactivity_timeout
EM.stop
}
end
def test_for_real
start, finish, reason = nil
timeout_start = Module.new do
define_method :post_init do
start = Time.now
end
end
timeout_handler = Module.new do
define_method :unbind do
finish = Time.now
EM.stop
end
end
EM.run {
setup_timeout 0.4
EM.heartbeat_interval = 0.01
EM.start_server("127.0.0.1", 12345, timeout_start)
EM.add_timer(0.01) {
c = EM.connect("127.0.0.1", 12345, timeout_handler)
c.comm_inactivity_timeout = 0.02
}
}
# Travis can vary from 0.02 to 0.17, Appveyor maybe as low as 0.01
assert_in_delta 0.09, (finish - start), (darwin? ? 0.10 : 0.08)
# simplified reproducer for comm_inactivity_timeout taking twice as long
# as requested -- https://github.com/eventmachine/eventmachine/issues/554
timeout_start_tls = Module.new do
define_method :post_init do
start = Time.now
start_tls
end
define_method :receive_data do |data|
send_data ">>>you sent: #{data}"
end
end
timeout_handler_tls = Module.new do
define_method :connection_completed do
start_tls
end
define_method :ssl_handshake_completed do
@timer = EM::PeriodicTimer.new(0.05) do
#puts "get_idle_time: #{get_idle_time} inactivity: #{comm_inactivity_timeout}"
end
send_data "hello world"
end
define_method :unbind do |r|
finish = Time.now
reason = r
EM.stop
end
end
EM.run {
setup_timeout 1.4
EM.start_server("127.0.0.1", 12345, timeout_start_tls)
c = EM.connect("127.0.0.1", 12345, timeout_handler_tls)
c.comm_inactivity_timeout = 0.15
}
# .30 is double the timeout and not acceptable
assert_in_delta 0.15, (finish - start), (darwin? ? 0.20 : 0.14)
# make sure it was a timeout and not a TLS error
assert_equal Errno::ETIMEDOUT, reason
end
else
warn "EM.comm_inactivity_timeout not implemented, skipping tests in #{__FILE__}"
# Because some rubies will complain if a TestCase class has no tests
def test_em_comm_inactivity_timeout_not_implemented
assert true
end
end
end