From 41eb8457f11d830ad03bb78e9a0110243ee3860f Mon Sep 17 00:00:00 2001 From: zah Date: Mon, 30 Jun 2025 02:00:45 +0300 Subject: [PATCH] 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. --- .agents/tasks/2025/06/29-2257-kernel-reset | 1 + .../lib/codetracer/kernel_patches.rb | 7 ++++ .../lib/codetracer/kernel_patches.rb | 7 ++++ test/test_kernel_patches.rb | 32 ++++++++++++------- 4 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 .agents/tasks/2025/06/29-2257-kernel-reset diff --git a/.agents/tasks/2025/06/29-2257-kernel-reset b/.agents/tasks/2025/06/29-2257-kernel-reset new file mode 100644 index 0000000..81bf53e --- /dev/null +++ b/.agents/tasks/2025/06/29-2257-kernel-reset @@ -0,0 +1 @@ +Implement KernelPatches.reset to uninstall all tracers and update tests diff --git a/gems/codetracer-pure-ruby-recorder/lib/codetracer/kernel_patches.rb b/gems/codetracer-pure-ruby-recorder/lib/codetracer/kernel_patches.rb index f3225bd..934a3af 100644 --- a/gems/codetracer-pure-ruby-recorder/lib/codetracer/kernel_patches.rb +++ b/gems/codetracer-pure-ruby-recorder/lib/codetracer/kernel_patches.rb @@ -57,5 +57,12 @@ def self.uninstall(tracer) end end end + + # Uninstall all active tracers and restore the original Kernel methods. + def self.reset + @@tracers.dup.each do |tracer| + uninstall(tracer) + end + end end end diff --git a/gems/codetracer-ruby-recorder/lib/codetracer/kernel_patches.rb b/gems/codetracer-ruby-recorder/lib/codetracer/kernel_patches.rb index f3225bd..934a3af 100644 --- a/gems/codetracer-ruby-recorder/lib/codetracer/kernel_patches.rb +++ b/gems/codetracer-ruby-recorder/lib/codetracer/kernel_patches.rb @@ -57,5 +57,12 @@ def self.uninstall(tracer) end end end + + # Uninstall all active tracers and restore the original Kernel methods. + def self.reset + @@tracers.dup.each do |tracer| + uninstall(tracer) + end + end end end diff --git a/test/test_kernel_patches.rb b/test/test_kernel_patches.rb index 568b671..187f14f 100644 --- a/test/test_kernel_patches.rb +++ b/test/test_kernel_patches.rb @@ -24,21 +24,11 @@ class TestKernelPatches < Minitest::Test def setup @tracer1 = MockTracer.new("tracer1") @tracer2 = MockTracer.new("tracer2") - # Ensure a clean state before each test by attempting to clear any existing tracers - # This is a bit of a hack, ideally KernelPatches would offer a reset or more direct access - current_tracers = CodeTracer::KernelPatches.class_variable_get(:@@tracers).dup - current_tracers.each do |tracer| - CodeTracer::KernelPatches.uninstall(tracer) - end + CodeTracer::KernelPatches.reset end def teardown - # Ensure all tracers are uninstalled after each test - current_tracers = CodeTracer::KernelPatches.class_variable_get(:@@tracers).dup - current_tracers.each do |tracer| - CodeTracer::KernelPatches.uninstall(tracer) - end - # Verify that original methods are restored if no tracers are left + CodeTracer::KernelPatches.reset assert_empty CodeTracer::KernelPatches.class_variable_get(:@@tracers), "Tracers should be empty after teardown" end @@ -116,6 +106,24 @@ def test_restoration_of_original_methods assert_empty @tracer1.events, "Tracer should not record events after being uninstalled and patches removed" end + def test_reset_removes_all_tracers_and_restores_methods + CodeTracer::KernelPatches.install(@tracer1) + CodeTracer::KernelPatches.install(@tracer2) + + CodeTracer::KernelPatches.reset + + assert_empty CodeTracer::KernelPatches.class_variable_get(:@@tracers), "No tracers should remain after reset" + + p 'after reset' + + assert_empty @tracer1.events, "Tracer1 should not record after reset" + assert_empty @tracer2.events, "Tracer2 should not record after reset" + + assert_equal Kernel.instance_method(:codetracer_original_p), Kernel.instance_method(:p) + assert_equal Kernel.instance_method(:codetracer_original_puts), Kernel.instance_method(:puts) + assert_equal Kernel.instance_method(:codetracer_original_print), Kernel.instance_method(:print) + end + def test_correct_event_arguments CodeTracer::KernelPatches.install(@tracer1)