Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove breadcrumb metadata validation #648

Merged
merged 3 commits into from
Dec 22, 2020
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 0 additions & 22 deletions lib/bugsnag/breadcrumbs/validator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,6 @@ def initialize(configuration)
#
# @param breadcrumb [Bugsnag::Breadcrumbs::Breadcrumb] the breadcrumb to be validated
def validate(breadcrumb)
# Check meta_data hash doesn't contain complex values
breadcrumb.meta_data = breadcrumb.meta_data.select do |k, v|
if valid_meta_data_type?(v)
true
else
@configuration.debug("Breadcrumb #{breadcrumb.name} meta_data #{k}:#{v.class} has been dropped for having an invalid data type")
false
end
end

# Check type is valid, set to manual otherwise
unless Bugsnag::Breadcrumbs::VALID_BREADCRUMB_TYPES.include?(breadcrumb.type)
@configuration.debug("Invalid type: #{breadcrumb.type} for breadcrumb: #{breadcrumb.name}, defaulting to #{Bugsnag::Breadcrumbs::MANUAL_BREADCRUMB_TYPE}")
Expand All @@ -37,17 +27,5 @@ def validate(breadcrumb)
@configuration.debug("Automatic breadcrumb of type #{breadcrumb.type} ignored: #{breadcrumb.name}")
breadcrumb.ignore!
end

private

##
# Tests whether the meta_data types are non-complex objects.
#
# Acceptable types are String, Symbol, Numeric, TrueClass, FalseClass, and nil.
#
# @param value [Object] the object to be type checked
def valid_meta_data_type?(value)
value.nil? || value.is_a?(String) || value.is_a?(Symbol) || value.is_a?(Numeric) || value.is_a?(FalseClass) || value.is_a?(TrueClass)
end
end
end
171 changes: 34 additions & 137 deletions spec/breadcrumbs/validator_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,171 +5,68 @@
require 'bugsnag/breadcrumbs/validator'

RSpec.describe Bugsnag::Breadcrumbs::Validator do
let(:enabled_automatic_breadcrumb_types) { Bugsnag::Breadcrumbs::VALID_BREADCRUMB_TYPES }
let(:auto) { false }
let(:auto) { :manual }
let(:name) { "Valid message" }
let(:type) { Bugsnag::Breadcrumbs::ERROR_BREADCRUMB_TYPE }
let(:meta_data) { {} }

describe "#validate" do
it "does not 'ignore!' a valid breadcrumb" do
config = instance_double(Bugsnag::Configuration)
allow(config).to receive(:enabled_automatic_breadcrumb_types).and_return(enabled_automatic_breadcrumb_types)
validator = Bugsnag::Breadcrumbs::Validator.new(config)
breadcrumb = Bugsnag::Breadcrumbs::Breadcrumb.new(name, type, {}, auto)

breadcrumb = instance_double(Bugsnag::Breadcrumbs::Breadcrumb, {
:auto => auto,
:name => name,
:type => type,
:meta_data => meta_data,
:meta_data= => nil
})

expect(breadcrumb).to_not receive(:ignore!)
expect(config).to_not receive(:debug)
expect(breadcrumb.ignore?).to eq(false)

validator = Bugsnag::Breadcrumbs::Validator.new(Bugsnag.configuration)
validator.validate(breadcrumb)
end

describe "tests meta_data types" do
it "accepts Strings, Numerics, Booleans, & nil" do
config = instance_double(Bugsnag::Configuration)
allow(config).to receive(:enabled_automatic_breadcrumb_types).and_return(enabled_automatic_breadcrumb_types)
validator = Bugsnag::Breadcrumbs::Validator.new(config)

meta_data = {
:string => "This is a string",
:symbol => :this_is_a_symbol,
:integer => 12345,
:float => 12345.6789,
:false => false,
:true => true,
:nil => nil
}

