Skip to content

Commit 800965f

Browse files
committed
feat: add reset method for kernel tracer patches
Implemented KernelPatches.reset in both recorder gems to uninstall all active tracers and restore original Kernel methods. Tests now use this helper in setup and teardown. Added dedicated test verifying that reset leaves no tracers installed and methods restored.
1 parent 4282ddf commit 800965f

File tree

4 files changed

+35
-12
lines changed

4 files changed

+35
-12
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Implement KernelPatches.reset to uninstall all tracers and update tests

gems/codetracer-pure-ruby-recorder/lib/codetracer/kernel_patches.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,12 @@ def self.uninstall(tracer)
5757
end
5858
end
5959
end
60+
61+
# Uninstall all active tracers and restore the original Kernel methods.
62+
def self.reset
63+
@@tracers.dup.each do |tracer|
64+
uninstall(tracer)
65+
end
66+
end
6067
end
6168
end

gems/codetracer-ruby-recorder/lib/codetracer/kernel_patches.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,12 @@ def self.uninstall(tracer)
5757
end
5858
end
5959
end
60+
61+
# Uninstall all active tracers and restore the original Kernel methods.
62+
def self.reset
63+
@@tracers.dup.each do |tracer|
64+
uninstall(tracer)
65+
end
66+
end
6067
end
6168
end

test/test_kernel_patches.rb

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,11 @@ class TestKernelPatches < Minitest::Test
2424
def setup
2525
@tracer1 = MockTracer.new("tracer1")
2626
@tracer2 = MockTracer.new("tracer2")
27-
# Ensure a clean state before each test by attempting to clear any existing tracers
28-
# This is a bit of a hack, ideally KernelPatches would offer a reset or more direct access
29-
current_tracers = CodeTracer::KernelPatches.class_variable_get(:@@tracers).dup
30-
current_tracers.each do |tracer|
31-
CodeTracer::KernelPatches.uninstall(tracer)
32-
end
27+
CodeTracer::KernelPatches.reset
3328
end
3429

3530
def teardown
36-
# Ensure all tracers are uninstalled after each test
37-
current_tracers = CodeTracer::KernelPatches.class_variable_get(:@@tracers).dup
38-
current_tracers.each do |tracer|
39-
CodeTracer::KernelPatches.uninstall(tracer)
40-
end
41-
# Verify that original methods are restored if no tracers are left
31+
CodeTracer::KernelPatches.reset
4232
assert_empty CodeTracer::KernelPatches.class_variable_get(:@@tracers), "Tracers should be empty after teardown"
4333
end
4434

@@ -116,6 +106,24 @@ def test_restoration_of_original_methods
116106
assert_empty @tracer1.events, "Tracer should not record events after being uninstalled and patches removed"
117107
end
118108

109+
def test_reset_removes_all_tracers_and_restores_methods
110+
CodeTracer::KernelPatches.install(@tracer1)
111+
CodeTracer::KernelPatches.install(@tracer2)
112+
113+
CodeTracer::KernelPatches.reset
114+
115+
assert_empty CodeTracer::KernelPatches.class_variable_get(:@@tracers), "No tracers should remain after reset"
116+
117+
p 'after reset'
118+
119+
assert_empty @tracer1.events, "Tracer1 should not record after reset"
120+
assert_empty @tracer2.events, "Tracer2 should not record after reset"
121+
122+
assert_equal Kernel.instance_method(:codetracer_original_p), Kernel.instance_method(:p)
123+
assert_equal Kernel.instance_method(:codetracer_original_puts), Kernel.instance_method(:puts)
124+
assert_equal Kernel.instance_method(:codetracer_original_print), Kernel.instance_method(:print)
125+
end
126+
119127
def test_correct_event_arguments
120128
CodeTracer::KernelPatches.install(@tracer1)
121129

0 commit comments

Comments
 (0)