Skip to content

Commit 612f7de

Browse files
l46kokcopybara-github
authored andcommitted
Support protobuf wire format types and field lookup in CelLiteDescriptor
PiperOrigin-RevId: 982685331
1 parent 38fa705 commit 612f7de

3 files changed

Lines changed: 189 additions & 21 deletions

File tree

‎protobuf/src/main/java/dev/cel/protobuf/CelLiteDescriptor.java‎

Lines changed: 93 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import com.google.errorprone.annotations.Immutable;
2020
import com.google.protobuf.MessageLite;
21+
import com.google.protobuf.WireFormat;
2122
import dev.cel.common.annotations.Internal;
2223
import java.util.Collections;
2324
import java.util.HashMap;
@@ -184,24 +185,95 @@ public enum JavaType {
184185
* <p>This is exactly the same as com.google.protobuf.Descriptors#Type
185186
*/
186187
public enum Type {
187-
DOUBLE,
188-
FLOAT,
189-
INT64,
190-
UINT64,
191-
INT32,
192-
FIXED64,
193-
FIXED32,
194-
BOOL,
195-
STRING,
196-
GROUP,
197-
MESSAGE,
198-
BYTES,
199-
UINT32,
200-
ENUM,
201-
SFIXED32,
202-
SFIXED64,
203-
SINT32,
204-
SINT64
188+
DOUBLE(1, WireFormat.FieldType.DOUBLE),
189+
FLOAT(2, WireFormat.FieldType.FLOAT),
190+
INT64(3, WireFormat.FieldType.INT64),
191+
UINT64(4, WireFormat.FieldType.UINT64),
192+
INT32(5, WireFormat.FieldType.INT32),
193+
FIXED64(6, WireFormat.FieldType.FIXED64),
194+
FIXED32(7, WireFormat.FieldType.FIXED32),
195+
BOOL(8, WireFormat.FieldType.BOOL),
196+
STRING(9, WireFormat.FieldType.STRING),
197+
GROUP(10, WireFormat.FieldType.GROUP),
198+
MESSAGE(11, WireFormat.FieldType.MESSAGE),
199+
BYTES(12, WireFormat.FieldType.BYTES),
200+
UINT32(13, WireFormat.FieldType.UINT32),
201+
ENUM(14, WireFormat.FieldType.ENUM),
202+
SFIXED32(15, WireFormat.FieldType.SFIXED32),
203+
SFIXED64(16, WireFormat.FieldType.SFIXED64),
204+
SINT32(17, WireFormat.FieldType.SINT32),
205+
SINT64(18, WireFormat.FieldType.SINT64);
206+
207+
private final int number;
208+
private final WireFormat.FieldType wireFormatFieldType;
209+
210+
/** Gets the type number corresponding to {@code FieldDescriptorProto.Type#getNumber()}. */
211+
public int getNumber() {
212+
return number;
213+
}
214+
215+
/** Converts this type to the corresponding {@link WireFormat.FieldType}. */
216+
public WireFormat.FieldType toWireFormatFieldType() {
217+
return wireFormatFieldType;
218+
}
219+
220+
/**
221+
* Returns the {@link Type} for the specified protobuf type number.
222+
*
223+
* @throws IllegalArgumentException if the number does not correspond to a valid protobuf
224+
* type.
225+
*/
226+
public static Type forNumber(int number) {
227+
switch (number) {
228+
case 1:
229+
return DOUBLE;
230+
case 2:
231+
return FLOAT;
232+
case 3:
233+
return INT64;
234+
case 4:
235+
return UINT64;
236+
case 5:
237+
return INT32;
238+
case 6:
239+
return FIXED64;
240+
case 7:
241+
return FIXED32;
242+
case 8:
243+
return BOOL;
244+
case 9:
245+
return STRING;
246+
case 10:
247+
return GROUP;
248+
case 11:
249+
return MESSAGE;
250+
case 12:
251+
return BYTES;
252+
case 13:
253+
return UINT32;
254+
case 14:
255+
return ENUM;
256+
case 15:
257+
return SFIXED32;
258+
case 16:
259+
return SFIXED64;
260+
case 17:
261+
return SINT32;
262+
case 18:
263+
return SINT64;
264+
default:
265+
throw new IllegalArgumentException("Unsupported proto type code: " + number);
266+
}
267+
}
268+
269+
private Type(int number, WireFormat.FieldType wireFormatFieldType) {
270+
this.number = number;
271+
this.wireFormatFieldType = Objects.requireNonNull(wireFormatFieldType);
272+
}
273+
}
274+
275+
public int getFieldNumber() {
276+
return fieldNumber;
205277
}
206278

207279
public String getFieldName() {
@@ -269,9 +341,9 @@ public FieldLiteDescriptor(
269341
String fieldProtoTypeName) {
270342
this.fieldNumber = fieldNumber;
271343
this.fieldName = Objects.requireNonNull(fieldName);
272-
this.javaType = javaType;
273-
this.encodingType = encodingType;
274-
this.protoFieldType = protoFieldType;
344+
this.javaType = Objects.requireNonNull(javaType);
345+
this.encodingType = Objects.requireNonNull(encodingType);
346+
this.protoFieldType = Objects.requireNonNull(protoFieldType);
275347
this.isPacked = isPacked;
276348
this.fieldProtoTypeName = Objects.requireNonNull(fieldProtoTypeName);
277349
}

‎protobuf/src/test/java/dev/cel/protobuf/BUILD.bazel‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ java_test(
1616
"@cel_spec//proto/cel/expr/conformance/proto3:test_all_types_java_proto_lite",
1717
"@maven//:com_google_testparameterinjector_test_parameter_injector",
1818
"@maven//:junit_junit",
19+
"@maven_android//:com_google_protobuf_protobuf_javalite",
1920
],
2021
)
2122

‎protobuf/src/test/java/dev/cel/protobuf/CelLiteDescriptorTest.java‎

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@
1515
package dev.cel.protobuf;
1616

1717
import static com.google.common.truth.Truth.assertThat;
18+
import static org.junit.Assert.assertThrows;
1819

20+
import com.google.protobuf.WireFormat;
21+
import com.google.testing.junit.testparameterinjector.TestParameter;
1922
import com.google.testing.junit.testparameterinjector.TestParameterInjector;
2023
import dev.cel.expr.conformance.proto3.TestAllTypesCelLiteDescriptor;
2124
import dev.cel.protobuf.CelLiteDescriptor.FieldLiteDescriptor;
@@ -146,4 +149,96 @@ public void fieldDescriptor_nestedMessage_fullyQualifiedNames() {
146149
assertThat(fieldLiteDescriptor.getFieldProtoTypeName())
147150
.isEqualTo("cel.expr.conformance.proto3.TestAllTypes.NestedMessage");
148151
}
152+
153+
private enum ProtoFieldTypeTestCase {
154+
DOUBLE(FieldLiteDescriptor.Type.DOUBLE, 1, WireFormat.FieldType.DOUBLE),
155+
FLOAT(FieldLiteDescriptor.Type.FLOAT, 2, WireFormat.FieldType.FLOAT),
156+
INT64(FieldLiteDescriptor.Type.INT64, 3, WireFormat.FieldType.INT64),
157+
UINT64(FieldLiteDescriptor.Type.UINT64, 4, WireFormat.FieldType.UINT64),
158+
INT32(FieldLiteDescriptor.Type.INT32, 5, WireFormat.FieldType.INT32),
159+
FIXED64(FieldLiteDescriptor.Type.FIXED64, 6, WireFormat.FieldType.FIXED64),
160+
FIXED32(FieldLiteDescriptor.Type.FIXED32, 7, WireFormat.FieldType.FIXED32),
161+
BOOL(FieldLiteDescriptor.Type.BOOL, 8, WireFormat.FieldType.BOOL),
162+
STRING(FieldLiteDescriptor.Type.STRING, 9, WireFormat.FieldType.STRING),
163+
GROUP(FieldLiteDescriptor.Type.GROUP, 10, WireFormat.FieldType.GROUP),
164+
MESSAGE(FieldLiteDescriptor.Type.MESSAGE, 11, WireFormat.FieldType.MESSAGE),
165+
BYTES(FieldLiteDescriptor.Type.BYTES, 12, WireFormat.FieldType.BYTES),
166+
UINT32(FieldLiteDescriptor.Type.UINT32, 13, WireFormat.FieldType.UINT32),
167+
ENUM(FieldLiteDescriptor.Type.ENUM, 14, WireFormat.FieldType.ENUM),
168+
SFIXED32(FieldLiteDescriptor.Type.SFIXED32, 15, WireFormat.FieldType.SFIXED32),
169+
SFIXED64(FieldLiteDescriptor.Type.SFIXED64, 16, WireFormat.FieldType.SFIXED64),
170+
SINT32(FieldLiteDescriptor.Type.SINT32, 17, WireFormat.FieldType.SINT32),
171+
SINT64(FieldLiteDescriptor.Type.SINT64, 18, WireFormat.FieldType.SINT64);
172+
173+
private final FieldLiteDescriptor.Type type;
174+
private final int expectedNumber;
175+
private final WireFormat.FieldType expectedWireType;
176+
177+
ProtoFieldTypeTestCase(
178+
FieldLiteDescriptor.Type type, int expectedNumber, WireFormat.FieldType expectedWireType) {
179+
this.type = type;
180+
this.expectedNumber = expectedNumber;
181+
this.expectedWireType = expectedWireType;
182+
}
183+
}
184+
185+
@Test
186+
public void protoFieldType_numbersAndWireTypes(@TestParameter ProtoFieldTypeTestCase testCase) {
187+
assertThat(testCase.type.getNumber()).isEqualTo(testCase.expectedNumber);
188+
assertThat(testCase.type.toWireFormatFieldType()).isEqualTo(testCase.expectedWireType);
189+
}
190+
191+
@Test
192+
public void protoFieldType_forNumber_roundTripAllTypes(
193+
@TestParameter FieldLiteDescriptor.Type type) {
194+
assertThat(FieldLiteDescriptor.Type.forNumber(type.getNumber())).isEqualTo(type);
195+
}
196+
197+
@Test
198+
public void protoFieldType_forNumber_outOfRange_throws(
199+
@TestParameter({"-2147483648", "-1", "0", "19", "100", "2147483647"}) int invalidNumber) {
200+
IllegalArgumentException e =
201+
assertThrows(
202+
IllegalArgumentException.class,
203+
() -> FieldLiteDescriptor.Type.forNumber(invalidNumber));
204+
205+
assertThat(e).hasMessageThat().isEqualTo("Unsupported proto type code: " + invalidNumber);
206+
}
207+
208+
@Test
209+
public void fieldLiteDescriptor_nullParameters_throws() {
210+
assertThrows(
211+
NullPointerException.class,
212+
() ->
213+
new FieldLiteDescriptor(
214+
1,
215+
"field",
216+
null,
217+
EncodingType.SINGULAR,
218+
FieldLiteDescriptor.Type.INT32,
219+
false,
220+
""));
221+
assertThrows(
222+
NullPointerException.class,
223+
() ->
224+
new FieldLiteDescriptor(
225+
1,
226+
"field",
227+
FieldLiteDescriptor.JavaType.INT,
228+
null,
229+
FieldLiteDescriptor.Type.INT32,
230+
false,
231+
""));
232+
assertThrows(
233+
NullPointerException.class,
234+
() ->
235+
new FieldLiteDescriptor(
236+
1,
237+
"field",
238+
FieldLiteDescriptor.JavaType.INT,
239+
EncodingType.SINGULAR,
240+
null,
241+
false,
242+
""));
243+
}
149244
}

0 commit comments

Comments
 (0)