Improve no Symbol leak tests to be more reliable

This commit is contained in:
Benoit Daloze
2026-03-25 16:46:47 +01:00
parent d824de701c
commit ad70c5c459
+13 -6
View File
@@ -44,8 +44,7 @@ class SecurityTest < Minitest::Test
end
def test_does_not_permanently_add_filters_to_symbol_table
current_symbols = Symbol.all_symbols
assert_no_new_symbols do
# MRI imprecisely marks objects found on the C stack, which can result
# in uninitialized memory being marked. This can even result in the test failing
# deterministically for a given compilation of ruby. Using a separate thread will
@@ -58,18 +57,26 @@ class SecurityTest < Minitest::Test
end.join
GC.start
assert_equal([], Symbol.all_symbols - current_symbols)
end
end
def test_does_not_add_drop_methods_to_symbol_table
current_symbols = Symbol.all_symbols
assert_no_new_symbols do
assigns = { 'drop' => Drop.new }
assert_equal("", Template.parse("{{ drop.custom_method_1 }}", assigns).render!)
assert_equal("", Template.parse("{{ drop.custom_method_2 }}", assigns).render!)
assert_equal("", Template.parse("{{ drop.custom_method_3 }}", assigns).render!)
end
end
def assert_no_new_symbols
# Run once to trigger any first-time initialization which might create some symbols,
# for example autoload or lazy method parsing might create symbols on first execution.
yield
# Ensure no new symbols for further runs, i.e. the code does not leak symbols
current_symbols = Symbol.all_symbols
yield
assert_equal([], Symbol.all_symbols - current_symbols)
end