Skip to content

Commit dff7737

Browse files
Automatic merge of master into galahad
2 parents 6157616 + 3ce8deb commit dff7737

File tree

17 files changed

+423
-191
lines changed

17 files changed

+423
-191
lines changed

substratevm/ci/ci.jsonnet

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@
122122
// but since we support JDK 21 anyways, there is not good reason to do so.
123123
"linux:amd64:jdk21": gate + t("30:00"),
124124
}),
125-
"basics": mxgate("build,helloworld,native_unittests,truffle_unittests,debuginfotest,hellomodule,java_agent") + maven + jsonschema + platform_spec(no_jobs) + platform_spec({
125+
"basics": mxgate("build,helloworld,native_unittests,truffle_unittests,debuginfotest,hellomodule,java_agent,condconfig") + maven + jsonschema + platform_spec(no_jobs) + platform_spec({
126126
"linux:amd64:jdk-latest": gate + gdb("14.2") + t("55:00"),
127127
"windows:amd64:jdk-latest": gate + t("1:30:00"),
128128
}) + variants({

substratevm/mx.substratevm/mx_substratevm.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -566,26 +566,28 @@ def conditional_config_task(native_image):
566566
agent_path = build_native_image_agent(native_image)
567567
conditional_config_filter_path = join(svmbuild_dir(), 'conditional-config-filter.json')
568568
with open(conditional_config_filter_path, 'w') as conditional_config_filter:
569-
conditional_config_filter.write(
570-
'''
569+
conditional_config_filter.write('''
571570
{
572571
"rules": [
573572
{"includeClasses": "com.oracle.svm.configure.test.conditionalconfig.**"}
574573
]
575574
}
576-
'''
577-
)
578-
575+
''')
579576
run_agent_conditional_config_test(agent_path, conditional_config_filter_path)
580-
581577
run_nic_conditional_config_test(agent_path, conditional_config_filter_path)
582578

583579

584580
def run_nic_conditional_config_test(agent_path, conditional_config_filter_path):
581+
"""
582+
Invoke ConfigurationGenerator test methods across multiple runs to produce multiple partial traces,
583+
use native-image-configure to compute the conditional configuration, then compare against the expected
584+
configuration.
585+
"""
585586
test_cases = [
586587
"createConfigPartOne",
587588
"createConfigPartTwo",
588589
"createConfigPartThree",
590+
"createConfigPartFour",
589591
]
590592
config_directories = []
591593
nic_test_dir = join(svmbuild_dir(), 'nic-cond-config-test')
@@ -602,10 +604,11 @@ def run_nic_conditional_config_test(agent_path, conditional_config_filter_path):
602604
'com.oracle.svm.configure.test.conditionalconfig.PartialConfigurationGenerator#' + test_case])
603605
config_output_dir = join(nic_test_dir, 'config-output')
604606
nic_exe = mx.cmd_suffix(join(mx.JDKConfig(home=mx_sdk_vm_impl.graalvm_output()).home, 'bin', 'native-image-configure'))
605-
nic_command = [nic_exe, 'create-conditional'] \
606-
+ ['--user-code-filter=' + conditional_config_filter_path] \
607-
+ ['--input-dir=' + config_dir for config_dir in config_directories] \
608-
+ ['--output-dir=' + config_output_dir]
607+
nic_command = [nic_exe, 'generate-conditional',
608+
'--user-code-filter=' + conditional_config_filter_path,
609+
'--class-name-filter=' + conditional_config_filter_path,
610+
'--output-dir=' + config_output_dir] \
611+
+ ['--input-dir=' + config_dir for config_dir in config_directories]
609612
mx.run(nic_command)
610613
jvm_unittest(
611614
['-Dcom.oracle.svm.configure.test.conditionalconfig.ConfigurationVerifier.configpath=' + config_output_dir,
@@ -619,7 +622,8 @@ def run_agent_conditional_config_test(agent_path, conditional_config_filter_path
619622
mx.rmtree(config_dir)
620623

621624
agent_opts = ['config-output-dir=' + config_dir,
622-
'experimental-conditional-config-filter-file=' + conditional_config_filter_path]
625+
'experimental-conditional-config-filter-file=' + conditional_config_filter_path,
626+
'conditional-config-class-filter-file=' + conditional_config_filter_path]
623627
# This run generates the configuration from different test cases
624628
jvm_unittest(['-agentpath:' + agent_path + '=' + ','.join(agent_opts),
625629
'-Dcom.oracle.svm.configure.test.conditionalconfig.ConfigurationGenerator.enabled=true',

substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/conditionalconfig/ConfigurationGenerator.java

Lines changed: 62 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,27 @@
2424
*/
2525
package com.oracle.svm.configure.test.conditionalconfig;
2626

27+
import static org.junit.Assume.assumeTrue;
28+
2729
import java.lang.reflect.Proxy;
2830

2931
import org.junit.Assert;
3032
import org.junit.Test;
3133

34+
/**
35+
* Test that generates configuration metadata when traced by the agent. This output is tested
36+
* against the expected output in the config-dir directory by {@link ConfigurationVerifier}. This
37+
* test is invoked manually from mx.
38+
*/
3239
public class ConfigurationGenerator {
3340

3441
@Test
3542
public void createTestConfig() {
36-
if (!Boolean.getBoolean(ConfigurationGenerator.class.getName() + ".enabled")) {
37-
return;
38-
}
43+
assumeTrue("Test must be explicitly enabled because it is not designed for regular execution", Boolean.getBoolean(ConfigurationGenerator.class.getName() + ".enabled"));
3944
NoPropagationNecessary.runTest();
4045
PropagateToParent.runTest();
4146
PropagateButLeaveCommonConfiguration.runTest();
47+
PropagateThroughRecursiveCall.runTest();
4248
}
4349

4450
}
@@ -174,14 +180,65 @@ interface IC {
174180
}
175181

176182
private static final class Util {
177-
static void doWork(String clazz, String resource, Class<?>... intefaceList) {
183+
static void doWork(String clazz, String resource, Class<?>... interfaceList) {
178184
ClassUtil.forName(clazz);
179185
ClassUtil.forName("PropagateButLeaveCommonConfiguration$C");
180186
ClassUtil.getResource(resource);
181187
ClassUtil.getResource("Common.txt");
182-
ClassUtil.createProxy(intefaceList);
188+
ClassUtil.createProxy(interfaceList);
183189
ClassUtil.createProxy(IC.class);
184190
}
185191
}
186192

187193
}
194+
195+
/**
196+
* This is a regression test. It ensures that configuration propagated from a recursive call does
197+
* not get lost (which can happen unless the configuration is propagated past any recursive
198+
* callers).
199+
*/
200+
@SuppressWarnings("unused")
201+
class PropagateThroughRecursiveCall {
202+
203+
public static void runTest() {
204+
ParentA.doWork();
205+
ParentB.doWork();
206+
}
207+
208+
private static final class ParentA {
209+
static void doWork() {
210+
Recursive.recur(true, "PropagateThroughRecursiveCall$A");
211+
}
212+
}
213+
214+
private static final class ParentB {
215+
static void doWork() {
216+
Recursive.recur(true, "PropagateThroughRecursiveCall$B");
217+
}
218+
}
219+
220+
private static final class A1 {
221+
}
222+
223+
private static final class A2 {
224+
}
225+
226+
private static final class B1 {
227+
}
228+
229+
private static final class B2 {
230+
}
231+
232+
private static final class Recursive {
233+
static void recur(boolean recurse, String clazz) {
234+
ClassUtil.forName("PropagateThroughRecursiveCall$Recursive");
235+
if (recurse) {
236+
ClassUtil.forName(clazz + "1");
237+
recur(false, clazz);
238+
} else {
239+
ClassUtil.forName(clazz + "2");
240+
}
241+
242+
}
243+
}
244+
}

substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/conditionalconfig/ConfigurationVerifier.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
*/
2525
package com.oracle.svm.configure.test.conditionalconfig;
2626

27+
import static org.junit.Assume.assumeTrue;
28+
2729
import java.io.IOException;
2830
import java.io.StringWriter;
2931
import java.net.URL;
@@ -35,21 +37,24 @@
3537
import com.oracle.svm.configure.ConfigurationBase;
3638
import com.oracle.svm.configure.config.ConfigurationFileCollection;
3739
import com.oracle.svm.configure.config.ConfigurationSet;
40+
import com.oracle.svm.configure.test.AddExports;
3841
import com.oracle.svm.core.configure.ConfigurationFile;
3942
import com.oracle.svm.core.util.VMError;
4043

4144
import jdk.graal.compiler.util.json.JsonWriter;
4245

46+
/**
47+
* Test that validates the configuration metadata produced by the agent. This test is invoked
48+
* manually from mx.
49+
*/
50+
@AddExports({"org.graalvm.nativeimage/org.graalvm.nativeimage.impl", "jdk.graal.compiler/jdk.graal.compiler.util"})
4351
public class ConfigurationVerifier {
4452

4553
public static final String CONFIG_PATH_PROPERTY = ConfigurationVerifier.class.getName() + ".configpath";
4654

4755
@Test
4856
public void testConfig() throws Exception {
49-
String enabledProperty = System.getProperty(ConfigurationVerifier.class.getName() + ".enabled");
50-
if (!Boolean.parseBoolean(enabledProperty)) {
51-
return;
52-
}
57+
assumeTrue("Test must be explicitly enabled because it is not designed for regular execution", Boolean.getBoolean(ConfigurationVerifier.class.getName() + ".enabled"));
5358
ConfigurationSet actualConfig = loadActualConfig();
5459
ConfigurationSet expectedConfig = loadExpectedConfig();
5560

substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/conditionalconfig/PartialConfigurationGenerator.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,20 @@
2424
*/
2525
package com.oracle.svm.configure.test.conditionalconfig;
2626

27+
import static org.junit.Assume.assumeTrue;
28+
2729
import org.junit.Test;
2830

31+
/**
32+
* Like {@link ConfigurationGenerator}, but performs the work across multiple test methods. The
33+
* agent is run separately for each and configured to emit "partial" configurations, and then the
34+
* results are combined using the {@code native-image-configure generate-conditional} command. This
35+
* test is invoked manually from mx.
36+
*/
2937
public class PartialConfigurationGenerator {
3038

3139
private static void runIfEnabled(Runnable runnable) {
32-
if (!Boolean.getBoolean(PartialConfigurationGenerator.class.getName() + ".enabled")) {
33-
return;
34-
}
40+
assumeTrue("Test must be explicitly enabled because it is not designed for regular execution", Boolean.getBoolean(PartialConfigurationGenerator.class.getName() + ".enabled"));
3541
runnable.run();
3642
}
3743

@@ -49,4 +55,9 @@ public void createConfigPartTwo() {
4955
public void createConfigPartThree() {
5056
runIfEnabled(PropagateButLeaveCommonConfiguration::runTest);
5157
}
58+
59+
@Test
60+
public void createConfigPartFour() {
61+
runIfEnabled(PropagateThroughRecursiveCall::runTest);
62+
}
5263
}

substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/conditionalconfig/config-dir/jni-config.json

Lines changed: 0 additions & 2 deletions
This file was deleted.

substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/conditionalconfig/config-dir/predefined-classes-config.json

Lines changed: 0 additions & 7 deletions
This file was deleted.

substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/conditionalconfig/config-dir/proxy-config.json

Lines changed: 0 additions & 26 deletions
This file was deleted.

0 commit comments

Comments
 (0)