Skip to content

Commit 67a6229

Browse files
committed
tests: guard against errors in process forking
Add a little bit of guarding to help surface errors in future should problems cause the suite to fail
1 parent 851f2bf commit 67a6229

File tree

1 file changed

+15
-8
lines changed

1 file changed

+15
-8
lines changed

metrics_sdk/test/opentelemetry/sdk/metrics/fork_hooks_test.rb

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,26 @@
55
# SPDX-License-Identifier: Apache-2.0
66

77
require 'test_helper'
8-
require 'opentelemetry-exporter-otlp-metrics' unless RUBY_ENGINE == 'jruby'
8+
require 'json'
99

1010
describe OpenTelemetry::SDK::Metrics::ForkHooks do
1111
def fork_with_fork_hooks(before_fork_lambda, after_fork_lambda)
1212
with_pipe do |inner_read_io, inner_write_io|
1313
child_pid = fork do # fork twice to avoid prepending fork in the parent process
1414
setup_fork_hooks(before_fork_lambda, after_fork_lambda) do
1515
grandchild_pid = fork {}
16-
Process.waitpid(grandchild_pid)
17-
inner_write_io.puts grandchild_pid
16+
Timeout.timeout(5) { Process.waitpid(grandchild_pid) }
17+
message = { 'child_pid' => Process.pid, 'grandchild_pid' => grandchild_pid }.to_json
18+
inner_write_io.puts message
19+
rescue StandardError => e
20+
message = { 'error' => e.message }.to_json
21+
inner_write_io.puts message
1822
end
1923
end
20-
Process.waitpid(child_pid)
21-
grandchild_pid = inner_read_io.gets.chomp.to_i
24+
Timeout.timeout(10) { Process.waitpid(child_pid) }
25+
received_from_child = JSON.parse(inner_read_io.gets.chomp)
26+
refute_includes(received_from_child, 'error')
27+
grandchild_pid = received_from_child['grandchild_pid']
2228
refute_equal(child_pid, Process.pid)
2329
refute_equal(child_pid, grandchild_pid)
2430
[child_pid, grandchild_pid]
@@ -59,11 +65,12 @@ def with_pipe
5965
with_pipe do |after_fork_read_io, after_fork_write_io|
6066
before_fork_lambda = proc {}
6167
after_fork_lambda = proc do
62-
after_fork_write_io.puts Process.pid
68+
message = { 'after_fork_pid' => Process.pid }.to_json
69+
after_fork_write_io.puts message
6370
end
6471

65-
forking_pid, forked_pid = fork_with_fork_hooks(before_fork_lambda, after_fork_lambda)
66-
pid_from_after_fork = after_fork_read_io.gets.chomp.to_i
72+
forking_pid, forked_pid = fork_with_fork_hooks(after_fork_lambda)
73+
pid_from_after_fork = JSON.parse(after_fork_read_io.gets.chomp)['after_fork_pid'].to_i
6774

6875
refute_equal(pid_from_after_fork, Process.pid)
6976
refute_equal(pid_from_after_fork, forking_pid)

0 commit comments

Comments
 (0)