From 3c4aa1b9fdcc12c3908d485cab7a72a42091fda9 Mon Sep 17 00:00:00 2001 From: Sean Huh Date: Mon, 5 Oct 2026 09:47:02 -0700 Subject: [PATCH] Change FIXED32 and FIXED64 decoding to UnsignedLong PiperOrigin-RevId: 993744421 --- .../values/ProtoLiteCelValueConverter.java | 9 ++++-- .../values/ProtoMessageLiteValueTest.java | 29 ++++++++++++------- .../runtime/CelLiteRuntimeAndroidTest.java | 4 +-- .../dev/cel/runtime/CelLiteRuntimeTest.java | 14 +++++++-- 4 files changed, 39 insertions(+), 17 deletions(-) diff --git a/common/src/main/java/dev/cel/common/values/ProtoLiteCelValueConverter.java b/common/src/main/java/dev/cel/common/values/ProtoLiteCelValueConverter.java index 20a5ced63..6aa523cb7 100644 --- a/common/src/main/java/dev/cel/common/values/ProtoLiteCelValueConverter.java +++ b/common/src/main/java/dev/cel/common/values/ProtoLiteCelValueConverter.java @@ -110,6 +110,8 @@ private static Object readFixed32BitField( case FLOAT: return inputStream.readFloat(); case FIXED32: + return UnsignedLong.fromLongBits( + Integer.toUnsignedLong(inputStream.readRawLittleEndian32())); case SFIXED32: return inputStream.readRawLittleEndian32(); default: @@ -124,6 +126,7 @@ private static Object readFixed64BitField( case DOUBLE: return inputStream.readDouble(); case FIXED64: + return UnsignedLong.fromLongBits(inputStream.readRawLittleEndian64()); case SFIXED64: return inputStream.readRawLittleEndian64(); default: @@ -257,11 +260,13 @@ private Object getScalarDefaultValue(FieldLiteDescriptor fieldDescriptor) { JavaType type = fieldDescriptor.getJavaType(); switch (type) { case INT: - return fieldDescriptor.getProtoFieldType().equals(FieldLiteDescriptor.Type.UINT32) + return (fieldDescriptor.getProtoFieldType().equals(FieldLiteDescriptor.Type.UINT32) + || fieldDescriptor.getProtoFieldType().equals(FieldLiteDescriptor.Type.FIXED32)) ? UnsignedLong.ZERO : Defaults.defaultValue(long.class); case LONG: - return fieldDescriptor.getProtoFieldType().equals(FieldLiteDescriptor.Type.UINT64) + return (fieldDescriptor.getProtoFieldType().equals(FieldLiteDescriptor.Type.UINT64) + || fieldDescriptor.getProtoFieldType().equals(FieldLiteDescriptor.Type.FIXED64)) ? UnsignedLong.ZERO : Defaults.defaultValue(long.class); case ENUM: diff --git a/common/src/test/java/dev/cel/common/values/ProtoMessageLiteValueTest.java b/common/src/test/java/dev/cel/common/values/ProtoMessageLiteValueTest.java index f6faf199a..e7d7ce4de 100644 --- a/common/src/test/java/dev/cel/common/values/ProtoMessageLiteValueTest.java +++ b/common/src/test/java/dev/cel/common/values/ProtoMessageLiteValueTest.java @@ -97,10 +97,10 @@ private enum SelectFieldTestCase { UINT64("single_uint64", UnsignedLong.MAX_VALUE), FLOAT("single_float", 1.5d), DOUBLE("single_double", 2.5d), - FIXED32("single_fixed32", 20), - SFIXED32("single_sfixed32", 30), - FIXED64("single_fixed64", 40), - SFIXED64("single_sfixed64", 50), + FIXED32("single_fixed32", UnsignedLong.valueOf(0xFFFFFFFFL)), + SFIXED32("single_sfixed32", 30L), + FIXED64("single_fixed64", UnsignedLong.MAX_VALUE), + SFIXED64("single_sfixed64", 50L), STRING("single_string", "test"), BYTES("single_bytes", CelByteString.of(new byte[] {0x01})), DURATION("single_duration", Duration.ofSeconds(100)), @@ -116,6 +116,11 @@ private enum SelectFieldTestCase { REPEATED_INT64("repeated_int64", ImmutableList.of(5L, 6L)), REPEATED_UINT64( "repeated_uint64", ImmutableList.of(UnsignedLong.valueOf(7L), UnsignedLong.valueOf(8L))), + REPEATED_FIXED32( + "repeated_fixed32", + ImmutableList.of(UnsignedLong.valueOf(20L), UnsignedLong.valueOf(0xFFFFFFFFL))), + REPEATED_FIXED64( + "repeated_fixed64", ImmutableList.of(UnsignedLong.valueOf(40L), UnsignedLong.MAX_VALUE)), REPEATED_FLOAT("repeated_float", ImmutableList.of(1.5d, 2.5d)), REPEATED_DOUBLE("repeated_double", ImmutableList.of(3.5d, 4.5d)), @@ -155,9 +160,9 @@ public void selectField_success(@TestParameter SelectFieldTestCase testCase) { .setSingleSint64(2L) .setSingleUint32(1) .setSingleUint64(UnsignedLong.MAX_VALUE.longValue()) - .setSingleFixed32(20) + .setSingleFixed32(-1) .setSingleSfixed32(30) - .setSingleFixed64(40) + .setSingleFixed64(-1L) .setSingleSfixed64(50) .setSingleFloat(1.5f) .setSingleDouble(2.5d) @@ -178,6 +183,10 @@ public void selectField_success(@TestParameter SelectFieldTestCase testCase) { .addRepeatedInt64(6L) .addRepeatedUint64(7L) .addRepeatedUint64(8L) + .addRepeatedFixed32(20) + .addRepeatedFixed32(-1) + .addRepeatedFixed64(40L) + .addRepeatedFixed64(-1L) .addRepeatedFloat(1.5f) .addRepeatedFloat(2.5f) .addRepeatedDouble(3.5d) @@ -212,10 +221,10 @@ private enum DefaultValueTestCase { SINT64("single_sint64", 0L), UINT32("single_uint32", UnsignedLong.ZERO), UINT64("single_uint64", UnsignedLong.ZERO), - FIXED32("single_fixed32", 0), - SFIXED32("single_sfixed32", 0), - FIXED64("single_fixed64", 0), - SFIXED64("single_sfixed64", 0), + FIXED32("single_fixed32", UnsignedLong.ZERO), + SFIXED32("single_sfixed32", 0L), + FIXED64("single_fixed64", UnsignedLong.ZERO), + SFIXED64("single_sfixed64", 0L), FLOAT("single_float", 0d), DOUBLE("single_double", 0d), STRING("single_string", ""), diff --git a/runtime/src/test/java/dev/cel/runtime/CelLiteRuntimeAndroidTest.java b/runtime/src/test/java/dev/cel/runtime/CelLiteRuntimeAndroidTest.java index 58c2f2bf9..27ae853ae 100644 --- a/runtime/src/test/java/dev/cel/runtime/CelLiteRuntimeAndroidTest.java +++ b/runtime/src/test/java/dev/cel/runtime/CelLiteRuntimeAndroidTest.java @@ -618,8 +618,8 @@ public void eval_protoMessage_repeatedFields(String checkedExpr) throws Exceptio ImmutableList.of(UnsignedLong.valueOf(7L), UnsignedLong.valueOf(8L)), ImmutableList.of(9L, 10L), ImmutableList.of(11L, 12L), - ImmutableList.of(13L, 14L), - ImmutableList.of(15L, 16L), + ImmutableList.of(UnsignedLong.valueOf(13L), UnsignedLong.valueOf(14L)), + ImmutableList.of(UnsignedLong.valueOf(15L), UnsignedLong.valueOf(16L)), ImmutableList.of(17L, 18L), ImmutableList.of(19L, 20L), ImmutableList.of(21.1d, 22.2d), diff --git a/runtime/src/test/java/dev/cel/runtime/CelLiteRuntimeTest.java b/runtime/src/test/java/dev/cel/runtime/CelLiteRuntimeTest.java index 56a944d8b..79de0b70d 100644 --- a/runtime/src/test/java/dev/cel/runtime/CelLiteRuntimeTest.java +++ b/runtime/src/test/java/dev/cel/runtime/CelLiteRuntimeTest.java @@ -173,9 +173,17 @@ public void fieldSelection_literals(String expression) throws Exception { @Test @TestParameters("{expression: 'msg.single_uint32'}") @TestParameters("{expression: 'msg.single_uint64'}") + @TestParameters("{expression: 'msg.single_fixed32'}") + @TestParameters("{expression: 'msg.single_fixed64'}") public void fieldSelection_unsigned(String expression) throws Exception { CelAbstractSyntaxTree ast = CEL_COMPILER.compile(expression).getAst(); - TestAllTypes msg = TestAllTypes.newBuilder().setSingleUint32(4).setSingleUint64(4L).build(); + TestAllTypes msg = + TestAllTypes.newBuilder() + .setSingleUint32(4) + .setSingleUint64(4L) + .setSingleFixed32(4) + .setSingleFixed64(4L) + .build(); Object result = CEL_RUNTIME.createProgram(ast).eval(ImmutableMap.of("msg", msg)); @@ -556,8 +564,8 @@ private enum DefaultValueTestCase { UINT64("msg.single_uint64", UnsignedLong.ZERO), SINT32("msg.single_sint32", 0L), SINT64("msg.single_sint64", 0L), - FIXED32("msg.single_fixed32", 0L), - FIXED64("msg.single_fixed64", 0L), + FIXED32("msg.single_fixed32", UnsignedLong.ZERO), + FIXED64("msg.single_fixed64", UnsignedLong.ZERO), SFIXED32("msg.single_sfixed32", 0L), SFIXED64("msg.single_sfixed64", 0L), FLOAT("msg.single_float", 0.0d),