Skip to content

Commit f6feb62

Browse files
l46kokcopybara-github
authored andcommitted
Restructure Java test runner to not require JVM classinfo inspection for loading descriptors
PiperOrigin-RevId: 900811839
1 parent 4f9a3a8 commit f6feb62

13 files changed

Lines changed: 146 additions & 123 deletions

File tree

common/src/main/java/dev/cel/common/internal/BUILD.bazel

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -396,18 +396,6 @@ java_library(
396396
],
397397
)
398398

399-
java_library(
400-
name = "proto_java_qualified_names",
401-
srcs = ["ProtoJavaQualifiedNames.java"],
402-
tags = [
403-
],
404-
deps = [
405-
"//common/annotations",
406-
"@maven//:com_google_guava_guava",
407-
"@maven//:com_google_protobuf_protobuf_java",
408-
],
409-
)
410-
411399
java_library(
412400
name = "reflection_util",
413401
srcs = ["ReflectionUtil.java"],

testing/BUILD.bazel

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,13 @@ java_library(
4545
name = "expr_value_utils",
4646
exports = ["//testing/src/main/java/dev/cel/testing/utils:expr_value_utils"],
4747
)
48+
49+
java_library(
50+
name = "dynamic_default_instance_message_factory",
51+
exports = ["//testing/src/main/java/dev/cel/testing/utils:dynamic_default_instance_message_factory"],
52+
)
53+
54+
java_library(
55+
name = "proto_descriptor_utils",
56+
exports = ["//testing/src/main/java/dev/cel/testing/testrunner:proto_descriptor_utils"],
57+
)

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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ java_library(
8686
":cel_expression_source",
8787
":cel_test_context",
8888
":cel_test_suite",
89+
":proto_descriptor_utils",
8990
":registry_utils",
9091
":result_matcher",
9192
"//bundle:cel",
@@ -104,7 +105,6 @@ java_library(
104105
"//policy:validation_exception",
105106
"//runtime",
106107
"//testing:expr_value_utils",
107-
"//testing/testrunner:proto_descriptor_utils",
108108
"@cel_spec//proto/cel/expr:expr_java_proto",
109109
"@maven//:com_google_guava_guava",
110110
"@maven//:com_google_protobuf_protobuf_java",
@@ -162,14 +162,14 @@ java_library(
162162
deps = [
163163
":cel_expression_source",
164164
":default_result_matcher",
165+
":proto_descriptor_utils",
165166
":result_matcher",
166167
"//:auto_value",
167168
"//bundle:cel",
168169
"//common:cel_descriptor_util",
169170
"//common:options",
170171
"//policy:parser",
171172
"//runtime",
172-
"//testing/testrunner:proto_descriptor_utils",
173173
"@maven//:com_google_errorprone_error_prone_annotations",
174174
"@maven//:com_google_guava_guava",
175175
"@maven//:com_google_protobuf_protobuf_java",
@@ -182,8 +182,19 @@ java_library(
182182
tags = [
183183
],
184184
deps = [
185-
"//common/internal:default_instance_message_factory",
186-
"//testing/testrunner:proto_descriptor_utils",
185+
":proto_descriptor_utils",
186+
"//testing:dynamic_default_instance_message_factory",
187+
"@maven//:com_google_protobuf_protobuf_java",
188+
],
189+
)
190+
191+
java_library(
192+
name = "proto_descriptor_utils",
193+
srcs = ["ProtoDescriptorUtils.java"],
194+
deps = [
195+
"//common:cel_descriptor_util",
196+
"//common:cel_descriptors",
197+
"@maven//:com_google_guava_guava",
187198
"@maven//:com_google_protobuf_protobuf_java",
188199
],
189200
)

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

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@
2525
import dev.cel.bundle.Cel;
2626
import dev.cel.bundle.CelFactory;
2727
import dev.cel.common.CelDescriptorUtil;
28+
import dev.cel.common.CelDescriptors;
2829
import dev.cel.common.CelOptions;
2930
import dev.cel.policy.CelPolicyParser;
3031
import dev.cel.runtime.CelLateFunctionBindings;
31-
import dev.cel.testing.utils.ProtoDescriptorUtils;
3232
import java.io.IOException;
3333
import java.util.Arrays;
3434
import java.util.Map;
@@ -125,6 +125,19 @@ public interface BindingTransformer {
125125

126126
abstract ImmutableSet<FileDescriptor> fileTypes();
127127

128+
@Memoized
129+
public Optional<CelDescriptors> celDescriptors() {
130+
if (fileDescriptorSetPath().isPresent()) {
131+
try {
132+
return Optional.of(ProtoDescriptorUtils.getDescriptorsFromFile(fileDescriptorSetPath().get()));
133+
} catch (IOException e) {
134+
throw new IllegalStateException(
135+
"Failed to load descriptors from path: " + fileDescriptorSetPath().get(), e);
136+
}
137+
}
138+
return Optional.empty();
139+
}
140+
128141
@Memoized
129142
public Optional<TypeRegistry> typeRegistry() {
130143
if (fileTypes().isEmpty() && !fileDescriptorSetPath().isPresent()) {
@@ -136,15 +149,8 @@ public Optional<TypeRegistry> typeRegistry() {
136149
CelDescriptorUtil.getAllDescriptorsFromFileDescriptor(fileTypes())
137150
.messageTypeDescriptors());
138151
}
139-
if (fileDescriptorSetPath().isPresent()) {
140-
try {
141-
builder.add(
142-
ProtoDescriptorUtils.getAllDescriptorsFromJvm(fileDescriptorSetPath().get())
143-
.messageTypeDescriptors());
144-
} catch (IOException e) {
145-
throw new IllegalStateException(
146-
"Failed to load descriptors from path: " + fileDescriptorSetPath().get(), e);
147-
}
152+
if (celDescriptors().isPresent()) {
153+
builder.add(celDescriptors().get().messageTypeDescriptors());
148154
}
149155
return Optional.of(builder.build());
150156
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.google.protobuf.TextFormat;
2323
import com.google.protobuf.TextFormat.ParseException;
2424
import com.google.protobuf.TypeRegistry;
25+
import dev.cel.common.CelDescriptors;
2526
import dev.cel.common.annotations.Internal;
2627
import dev.cel.expr.conformance.test.InputValue;
2728
import dev.cel.expr.conformance.test.TestCase;
@@ -71,8 +72,9 @@ private TestSuite parseTestSuite(
7172
TypeRegistry typeRegistry = customTypeRegistry;
7273
ExtensionRegistry extensionRegistry = customExtensionRegistry;
7374
if (fileDescriptorSetPath != null) {
74-
extensionRegistry = RegistryUtils.getExtensionRegistry(fileDescriptorSetPath);
75-
typeRegistry = RegistryUtils.getTypeRegistry(fileDescriptorSetPath);
75+
CelDescriptors descriptors = ProtoDescriptorUtils.getDescriptorsFromFile(fileDescriptorSetPath);
76+
extensionRegistry = RegistryUtils.getExtensionRegistry(descriptors);
77+
typeRegistry = RegistryUtils.getTypeRegistry(descriptors);
7678
}
7779
TextFormat.Parser parser = TextFormat.Parser.newBuilder().setTypeRegistry(typeRegistry).build();
7880
TestSuite.Builder builder = TestSuite.newBuilder();

testing/src/main/java/dev/cel/testing/utils/ProtoDescriptorUtils.java renamed to testing/src/main/java/dev/cel/testing/testrunner/ProtoDescriptorUtils.java

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2025 Google LLC
1+
// Copyright 2026 Google LLC
22
//
33
// Licensed under the Apache License, Version 2.0 (the "License");
44
// you may not use this file except in compliance with the License.
@@ -11,18 +11,11 @@
1111
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
14-
package dev.cel.testing.utils;
1514

16-
import static com.google.common.collect.ImmutableList.toImmutableList;
17-
import static com.google.common.collect.ImmutableSet.toImmutableSet;
18-
import static dev.cel.testing.utils.ClassLoaderUtils.loadDescriptors;
15+
package dev.cel.testing.testrunner;
1916

20-
import com.google.common.collect.ImmutableList;
21-
import com.google.common.collect.ImmutableSet;
2217
import com.google.common.io.Files;
2318
import com.google.protobuf.DescriptorProtos.FileDescriptorSet;
24-
import com.google.protobuf.Descriptors.Descriptor;
25-
import com.google.protobuf.Descriptors.FileDescriptor;
2619
import com.google.protobuf.ExtensionRegistry;
2720
import dev.cel.common.CelDescriptorUtil;
2821
import dev.cel.common.CelDescriptors;
@@ -33,30 +26,15 @@
3326
public final class ProtoDescriptorUtils {
3427

3528
/**
36-
* Returns all the descriptors from the JVM.
29+
* Returns all the descriptors from the file descriptor set file.
3730
*
3831
* @return The {@link CelDescriptors} object containing all the descriptors.
3932
*/
40-
public static CelDescriptors getAllDescriptorsFromJvm(String fileDescriptorSetPath)
33+
public static CelDescriptors getDescriptorsFromFile(String fileDescriptorSetPath)
4134
throws IOException {
42-
ImmutableList<Descriptor> compileTimeLoadedDescriptors = loadDescriptors();
4335
FileDescriptorSet fileDescriptorSet = getFileDescriptorSet(fileDescriptorSetPath);
44-
ImmutableSet<String> runtimeFileDescriptorNames =
45-
CelDescriptorUtil.getFileDescriptorsFromFileDescriptorSet(fileDescriptorSet).stream()
46-
.map(FileDescriptor::getFullName)
47-
.collect(toImmutableSet());
48-
49-
// Get all the file descriptors from the descriptors which are loaded from the JVM and use the
50-
// ones which match the ones provided by the user in the file descriptor set.
51-
ImmutableList<FileDescriptor> userProvidedFileDescriptors =
52-
CelDescriptorUtil.getFileDescriptorsForDescriptors(compileTimeLoadedDescriptors).stream()
53-
.filter(
54-
fileDescriptor -> runtimeFileDescriptorNames.contains(fileDescriptor.getFullName()))
55-
.collect(toImmutableList());
56-
57-
// Get all the descriptors from the file descriptors above which include nested, extension and
58-
// message type descriptors as well.
59-
return CelDescriptorUtil.getAllDescriptorsFromFileDescriptor(userProvidedFileDescriptors);
36+
return CelDescriptorUtil.getAllDescriptorsFromFileDescriptor(
37+
CelDescriptorUtil.getFileDescriptorsFromFileDescriptorSet(fileDescriptorSet));
6038
}
6139

6240
private static FileDescriptorSet getFileDescriptorSet(String fileDescriptorSetPath)

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

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

16-
import static dev.cel.testing.utils.ProtoDescriptorUtils.getAllDescriptorsFromJvm;
16+
1717

1818
import com.google.protobuf.Descriptors.FieldDescriptor;
1919
import com.google.protobuf.ExtensionRegistry;
2020
import com.google.protobuf.Message;
2121
import com.google.protobuf.TypeRegistry;
22-
import dev.cel.common.internal.DefaultInstanceMessageFactory;
23-
import java.io.IOException;
22+
import dev.cel.common.CelDescriptors;
23+
import dev.cel.testing.utils.DynamicDefaultInstanceMessageFactory;
2424
import java.util.NoSuchElementException;
2525

2626
/** Utility class for creating registries from a file descriptor set. */
2727
public final class RegistryUtils {
2828

2929
/** Returns the {@link TypeRegistry} for the given file descriptor set. */
30-
public static TypeRegistry getTypeRegistry(String fileDescriptorSetPath) throws IOException {
30+
public static TypeRegistry getTypeRegistry(CelDescriptors descriptors) {
3131
return TypeRegistry.newBuilder()
32-
.add(getAllDescriptorsFromJvm(fileDescriptorSetPath).messageTypeDescriptors())
32+
.add(descriptors.messageTypeDescriptors())
3333
.build();
3434
}
3535

3636
/** Returns the {@link ExtensionRegistry} for the given file descriptor set. */
37-
public static ExtensionRegistry getExtensionRegistry(String fileDescriptorSetPath)
38-
throws IOException {
37+
public static ExtensionRegistry getExtensionRegistry(CelDescriptors descriptors) {
3938
ExtensionRegistry extensionRegistry = ExtensionRegistry.newInstance();
4039

41-
getAllDescriptorsFromJvm(fileDescriptorSetPath)
40+
descriptors
4241
.extensionDescriptors()
4342
.forEach(
4443
(descriptorName, descriptor) -> {
4544
if (descriptor.getType().equals(FieldDescriptor.Type.MESSAGE)) {
4645
Message output =
47-
DefaultInstanceMessageFactory.getInstance()
46+
DynamicDefaultInstanceMessageFactory.getInstance()
4847
.getPrototype(descriptor.getMessageType())
4948
.orElseThrow(
5049
() ->

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,8 @@ public String describe() {
236236
testResult.setStatus(JUnitXmlReporter.TestResult.FAILURE);
237237
testResult.setThrowable(result.getFailures().get(0).getException());
238238
testReporter.onTestFailure(testResult);
239+
System.err.println("Test failed: " + testName);
240+
result.getFailures().forEach(failure -> failure.getException().printStackTrace());
239241
}
240242
}
241243
}

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

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
import dev.cel.testing.testrunner.CelTestSuite.CelTestSection.CelTestCase;
5353
import dev.cel.testing.testrunner.CelTestSuite.CelTestSection.CelTestCase.Input.Binding;
5454
import dev.cel.testing.testrunner.ResultMatcher.ResultMatcherParams;
55-
import dev.cel.testing.utils.ProtoDescriptorUtils;
5655
import java.io.File;
5756
import java.io.IOException;
5857
import java.nio.file.Paths;
@@ -206,11 +205,9 @@ private static Cel extendCel(CelTestContext celTestContext, CelOptions celOption
206205
extendedCel
207206
.toCelBuilder()
208207
.addMessageTypes(
209-
ProtoDescriptorUtils.getAllDescriptorsFromJvm(
210-
celTestContext.fileDescriptorSetPath().get())
211-
.messageTypeDescriptors())
208+
celTestContext.celDescriptors().get().messageTypeDescriptors())
212209
.setExtensionRegistry(
213-
RegistryUtils.getExtensionRegistry(celTestContext.fileDescriptorSetPath().get()))
210+
RegistryUtils.getExtensionRegistry(celTestContext.celDescriptors().get()))
214211
.build();
215212
}
216213

@@ -369,13 +366,13 @@ private static Message unpackAny(Any any, CelTestContext celTestContext) throws
369366
"Proto descriptors are required for unpacking Any messages.");
370367
}
371368
Descriptor descriptor =
372-
RegistryUtils.getTypeRegistry(celTestContext.fileDescriptorSetPath().get())
369+
RegistryUtils.getTypeRegistry(celTestContext.celDescriptors().get())
373370
.getDescriptorForTypeUrl(any.getTypeUrl());
374371
return getDefaultInstance(descriptor)
375372
.getParserForType()
376373
.parseFrom(
377374
any.getValue(),
378-
RegistryUtils.getExtensionRegistry(celTestContext.fileDescriptorSetPath().get()));
375+
RegistryUtils.getExtensionRegistry(celTestContext.celDescriptors().get()));
379376
}
380377

381378
private static Message getDefaultInstance(Descriptor descriptor) throws IOException {

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

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@ java_library(
1515
tags = [
1616
],
1717
deps = [
18-
"//common:cel_descriptor_util",
19-
"//common:cel_descriptors",
20-
"//common/internal:default_instance_message_factory",
18+
":dynamic_default_instance_message_factory",
2119
"//common/internal:proto_time_utils",
2220
"//common/types",
2321
"//common/types:type_providers",
@@ -26,8 +24,6 @@ java_library(
2624
"//runtime:unknown_attributes",
2725
"//testing/testrunner:registry_utils",
2826
"@cel_spec//proto/cel/expr:expr_java_proto",
29-
"@cel_spec//proto/cel/expr/conformance/proto2:test_all_types_java_proto",
30-
"@cel_spec//proto/cel/expr/conformance/proto3:test_all_types_java_proto",
3127
"@maven//:com_google_guava_guava",
3228
"@maven//:com_google_protobuf_protobuf_java",
3329
"@maven_android//:com_google_protobuf_protobuf_javalite",
@@ -41,21 +37,15 @@ java_library(
4137
],
4238
deps = [
4339
"@maven//:com_google_guava_guava",
44-
"@maven//:com_google_protobuf_protobuf_java",
4540
"@maven//:io_github_classgraph_classgraph",
4641
],
4742
)
4843

4944
java_library(
50-
name = "proto_descriptor_utils",
51-
srcs = ["ProtoDescriptorUtils.java"],
52-
tags = [
53-
],
45+
name = "dynamic_default_instance_message_factory",
46+
srcs = ["DynamicDefaultInstanceMessageFactory.java"],
5447
deps = [
55-
"//common:cel_descriptor_util",
56-
"//common:cel_descriptors",
57-
"//testing/testrunner:class_loader_utils",
58-
"@maven//:com_google_guava_guava",
48+
"//common/internal:proto_java_qualified_names",
5949
"@maven//:com_google_protobuf_protobuf_java",
6050
],
6151
)

0 commit comments

Comments
 (0)