/
test_events.rb
188 lines (132 loc) · 3.8 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
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
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
# events.stdout is a dup, so same file handle, different ruby object, but inspect should show the same file handle
assert_equal STDOUT.inspect, events.stdout.inspect
assert_equal STDERR.inspect, events.stderr.inspect
end
def test_stdio_respects_sync
STDOUT.sync = false
events = Puma::Events.stdio
assert !STDOUT.sync
assert events.stdout.sync
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
Puma::Events.stdio.error("interrupted")
end
assert_equal "ERROR: interrupted", err
rescue SystemExit
did_exit = true
ensure
assert did_exit
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 = Puma::Events::CustomFormatter.new(Proc.new { |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
server.add_tcp_listener host, port
server.run
sock = TCPSocket.new host, server.connected_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 \(#{path}\)!, events.stderr.string
server.stop(true)
end
end