Skip to content

Commit 62cf889

Browse files
committed
[GR-53801] Added context pre-initialization test for unpatched resource roots.
1 parent 27fe3e8 commit 62cf889

File tree

4 files changed

+72
-30
lines changed

4 files changed

+72
-30
lines changed

truffle/src/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/polyglot/ContextPreInitializationTest.java

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@
8888
import com.oracle.truffle.api.InternalResource;
8989
import com.oracle.truffle.api.test.ReflectionUtils;
9090
import org.graalvm.collections.Pair;
91-
import org.graalvm.nativeimage.ImageInfo;
9291
import org.graalvm.options.OptionCategory;
9392
import org.graalvm.options.OptionDescriptor;
9493
import org.graalvm.options.OptionDescriptors;
@@ -2588,7 +2587,7 @@ public void testSandboxPolicyLanguageOptionFailure() throws Exception {
25882587
@Test
25892588
@SuppressWarnings("try")
25902589
public void testLanguageInternalResources() throws Exception {
2591-
Assume.assumeFalse("Cannot run as native unittest", ImageInfo.inImageRuntimeCode());
2590+
TruffleTestAssumptions.assumeNotAOT();
25922591
setPatchable(FIRST);
25932592
List<TruffleFile> files = new ArrayList<>();
25942593
try (TemporaryResourceCacheRoot imageBuildTimeCacheRoot = new TemporaryResourceCacheRoot(false)) {
@@ -2607,6 +2606,35 @@ public void testLanguageInternalResources() throws Exception {
26072606
}
26082607
}
26092608

2609+
@Test
2610+
@SuppressWarnings("try")
2611+
public void testInternalResourcesInNonPreInitializedEngine() throws Exception {
2612+
TruffleTestAssumptions.assumeNotAOT();
2613+
setPatchable(FIRST);
2614+
List<TruffleFile> files = new ArrayList<>();
2615+
try (TemporaryResourceCacheRoot imageBuildTimeCacheRoot = new TemporaryResourceCacheRoot(false)) {
2616+
BaseLanguage.registerAction(ContextPreInitializationTestFirstLanguage.class, ActionKind.ON_INITIALIZE_CONTEXT, newResourceBuildTimeVerifier(files));
2617+
doContextPreinitialize(FIRST);
2618+
assertFalse(files.isEmpty());
2619+
}
2620+
Path runtimeCacheRoot = Files.createTempDirectory(null).toRealPath();
2621+
Engine.copyResources(runtimeCacheRoot, FIRST);
2622+
System.setProperty("polyglot.engine.resourcePath", runtimeCacheRoot.toString());
2623+
try (Engine engine = Engine.create()) {
2624+
BaseLanguage.registerAction(ContextPreInitializationTestFirstLanguage.class, ActionKind.ON_PATCH_CONTEXT, (env) -> {
2625+
throw CompilerDirectives.shouldNotReachHere("Pre-initialized context should not be used.");
2626+
});
2627+
BaseLanguage.registerAction(ContextPreInitializationTestFirstLanguage.class, ActionKind.ON_INITIALIZE_CONTEXT, newResourceNonPreInitializedContextVerifier(runtimeCacheRoot.toString()));
2628+
try (Context ctx = Context.newBuilder().engine(engine).build()) {
2629+
Value res = ctx.eval(Source.create(FIRST, "test"));
2630+
assertEquals("test", res.asString());
2631+
}
2632+
} finally {
2633+
System.getProperties().remove("polyglot.engine.resourcePath");
2634+
TemporaryResourceCacheRoot.reset(false);
2635+
}
2636+
}
2637+
26102638
private static Consumer<Env> newResourceBuildTimeVerifier(List<TruffleFile> files) {
26112639
return (env) -> {
26122640
try {
@@ -2624,6 +2652,25 @@ private static Consumer<Env> newResourceBuildTimeVerifier(List<TruffleFile> file
26242652
};
26252653
}
26262654

2655+
private static Consumer<Env> newResourceNonPreInitializedContextVerifier(String expectedRootPrefix) {
2656+
return (env) -> {
2657+
try {
2658+
ContextPreInitializationResource.unpackCount = 0;
2659+
TruffleFile root = env.getInternalResource(ContextPreInitializationResource.class);
2660+
assertEquals(0, ContextPreInitializationResource.unpackCount);
2661+
assertNotNull(root);
2662+
assertTrue(root.isAbsolute());
2663+
TruffleFile resource = root.resolve(ContextPreInitializationResource.FILE_NAME);
2664+
assertNotNull(resource);
2665+
assertTrue(resource.isAbsolute());
2666+
assertTrue(resource.getAbsoluteFile().toString().startsWith(expectedRootPrefix));
2667+
assertEquals(ContextPreInitializationResource.FILE_CONTENT, new String(resource.readAllBytes(), StandardCharsets.UTF_8));
2668+
} catch (IOException ioe) {
2669+
throw new AssertionError(ioe);
2670+
}
2671+
};
2672+
}
2673+
26272674
private static Consumer<Env> newResourceExecutionTimeVerifier(List<TruffleFile> files, String expectedRootPrefix) {
26282675
return (env) -> {
26292676
try {
@@ -2651,7 +2698,7 @@ private static Consumer<Env> newResourceExecutionTimeVerifier(List<TruffleFile>
26512698
@Test
26522699
@SuppressWarnings("try")
26532700
public void testSourcesForInternalResources() throws Exception {
2654-
Assume.assumeFalse("Cannot run as native unittest", ImageInfo.inImageRuntimeCode());
2701+
TruffleTestAssumptions.assumeNotAOT();
26552702
setPatchable(FIRST);
26562703
List<com.oracle.truffle.api.source.Source> sources = new ArrayList<>();
26572704
try (TemporaryResourceCacheRoot imageBuildTimeCacheRoot = new TemporaryResourceCacheRoot(false)) {
@@ -2693,7 +2740,7 @@ public void testSourcesForInternalResources() throws Exception {
26932740
@Test
26942741
@SuppressWarnings("try")
26952742
public void testInstrumentInternalResources() throws Exception {
2696-
Assume.assumeFalse("Cannot run as native unittest", ImageInfo.inImageRuntimeCode());
2743+
TruffleTestAssumptions.assumeNotAOT();
26972744
setPatchable(FIRST);
26982745
AtomicReference<TruffleFile> rootRef = new AtomicReference<>();
26992746
ContextPreInitializationFirstInstrument.actions = Collections.singletonMap("onContextCreated", (e) -> {
@@ -2728,7 +2775,7 @@ public void testInstrumentInternalResources() throws Exception {
27282775
@Test
27292776
@SuppressWarnings("try")
27302777
public void testOverriddenCacheRoot() throws Exception {
2731-
Assume.assumeFalse("Cannot run as native unittest", ImageInfo.inImageRuntimeCode());
2778+
TruffleTestAssumptions.assumeNotAOT();
27322779
setPatchable(FIRST);
27332780
List<TruffleFile> files = new ArrayList<>();
27342781
try (TemporaryResourceCacheRoot imageBuildTimeCacheRoot = new TemporaryResourceCacheRoot(false)) {
@@ -2756,7 +2803,7 @@ public void testOverriddenCacheRoot() throws Exception {
27562803
@Test
27572804
@SuppressWarnings("try")
27582805
public void testOverriddenComponentRoot() throws Exception {
2759-
Assume.assumeFalse("Cannot run as native unittest", ImageInfo.inImageRuntimeCode());
2806+
TruffleTestAssumptions.assumeNotAOT();
27602807
setPatchable(FIRST);
27612808
List<TruffleFile> files = new ArrayList<>();
27622809
try (TemporaryResourceCacheRoot imageBuildTimeCacheRoot = new TemporaryResourceCacheRoot(false)) {
@@ -2783,7 +2830,7 @@ public void testOverriddenComponentRoot() throws Exception {
27832830
@Test
27842831
@SuppressWarnings("try")
27852832
public void testOverriddenResourceRoot() throws Exception {
2786-
Assume.assumeFalse("Cannot run as native unittest", ImageInfo.inImageRuntimeCode());
2833+
TruffleTestAssumptions.assumeNotAOT();
27872834
setPatchable(FIRST);
27882835
List<TruffleFile> files = new ArrayList<>();
27892836
try (TemporaryResourceCacheRoot imageBuildTimeCacheRoot = new TemporaryResourceCacheRoot(false)) {

truffle/src/com.oracle.truffle.polyglot/src/com/oracle/truffle/polyglot/FileSystems.java

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1226,19 +1226,10 @@ private static final class ResourcesFileSystem implements PolyglotFileSystem {
12261226
private final FileSystem resourcesFileSystem;
12271227
private final FileSystem delegateFileSystem;
12281228
private final InternalResourceRoots resourceRoots;
1229-
private final Set<Path> languageHomes;
1229+
private final Collection<Path> languageHomes;
12301230

12311231
static ResourcesFileSystem createForEngine(PolyglotEngineImpl engine, FileSystem resourcesFileSystem, FileSystem delegateFileSystem) {
1232-
Set<Path> languageHomes = new HashSet<>();
1233-
for (PolyglotLanguage language : engine.languages) {
1234-
if (language != null) {
1235-
final String languageHome = language.cache.getLanguageHome();
1236-
if (languageHome != null) {
1237-
languageHomes.add(Paths.get(languageHome));
1238-
}
1239-
}
1240-
}
1241-
return new ResourcesFileSystem(resourcesFileSystem, delegateFileSystem, engine.internalResourceRoots, languageHomes);
1232+
return new ResourcesFileSystem(resourcesFileSystem, delegateFileSystem, engine.internalResourceRoots, List.copyOf(engine.languageHomes().values()));
12421233
}
12431234

12441235
static ResourcesFileSystem createForEmbedder(FileSystem resourcesFileSystem, FileSystem delegateFileSystem) {
@@ -1253,7 +1244,7 @@ static ResourcesFileSystem createForEmbedder(FileSystem resourcesFileSystem, Fil
12531244
}
12541245

12551246
private ResourcesFileSystem(FileSystem resourcesFileSystem, FileSystem delegateFileSystem,
1256-
InternalResourceRoots resourceRoots, Set<Path> languageHomes) {
1247+
InternalResourceRoots resourceRoots, Collection<Path> languageHomes) {
12571248
this.resourcesFileSystem = Objects.requireNonNull(resourcesFileSystem, "ResourcesFileSystem must be non-null");
12581249
this.delegateFileSystem = Objects.requireNonNull(delegateFileSystem, "DelegateFileSystem must be non-null");
12591250
this.resourceRoots = Objects.requireNonNull(resourceRoots, "ResourceRoots must be non-null");

truffle/src/com.oracle.truffle.polyglot/src/com/oracle/truffle/polyglot/PolyglotContextImpl.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3610,17 +3610,7 @@ static PolyglotContextImpl preinitialize(final PolyglotEngineImpl engine, final
36103610
context.singleThreadValue.reset();
36113611
context.sourcesToInvalidate = null;
36123612
context.threadLocalActions.prepareContextStore();
3613-
Map<String, Path> languageHomes = new HashMap<>();
3614-
for (PolyglotLanguage language : engine.languages) {
3615-
if (language != null) {
3616-
LanguageCache cache = language.cache;
3617-
String languageHome = cache.getLanguageHome();
3618-
if (languageHome != null) {
3619-
languageHomes.put(cache.getId(), Path.of(languageHome));
3620-
}
3621-
}
3622-
}
3623-
3613+
Map<String, Path> languageHomes = engine.languageHomes();
36243614
((PreInitializeContextFileSystem) fileSystemConfig.fileSystem).onPreInitializeContextEnd(engine.internalResourceRoots, languageHomes);
36253615
((PreInitializeContextFileSystem) fileSystemConfig.internalFileSystem).onPreInitializeContextEnd(engine.internalResourceRoots, languageHomes);
36263616
EngineAccessor.LANGUAGE.configureLoggers(context, null, context.getAllLoggers());

truffle/src/com.oracle.truffle.polyglot/src/com/oracle/truffle/polyglot/PolyglotEngineImpl.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2337,4 +2337,18 @@ String getVersion() {
23372337
}
23382338
}
23392339

2340+
Map<String, Path> languageHomes() {
2341+
Map<String, Path> languageHomes = new HashMap<>();
2342+
for (PolyglotLanguage language : languages) {
2343+
if (language != null) {
2344+
LanguageCache cache = language.cache;
2345+
String languageHome = cache.getLanguageHome();
2346+
if (languageHome != null) {
2347+
languageHomes.put(cache.getId(), Path.of(languageHome));
2348+
}
2349+
}
2350+
}
2351+
return languageHomes;
2352+
}
2353+
23402354
}

0 commit comments

Comments
 (0)