Fix BacktraceCleaner#noise for multiple silencers.

The previous implementation of BacktraceSilencer#noise did not
work correctly if more than one silencer was configured --
specifically, it would only return noise which was matched by all
silencers.

The new implementation is such that anything that has been matched by
silencers is removed from the backtrace using Array#- (array
difference), ie. we now return all elements within a backtrace that
have been matched by any silencer (and are thus removed by #silence).

Fixes #11030.
This commit is contained in:
Mark J. Titorenko 2013-06-20 13:51:01 +01:00
parent 7c69a829a3
commit a3678e45ec
3 changed files with 29 additions and 5 deletions

View File

@ -1,3 +1,10 @@
* Fix return value from `BacktraceCleaner#noise` when the cleaner is configured
with multiple silencers.
Fixes #11030
*Mark J. Titorenko*
* `HashWithIndifferentAccess#select` now returns a `HashWithIndifferentAccess`
instance instead of a `Hash` instance.

View File

@ -97,11 +97,7 @@ module ActiveSupport
end
def noise(backtrace)
@silencers.each do |s|
backtrace = backtrace.select { |line| s.call(line) }
end
backtrace
backtrace - silence(backtrace)
end
end
end

View File

@ -36,6 +36,27 @@ class BacktraceCleanerSilencerTest < ActiveSupport::TestCase
end
end
class BacktraceCleanerMultipleSilencersTest < ActiveSupport::TestCase
def setup
@bc = ActiveSupport::BacktraceCleaner.new
@bc.add_silencer { |line| line =~ /mongrel/ }
@bc.add_silencer { |line| line =~ /yolo/ }
end
test "backtrace should not contain lines that match the silencers" do
assert_equal \
[ "/other/class.rb" ],
@bc.clean([ "/mongrel/class.rb", "/other/class.rb", "/mongrel/stuff.rb", "/other/yolo.rb" ])
end
test "backtrace should only contain lines that match the silencers" do
assert_equal \
[ "/mongrel/class.rb", "/mongrel/stuff.rb", "/other/yolo.rb" ],
@bc.clean([ "/mongrel/class.rb", "/other/class.rb", "/mongrel/stuff.rb", "/other/yolo.rb" ],
:noise)
end
end
class BacktraceCleanerFilterAndSilencerTest < ActiveSupport::TestCase
def setup
@bc = ActiveSupport::BacktraceCleaner.new