Skip to content

Commit b98a6dd

Browse files
l46kokcopybara-github
authored andcommitted
Enable evaluateCanonicalTypesToNativeValues by default
PiperOrigin-RevId: 808650209
1 parent f1ab6e5 commit b98a6dd

File tree

11 files changed

+41
-34
lines changed

11 files changed

+41
-34
lines changed

bundle/src/test/java/dev/cel/bundle/CelImplTest.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@
7777
import dev.cel.common.CelVarDecl;
7878
import dev.cel.common.ast.CelExpr;
7979
import dev.cel.common.ast.CelExpr.CelList;
80-
import dev.cel.common.internal.ProtoTimeUtils;
8180
import dev.cel.common.testing.RepeatedTestProvider;
8281
import dev.cel.common.types.CelKind;
8382
import dev.cel.common.types.CelProtoMessageTypes;
@@ -114,6 +113,7 @@
114113
import dev.cel.runtime.CelVariableResolver;
115114
import dev.cel.runtime.UnknownContext;
116115
import dev.cel.testing.testdata.proto3.StandaloneGlobalEnum;
116+
import java.time.Instant;
117117
import java.util.ArrayList;
118118
import java.util.LinkedHashMap;
119119
import java.util.List;
@@ -817,27 +817,30 @@ public void program_messageConstruction() throws Exception {
817817
public void program_duplicateTypeDescriptor() throws Exception {
818818
Cel cel =
819819
standardCelBuilderWithMacros()
820+
.setOptions(CelOptions.current().evaluateCanonicalTypesToNativeValues(true).build())
820821
.addMessageTypes(Timestamp.getDescriptor())
821822
.addMessageTypes(ImmutableList.of(Timestamp.getDescriptor()))
822823
.setContainer(CelContainer.ofName("google"))
823824
.setResultType(SimpleType.TIMESTAMP)
824825
.build();
825826
CelRuntime.Program program =
826827
cel.createProgram(cel.compile("protobuf.Timestamp{seconds: 12}").getAst());
827-
assertThat(program.eval()).isEqualTo(ProtoTimeUtils.fromSecondsToTimestamp(12));
828+
829+
assertThat(program.eval()).isEqualTo(Instant.ofEpochSecond(12));
828830
}
829831

830832
@Test
831833
public void program_hermeticDescriptors_wellKnownProtobuf() throws Exception {
832834
Cel cel =
833835
standardCelBuilderWithMacros()
836+
.setOptions(CelOptions.current().evaluateCanonicalTypesToNativeValues(true).build())
834837
.addMessageTypes(Timestamp.getDescriptor())
835838
.setContainer(CelContainer.ofName("google"))
836839
.setResultType(SimpleType.TIMESTAMP)
837840
.build();
838841
CelRuntime.Program program =
839842
cel.createProgram(cel.compile("protobuf.Timestamp{seconds: 12}").getAst());
840-
assertThat(program.eval()).isEqualTo(ProtoTimeUtils.fromSecondsToTimestamp(12));
843+
assertThat(program.eval()).isEqualTo(Instant.ofEpochSecond(12));
841844
}
842845

843846
@Test
@@ -959,14 +962,15 @@ public void program_deepTypeResolutionDisabledForRuntime_fails() throws Exceptio
959962
public void program_typeProvider() throws Exception {
960963
Cel cel =
961964
standardCelBuilderWithMacros()
965+
.setOptions(CelOptions.current().evaluateCanonicalTypesToNativeValues(true).build())
962966
.setTypeProvider(
963967
new DescriptorTypeProvider(ImmutableList.of(Timestamp.getDescriptor())))
964968
.setContainer(CelContainer.ofName("google"))
965969
.setResultType(SimpleType.TIMESTAMP)
966970
.build();
967971
CelRuntime.Program program =
968972
cel.createProgram(cel.compile("protobuf.Timestamp{seconds: 12}").getAst());
969-
assertThat(program.eval()).isEqualTo(ProtoTimeUtils.fromSecondsToTimestamp(12));
973+
assertThat(program.eval()).isEqualTo(Instant.ofEpochSecond(12));
970974
}
971975

972976
@Test

codelab/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1065,8 +1065,8 @@ public void validate_invalidTimestampLiteral_returnsError() throws Exception {
10651065
assertThat(validationResult.hasError()).isTrue();
10661066
assertThat(validationResult.getErrorString())
10671067
.isEqualTo(
1068-
"ERROR: <input>:1:11: timestamp validation failed. Reason: evaluation error: Failed to"
1069-
+ " parse timestamp: invalid timestamp \"bad\"\n"
1068+
"ERROR: <input>:1:11: timestamp validation failed. Reason: evaluation error: Text 'bad'"
1069+
+ " could not be parsed at index 0\n"
10701070
+ " | timestamp('bad')\n"
10711071
+ " | ..........^");
10721072
}

codelab/src/test/codelab/Exercise8Test.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ public void validate_invalidTimestampLiteral_returnsError() throws Exception {
4343
assertThat(validationResult.hasError()).isTrue();
4444
assertThat(validationResult.getErrorString())
4545
.isEqualTo(
46-
"ERROR: <input>:1:11: timestamp validation failed. Reason: evaluation error: Failed to"
47-
+ " parse timestamp: invalid timestamp \"bad\"\n"
46+
"ERROR: <input>:1:11: timestamp validation failed. Reason: evaluation error: Text 'bad'"
47+
+ " could not be parsed at index 0\n"
4848
+ " | timestamp('bad')\n"
4949
+ " | ..........^");
5050
}

codelab/src/test/codelab/solutions/Exercise8Test.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ public void validate_invalidTimestampLiteral_returnsError() throws Exception {
4343
assertThat(validationResult.hasError()).isTrue();
4444
assertThat(validationResult.getErrorString())
4545
.isEqualTo(
46-
"ERROR: <input>:1:11: timestamp validation failed. Reason: evaluation error: Failed to"
47-
+ " parse timestamp: invalid timestamp \"bad\"\n"
46+
"ERROR: <input>:1:11: timestamp validation failed. Reason: evaluation error: Text 'bad'"
47+
+ " could not be parsed at index 0\n"
4848
+ " | timestamp('bad')\n"
4949
+ " | ..........^");
5050
}

common/src/main/java/dev/cel/common/CelOptions.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ public static Builder current() {
184184
.enableUnsignedLongs(true)
185185
.enableRegexPartialMatch(true)
186186
.errorOnDuplicateMapKeys(true)
187+
.evaluateCanonicalTypesToNativeValues(true)
187188
.errorOnIntWrap(true)
188189
.resolveTypeDependencies(true)
189190
.disableCelStandardEquality(false);
@@ -462,6 +463,8 @@ public abstract static class Builder {
462463
* com.google.protobuf.ByteString}.
463464
* <li>CEL null: {@code dev.cel.common.values.NullValue} instead of {@code
464465
* com.google.protobuf.NullValue}.
466+
* <li>Timestamp: {@code java.time.Instant} instead of {@code com.google.protobuf.Timestamp}.
467+
* <li>Duration: {@code java.time.Duration} instead of {@code com.google.protobuf.Duration}.
465468
* </ul>
466469
*/
467470
public abstract Builder evaluateCanonicalTypesToNativeValues(boolean value);

common/src/test/java/dev/cel/common/internal/ProtoAdapterTest.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import com.google.type.Expr;
4242
import dev.cel.common.CelOptions;
4343
import dev.cel.common.values.CelByteString;
44+
import java.time.Instant;
4445
import java.util.Arrays;
4546
import java.util.List;
4647
import java.util.Optional;
@@ -88,11 +89,10 @@ public static List<Object[]> data() {
8889
{1.5D, Any.pack(DoubleValue.of(1.5D))},
8990
{1.5D, Value.newBuilder().setNumberValue(1.5D).build()},
9091
{
91-
Duration.newBuilder().setSeconds(123).build(),
92-
Duration.newBuilder().setSeconds(123).build(),
92+
java.time.Duration.ofSeconds(123), Duration.newBuilder().setSeconds(123).build(),
9393
},
9494
{
95-
Duration.newBuilder().setSeconds(123).build(),
95+
java.time.Duration.ofSeconds(123),
9696
Any.pack(Duration.newBuilder().setSeconds(123).build()),
9797
},
9898
{1L, Int64Value.of(1L)},
@@ -132,12 +132,10 @@ public static List<Object[]> data() {
132132
.build(),
133133
},
134134
{
135-
Timestamp.newBuilder().setSeconds(123).build(),
136-
Timestamp.newBuilder().setSeconds(123).build(),
135+
Instant.ofEpochSecond(123), Timestamp.newBuilder().setSeconds(123).build(),
137136
},
138137
{
139-
Timestamp.newBuilder().setSeconds(123).build(),
140-
Any.pack(Timestamp.newBuilder().setSeconds(123).build()),
138+
Instant.ofEpochSecond(123), Any.pack(Timestamp.newBuilder().setSeconds(123).build()),
141139
},
142140
{UnsignedLong.valueOf(1L), UInt64Value.of(1L)},
143141
{UnsignedLong.valueOf(1L), Any.pack(UInt64Value.of(1L))},
@@ -152,7 +150,10 @@ public static List<Object[]> data() {
152150
@Test
153151
public void adaptValueToProto_bidirectionalConversion() {
154152
DynamicProto dynamicProto = DynamicProto.create(DefaultMessageFactory.INSTANCE);
155-
ProtoAdapter protoAdapter = new ProtoAdapter(dynamicProto, CelOptions.DEFAULT);
153+
ProtoAdapter protoAdapter =
154+
new ProtoAdapter(
155+
dynamicProto,
156+
CelOptions.current().evaluateCanonicalTypesToNativeValues(true).build());
156157
assertThat(protoAdapter.adaptValueToProto(value, proto.getDescriptorForType().getFullName()))
157158
.isEqualTo(proto);
158159
assertThat(protoAdapter.adaptProtoToValue(proto)).isEqualTo(value);

common/src/test/java/dev/cel/common/values/ProtoMessageValueProviderTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import dev.cel.common.internal.DefaultMessageFactory;
2929
import dev.cel.common.internal.DynamicProto;
3030
import dev.cel.common.internal.ProtoMessageFactory;
31-
import dev.cel.common.internal.ProtoTimeUtils;
3231
import dev.cel.expr.conformance.proto2.TestAllTypes;
3332
import dev.cel.expr.conformance.proto2.TestAllTypesExtensions;
3433
import java.time.Duration;
@@ -66,7 +65,8 @@ public void newValue_createEmptyProtoMessage() {
6665
@Test
6766
public void newValue_createProtoMessage_fieldsPopulated() {
6867
ProtoMessageValueProvider protoMessageValueProvider =
69-
ProtoMessageValueProvider.newInstance(CelOptions.DEFAULT, DYNAMIC_PROTO);
68+
ProtoMessageValueProvider.newInstance(
69+
CelOptions.current().evaluateCanonicalTypesToNativeValues(true).build(), DYNAMIC_PROTO);
7070

7171
ProtoMessageValue protoMessageValue =
7272
(ProtoMessageValue)
@@ -89,9 +89,9 @@ public void newValue_createProtoMessage_fieldsPopulated() {
8989
"single_string",
9090
"hello",
9191
"single_timestamp",
92-
ProtoTimeUtils.fromSecondsToTimestamp(50),
92+
Instant.ofEpochSecond(50),
9393
"single_duration",
94-
ProtoTimeUtils.fromSecondsToDuration(100)))
94+
Duration.ofSeconds(100)))
9595
.get();
9696

9797
assertThat(protoMessageValue.isZeroValue()).isFalse();

validator/src/main/java/dev/cel/validator/validators/DurationLiteralValidator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
package dev.cel.validator.validators;
1616

17-
import com.google.protobuf.Duration;
17+
import java.time.Duration;
1818

1919
/** DurationLiteralValidator ensures that duration literal arguments are valid. */
2020
public final class DurationLiteralValidator extends LiteralValidator {

validator/src/main/java/dev/cel/validator/validators/TimestampLiteralValidator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@
1414

1515
package dev.cel.validator.validators;
1616

17-
import com.google.protobuf.Timestamp;
17+
import java.time.Instant;
1818

1919
/** TimestampLiteralValidator ensures that timestamp literal arguments are valid. */
2020
public final class TimestampLiteralValidator extends LiteralValidator {
2121
public static final TimestampLiteralValidator INSTANCE =
22-
new TimestampLiteralValidator("timestamp", Timestamp.class);
22+
new TimestampLiteralValidator("timestamp", Instant.class);
2323

2424
private TimestampLiteralValidator(String functionName, Class<?> expectedResultType) {
2525
super(functionName, expectedResultType);

validator/src/test/java/dev/cel/validator/validators/DurationLiteralValidatorTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import static org.junit.Assert.assertThrows;
2121

2222
import com.google.common.collect.ImmutableMap;
23-
import com.google.protobuf.Duration;
2423
import com.google.testing.junit.testparameterinjector.TestParameterInjector;
2524
import com.google.testing.junit.testparameterinjector.TestParameters;
2625
import dev.cel.bundle.Cel;
@@ -35,6 +34,7 @@
3534
import dev.cel.validator.CelValidator;
3635
import dev.cel.validator.CelValidatorFactory;
3736
import java.text.ParseException;
37+
import java.time.Duration;
3838
import org.junit.Test;
3939
import org.junit.runner.RunWith;
4040

@@ -174,7 +174,7 @@ public void duration_unexpectedResultType_throws() throws Exception {
174174
assertThat(result.getAllIssues().get(0).toDisplayString(ast.getSource()))
175175
.isEqualTo(
176176
"ERROR: <input>:1:10: duration validation failed. Reason: Expected"
177-
+ " com.google.protobuf.Duration type but got java.lang.Integer instead\n"
177+
+ " java.time.Duration type but got java.lang.Integer instead\n"
178178
+ " | duration('1h')\n"
179179
+ " | .........^");
180180
}

0 commit comments

Comments
 (0)