forked from puma/puma
-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_events.rb
231 lines (168 loc) · 5.03 KB
/
test_events.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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
require 'puma/events'
require_relative "helper"
class TestEvents < Minitest::Test
def test_null
events = Puma::Events.null
assert_instance_of Puma::NullIO, events.stdout
assert_instance_of Puma::NullIO, events.stderr
assert_equal events.stdout, events.stderr
end
def test_strings
events = Puma::Events.strings
assert_instance_of StringIO, events.stdout
assert_instance_of StringIO, events.stderr
end
def test_stdio
events = Puma::Events.stdio
assert_equal STDOUT, events.stdout
assert_equal STDERR, events.stderr
end
def test_stdio_respects_sync
events = Puma::Events.stdio
assert_equal STDOUT.sync, events.stdout.sync
assert_equal STDERR.sync, events.stderr.sync
assert_equal STDOUT, events.stdout
assert_equal STDERR, events.stderr
end
def test_register_callback_with_block
res = false
events = Puma::Events.null
events.register(:exec) { res = true }
events.fire(:exec)
assert_equal true, res
end
def test_register_callback_with_object
obj = Object.new
def obj.res
@res || false
end
def obj.call
@res = true
end
events = Puma::Events.null
events.register(:exec, obj)
events.fire(:exec)
assert_equal true, obj.res
end
def test_fire_callback_with_multiple_arguments
res = []
events = Puma::Events.null
events.register(:exec) { |*args| res.concat(args) }
events.fire(:exec, :foo, :bar, :baz)
assert_equal [:foo, :bar, :baz], res
end
def test_on_booted_callback
res = false
events = Puma::Events.null
events.on_booted { res = true }
events.fire_on_booted!
assert res
end
def test_log_writes_to_stdout
out, _ = capture_io do
Puma::Events.stdio.log("ready")
end
assert_equal "ready\n", out
end
def test_write_writes_to_stdout
out, _ = capture_io do
Puma::Events.stdio.write("ready")
end
assert_equal "ready", out
end
def test_debug_writes_to_stdout_if_env_is_present
original_debug, ENV["PUMA_DEBUG"] = ENV["PUMA_DEBUG"], "1"
out, _ = capture_io do
Puma::Events.stdio.debug("ready")
end
assert_equal "% ready\n", out
ensure
ENV["PUMA_DEBUG"] = original_debug
end
def test_debug_not_write_to_stdout_if_env_is_not_present
out, _ = capture_io do
Puma::Events.stdio.debug("ready")
end
assert_empty out
end
def test_error_writes_to_stderr_and_exits
did_exit = false
_, err = capture_io do
begin
Puma::Events.stdio.error("interrupted")
rescue SystemExit
did_exit = true
ensure
assert did_exit
end
end
assert_match %r!ERROR: interrupted!, err
end
def test_pid_formatter
pid = Process.pid
out, _ = capture_io do
events = Puma::Events.stdio
events.formatter = Puma::Events::PidFormatter.new
events.write("ready")
end
assert_equal "[#{ pid }] ready", out
end
def test_custom_log_formatter
custom_formatter = proc { |str| "-> #{ str }" }
out, _ = capture_io do
events = Puma::Events.stdio
events.formatter = custom_formatter
events.write("ready")
end
assert_equal "-> ready", out
end
def test_parse_error
port = 0
host = "127.0.0.1"
app = proc { |env| [200, {"Content-Type" => "plain/text"}, ["hello\n"]] }
events = Puma::Events.strings
server = Puma::Server.new app, events
port = (server.add_tcp_listener host, 0).addr[1]
server.run
sock = TCPSocket.new host, port
path = "/"
params = "a"*1024*10
sock << "GET #{path}?a=#{params} HTTP/1.1\r\nConnection: close\r\n\r\n"
sock.read
sleep 0.1 # important so that the previous data is sent as a packet
assert_match %r!HTTP parse error, malformed request!, events.stderr.string
assert_match %r!\("GET #{path}" - \(-\)\)!, events.stderr.string
ensure
sock.close if sock && !sock.closed?
server.stop true
end
# test_puma_server_ssl.rb checks that ssl errors are raised correctly,
# but it mocks the actual error code. This test the code, but it will
# break if the logged message changes
def test_ssl_error
events = Puma::Events.strings
ssl_mock = -> (addr, subj) {
obj = Object.new
obj.define_singleton_method(:peeraddr) { addr }
if subj
cert = Object.new
cert.define_singleton_method(:subject) { subj }
obj.define_singleton_method(:peercert) { cert }
else
obj.define_singleton_method(:peercert) { nil }
end
obj
}
events.ssl_error OpenSSL::SSL::SSLError, ssl_mock.call(['127.0.0.1'], 'test_cert')
error = events.stderr.string
assert_includes error, "SSL error"
assert_includes error, "peer: 127.0.0.1"
assert_includes error, "cert: test_cert"
events.stderr.string = ''
events.ssl_error OpenSSL::SSL::SSLError, ssl_mock.call(nil, nil)
error = events.stderr.string
assert_includes error, "SSL error"
assert_includes error, "peer: <unknown>"
assert_includes error, "cert: :"
end if ::Puma::HAS_SSL
end