Protocol Buffers - Google's data interchange format (grpc依赖)
https://developers.google.com/protocol-buffers/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
3.1 KiB
130 lines
3.1 KiB
#!/usr/bin/ruby |
|
|
|
require 'google/protobuf' |
|
require 'utf8_pb' |
|
require 'test/unit' |
|
|
|
module CaptureWarnings |
|
@@warnings = nil |
|
|
|
module_function |
|
|
|
def warn(message, category: nil, **kwargs) |
|
if @@warnings |
|
@@warnings << message |
|
else |
|
super |
|
end |
|
end |
|
|
|
def capture |
|
@@warnings = [] |
|
yield |
|
@@warnings |
|
ensure |
|
@@warnings = nil |
|
end |
|
end |
|
|
|
Warning.extend CaptureWarnings |
|
|
|
module Utf8Test |
|
def test_scalar |
|
msg = Utf8TestProtos::TestUtf8.new |
|
assert_bad_utf8 { msg.optional_string = bad_utf8_string() } |
|
end |
|
|
|
def test_repeated |
|
msg = Utf8TestProtos::TestUtf8.new |
|
assert_bad_utf8 { msg.repeated_string << bad_utf8_string() } |
|
end |
|
|
|
def test_map_key |
|
msg = Utf8TestProtos::TestUtf8.new |
|
assert_bad_utf8 { msg.map_string_string[bad_utf8_string()] = "abc" } |
|
end |
|
|
|
def test_map_value |
|
msg = Utf8TestProtos::TestUtf8.new |
|
assert_bad_utf8 { msg.map_string_string["abc"] = bad_utf8_string() } |
|
end |
|
end |
|
|
|
# Tests the case of string objects that are marked UTF-8, but contain invalid |
|
# UTF-8. |
|
# |
|
# This case will raise Encoding::InvalidByteSequenceError |
|
class MarkedUtf8Test < Test::Unit::TestCase |
|
def assert_bad_utf8(&block) |
|
assert_raises(Encoding::InvalidByteSequenceError, &block) |
|
end |
|
|
|
def bad_utf8_string |
|
str = "\x80" |
|
assert_false str.valid_encoding? |
|
str |
|
end |
|
|
|
include Utf8Test |
|
end |
|
|
|
# This test doesn't work in JRuby because JRuby appears to have a bug where |
|
# the "valid" bit on a string's data is not invalidated properly when the |
|
# string is modified: https://github.com/jruby/jruby/issues/8316 |
|
if !defined? JRUBY_VERSION |
|
# Tests the case of string objects that are marked UTF-8, and initially contain |
|
# valid UTF-8, but are later modified to be invalid UTF-8. This may put the |
|
# string into an state of "unknown" validity. |
|
# |
|
# This case will raise Encoding::InvalidByteSequenceError |
|
class MarkedModifiedUtf8Test < Test::Unit::TestCase |
|
def assert_bad_utf8(&block) |
|
assert_raises(Encoding::InvalidByteSequenceError, &block) |
|
end |
|
|
|
def bad_utf8_string |
|
str = " " |
|
assert_true str.valid_encoding? |
|
str[0] = "\x80" |
|
str |
|
end |
|
|
|
include Utf8Test |
|
end |
|
end |
|
|
|
# Tests the case of string objects that are marked with a non-UTF-8 encoding, |
|
# but contain invalid UTF-8. |
|
# |
|
# This case will raise Encoding::UndefinedConversionError. |
|
class MarkedNonUtf8Test < Test::Unit::TestCase |
|
def assert_bad_utf8 |
|
assert_raises(Encoding::UndefinedConversionError) { yield } |
|
end |
|
|
|
def bad_utf8_string |
|
str = "\x80".force_encoding(Encoding::ASCII_8BIT) |
|
assert_true str.valid_encoding? |
|
str |
|
end |
|
|
|
include Utf8Test |
|
end |
|
|
|
# Tests the case of string objects that are marked with a non-UTF-8 encoding, |
|
# but are invalid even in their source encoding. |
|
# |
|
# This case will raise Encoding::InvalidByteSequenceError |
|
class MarkedNonUtf8Test < Test::Unit::TestCase |
|
def assert_bad_utf8(&block) |
|
assert_raises(Encoding::InvalidByteSequenceError, &block) |
|
end |
|
|
|
def bad_utf8_string |
|
str = "\x80".force_encoding(Encoding::ASCII) |
|
assert_false str.valid_encoding? |
|
str |
|
end |
|
|
|
include Utf8Test |
|
end
|
|
|