Skip to content

Commit

Permalink
Fixed the case of multi-line strings in JSON.
Browse files Browse the repository at this point in the history
  • Loading branch information
haberman committed Oct 31, 2019
1 parent 5f25400 commit 781d696
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 8 deletions.
10 changes: 6 additions & 4 deletions ruby/ext/google/protobuf_c/encode_decode.c
Expand Up @@ -630,31 +630,33 @@ static void* startstringwrapper_handler(void* closure, const void* hd,
size_t size_hint) {
VALUE* rbval = closure;
(void)size_hint;
*rbval = get_frozen_string(NULL, 0, false);
*rbval = rb_str_new(NULL, 0);
rb_enc_associate(*rbval, kRubyStringUtf8Encoding);
return closure;
}

static size_t stringwrapper_handler(void* closure, const void* hd,
const char* ptr, size_t len,
const upb_bufhandle* handle) {
VALUE* rbval = closure;
*rbval = get_frozen_string(ptr, len, false);
*rbval = noleak_rb_str_cat(*rbval, ptr, len);
return len;
}

static void* startbyteswrapper_handler(void* closure, const void* hd,
size_t size_hint) {
VALUE* rbval = closure;
(void)size_hint;
*rbval = get_frozen_string(NULL, 0, true);
*rbval = rb_str_new(NULL, 0);
rb_enc_associate(*rbval, kRubyString8bitEncoding);
return closure;
}

static size_t byteswrapper_handler(void* closure, const void* hd,
const char* ptr, size_t len,
const upb_bufhandle* handle) {
VALUE* rbval = closure;
*rbval = get_frozen_string(ptr, len, true);
*rbval = noleak_rb_str_cat(*rbval, ptr, len);
return len;
}

Expand Down
18 changes: 14 additions & 4 deletions ruby/tests/common_tests.rb
Expand Up @@ -1295,9 +1295,9 @@ def test_wrapper_getters
assert_equal true, m.bool.value
assert_equal true, m.bool_as_value

assert_equal 'str', m.string_as_value
assert_equal 'str', m.string.value
assert_equal 'str', m.string_as_value
assert_equal "st\nr", m.string_as_value
assert_equal "st\nr", m.string.value
assert_equal "st\nr", m.string_as_value

assert_equal 'fun', m.bytes_as_value
assert_equal 'fun', m.bytes.value
Expand All @@ -1312,7 +1312,7 @@ def test_wrapper_getters
uint32: Google::Protobuf::UInt32Value.new(value: 5),
uint64: Google::Protobuf::UInt64Value.new(value: 6),
bool: Google::Protobuf::BoolValue.new(value: true),
string: Google::Protobuf::StringValue.new(value: 'str'),
string: Google::Protobuf::StringValue.new(value: "st\nr"),
bytes: Google::Protobuf::BytesValue.new(value: 'fun'),
real_string: '100'
)
Expand All @@ -1332,6 +1332,10 @@ def test_wrapper_getters
# Test that the lazy form compares equal to the expanded form.
m5 = proto_module::Wrapper::decode(serialized2)
assert_equal m5, m

serialized_json = proto_module::Wrapper::encode_json(m)
m6 = proto_module::Wrapper::decode_json(serialized_json)
assert_equal m6, m
end

def test_repeated_wrappers
Expand Down Expand Up @@ -1374,6 +1378,12 @@ def test_repeated_wrappers
# Test that the lazy form compares equal to the expanded form.
m5 = proto_module::Wrapper::decode(serialized2)
assert_equal m5, m

# Test JSON.
serialized_json = proto_module::Wrapper::encode_json(m5)
m6 = proto_module::Wrapper::decode_json(serialized_json)
run_asserts.call(m6)
assert_equal m6, m
end

def test_oneof_wrappers
Expand Down

0 comments on commit 781d696

Please sign in to comment.