Przeglądaj źródła

Fix some more failing tests

Rob Widmer 5 lat temu
rodzic
commit
7b1d6abbe4

+ 1 - 0
ruby/src/main/java/com/google/protobuf/jruby/RubyEnumBuilderContext.java

@@ -66,6 +66,7 @@ public class RubyEnumBuilderContext extends RubyObject {
         this.fileBuilderContext = (RubyFileBuilderContext) fileBuilderContext;
         this.fileBuilderContext = (RubyFileBuilderContext) fileBuilderContext;
         this.builder = this.fileBuilderContext.getNewEnumBuilder();
         this.builder = this.fileBuilderContext.getNewEnumBuilder();
         this.builder.setName(name.asJavaString());
         this.builder.setName(name.asJavaString());
+        this.builder.getOptionsBuilder().setAllowAlias(true);
 
 
         return this;
         return this;
     }
     }

+ 7 - 1
ruby/src/main/java/com/google/protobuf/jruby/RubyEnumDescriptor.java

@@ -152,7 +152,13 @@ public class RubyEnumDescriptor extends RubyObject {
 
 
         RubyModule enumModule = RubyModule.newModule(runtime);
         RubyModule enumModule = RubyModule.newModule(runtime);
         for (EnumValueDescriptor value : descriptor.getValues()) {
         for (EnumValueDescriptor value : descriptor.getValues()) {
-            enumModule.defineConstant(value.getName(), runtime.newFixnum(value.getNumber()));
+            String name = value.getName();
+            // Make sure its a valid constant name before trying to create it
+            if (Character.isUpperCase(name.codePointAt(0))) {
+                enumModule.defineConstant(name, runtime.newFixnum(value.getNumber()));
+            } else {
+                runtime.getWarnings().warn("Enum value " + name + " does not start with an uppercase letter as is required for Ruby constants.");
+            }
         }
         }
 
 
         enumModule.instance_variable_set(runtime.newString(Utils.DESCRIPTOR_INSTANCE_VAR), this);
         enumModule.instance_variable_set(runtime.newString(Utils.DESCRIPTOR_INSTANCE_VAR), this);

+ 19 - 3
ruby/src/main/java/com/google/protobuf/jruby/RubyMessage.java

@@ -291,9 +291,25 @@ public class RubyMessage extends RubyObject {
 
 
             if (!oneofDescriptor.isNil()) {
             if (!oneofDescriptor.isNil()) {
                 RubyOneofDescriptor rubyOneofDescriptor = (RubyOneofDescriptor) oneofDescriptor;
                 RubyOneofDescriptor rubyOneofDescriptor = (RubyOneofDescriptor) oneofDescriptor;
-                FieldDescriptor fieldDescriptor = oneofCases.get(rubyOneofDescriptor.getDescriptor());
+                OneofDescriptor ood = rubyOneofDescriptor.getDescriptor();
 
 
-                return fieldDescriptor == null ? context.nil : runtime.newSymbol(fieldDescriptor.getName());
+                // Check to see if we set this through ruby
+                FieldDescriptor fieldDescriptor = oneofCases.get(ood);
+
+                if (fieldDescriptor == null) {
+                    // See if we set this from decoding a message
+                    fieldDescriptor = builder.getOneofFieldDescriptor(ood);
+
+                    if (fieldDescriptor == null) {
+                        return context.nil;
+                    } else {
+                        // Cache it so we don't need to do multiple checks next time
+                        oneofCases.put(ood, fieldDescriptor);
+                        return runtime.newSymbol(fieldDescriptor.getName());
+                    }
+                } else {
+                    return runtime.newSymbol(fieldDescriptor.getName());
+                }
             }
             }
 
 
             // If we find a field return its value
             // If we find a field return its value
@@ -468,7 +484,7 @@ public class RubyMessage extends RubyObject {
         try {
         try {
             ret.builder.mergeFrom(bin);
             ret.builder.mergeFrom(bin);
         } catch (InvalidProtocolBufferException e) {
         } catch (InvalidProtocolBufferException e) {
-            throw context.runtime.newRuntimeError(e.getMessage());
+            throw RaiseException.from(context.runtime, (RubyClass) context.runtime.getClassFromPath("Google::Protobuf::ParseError"), e.getMessage());
         }
         }
 
 
         if (!ret.proto3) {
         if (!ret.proto3) {

+ 9 - 3
ruby/tests/gc_test.rb

@@ -95,9 +95,15 @@ class GCTest < Test::Unit::TestCase
     data = A::B::C::TestMessage.encode(from)
     data = A::B::C::TestMessage.encode(from)
     to = A::B::C::TestMessage.decode(data)
     to = A::B::C::TestMessage.decode(data)
 
 
-    from = get_msg_proto2
-    data = A::B::Proto2::TestMessage.encode(from)
-    to = A::B::Proto2::TestMessage.decode(data)
+    # This doesn't work for proto2 on JRuby because there is a nested required message.
+    # A::B::Proto2::TestMessage has :required_msg which is of type:
+    # A::B::Proto2::TestMessage so there is no way to generate a valid
+    # message that doesn't exceed the depth limit
+    if !defined? JRUBY_VERSION
+        from = get_msg_proto2
+        data = A::B::Proto2::TestMessage.encode(from)
+        to = A::B::Proto2::TestMessage.decode(data)
+    end
     GC.stress = old_gc
     GC.stress = old_gc
     puts "passed"
     puts "passed"
   end
   end