breadcrumb = instance_double(Bugsnag::Breadcrumbs::Breadcrumb, {
:auto => auto,
:name => name,
:type => type,
:meta_data => meta_data,
:meta_data= => nil
})

expect(breadcrumb).to_not receive(:ignore!)
expect(config).to_not receive(:debug)

validator.validate(breadcrumb)
end

it "rejects Arrays, Hashes, and non-primitive objects" do
config = instance_double(Bugsnag::Configuration)
allow(config).to receive(:enabled_automatic_breadcrumb_types).and_return(enabled_automatic_breadcrumb_types)
validator = Bugsnag::Breadcrumbs::Validator.new(config)

class TestClass
end

meta_data = {
:fine => 1,
:array => [1, 2, 3],
:hash => {
:a => 1
},
:object => TestClass.new
}

breadcrumb = instance_double(Bugsnag::Breadcrumbs::Breadcrumb, {
:auto => auto,
:name => name,
:type => type,
:meta_data => meta_data
})

expect(breadcrumb).to_not receive(:ignore!)
expected_string_1 = "Breadcrumb #{breadcrumb.name} meta_data array:Array has been dropped for having an invalid data type"
expected_string_2 = "Breadcrumb #{breadcrumb.name} meta_data hash:Hash has been dropped for having an invalid data type"
expected_string_3 = "Breadcrumb #{breadcrumb.name} meta_data object:TestClass has been dropped for having an invalid data type"
expect(config).to receive(:debug).with(expected_string_1)
expect(config).to receive(:debug).with(expected_string_2)
expect(config).to receive(:debug).with(expected_string_3)

# Confirms that the meta_data is being filtered
expect(breadcrumb).to receive(:meta_data=).with({
:fine => 1
})

validator.validate(breadcrumb)
end
expect(breadcrumb.ignore?).to eq(false)
end

it "tests type, defaulting to 'manual' if invalid" do
config = instance_double(Bugsnag::Configuration)
allow(config).to receive(:enabled_automatic_breadcrumb_types).and_return(enabled_automatic_breadcrumb_types)
validator = Bugsnag::Breadcrumbs::Validator.new(config)

type = "Not a valid type"

breadcrumb = instance_double(Bugsnag::Breadcrumbs::Breadcrumb, {
:auto => auto,
:name => name,
:type => type,
:meta_data => meta_data,
:meta_data= => nil
})
invalid_type = "I'm not a valid type :-)"
breadcrumb = Bugsnag::Breadcrumbs::Breadcrumb.new(name, invalid_type, {}, auto)

expect(breadcrumb).to receive(:type=).with(Bugsnag::Breadcrumbs::MANUAL_BREADCRUMB_TYPE)
expect(breadcrumb).to_not receive(:ignore!)
expected_string = "Invalid type: #{type} for breadcrumb: #{breadcrumb.name}, defaulting to #{Bugsnag::Breadcrumbs::MANUAL_BREADCRUMB_TYPE}"
expect(config).to receive(:debug).with(expected_string)
expect(breadcrumb.ignore?).to eq(false)
expect(breadcrumb.type).to eq(invalid_type)

validator = Bugsnag::Breadcrumbs::Validator.new(Bugsnag.configuration)
validator.validate(breadcrumb)

expect(breadcrumb.ignore?).to eq(false)
expect(breadcrumb.type).to eq(Bugsnag::Breadcrumbs::MANUAL_BREADCRUMB_TYPE)
end

describe "with enabled_automatic_breadcrumb_types set" do
it "rejects automatic breadcrumbs with rejected types" do
config = instance_double(Bugsnag::Configuration)
allowed_breadcrumb_types = []
allow(config).to receive(:enabled_automatic_breadcrumb_types).and_return(allowed_breadcrumb_types)
validator = Bugsnag::Breadcrumbs::Validator.new(config)

auto = true
type = Bugsnag::Breadcrumbs::ERROR_BREADCRUMB_TYPE

