Skip to content

Commit

Permalink
test: extract setup and teardown in ForkTracker tests
Browse files Browse the repository at this point in the history
and backfill coverage for deregistering callbacks.
  • Loading branch information
flavorjones committed Sep 14, 2024
1 parent 0c54183 commit b3234a7
Showing 1 changed file with 74 additions and 110 deletions.
184 changes: 74 additions & 110 deletions activesupport/test/fork_tracker_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,164 +3,114 @@
require_relative "abstract_unit"

class ForkTrackerTest < ActiveSupport::TestCase
def test_object_fork
read, write = IO.pipe
called = false
def setup
super

@read, @write = IO.pipe
@called = false

handler = ActiveSupport::ForkTracker.after_fork do
called = true
write.write "forked"
@handler = ActiveSupport::ForkTracker.after_fork do
@called = true
@write.write "forked"
end
end

def teardown
ActiveSupport::ForkTracker.unregister(@handler)

super
end

def test_object_fork
assert_not respond_to?(:fork)
pid = fork do
read.close
write.close
@read.close
@write.close
exit!
end

write.close
@write.close

Process.waitpid(pid)
assert_equal "forked", read.read
read.close
assert_equal "forked", @read.read
@read.close

assert_not called
ensure
ActiveSupport::ForkTracker.unregister(handler)
assert_not @called
end

def test_object_fork_without_block
read, write = IO.pipe
called = false

handler = ActiveSupport::ForkTracker.after_fork do
called = true
write.write "forked"
end

if pid = fork
write.close
@write.close
Process.waitpid(pid)
assert_equal "forked", read.read
read.close
assert_not called
assert_equal "forked", @read.read
@read.close
assert_not @called
else
read.close
write.close
@read.close
@write.close
exit!
end
ensure
ActiveSupport::ForkTracker.unregister(handler)
end

def test_process_fork
read, write = IO.pipe
called = false

handler = ActiveSupport::ForkTracker.after_fork do
called = true
write.write "forked"
end

pid = Process.fork do
read.close
write.close
@read.close
@write.close
exit!
end

write.close
@write.close

Process.waitpid(pid)
assert_equal "forked", read.read
read.close
assert_not called
ensure
ActiveSupport::ForkTracker.unregister(handler)
assert_equal "forked", @read.read
@read.close
assert_not @called
end

def test_process_fork_without_block
read, write = IO.pipe
called = false

handler = ActiveSupport::ForkTracker.after_fork do
called = true
write.write "forked"
end

if pid = Process.fork
write.close
@write.close
Process.waitpid(pid)
assert_equal "forked", read.read
read.close
assert_not called
assert_equal "forked", @read.read
@read.close
assert_not @called
else
read.close
write.close
@read.close
@write.close
exit!
end
ensure
ActiveSupport::ForkTracker.unregister(handler)
end

def test_kernel_fork
read, write = IO.pipe
called = false

handler = ActiveSupport::ForkTracker.after_fork do
called = true
write.write "forked"
end

pid = Kernel.fork do
read.close
write.close
@read.close
@write.close
exit!
end

write.close
@write.close

Process.waitpid(pid)
assert_equal "forked", read.read
read.close
assert_not called
ensure
ActiveSupport::ForkTracker.unregister(handler)
assert_equal "forked", @read.read
@read.close
assert_not @called
end

def test_kernel_fork_without_block
read, write = IO.pipe
called = false

handler = ActiveSupport::ForkTracker.after_fork do
called = true
write.write "forked"
end

if pid = Kernel.fork
write.close
@write.close
Process.waitpid(pid)
assert_equal "forked", read.read
read.close
assert_not called
assert_equal "forked", @read.read
@read.close
assert_not @called
else
read.close
write.close
@read.close
@write.close
exit!
end
ensure
ActiveSupport::ForkTracker.unregister(handler)
end

def test_basic_object_with_kernel_fork
read, write = IO.pipe
called = false

handler = ActiveSupport::ForkTracker.after_fork do
called = true
write.write "forked"
end

klass = Class.new(BasicObject) do
include ::Kernel
def fark(&block)
Expand All @@ -171,19 +121,33 @@ def fark(&block)
object = klass.new
assert_not object.respond_to?(:fork)
pid = object.fark do
read.close
write.close
@read.close
@write.close
exit!
end

write.close
@write.close

Process.waitpid(pid)
assert_equal "forked", read.read
read.close
assert_equal "forked", @read.read
@read.close

assert_not called
ensure
ActiveSupport::ForkTracker.unregister(handler)
assert_not @called
end

def test_unregister_callback
ActiveSupport::ForkTracker.unregister(@handler)

if pid = Process.fork
@write.close
Process.waitpid(pid)
assert_equal "", @read.read
@read.close
assert_not @called
else
@read.close
@write.close
exit!
end
end
end if Process.respond_to?(:fork)

0 comments on commit b3234a7

Please sign in to comment.