|
43 | 43 | import com.google.protobuf.ByteString; |
44 | 44 | import com.google.protobuf.DescriptorProtos.FileDescriptorProto; |
45 | 45 | import com.google.protobuf.DescriptorProtos.FileDescriptorSet; |
| 46 | +import com.google.protobuf.Descriptors.Descriptor; |
46 | 47 | import com.google.protobuf.Descriptors.FileDescriptor; |
47 | 48 | import com.google.protobuf.Duration; |
48 | 49 | import com.google.protobuf.Empty; |
|
51 | 52 | import com.google.protobuf.Struct; |
52 | 53 | import com.google.protobuf.TextFormat; |
53 | 54 | import com.google.protobuf.Timestamp; |
| 55 | +import com.google.protobuf.TypeRegistry; |
54 | 56 | import com.google.protobuf.WrappersProto; |
55 | 57 | import com.google.rpc.context.AttributeContext; |
56 | 58 | import com.google.testing.junit.testparameterinjector.TestParameter; |
|
62 | 64 | import dev.cel.checker.TypeProvider; |
63 | 65 | import dev.cel.common.CelAbstractSyntaxTree; |
64 | 66 | import dev.cel.common.CelContainer; |
| 67 | +import dev.cel.common.CelDescriptorUtil; |
65 | 68 | import dev.cel.common.CelErrorCode; |
66 | 69 | import dev.cel.common.CelIssue; |
67 | 70 | import dev.cel.common.CelOptions; |
|
91 | 94 | import dev.cel.compiler.CelCompilerFactory; |
92 | 95 | import dev.cel.compiler.CelCompilerImpl; |
93 | 96 | import dev.cel.expr.conformance.proto2.Proto2ExtensionScopedMessage; |
| 97 | +import dev.cel.expr.conformance.proto2.TestAllTypesExtensions; |
94 | 98 | import dev.cel.expr.conformance.proto3.TestAllTypes; |
95 | 99 | import dev.cel.parser.CelParserImpl; |
96 | 100 | import dev.cel.parser.CelStandardMacro; |
@@ -196,13 +200,11 @@ public void build_badFileDescriptorSet() { |
196 | 200 | IllegalArgumentException.class, |
197 | 201 | () -> |
198 | 202 | standardCelBuilderWithMacros() |
199 | | - .setContainer(CelContainer.ofName("google.rpc.context.AttributeContext")) |
| 203 | + .setContainer(CelContainer.ofName("cel.expr.conformance.proto2")) |
200 | 204 | .addFileTypes( |
201 | 205 | FileDescriptorSet.newBuilder() |
202 | | - .addFile(AttributeContext.getDescriptor().getFile().toProto()) |
| 206 | + .addFile(TestAllTypesExtensions.getDescriptor().getFile().toProto()) |
203 | 207 | .build()) |
204 | | - .setProtoResultType( |
205 | | - CelProtoTypes.createMessage("google.rpc.context.AttributeContext.Resource")) |
206 | 208 | .build()); |
207 | 209 | assertThat(e).hasMessageThat().contains("file descriptor set with unresolved proto file"); |
208 | 210 | } |
@@ -2124,6 +2126,61 @@ public void program_evaluateCanonicalTypesToNativeTypesDisabled_producesBytesPro |
2124 | 2126 | assertThat(result).isEqualTo(ByteString.copyFromUtf8("abc")); |
2125 | 2127 | } |
2126 | 2128 |
|
| 2129 | + @Test |
| 2130 | + public void textProto_containsWktDependency_descriptorInstancesMatch() throws Exception { |
| 2131 | + Cel cel = |
| 2132 | + standardCelBuilderWithMacros() |
| 2133 | + .addMessageTypes(TestAllTypes.getDescriptor()) |
| 2134 | + .setContainer(CelContainer.ofName("cel.expr.conformance.proto3")) |
| 2135 | + .build(); |
| 2136 | + CelAbstractSyntaxTree ast = |
| 2137 | + cel.compile("TestAllTypes{single_bytes: bytes('abc')}.single_bytes").getAst(); |
| 2138 | + |
| 2139 | + ByteString result = (ByteString) cel.createProgram(ast).eval(); |
| 2140 | + |
| 2141 | + assertThat(result).isEqualTo(ByteString.copyFromUtf8("abc")); |
| 2142 | + } |
| 2143 | + |
| 2144 | + @Test |
| 2145 | + public void program_fdsContainsWktDependency_descriptorInstancesMatch() throws Exception { |
| 2146 | + // Force serialization of the descriptor to get a unique instance |
| 2147 | + FileDescriptorProto proto = TestAllTypes.getDescriptor().getFile().toProto(); |
| 2148 | + FileDescriptorSet fds = FileDescriptorSet.newBuilder().addFile(proto).build(); |
| 2149 | + ImmutableSet<FileDescriptor> fileDescriptors = |
| 2150 | + CelDescriptorUtil.getFileDescriptorsFromFileDescriptorSet(fds); |
| 2151 | + ImmutableSet<Descriptor> descriptors = |
| 2152 | + CelDescriptorUtil.getAllDescriptorsFromFileDescriptor(fileDescriptors) |
| 2153 | + .messageTypeDescriptors(); |
| 2154 | + // Parse text proto using this fds |
| 2155 | + String textProto = |
| 2156 | + "single_timestamp {\n" // |
| 2157 | + + " seconds: 100\n" // |
| 2158 | + + "}"; |
| 2159 | + TypeRegistry typeRegistry = TypeRegistry.newBuilder().add(descriptors).build(); |
| 2160 | + TestAllTypes.Builder testAllTypesBuilder = TestAllTypes.newBuilder(); |
| 2161 | + TextFormat.Parser textFormatParser = |
| 2162 | + TextFormat.Parser.newBuilder().setTypeRegistry(typeRegistry).build(); |
| 2163 | + textFormatParser.merge(textProto, testAllTypesBuilder); |
| 2164 | + TestAllTypes testAllTypesFromTextProto = testAllTypesBuilder.build(); |
| 2165 | + // Evaluate a timestamp message using the same descriptor |
| 2166 | + Cel cel = |
| 2167 | + standardCelBuilderWithMacros() |
| 2168 | + .addMessageTypes(descriptors) |
| 2169 | + .setOptions( |
| 2170 | + CelOptions.current() |
| 2171 | + .evaluateCanonicalTypesToNativeValues(true) |
| 2172 | + .enableTimestampEpoch(true) |
| 2173 | + .build()) |
| 2174 | + .setContainer(CelContainer.ofName("cel.expr.conformance.proto3")) |
| 2175 | + .build(); |
| 2176 | + CelAbstractSyntaxTree ast = |
| 2177 | + cel.compile("TestAllTypes{single_timestamp: timestamp(100)}").getAst(); |
| 2178 | + |
| 2179 | + TestAllTypes evalResult = (TestAllTypes) cel.createProgram(ast).eval(); |
| 2180 | + |
| 2181 | + assertThat(evalResult).isEqualTo(testAllTypesFromTextProto); |
| 2182 | + } |
| 2183 | + |
2127 | 2184 | @Test |
2128 | 2185 | public void toBuilder_isImmutable() { |
2129 | 2186 | CelBuilder celBuilder = CelFactory.standardCelBuilder(); |
|
0 commit comments