diff --git a/ext/datadog_cov/datadog_cov.c b/ext/datadog_cov/datadog_cov.c index dab33db2..987de99e 100644 --- a/ext/datadog_cov/datadog_cov.c +++ b/ext/datadog_cov/datadog_cov.c @@ -249,7 +249,7 @@ static int process_instantiated_klass(st_data_t key, st_data_t _value, st_data_t } VALUE filename = RARRAY_AREF(source_location, 0); - if (filename == Qnil) + if (filename == Qnil || !RB_TYPE_P(filename, T_STRING)) { return ST_CONTINUE; } diff --git "a/spec/ddcov/app/model/my_model_\342\235\244\357\270\217.rb" "b/spec/ddcov/app/model/my_model_\342\235\244\357\270\217.rb" new file mode 100644 index 00000000..e42b23f0 --- /dev/null +++ "b/spec/ddcov/app/model/my_model_\342\235\244\357\270\217.rb" @@ -0,0 +1,2 @@ +class MyModel❤️ +end diff --git a/spec/ddcov/ddcov_spec.rb b/spec/ddcov/ddcov_spec.rb index 98c45407..264725d5 100644 --- a/spec/ddcov/ddcov_spec.rb +++ b/spec/ddcov/ddcov_spec.rb @@ -3,6 +3,7 @@ require "datadog_cov.#{RUBY_VERSION}_#{RUBY_PLATFORM}" require_relative "app/model/my_model" +require_relative "app/model/my_model_❤️" require_relative "app/model/my_struct" require_relative "calculator/calculator" require_relative "calculator/code_with_❤️" @@ -357,6 +358,93 @@ def thread_local_cov expect(coverage.keys).to include(absolute_path("app/model/my_struct.rb")) end + it "tracks coverage for objects defined with emojis" do + subject.start + + MyModel❤️.new + + coverage = subject.stop + expect(coverage.size).to eq(1) + expect(coverage.keys).to include(absolute_path("app/model/my_model_❤️.rb")) + end + + context "Object.const_source_location is redefined in tests" do + context "returns invalid values" do + before do + allow(Object).to receive(:const_source_location).and_return([-1, -1]) + end + + it "does not break" do + subject.start + + User.new("john doe", "johndoe@mail.test") + + coverage = subject.stop + expect(coverage.size).to eq(0) + end + end + + context "returns nil" do + before do + allow(Object).to receive(:const_source_location).and_return(nil) + end + + it "does not break" do + subject.start + + User.new("john doe", "johndoe@mail.test") + + coverage = subject.stop + expect(coverage.size).to eq(0) + end + end + + context "returns empty array" do + before do + allow(Object).to receive(:const_source_location).and_return([]) + end + + it "does not break" do + subject.start + + User.new("john doe", "johndoe@mail.test") + + coverage = subject.stop + expect(coverage.size).to eq(0) + end + end + + context "returns empty nested array" do + before do + allow(Object).to receive(:const_source_location).and_return([[]]) + end + + it "does not break" do + subject.start + + User.new("john doe", "johndoe@mail.test") + + coverage = subject.stop + expect(coverage.size).to eq(0) + end + end + + context "raises" do + before do + allow(Object).to receive(:const_source_location).and_raise(StandardError) + end + + it "does not break" do + subject.start + + User.new("john doe", "johndoe@mail.test") + + coverage = subject.stop + expect(coverage.size).to eq(0) + end + end + end + context "Data structs available since Ruby 3.2" do before do if RUBY_VERSION < "3.2"