From b24c8ad9ae8056a3f465809bc1dc6833f0a68e38 Mon Sep 17 00:00:00 2001 From: Sean Huh Date: Thu, 8 Oct 2026 16:50:04 -0700 Subject: [PATCH] Return zero values for missing wrapper map values in the lite runtime PiperOrigin-RevId: 996153168 --- .../dev/cel/common/values/ProtoLiteCelValueConverter.java | 6 +++++- .../cel/common/values/ProtoLiteCelValueConverterTest.java | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) 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 74b9b4b32..fa63abf61 100644 --- a/common/src/main/java/dev/cel/common/values/ProtoLiteCelValueConverter.java +++ b/common/src/main/java/dev/cel/common/values/ProtoLiteCelValueConverter.java @@ -299,7 +299,11 @@ private Map.Entry readSingleMapEntry( key = getDefaultCelValue(keyDescriptor); } if (value == null) { - value = getDefaultCelValue(valueDescriptor); + // Map values have no presence, so a missing message (even a wrapper) is empty, not null. + value = + valueDescriptor.getJavaType().equals(JavaType.MESSAGE) + ? readMessageField(ByteString.EMPTY, valueDescriptor.getFieldProtoTypeName()) + : getDefaultCelValue(valueDescriptor); } return new AbstractMap.SimpleImmutableEntry<>(key, value); diff --git a/common/src/test/java/dev/cel/common/values/ProtoLiteCelValueConverterTest.java b/common/src/test/java/dev/cel/common/values/ProtoLiteCelValueConverterTest.java index d416b3aa8..a812affa1 100644 --- a/common/src/test/java/dev/cel/common/values/ProtoLiteCelValueConverterTest.java +++ b/common/src/test/java/dev/cel/common/values/ProtoLiteCelValueConverterTest.java @@ -478,6 +478,8 @@ private enum ReadSingleFieldTestCase { REPEATED_INT32(TestAllTypes.REPEATED_INT32_FIELD_NUMBER, ImmutableList.of(1L, 2L)), MAP_STRING_STRING( TestAllTypes.MAP_STRING_STRING_FIELD_NUMBER, ImmutableMap.of("k", "v", "k2", "v2", "", "")), + MAP_STRING_INT64_WRAPPER( + TestAllTypes.MAP_STRING_INT64_WRAPPER_FIELD_NUMBER, ImmutableMap.of("", 0L)), SPLIT_DURATION( TestAllTypes.SINGLE_DURATION_FIELD_NUMBER, java.time.Duration.ofSeconds(10, 500)); @@ -521,6 +523,8 @@ public void readSingleField_skipsOtherFieldsAndDecodesTarget( extraWireCos.writeByteArray(TestAllTypes.REPEATED_INT32_FIELD_NUMBER, new byte[0]); extraWireCos.writeByteArray( TestAllTypes.MAP_STRING_STRING_FIELD_NUMBER, mapEntryWithUnknownOut.toByteArray()); + extraWireCos.writeByteArray( + TestAllTypes.MAP_STRING_INT64_WRAPPER_FIELD_NUMBER, mapEntryWithUnknownOut.toByteArray()); extraWireCos.flush(); ByteString bytes = part1