Fix separate issues in JRuby's "native" "`dup` and `inspect` methods.
Update the stress test to exercise `proto3_optional` fields.
diff --git a/ruby/src/main/java/com/google/protobuf/jruby/RubyMessage.java b/ruby/src/main/java/com/google/protobuf/jruby/RubyMessage.java
index 25f9dca..a7699a0 100644
--- a/ruby/src/main/java/com/google/protobuf/jruby/RubyMessage.java
+++ b/ruby/src/main/java/com/google/protobuf/jruby/RubyMessage.java
@@ -202,7 +202,7 @@
sb.append(cname).append(colon);
for (FieldDescriptor fd : descriptor.getFields()) {
- if (fd.hasPresence() && !fields.containsKey(fd)) {
+ if (fd.hasPresence() && !(fields.containsKey(fd) || builder.hasField(fd))) {
continue;
}
if (addComma) {
@@ -550,8 +550,7 @@
} else if (fields.containsKey(fieldDescriptor)) {
dup.setFieldInternal(context, fieldDescriptor, fields.get(fieldDescriptor));
} else if (this.builder.hasField(fieldDescriptor)) {
- dup.fields.put(
- fieldDescriptor,
+ dup.setFieldInternal(context, fieldDescriptor,
wrapField(context, fieldDescriptor, this.builder.getField(fieldDescriptor)));
}
}
diff --git a/ruby/tests/stress.rb b/ruby/tests/stress.rb
index b688e8b..413d112 100755
--- a/ruby/tests/stress.rb
+++ b/ruby/tests/stress.rb
@@ -1,17 +1,18 @@
#!/usr/bin/ruby
require 'google/protobuf'
+require 'stress_pb'
require 'test/unit'
module StressTest
pool = Google::Protobuf::DescriptorPool.new
pool.build do
add_message "TestMessage" do
- optional :a, :int32, 1
+ proto3_optional :a, :int32, 1
repeated :b, :message, 2, "M"
end
add_message "M" do
- optional :foo, :string, 1
+ proto3_optional :foo, :string, 1
end
end
@@ -29,9 +30,11 @@
data = TestMessage.encode(m)
100_000.times do
mnew = TestMessage.decode(data)
- mnew = mnew.dup
+ mnew2 = mnew.dup
assert_equal m.inspect, mnew.inspect
assert_equal data, TestMessage.encode(mnew)
+ assert_equal m.inspect, mnew2.inspect
+ assert_equal data, TestMessage.encode(mnew2)
end
end
end