Skip to content

Commit 9444fee

Browse files
committed
Fix message selections to work on repeated wrapper fields
1 parent b8eafbf commit 9444fee

3 files changed

Lines changed: 98 additions & 2 deletions

File tree

runtime/src/main/java/dev/cel/runtime/DescriptorMessageProvider.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,9 @@ public DescriptorMessageProvider(ProtoMessageFactory protoMessageFactory, CelOpt
126126
MessageOrBuilder typedMessage = assertFullProtoMessage(message, fieldName);
127127
FieldDescriptor fieldDescriptor = findField(typedMessage.getDescriptorForType(), fieldName);
128128
// check whether the field is a wrapper type, then test has and return null
129-
if (isWrapperType(fieldDescriptor) && !typedMessage.hasField(fieldDescriptor)) {
129+
if (isWrapperType(fieldDescriptor) &&
130+
!fieldDescriptor.isRepeated() &&
131+
!typedMessage.hasField(fieldDescriptor)) {
130132
return NullValue.NULL_VALUE;
131133
}
132134
Object value = typedMessage.getField(fieldDescriptor);

runtime/src/test/resources/wrappers.baseline

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,75 @@ single_bytes_wrapper {
6666
}
6767
result: true
6868

69+
Source: x.repeated_int32_wrapper == [1,2] && x.repeated_int64_wrapper == [3] && x.repeated_float_wrapper == [1.5, 2.5] && x.repeated_double_wrapper == [3.5, 4.5] && x.repeated_string_wrapper == ['foo', 'bar'] && x.repeated_bool_wrapper == [true] && x.repeated_uint32_wrapper == [1u, 2u] && x.repeated_uint64_wrapper == []
70+
declare x {
71+
value cel.expr.conformance.proto3.TestAllTypes
72+
}
73+
=====>
74+
bindings: {x=single_int64_wrapper {
75+
value: -34
76+
}
77+
single_int32_wrapper {
78+
value: -12
79+
}
80+
single_double_wrapper {
81+
value: -3.0
82+
}
83+
single_float_wrapper {
84+
value: 1.5
85+
}
86+
single_uint64_wrapper {
87+
value: 34
88+
}
89+
single_uint32_wrapper {
90+
value: 12
91+
}
92+
single_string_wrapper {
93+
}
94+
single_bool_wrapper {
95+
}
96+
single_bytes_wrapper {
97+
value: "hi"
98+
}
99+
repeated_int64_wrapper {
100+
value: 3
101+
}
102+
repeated_int32_wrapper {
103+
value: 1
104+
}
105+
repeated_int32_wrapper {
106+
value: 2
107+
}
108+
repeated_double_wrapper {
109+
value: 3.5
110+
}
111+
repeated_double_wrapper {
112+
value: 4.5
113+
}
114+
repeated_float_wrapper {
115+
value: 1.5
116+
}
117+
repeated_float_wrapper {
118+
value: 2.5
119+
}
120+
repeated_uint32_wrapper {
121+
value: 1
122+
}
123+
repeated_uint32_wrapper {
124+
value: 2
125+
}
126+
repeated_string_wrapper {
127+
value: "foo"
128+
}
129+
repeated_string_wrapper {
130+
value: "bar"
131+
}
132+
repeated_bool_wrapper {
133+
value: true
134+
}
135+
}
136+
result: true
137+
69138
Source: x.single_bool_wrapper == null && x.single_bytes_wrapper == null && x.single_double_wrapper == null && x.single_float_wrapper == null && x.single_int32_wrapper == null && x.single_int64_wrapper == null && x.single_string_wrapper == null && x.single_uint32_wrapper == null && x.single_uint64_wrapper == null
70139
declare x {
71140
value cel.expr.conformance.proto3.TestAllTypes
@@ -88,4 +157,4 @@ result: NULL_VALUE
88157
Source: google.protobuf.Timestamp{ seconds: 253402300800 }
89158
=====>
90159
bindings: {}
91-
result: +10000-01-01T00:00:00Z
160+
result: +10000-01-01T00:00:00Z

testing/src/main/java/dev/cel/testing/BaseInterpreterTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2015,6 +2015,31 @@ public void wrappers() throws Exception {
20152015
.setSingleBoolWrapper(BoolValue.getDefaultInstance())
20162016
.setSingleStringWrapper(StringValue.getDefaultInstance())));
20172017

2018+
source =
2019+
"x.repeated_int32_wrapper == [1,2] && " +
2020+
"x.repeated_int64_wrapper == [3] && " +
2021+
"x.repeated_float_wrapper == [1.5, 2.5] && " +
2022+
"x.repeated_double_wrapper == [3.5, 4.5] && " +
2023+
"x.repeated_string_wrapper == ['foo', 'bar'] && " +
2024+
"x.repeated_bool_wrapper == [true] && " +
2025+
"x.repeated_uint32_wrapper == [1u, 2u] && " +
2026+
"x.repeated_uint64_wrapper == []";
2027+
2028+
runTest(ImmutableMap.of("x",
2029+
wrapperBindings.addRepeatedInt32Wrapper(Int32Value.of(1))
2030+
.addRepeatedInt32Wrapper(Int32Value.of(2))
2031+
.addRepeatedInt64Wrapper(Int64Value.of(3))
2032+
.addRepeatedFloatWrapper(FloatValue.of(1.5f))
2033+
.addRepeatedFloatWrapper(FloatValue.of(2.5f))
2034+
.addRepeatedDoubleWrapper(DoubleValue.of(3.5f))
2035+
.addRepeatedDoubleWrapper(DoubleValue.of(4.5f))
2036+
.addRepeatedStringWrapper(StringValue.of("foo"))
2037+
.addRepeatedStringWrapper(StringValue.of("bar"))
2038+
.addRepeatedBoolWrapper(BoolValue.of(true))
2039+
.addRepeatedUint32Wrapper(UInt32Value.of(1))
2040+
.addRepeatedUint32Wrapper(UInt32Value.of(2))))
2041+
;
2042+
20182043
source =
20192044
"x.single_bool_wrapper == null && "
20202045
+ "x.single_bytes_wrapper == null && "

0 commit comments

Comments
 (0)