Skip to content
This repository was archived by the owner on Nov 30, 2024. It is now read-only.

Commit 703a882

Browse files
committed
Replace invalid bytes in exception message with '?'
1 parent e5efd86 commit 703a882

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

lib/rspec/core/notifications.rb

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,12 +220,26 @@ def exception_class_name
220220
name
221221
end
222222

223+
def exception_message
224+
@exception_message ||= begin
225+
if String.method_defined?(:encoding)
226+
exception.message.to_s.
227+
# Converting it to a higher higher character set (UTF-16) and then
228+
# back (to UTF-8) ensures that you will strip away invalid or undefined byte sequences.
229+
encode(::Encoding::UTF_16LE, :invalid => :replace, :undef => :replace, :replace => '?').
230+
encode(::Encoding::UTF_8)
231+
else
232+
exception.message.to_s
233+
end
234+
end
235+
end
236+
223237
def failure_lines
224238
@failure_lines ||=
225239
begin
226240
lines = ["Failure/Error: #{read_failed_line.strip}"]
227241
lines << "#{exception_class_name}:" unless exception_class_name =~ /RSpec/
228-
exception.message.to_s.split("\n").each do |line|
242+
exception_message.split("\n").each do |line|
229243
lines << " #{line}" if exception.message
230244
end
231245
lines

spec/rspec/core/encoding_spec.rb

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@
1515

1616
describe '#message_lines' do
1717
let(:message_with_invalid_byte_sequence) do
18-
"\xEF \255 \xAD".force_encoding(Encoding::UTF_8)
18+
"\xEF \255 \xAD I have bad bytes".force_encoding(Encoding::UTF_8)
1919
end
20+
let(:expected_message) { "? ? ? I have bad bytes" }
2021
let(:exception) do
2122
instance_double(
2223
Exception,
@@ -38,8 +39,10 @@
3839
end
3940

4041
context "when failure_lines contains an invalid byte sequence" do
41-
it "raises an ArgumentError" do
42-
expect { lines = notification.message_lines }.to raise_error(ArgumentError)
42+
it "replaces bad bytes with a '?'" do
43+
lines = notification.message_lines
44+
expect(lines[0]).to match %r{\AFailure\/Error}
45+
expect(lines[1].strip).to eq(expected_message)
4346
end
4447
end
4548

0 commit comments

Comments
 (0)