4848import com .google .protobuf .Empty ;
4949import com .google .protobuf .FieldMask ;
5050import com .google .protobuf .Message ;
51- import com .google .protobuf .NullValue ;
5251import com .google .protobuf .Struct ;
5352import com .google .protobuf .TextFormat ;
5453import com .google .protobuf .Timestamp ;
8685import dev .cel .common .types .ProtoMessageTypeProvider ;
8786import dev .cel .common .types .SimpleType ;
8887import dev .cel .common .types .StructTypeReference ;
88+ import dev .cel .common .values .CelByteString ;
89+ import dev .cel .common .values .NullValue ;
8990import dev .cel .compiler .CelCompiler ;
9091import dev .cel .compiler .CelCompilerFactory ;
9192import dev .cel .compiler .CelCompilerImpl ;
108109import dev .cel .runtime .UnknownContext ;
109110import dev .cel .testing .testdata .proto3 .StandaloneGlobalEnum ;
110111import java .util .ArrayList ;
112+ import java .util .LinkedHashMap ;
111113import java .util .List ;
112114import java .util .Map ;
113115import java .util .Optional ;
@@ -1019,7 +1021,10 @@ public void program_enumTypeReferenceResolution(boolean resolveTypeDependencies)
10191021 Cel cel =
10201022 standardCelBuilderWithMacros ()
10211023 .setOptions (
1022- CelOptions .current ().resolveTypeDependencies (resolveTypeDependencies ).build ())
1024+ CelOptions .current ()
1025+ .evaluateCanonicalTypesToNativeValues (true )
1026+ .resolveTypeDependencies (resolveTypeDependencies )
1027+ .build ())
10231028 .addMessageTypes (Struct .getDescriptor ())
10241029 .setResultType (StructTypeReference .create ("google.protobuf.NullValue" ))
10251030 .setContainer (CelContainer .ofName ("google.protobuf" ))
@@ -1037,7 +1042,11 @@ public void program_enumTypeReferenceResolution(boolean resolveTypeDependencies)
10371042 public void program_enumTypeTransitiveResolution () throws Exception {
10381043 Cel cel =
10391044 standardCelBuilderWithMacros ()
1040- .setOptions (CelOptions .current ().resolveTypeDependencies (true ).build ())
1045+ .setOptions (
1046+ CelOptions .current ()
1047+ .evaluateCanonicalTypesToNativeValues (true )
1048+ .resolveTypeDependencies (true )
1049+ .build ())
10411050 .addMessageTypes (Proto2ExtensionScopedMessage .getDescriptor ())
10421051 .setResultType (StructTypeReference .create ("google.protobuf.NullValue" ))
10431052 .setContainer (CelContainer .ofName ("google.protobuf" ))
@@ -1626,7 +1635,11 @@ public void programAdvanceEvaluation_indexOnUnknownContainer() throws Exception
16261635 public void programAdvanceEvaluation_unsupportedIndexIgnored () throws Exception {
16271636 Cel cel =
16281637 standardCelBuilderWithMacros ()
1629- .setOptions (CelOptions .current ().enableUnknownTracking (true ).build ())
1638+ .setOptions (
1639+ CelOptions .current ()
1640+ .evaluateCanonicalTypesToNativeValues (true )
1641+ .enableUnknownTracking (true )
1642+ .build ())
16301643 .addVar ("unk" , MapType .create (SimpleType .STRING , SimpleType .BOOL ))
16311644 .setContainer (CelContainer .ofName ("" ))
16321645 .addFunctionBindings ()
@@ -1654,7 +1667,7 @@ public void programAdvanceEvaluation_unsupportedIndexIgnored() throws Exception
16541667 UnknownContext .create (
16551668 fromMap (
16561669 ImmutableMap .of (
1657- "unk" , ImmutableMap .of (ByteString .copyFromUtf8 ("a" ), false ))),
1670+ "unk" , ImmutableMap .of (CelByteString .copyFromUtf8 ("a" ), false ))),
16581671 ImmutableList .of ())))
16591672 .isEqualTo (false );
16601673 }
@@ -2077,6 +2090,23 @@ public void program_regexProgramSizeExceedsLimit_throws() throws Exception {
20772090 assertThat (e .getErrorCode ()).isEqualTo (CelErrorCode .INVALID_ARGUMENT );
20782091 }
20792092
2093+ @ Test
2094+ @ SuppressWarnings ("unchecked" ) // test only
2095+ public void program_evaluateCanonicalTypesToNativeTypesDisabled_producesProtoValues ()
2096+ throws Exception {
2097+ Cel cel =
2098+ standardCelBuilderWithMacros ()
2099+ .setOptions (CelOptions .current ().evaluateCanonicalTypesToNativeValues (false ).build ())
2100+ .build ();
2101+ CelAbstractSyntaxTree ast = cel .compile ("[null, {b'abc': null}]" ).getAst ();
2102+ Map <ByteString , Object > expectedNestedMap = new LinkedHashMap <>();
2103+ expectedNestedMap .put (ByteString .copyFromUtf8 ("abc" ), com .google .protobuf .NullValue .NULL_VALUE );
2104+
2105+ List <Object > result = (List <Object >) cel .createProgram (ast ).eval ();
2106+
2107+ assertThat (result ).containsExactly (com .google .protobuf .NullValue .NULL_VALUE , expectedNestedMap );
2108+ }
2109+
20802110 @ Test
20812111 public void toBuilder_isImmutable () {
20822112 CelBuilder celBuilder = CelFactory .standardCelBuilder ();
0 commit comments