Skip to content

Commit ca1f220

Browse files
committed
Simplify entitlement rest test discovery (#125449)
This commit cleans up how entitlement test methods are discovered. It also adds another robustness check to ensure an annotation doesn't exist on a private method.
1 parent 6c8ac6e commit ca1f220

File tree

1 file changed

+41
-31
lines changed

1 file changed

+41
-31
lines changed

libs/entitlement/qa/entitlement-test-plugin/src/main/java/org/elasticsearch/entitlement/qa/test/RestEntitlementsCheckAction.java

Lines changed: 41 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,8 @@
2929
import java.util.Map;
3030
import java.util.Map.Entry;
3131
import java.util.Set;
32-
import java.util.function.Function;
32+
import java.util.function.Predicate;
3333
import java.util.stream.Collectors;
34-
import java.util.stream.Stream;
3534

3635
import static java.util.Map.entry;
3736
import static org.elasticsearch.entitlement.qa.test.EntitlementTest.ExpectedAccess.ALWAYS_ALLOWED;
@@ -49,27 +48,34 @@ record CheckAction(
4948
Integer fromJavaVersion
5049
) {}
5150

52-
private static final Map<String, CheckAction> checkActions = Stream.of(
53-
getTestEntries(FileCheckActions.class),
54-
getTestEntries(FileStoreActions.class),
55-
getTestEntries(JvmActions.class),
56-
getTestEntries(LoadNativeLibrariesCheckActions.class),
57-
getTestEntries(ManageThreadsActions.class),
58-
getTestEntries(NativeActions.class),
59-
getTestEntries(NetworkAccessCheckActions.class),
60-
getTestEntries(NioChannelsActions.class),
61-
getTestEntries(NioFilesActions.class),
62-
getTestEntries(NioFileSystemActions.class),
63-
getTestEntries(OperatingSystemActions.class),
64-
getTestEntries(PathActions.class),
65-
getTestEntries(SpiActions.class),
66-
getTestEntries(SystemActions.class),
67-
getTestEntries(URLConnectionFileActions.class),
68-
getTestEntries(URLConnectionNetworkActions.class)
69-
)
70-
.flatMap(Function.identity())
71-
.filter(entry -> entry.getValue().fromJavaVersion() == null || Runtime.version().feature() >= entry.getValue().fromJavaVersion())
72-
.collect(Collectors.toUnmodifiableMap(Entry::getKey, Entry::getValue));
51+
private static final Map<String, CheckAction> checkActions = collectTests(
52+
FileCheckActions.class,
53+
FileStoreActions.class,
54+
JvmActions.class,
55+
LoadNativeLibrariesCheckActions.class,
56+
ManageThreadsActions.class,
57+
NativeActions.class,
58+
NetworkAccessCheckActions.class,
59+
NioChannelsActions.class,
60+
NioFilesActions.class,
61+
NioFileSystemActions.class,
62+
OperatingSystemActions.class,
63+
PathActions.class,
64+
SpiActions.class,
65+
SystemActions.class,
66+
URLConnectionFileActions.class,
67+
URLConnectionNetworkActions.class
68+
);
69+
70+
private static Map<String, CheckAction> collectTests(Class<?>... testClasses) {
71+
List<Entry<String, CheckAction>> entries = new ArrayList<>();
72+
for (Class<?> testClass : testClasses) {
73+
getTestEntries(entries, testClass, a -> a.fromJavaVersion() == null || Runtime.version().feature() >= a.fromJavaVersion());
74+
}
75+
@SuppressWarnings({ "unchecked", "rawtypes" })
76+
Entry<String, CheckAction>[] entriesArray = entries.toArray(new Entry[0]);
77+
return Map.ofEntries(entriesArray);
78+
}
7379

7480
private final Environment environment;
7581

@@ -82,8 +88,7 @@ private static Method[] getDeclaredMethods(Class<?> clazz) {
8288
return clazz.getDeclaredMethods();
8389
}
8490

85-
private static Stream<Entry<String, CheckAction>> getTestEntries(Class<?> actionsClass) {
86-
List<Entry<String, CheckAction>> entries = new ArrayList<>();
91+
private static void getTestEntries(List<Entry<String, CheckAction>> entries, Class<?> actionsClass, Predicate<CheckAction> filter) {
8792
for (var method : getDeclaredMethods(actionsClass)) {
8893
var testAnnotation = method.getAnnotation(EntitlementTest.class);
8994
if (testAnnotation == null) {
@@ -92,6 +97,9 @@ private static Stream<Entry<String, CheckAction>> getTestEntries(Class<?> action
9297
if (Modifier.isStatic(method.getModifiers()) == false) {
9398
throw new AssertionError("Entitlement test method [" + method + "] must be static");
9499
}
100+
if (Modifier.isPrivate(method.getModifiers())) {
101+
throw new AssertionError("Entitlement test method [" + method + "] must not be private");
102+
}
95103
final CheckedConsumer<Environment, Exception> call = createConsumerForMethod(method);
96104
CheckedConsumer<Environment, Exception> runnable = env -> {
97105
try {
@@ -107,14 +115,16 @@ private static Stream<Entry<String, CheckAction>> getTestEntries(Class<?> action
107115
}
108116
};
109117
Integer fromJavaVersion = testAnnotation.fromJavaVersion() == -1 ? null : testAnnotation.fromJavaVersion();
110-
entries.add(
111-
entry(
112-
method.getName(),
113-
new CheckAction(runnable, testAnnotation.expectedAccess(), testAnnotation.expectedExceptionIfDenied(), fromJavaVersion)
114-
)
118+
var checkAction = new CheckAction(
119+
runnable,
120+
testAnnotation.expectedAccess(),
121+
testAnnotation.expectedExceptionIfDenied(),
122+
fromJavaVersion
115123
);
124+
if (filter.test(checkAction)) {
125+
entries.add(entry(method.getName(), checkAction));
126+
}
116127
}
117-
return entries.stream();
118128
}
119129

120130
private static CheckedConsumer<Environment, Exception> createConsumerForMethod(Method method) {

0 commit comments

Comments
 (0)