Skip to content

Commit 5ab175e

Browse files
authored
Move spi and system actions into separate classes (#121555)
This commit moves methods used to test spi and system actions out of RestEntitlementsCheckAction into separate classes, to ease future merges.
1 parent c8053d4 commit 5ab175e

File tree

4 files changed

+151
-121
lines changed

4 files changed

+151
-121
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
enum ExpectedAccess {
2121
PLUGINS,
2222
ES_MODULES_ONLY,
23+
SERVER_ONLY,
2324
ALWAYS_DENIED
2425
}
2526

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

Lines changed: 7 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,6 @@
1313
import org.elasticsearch.common.Strings;
1414
import org.elasticsearch.core.CheckedRunnable;
1515
import org.elasticsearch.core.SuppressForbidden;
16-
import org.elasticsearch.entitlement.qa.test.DummyImplementations.DummyBreakIteratorProvider;
17-
import org.elasticsearch.entitlement.qa.test.DummyImplementations.DummyCalendarDataProvider;
18-
import org.elasticsearch.entitlement.qa.test.DummyImplementations.DummyCalendarNameProvider;
19-
import org.elasticsearch.entitlement.qa.test.DummyImplementations.DummyCollatorProvider;
20-
import org.elasticsearch.entitlement.qa.test.DummyImplementations.DummyCurrencyNameProvider;
21-
import org.elasticsearch.entitlement.qa.test.DummyImplementations.DummyDateFormatProvider;
22-
import org.elasticsearch.entitlement.qa.test.DummyImplementations.DummyDateFormatSymbolsProvider;
23-
import org.elasticsearch.entitlement.qa.test.DummyImplementations.DummyDecimalFormatSymbolsProvider;
24-
import org.elasticsearch.entitlement.qa.test.DummyImplementations.DummyLocaleNameProvider;
25-
import org.elasticsearch.entitlement.qa.test.DummyImplementations.DummyLocaleServiceProvider;
26-
import org.elasticsearch.entitlement.qa.test.DummyImplementations.DummyNumberFormatProvider;
27-
import org.elasticsearch.entitlement.qa.test.DummyImplementations.DummyTimeZoneNameProvider;
2816
import org.elasticsearch.logging.LogManager;
2917
import org.elasticsearch.logging.Logger;
3018
import org.elasticsearch.rest.BaseRestHandler;
@@ -59,6 +47,7 @@
5947
import java.util.Map;
6048
import java.util.Map.Entry;
6149
import java.util.Set;
50+
import java.util.function.Function;
6251
import java.util.stream.Collectors;
6352
import java.util.stream.Stream;
6453

@@ -75,7 +64,6 @@
7564
@SuppressWarnings("unused")
7665
public class RestEntitlementsCheckAction extends BaseRestHandler {
7766
private static final Logger logger = LogManager.getLogger(RestEntitlementsCheckAction.class);
78-
public static final Thread NO_OP_SHUTDOWN_HOOK = new Thread(() -> {}, "Shutdown hook for testing");
7967

8068
record CheckAction(CheckedRunnable<Exception> action, boolean isAlwaysDeniedToPlugins, Integer fromJavaVersion) {
8169
/**
@@ -94,39 +82,19 @@ static CheckAction alwaysDenied(CheckedRunnable<Exception> action) {
9482
}
9583
}
9684

97-
private static final Map<String, CheckAction> checkActions = Stream.concat(
85+
private static final Map<String, CheckAction> checkActions = Stream.of(
9886
Stream.<Entry<String, CheckAction>>of(
99-
entry("runtime_exit", deniedToPlugins(RestEntitlementsCheckAction::runtimeExit)),
100-
entry("runtime_halt", deniedToPlugins(RestEntitlementsCheckAction::runtimeHalt)),
101-
entry("system_exit", deniedToPlugins(RestEntitlementsCheckAction::systemExit)),
10287
entry("create_classloader", forPlugins(RestEntitlementsCheckAction::createClassLoader)),
10388
entry("processBuilder_start", deniedToPlugins(RestEntitlementsCheckAction::processBuilder_start)),
10489
entry("processBuilder_startPipeline", deniedToPlugins(RestEntitlementsCheckAction::processBuilder_startPipeline)),
10590
entry("set_https_connection_properties", forPlugins(RestEntitlementsCheckAction::setHttpsConnectionProperties)),
10691
entry("set_default_ssl_socket_factory", alwaysDenied(RestEntitlementsCheckAction::setDefaultSSLSocketFactory)),
10792
entry("set_default_hostname_verifier", alwaysDenied(RestEntitlementsCheckAction::setDefaultHostnameVerifier)),
10893
entry("set_default_ssl_context", alwaysDenied(RestEntitlementsCheckAction::setDefaultSSLContext)),
109-
entry("system_setIn", alwaysDenied(RestEntitlementsCheckAction::system$$setIn)),
110-
entry("system_setOut", alwaysDenied(RestEntitlementsCheckAction::system$$setOut)),
111-
entry("system_setErr", alwaysDenied(RestEntitlementsCheckAction::system$$setErr)),
112-
entry("runtime_addShutdownHook", alwaysDenied(RestEntitlementsCheckAction::runtime$addShutdownHook)),
113-
entry("runtime_removeShutdownHook", alwaysDenied(RestEntitlementsCheckAction::runtime$$removeShutdownHook)),
11494
entry(
11595
"thread_setDefaultUncaughtExceptionHandler",
11696
alwaysDenied(RestEntitlementsCheckAction::thread$$setDefaultUncaughtExceptionHandler)
11797
),
118-
entry("localeServiceProvider", alwaysDenied(RestEntitlementsCheckAction::localeServiceProvider$)),
119-
entry("breakIteratorProvider", alwaysDenied(RestEntitlementsCheckAction::breakIteratorProvider$)),
120-
entry("collatorProvider", alwaysDenied(RestEntitlementsCheckAction::collatorProvider$)),
121-
entry("dateFormatProvider", alwaysDenied(RestEntitlementsCheckAction::dateFormatProvider$)),
122-
entry("dateFormatSymbolsProvider", alwaysDenied(RestEntitlementsCheckAction::dateFormatSymbolsProvider$)),
123-
entry("decimalFormatSymbolsProvider", alwaysDenied(RestEntitlementsCheckAction::decimalFormatSymbolsProvider$)),
124-
entry("numberFormatProvider", alwaysDenied(RestEntitlementsCheckAction::numberFormatProvider$)),
125-
entry("calendarDataProvider", alwaysDenied(RestEntitlementsCheckAction::calendarDataProvider$)),
126-
entry("calendarNameProvider", alwaysDenied(RestEntitlementsCheckAction::calendarNameProvider$)),
127-
entry("currencyNameProvider", alwaysDenied(RestEntitlementsCheckAction::currencyNameProvider$)),
128-
entry("localeNameProvider", alwaysDenied(RestEntitlementsCheckAction::localeNameProvider$)),
129-
entry("timeZoneNameProvider", alwaysDenied(RestEntitlementsCheckAction::timeZoneNameProvider$)),
13098
entry("logManager", alwaysDenied(RestEntitlementsCheckAction::logManager$)),
13199

132100
entry("locale_setDefault", alwaysDenied(WritePropertiesCheckActions::setDefaultLocale)),
@@ -230,8 +198,11 @@ static CheckAction alwaysDenied(CheckedRunnable<Exception> action) {
230198
entry("symbol_lookup_name", new CheckAction(VersionSpecificNativeChecks::symbolLookupWithName, false, 22)),
231199
entry("symbol_lookup_path", new CheckAction(VersionSpecificNativeChecks::symbolLookupWithPath, false, 22))
232200
),
233-
getTestEntries(FileCheckActions.class)
201+
getTestEntries(FileCheckActions.class),
202+
getTestEntries(SpiActions.class),
203+
getTestEntries(SystemActions.class)
234204
)
205+
.flatMap(Function.identity())
235206
.filter(entry -> entry.getValue().fromJavaVersion() == null || Runtime.version().feature() >= entry.getValue().fromJavaVersion())
236207
.collect(Collectors.toUnmodifiableMap(Entry::getKey, Entry::getValue));
237208

@@ -267,7 +238,7 @@ private static Stream<Entry<String, CheckAction>> getTestEntries(Class<?> action
267238
}
268239
}
269240
};
270-
boolean deniedToPlugins = testAnnotation.expectedAccess() == PLUGINS;
241+
boolean deniedToPlugins = testAnnotation.expectedAccess() != PLUGINS;
271242
Integer fromJavaVersion = testAnnotation.fromJavaVersion() == -1 ? null : testAnnotation.fromJavaVersion();
272243
entries.add(entry(method.getName(), new CheckAction(runnable, deniedToPlugins, fromJavaVersion)));
273244
}
@@ -323,21 +294,6 @@ private static void setDefaultSSLSocketFactory() {
323294
HttpsURLConnection.setDefaultSSLSocketFactory(new DummyImplementations.DummySSLSocketFactory());
324295
}
325296

326-
@SuppressForbidden(reason = "Specifically testing Runtime.exit")
327-
private static void runtimeExit() {
328-
Runtime.getRuntime().exit(123);
329-
}
330-
331-
@SuppressForbidden(reason = "Specifically testing Runtime.halt")
332-
private static void runtimeHalt() {
333-
Runtime.getRuntime().halt(123);
334-
}
335-
336-
@SuppressForbidden(reason = "Specifically testing System.exit")
337-
private static void systemExit() {
338-
System.exit(123);
339-
}
340-
341297
private static void createClassLoader() throws IOException {
342298
try (var classLoader = new URLClassLoader("test", new URL[0], RestEntitlementsCheckAction.class.getClassLoader())) {
343299
logger.info("Created URLClassLoader [{}]", classLoader.getName());
@@ -356,80 +312,10 @@ private static void setHttpsConnectionProperties() {
356312
new DummyImplementations.DummyHttpsURLConnection().setSSLSocketFactory(new DummyImplementations.DummySSLSocketFactory());
357313
}
358314

359-
private static void system$$setIn() {
360-
System.setIn(System.in);
361-
}
362-
363-
@SuppressForbidden(reason = "This should be a no-op so we don't interfere with system streams")
364-
private static void system$$setOut() {
365-
System.setOut(System.out);
366-
}
367-
368-
@SuppressForbidden(reason = "This should be a no-op so we don't interfere with system streams")
369-
private static void system$$setErr() {
370-
System.setErr(System.err);
371-
}
372-
373-
private static void runtime$addShutdownHook() {
374-
Runtime.getRuntime().addShutdownHook(NO_OP_SHUTDOWN_HOOK);
375-
}
376-
377-
private static void runtime$$removeShutdownHook() {
378-
Runtime.getRuntime().removeShutdownHook(NO_OP_SHUTDOWN_HOOK);
379-
}
380-
381315
private static void thread$$setDefaultUncaughtExceptionHandler() {
382316
Thread.setDefaultUncaughtExceptionHandler(Thread.getDefaultUncaughtExceptionHandler());
383317
}
384318

385-
private static void localeServiceProvider$() {
386-
new DummyLocaleServiceProvider();
387-
}
388-
389-
private static void breakIteratorProvider$() {
390-
new DummyBreakIteratorProvider();
391-
}
392-
393-
private static void collatorProvider$() {
394-
new DummyCollatorProvider();
395-
}
396-
397-
private static void dateFormatProvider$() {
398-
new DummyDateFormatProvider();
399-
}
400-
401-
private static void dateFormatSymbolsProvider$() {
402-
new DummyDateFormatSymbolsProvider();
403-
}
404-
405-
private static void decimalFormatSymbolsProvider$() {
406-
new DummyDecimalFormatSymbolsProvider();
407-
}
408-
409-
private static void numberFormatProvider$() {
410-
new DummyNumberFormatProvider();
411-
}
412-
413-
private static void calendarDataProvider$() {
414-
new DummyCalendarDataProvider();
415-
}
416-
417-
private static void calendarNameProvider$() {
418-
new DummyCalendarNameProvider();
419-
}
420-
421-
private static void currencyNameProvider$() {
422-
new DummyCurrencyNameProvider();
423-
}
424-
425-
private static void localeNameProvider$() {
426-
new DummyLocaleNameProvider();
427-
}
428-
429-
private static void timeZoneNameProvider$() {
430-
new DummyTimeZoneNameProvider();
431-
}
432-
433319
private static void logManager$() {
434320
new java.util.logging.LogManager() {
435321
};
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the "Elastic License
4+
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
5+
* Public License v 1"; you may not use this file except in compliance with, at
6+
* your election, the "Elastic License 2.0", the "GNU Affero General Public
7+
* License v3.0 only", or the "Server Side Public License, v 1".
8+
*/
9+
10+
package org.elasticsearch.entitlement.qa.test;
11+
12+
import static org.elasticsearch.entitlement.qa.test.EntitlementTest.ExpectedAccess.ALWAYS_DENIED;
13+
14+
class SpiActions {
15+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
16+
static void createBreakIteratorProvider() {
17+
new DummyImplementations.DummyBreakIteratorProvider();
18+
}
19+
20+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
21+
static void createCollatorProvider() {
22+
new DummyImplementations.DummyCollatorProvider();
23+
}
24+
25+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
26+
static void createDateFormatProvider() {
27+
new DummyImplementations.DummyDateFormatProvider();
28+
}
29+
30+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
31+
static void createDateFormatSymbolsProvider() {
32+
new DummyImplementations.DummyDateFormatSymbolsProvider();
33+
}
34+
35+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
36+
static void createDecimalFormatSymbolsProvider() {
37+
new DummyImplementations.DummyDecimalFormatSymbolsProvider();
38+
}
39+
40+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
41+
static void createNumberFormatProvider() {
42+
new DummyImplementations.DummyNumberFormatProvider();
43+
}
44+
45+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
46+
static void createCalendarDataProvider() {
47+
new DummyImplementations.DummyCalendarDataProvider();
48+
}
49+
50+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
51+
static void createCalendarNameProvider() {
52+
new DummyImplementations.DummyCalendarNameProvider();
53+
}
54+
55+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
56+
static void createCurrencyNameProvider() {
57+
new DummyImplementations.DummyCurrencyNameProvider();
58+
}
59+
60+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
61+
static void createLocaleNameProvider() {
62+
new DummyImplementations.DummyLocaleNameProvider();
63+
}
64+
65+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
66+
static void createTimeZoneNameProvider() {
67+
new DummyImplementations.DummyTimeZoneNameProvider();
68+
}
69+
70+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
71+
static void createLocaleServiceProvider() {
72+
new DummyImplementations.DummyLocaleServiceProvider();
73+
}
74+
75+
private SpiActions() {}
76+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the "Elastic License
4+
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
5+
* Public License v 1"; you may not use this file except in compliance with, at
6+
* your election, the "Elastic License 2.0", the "GNU Affero General Public
7+
* License v3.0 only", or the "Server Side Public License, v 1".
8+
*/
9+
10+
package org.elasticsearch.entitlement.qa.test;
11+
12+
import org.elasticsearch.core.SuppressForbidden;
13+
14+
import static org.elasticsearch.entitlement.qa.test.EntitlementTest.ExpectedAccess.ALWAYS_DENIED;
15+
import static org.elasticsearch.entitlement.qa.test.EntitlementTest.ExpectedAccess.SERVER_ONLY;
16+
17+
class SystemActions {
18+
19+
@SuppressForbidden(reason = "Specifically testing Runtime.exit")
20+
@EntitlementTest(expectedAccess = SERVER_ONLY)
21+
static void runtimeExit() {
22+
Runtime.getRuntime().exit(123);
23+
}
24+
25+
@SuppressForbidden(reason = "Specifically testing Runtime.halt")
26+
@EntitlementTest(expectedAccess = SERVER_ONLY)
27+
static void runtimeHalt() {
28+
Runtime.getRuntime().halt(123);
29+
}
30+
31+
@SuppressForbidden(reason = "Specifically testing System.exit")
32+
@EntitlementTest(expectedAccess = SERVER_ONLY)
33+
static void systemExit() {
34+
System.exit(123);
35+
}
36+
37+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
38+
static void systemSetIn() {
39+
System.setIn(System.in);
40+
}
41+
42+
@SuppressForbidden(reason = "This should be a no-op so we don't interfere with system streams")
43+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
44+
static void systemSetOut() {
45+
System.setOut(System.out);
46+
}
47+
48+
@SuppressForbidden(reason = "This should be a no-op so we don't interfere with system streams")
49+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
50+
static void systemSetErr() {
51+
System.setErr(System.err);
52+
}
53+
54+
private static final Thread NO_OP_SHUTDOWN_HOOK = new Thread(() -> {}, "Shutdown hook for testing");
55+
56+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
57+
static void runtimeAddShutdownHook() {
58+
Runtime.getRuntime().addShutdownHook(NO_OP_SHUTDOWN_HOOK);
59+
}
60+
61+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
62+
static void runtimeRemoveShutdownHook() {
63+
Runtime.getRuntime().removeShutdownHook(NO_OP_SHUTDOWN_HOOK);
64+
}
65+
66+
private SystemActions() {}
67+
}

0 commit comments

Comments
 (0)