Skip to content

Commit 9313ea9

Browse files
ChinmayMadeshicopybara-github
authored andcommitted
Internal change
PiperOrigin-RevId: 755946795
1 parent f1b9a60 commit 9313ea9

15 files changed

Lines changed: 334 additions & 219 deletions

File tree

testing/src/main/java/dev/cel/testing/testrunner/BUILD.bazel

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ java_library(
2121
":cel_test_suite_yaml_parser",
2222
":cel_user_test_template",
2323
":junit_xml_reporter",
24+
"//testing/testrunner:class_loader_utils",
2425
"@maven//:com_google_guava_guava",
2526
"@maven//:io_github_classgraph_classgraph",
2627
"@maven//:junit_junit",
@@ -61,10 +62,8 @@ java_library(
6162
"//:auto_value",
6263
"//bundle:cel",
6364
"//bundle:environment",
64-
"//bundle:environment_exception",
6565
"//bundle:environment_yaml_parser",
6666
"//common:cel_ast",
67-
"//common:cel_descriptors",
6867
"//common:compiler_common",
6968
"//common:options",
7069
"//common:proto_ast",
@@ -75,6 +74,7 @@ java_library(
7574
"//policy:validation_exception",
7675
"//runtime",
7776
"//testing:expr_value_utils",
77+
"//testing/testrunner:proto_descriptor_utils",
7878
"@cel_spec//proto/cel/expr:expr_java_proto",
7979
"@maven//:com_google_guava_guava",
8080
"@maven//:com_google_protobuf_protobuf_java",
@@ -145,10 +145,8 @@ java_library(
145145
tags = [
146146
],
147147
deps = [
148-
"//common:cel_descriptors",
149-
"//common/internal:cel_descriptor_pools",
150-
"//common/internal:default_message_factory",
151-
"@maven//:com_google_guava_guava",
148+
"//common/internal:default_instance_message_factory",
149+
"//testing/testrunner:proto_descriptor_utils",
152150
"@maven//:com_google_protobuf_protobuf_java",
153151
],
154152
)
@@ -177,12 +175,9 @@ java_library(
177175
"//:java_truth",
178176
"//bundle:cel",
179177
"//common:cel_ast",
180-
"//common:cel_descriptors",
181178
"//runtime",
182179
"//testing:expr_value_utils",
183180
"@cel_spec//proto/cel/expr:expr_java_proto",
184-
"@maven//:com_google_guava_guava",
185-
"@maven//:com_google_protobuf_protobuf_java",
186181
"@maven//:com_google_truth_extensions_truth_proto_extension",
187182
],
188183
)
@@ -196,7 +191,6 @@ java_library(
196191
":cel_test_suite",
197192
":cel_test_suite_exception",
198193
":registry_utils",
199-
"//common:cel_descriptors",
200194
"@cel_spec//proto/cel/expr:expr_java_proto",
201195
"@cel_spec//proto/cel/expr/conformance/test:suite_java_proto",
202196
"@maven//:com_google_guava_guava",

testing/src/main/java/dev/cel/testing/testrunner/CelTestSuiteTextProtoParser.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,10 @@
1818
import com.google.common.collect.ImmutableList;
1919
import com.google.common.collect.ImmutableMap;
2020
import com.google.common.collect.ImmutableSet;
21-
import com.google.protobuf.Descriptors.FileDescriptor;
2221
import com.google.protobuf.ExtensionRegistry;
2322
import com.google.protobuf.TextFormat;
2423
import com.google.protobuf.TextFormat.ParseException;
2524
import com.google.protobuf.TypeRegistry;
26-
import dev.cel.common.CelDescriptorUtil;
2725
import dev.cel.expr.conformance.test.InputValue;
2826
import dev.cel.expr.conformance.test.TestCase;
2927
import dev.cel.expr.conformance.test.TestSection;
@@ -55,11 +53,8 @@ private TestSuite parseTestSuite(String textProto) throws IOException {
5553
TypeRegistry typeRegistry = TypeRegistry.getEmptyTypeRegistry();
5654
ExtensionRegistry extensionRegistry = ExtensionRegistry.getEmptyRegistry();
5755
if (fileDescriptorSetPath != null) {
58-
ImmutableSet<FileDescriptor> fileDescriptors =
59-
CelDescriptorUtil.getFileDescriptorsFromFileDescriptorSet(
60-
RegistryUtils.getFileDescriptorSet(fileDescriptorSetPath));
61-
extensionRegistry = RegistryUtils.getExtensionRegistry(fileDescriptors);
62-
typeRegistry = RegistryUtils.getTypeRegistry(fileDescriptors);
56+
extensionRegistry = RegistryUtils.getExtensionRegistry();
57+
typeRegistry = RegistryUtils.getTypeRegistry();
6358
}
6459
TextFormat.Parser parser = TextFormat.Parser.newBuilder().setTypeRegistry(typeRegistry).build();
6560
TestSuite.Builder builder = TestSuite.newBuilder();

testing/src/main/java/dev/cel/testing/testrunner/DefaultResultMatcher.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,8 @@
1919

2020
import dev.cel.expr.ExprValue;
2121
import dev.cel.expr.MapValue;
22-
import com.google.common.collect.ImmutableSet;
23-
import com.google.protobuf.Descriptors.FileDescriptor;
2422
import dev.cel.bundle.Cel;
2523
import dev.cel.common.CelAbstractSyntaxTree;
26-
import dev.cel.common.CelDescriptorUtil;
2724
import dev.cel.runtime.CelEvaluationException;
2825
import dev.cel.runtime.CelRuntime.Program;
2926
import dev.cel.testing.testrunner.CelTestSuite.CelTestSection.CelTestCase.Output;
@@ -87,15 +84,10 @@ private static void assertExprValue(ExprValue exprValue, ExprValue expectedExprV
8784
throws IOException {
8885
String fileDescriptorSetPath = System.getProperty("file_descriptor_set_path");
8986
if (fileDescriptorSetPath != null) {
90-
ImmutableSet<FileDescriptor> fileDescriptors =
91-
CelDescriptorUtil.getFileDescriptorsFromFileDescriptorSet(
92-
RegistryUtils.getFileDescriptorSet(fileDescriptorSetPath));
9387
assertThat(exprValue)
9488
.ignoringRepeatedFieldOrderOfFieldDescriptors(
9589
MapValue.getDescriptor().findFieldByName("entries"))
96-
.unpackingAnyUsing(
97-
RegistryUtils.getTypeRegistry(fileDescriptors),
98-
RegistryUtils.getExtensionRegistry(fileDescriptors))
90+
.unpackingAnyUsing(RegistryUtils.getTypeRegistry(), RegistryUtils.getExtensionRegistry())
9991
.isEqualTo(expectedExprValue);
10092
} else {
10193
assertThat(exprValue)

testing/src/main/java/dev/cel/testing/testrunner/RegistryUtils.java

Lines changed: 13 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -13,91 +13,48 @@
1313
// limitations under the License.
1414
package dev.cel.testing.testrunner;
1515

16-
import com.google.common.io.Files;
17-
import com.google.protobuf.DescriptorProtos.FileDescriptorSet;
16+
import static dev.cel.testing.utils.ProtoDescriptorUtils.getAllDescriptors;
17+
1818
import com.google.protobuf.Descriptors.FieldDescriptor;
19-
import com.google.protobuf.Descriptors.FileDescriptor;
2019
import com.google.protobuf.ExtensionRegistry;
2120
import com.google.protobuf.Message;
2221
import com.google.protobuf.TypeRegistry;
23-
import dev.cel.common.CelDescriptorUtil;
24-
import dev.cel.common.CelDescriptors;
25-
import dev.cel.common.internal.CelDescriptorPool;
26-
import dev.cel.common.internal.DefaultDescriptorPool;
27-
import dev.cel.common.internal.DefaultMessageFactory;
28-
import java.io.File;
22+
import dev.cel.common.internal.DefaultInstanceMessageFactory;
2923
import java.io.IOException;
3024
import java.util.NoSuchElementException;
31-
import java.util.Set;
3225

3326
/** Utility class for creating registries from a file descriptor set. */
3427
public final class RegistryUtils {
3528

36-
private RegistryUtils() {}
37-
38-
/** Returns the {@link FileDescriptorSet} for the given file descriptor set path. */
39-
public static FileDescriptorSet getFileDescriptorSet(String fileDescriptorSetPath)
40-
throws IOException {
41-
// We can pass an empty extension registry here because extensions are recovered later when
42-
// creating the extension registry in {@link #createExtensionRegistry}.
43-
return FileDescriptorSet.parseFrom(
44-
Files.toByteArray(new File(fileDescriptorSetPath)), ExtensionRegistry.newInstance());
45-
}
46-
4729
/** Returns the {@link TypeRegistry} for the given file descriptor set. */
48-
public static TypeRegistry getTypeRegistry(Set<FileDescriptor> fileDescriptors)
49-
throws IOException {
50-
return createTypeRegistry(fileDescriptors);
30+
public static TypeRegistry getTypeRegistry() throws IOException {
31+
return TypeRegistry.newBuilder().add(getAllDescriptors().messageTypeDescriptors()).build();
5132
}
5233

5334
/** Returns the {@link ExtensionRegistry} for the given file descriptor set. */
54-
public static ExtensionRegistry getExtensionRegistry(Set<FileDescriptor> fileDescriptors)
55-
throws IOException {
56-
return createExtensionRegistry(fileDescriptors);
57-
}
58-
59-
private static TypeRegistry createTypeRegistry(Set<FileDescriptor> fileDescriptors) {
60-
CelDescriptors allDescriptors =
61-
CelDescriptorUtil.getAllDescriptorsFromFileDescriptor(fileDescriptors);
62-
return TypeRegistry.newBuilder().add(allDescriptors.messageTypeDescriptors()).build();
63-
}
64-
65-
private static ExtensionRegistry createExtensionRegistry(Set<FileDescriptor> fileDescriptors) {
35+
public static ExtensionRegistry getExtensionRegistry() throws IOException {
6636
ExtensionRegistry extensionRegistry = ExtensionRegistry.newInstance();
6737

68-
CelDescriptors allDescriptors =
69-
CelDescriptorUtil.getAllDescriptorsFromFileDescriptor(fileDescriptors);
70-
71-
CelDescriptorPool pool = DefaultDescriptorPool.create(allDescriptors);
72-
73-
// We need to create a default message factory because there would always be difference in
74-
// reference between the default instance's descriptor and the descriptor in the pool if the
75-
// file descriptor set is created at runtime, therefore
76-
// we need to create a default message factory to get the default instance for each descriptor
77-
// because it falls back to the DynamicMessages.
78-
//
79-
// For more details, see: b/292174333
80-
DefaultMessageFactory defaultMessageFactory = DefaultMessageFactory.create(pool);
81-
82-
allDescriptors
38+
getAllDescriptors()
8339
.extensionDescriptors()
8440
.forEach(
8541
(descriptorName, descriptor) -> {
8642
if (descriptor.getType().equals(FieldDescriptor.Type.MESSAGE)) {
87-
Message.Builder defaultInstance =
88-
defaultMessageFactory
89-
.newBuilder(descriptor.getMessageType().getFullName())
43+
Message output =
44+
DefaultInstanceMessageFactory.getInstance()
45+
.getPrototype(descriptor.getMessageType())
9046
.orElseThrow(
9147
() ->
9248
new NoSuchElementException(
9349
"Could not find a default message for: "
9450
+ descriptor.getFullName()));
95-
extensionRegistry.add(descriptor, defaultInstance.build());
51+
extensionRegistry.add(descriptor, output);
9652
} else {
9753
extensionRegistry.add(descriptor);
9854
}
9955
});
100-
10156
return extensionRegistry;
10257
}
58+
59+
private RegistryUtils() {}
10360
}

testing/src/main/java/dev/cel/testing/testrunner/TestExecutor.java

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
package dev.cel.testing.testrunner;
1616

1717
import static com.google.common.collect.MoreCollectors.onlyElement;
18+
import static dev.cel.testing.utils.ClassLoaderUtils.loadClassesWithMethodAnnotation;
19+
import static dev.cel.testing.utils.ClassLoaderUtils.loadSubclasses;
1820
import static java.nio.charset.StandardCharsets.UTF_8;
1921
import static java.time.ZoneId.systemDefault;
2022

@@ -23,9 +25,7 @@
2325
import dev.cel.testing.testrunner.Annotations.TestSuiteSupplier;
2426
import dev.cel.testing.testrunner.CelTestSuite.CelTestSection;
2527
import dev.cel.testing.testrunner.CelTestSuite.CelTestSection.CelTestCase;
26-
import io.github.classgraph.ClassGraph;
2728
import io.github.classgraph.ClassInfoList;
28-
import io.github.classgraph.ScanResult;
2929
import java.io.File;
3030
import java.io.IOException;
3131
import java.lang.reflect.Method;
@@ -166,12 +166,8 @@ private void setStartMillis(long startMillis) {
166166
public static void runTests() throws Exception {
167167
String testSuitePath = System.getProperty("test_suite_path");
168168

169-
// Using `enableAllInfo()` to scan all class files upfront. This avoids repeated parsing
170-
// of class files by individual methods, improving efficiency.
171-
ScanResult scanResult = new ClassGraph().enableAllInfo().scan();
172-
173169
CelTestSuite testSuite;
174-
testSuite = readCustomTestSuite(scanResult);
170+
testSuite = readCustomTestSuite();
175171

176172
if (testSuitePath != null) {
177173
if (testSuite != null) {
@@ -184,7 +180,7 @@ public static void runTests() throws Exception {
184180
throw new IllegalArgumentException("Neither test_suite_path nor TestSuiteSupplier is set.");
185181
}
186182

187-
Class<?> testClass = getUserTestClass(scanResult);
183+
Class<?> testClass = getUserTestClass();
188184
String envXmlFile = System.getenv("XML_OUTPUT_FILE");
189185
JUnitXmlReporter testReporter = new JUnitXmlReporter(envXmlFile);
190186
TestContext testContext = new TestContext();
@@ -245,9 +241,9 @@ public String describe() {
245241
}
246242
}
247243

248-
private static CelTestSuite readCustomTestSuite(ScanResult scanResult) throws Exception {
244+
private static CelTestSuite readCustomTestSuite() throws Exception {
249245
ClassInfoList classInfoList =
250-
scanResult.getClassesWithMethodAnnotation(CEL_TESTSUITE_ANNOTATION_CLASS.getName());
246+
loadClassesWithMethodAnnotation(CEL_TESTSUITE_ANNOTATION_CLASS.getName());
251247
if (classInfoList.isEmpty()) {
252248
return null;
253249
}
@@ -278,8 +274,8 @@ private static Method getMethodWithAnnotation(Class<?> clazz) {
278274
return testSuiteSupplierMethod;
279275
}
280276

281-
private static Class<?> getUserTestClass(ScanResult scanResult) {
282-
ClassInfoList subClassInfoList = scanResult.getSubclasses(CelUserTestTemplate.class);
277+
private static Class<?> getUserTestClass() {
278+
ClassInfoList subClassInfoList = loadSubclasses(CelUserTestTemplate.class);
283279
if (subClassInfoList.size() != 1) {
284280
throw new IllegalArgumentException(
285281
"Expected 1 subclass for CelUserTestTemplate, but got "

0 commit comments

Comments
 (0)