Revert "Merge pull request #39304 from zenspider/zenspider/backtrace_filter_should_never_return_empty"

This reverts commit 2eb7aa111b, reversing
changes made to 0b28f0c39c.

Rails backtrace cleaner needs to be able to return empty traces to
separate application code from the framework code and not report
exceptions that happen inside only framework code.

See
345de17caf/actionpack/lib/action_dispatch/middleware/exception_wrapper.rb (L72).
This commit is contained in:
Rafael Mendonça França 2020-10-06 22:31:41 +00:00
parent 345de17caf
commit d98d749222
No known key found for this signature in database
GPG Key ID: FC23B6D0F1EEE948
3 changed files with 20 additions and 34 deletions

View File

@ -540,9 +540,7 @@ class DebugExceptionsTest < ActionDispatch::IntegrationTest
output = StringIO.new
backtrace_cleaner = ActiveSupport::BacktraceCleaner.new
def backtrace_cleaner.clean(bt, _)
[]
end
backtrace_cleaner.add_silencer { true }
env = { "action_dispatch.show_exceptions" => true,
"action_dispatch.logger" => Logger.new(output),

View File

@ -104,29 +104,28 @@ module ActiveSupport
add_silencer { |line| line.start_with?(RbConfig::CONFIG["rubylibdir"]) }
end
# Process +ary+ via +filters+ using +method+, ensuring
# _something_ gets returned.
def process_collection(ary, filters, method)
filters.reduce(ary) { |bt, f| bt.public_send(method) { |line| f.call(line) } }
end
# Use @filters to transform the backtrace via map
def filter_backtrace(backtrace)
process_collection backtrace, @filters, :map
@filters.each do |f|
backtrace = backtrace.map { |line| f.call(line) }
end
backtrace
end
# Use @silencers to reject parts of the backtrace. Guarantee
# something non-empty is returned.
def silence(backtrace)
result = process_collection backtrace, @silencers, :reject
result.first ? result : backtrace.dup
@silencers.each do |s|
backtrace = backtrace.reject { |line| s.call(line) }
end
backtrace
end
# Use @silencers to select parts of the backtrace. Guarantee
# something non-empty is returned.
def noise(backtrace)
result = backtrace.select { |line| @silencers.any? { |s| s.call(line) } }
result.first ? result : backtrace.dup
backtrace.select do |line|
@silencers.any? do |s|
s.call(line)
end
end
end
end
end

View File

@ -42,17 +42,6 @@ class BacktraceCleanerSilencerTest < ActiveSupport::TestCase
end
end
class BacktraceCleanerShouldNeverReturnEmpty < ActiveSupport::TestCase
test "backtrace should return a backtrace no matter what" do
@bc = ActiveSupport::BacktraceCleaner.new
@bc.add_silencer { |line| true }
bt = %w[ first second third ]
assert_equal bt, @bc.clean(bt.dup)
end
end
class BacktraceCleanerMultipleSilencersTest < ActiveSupport::TestCase
def setup
@bc = ActiveSupport::BacktraceCleaner.new
@ -114,15 +103,15 @@ class BacktraceCleanerDefaultFilterAndSilencerTest < ActiveSupport::TestCase
end
test "should silence gems from the backtrace" do
backtrace = [ "#{Gem.path[0]}/gems/nosuchgem-1.2.3/lib/foo.rb", "other/file.rb" ]
backtrace = [ "#{Gem.path[0]}/gems/nosuchgem-1.2.3/lib/foo.rb" ]
result = @bc.clean(backtrace)
assert_equal %w[other/file.rb], result
assert_empty result
end
test "should silence stdlib" do
backtrace = ["#{RbConfig::CONFIG["rubylibdir"]}/lib/foo.rb", "other/file.rb"]
backtrace = ["#{RbConfig::CONFIG["rubylibdir"]}/lib/foo.rb"]
result = @bc.clean(backtrace)
assert_equal %w[other/file.rb], result
assert_empty result
end
test "should preserve lines that have a subpath matching a gem path" do