breadcrumb = instance_double(Bugsnag::Breadcrumbs::Breadcrumb, {
:auto => auto,
:name => name,
:type => type,
:meta_data => meta_data,
:meta_data= => nil
})

expect(breadcrumb).to receive(:ignore!)
expected_string = "Automatic breadcrumb of type #{Bugsnag::Breadcrumbs::ERROR_BREADCRUMB_TYPE} ignored: #{breadcrumb.name}"
expect(config).to receive(:debug).with(expected_string)
Bugsnag.configuration.logger = spy(Logger)
Bugsnag.configuration.enabled_automatic_breadcrumb_types.delete(type)

breadcrumb = Bugsnag::Breadcrumbs::Breadcrumb.new(name, type, {}, :auto)

expect(breadcrumb.ignore?).to eq(false)

validator = Bugsnag::Breadcrumbs::Validator.new(Bugsnag.configuration)
validator.validate(breadcrumb)

expect(breadcrumb.ignore?).to eq(true)

expect(Bugsnag.configuration.logger).to have_received(:debug) do |&block|
expect(block.call).to eq("Automatic breadcrumb of type #{type} ignored: #{name}")
end
end

it "does not reject manual breadcrumbs with rejected types" do
config = instance_double(Bugsnag::Configuration)
allowed_breadcrumb_types = []
allow(config).to receive(:enabled_automatic_breadcrumb_types).and_return(allowed_breadcrumb_types)
validator = Bugsnag::Breadcrumbs::Validator.new(config)
Bugsnag.configuration.logger = spy(Logger)
Bugsnag.configuration.enabled_automatic_breadcrumb_types.delete(type)

type = Bugsnag::Breadcrumbs::ERROR_BREADCRUMB_TYPE
breadcrumb = Bugsnag::Breadcrumbs::Breadcrumb.new(name, type, {}, :manual)

breadcrumb = instance_double(Bugsnag::Breadcrumbs::Breadcrumb, {
:auto => auto,
:name => name,
:type => type,
:meta_data => meta_data,
:meta_data= => nil
})

expect(breadcrumb).to_not receive(:ignore!)
expect(config).to_not receive(:debug)
expect(breadcrumb.ignore?).to eq(false)

validator = Bugsnag::Breadcrumbs::Validator.new(Bugsnag.configuration)
validator.validate(breadcrumb)

expect(breadcrumb.ignore?).to eq(false)
expect(Bugsnag.configuration.logger).to_not have_received(:debug)
end
end
end
Expand Down
17 changes: 15 additions & 2 deletions spec/bugsnag_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -266,12 +266,18 @@ module Kernel
},
"Not a real type"
)

expect(breadcrumbs.to_a.size).to eq(1)
expect(breadcrumbs.first.to_h).to match({
:name => "123123123123123123123123123123456456456456456456456456456456",
:type => Bugsnag::Breadcrumbs::MANUAL_BREADCRUMB_TYPE,
:metaData => {
:a => 1
:a => 1,
:b => [1, 2, 3, 4],
:c => {
:test => true,
:test2 => false
}
},
:timestamp => match(timestamp_regex)
})
Expand Down Expand Up @@ -308,13 +314,20 @@ module Kernel
breadcrumb.type = "Not a real type"
breadcrumb.name = "123123123123123123123123123123456456456456456"
end

Bugsnag.leave_breadcrumb("TestName")

expect(breadcrumbs.to_a.size).to eq(1)
expect(breadcrumbs.first.to_h).to match({
:name => "123123123123123123123123123123456456456456456",
:type => Bugsnag::Breadcrumbs::MANUAL_BREADCRUMB_TYPE,
:metaData => {
:int => 1
:int => 1,
:array => [1, 2, 3],
:hash => {
:a => 1,
:b => 2
}
},
:timestamp => match(timestamp_regex)
})
Expand Down