From 781d6963c65201a56406cf28b6258b041e45664f Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Thu, 31 Oct 2019 12:23:25 -0700 Subject: [PATCH] Fixed the case of multi-line strings in JSON. --- ruby/ext/google/protobuf_c/encode_decode.c | 10 ++++++---- ruby/tests/common_tests.rb | 18 ++++++++++++++---- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/ruby/ext/google/protobuf_c/encode_decode.c b/ruby/ext/google/protobuf_c/encode_decode.c index 093b0485b949..713da435229f 100644 --- a/ruby/ext/google/protobuf_c/encode_decode.c +++ b/ruby/ext/google/protobuf_c/encode_decode.c @@ -630,7 +630,8 @@ 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; } @@ -638,7 +639,7 @@ 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; } @@ -646,7 +647,8 @@ 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; } @@ -654,7 +656,7 @@ 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; } diff --git a/ruby/tests/common_tests.rb b/ruby/tests/common_tests.rb index d20b76cfe6d5..ada42432ebbc 100644 --- a/ruby/tests/common_tests.rb +++ b/ruby/tests/common_tests.rb @@ -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 @@ -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' ) @@ -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 @@ -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