Skip to content

Commit 1dd9cf1

Browse files
committedMar 11, 2025
8349099: java/awt/Headless/HeadlessMalfunctionTest.java fails on CI with Compilation error
Reviewed-by: aivanov, sgehwolf, prr
1 parent 64464ea commit 1dd9cf1

File tree

3 files changed

+32
-39
lines changed

3 files changed

+32
-39
lines changed
 

‎test/jdk/ProblemList.txt

-1
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,6 @@ java/awt/PopupMenu/PopupMenuLocation.java 8259913,8315878 windows-all,macosx-aar
462462
java/awt/GridLayout/ComponentPreferredSize/ComponentPreferredSize.java 8238720,8324782 windows-all,macosx-all
463463
java/awt/GridLayout/ChangeGridSize/ChangeGridSize.java 8238720,8324782 windows-all,macosx-all
464464
java/awt/event/MouseEvent/FrameMouseEventAbsoluteCoordsTest/FrameMouseEventAbsoluteCoordsTest.java 8238720 windows-all
465-
java/awt/Headless/HeadlessMalfunctionTest.java 8349099 generic-all
466465

467466
# Several tests which fail sometimes on macos11
468467
java/awt/Window/MainKeyWindowTest/TestMainKeyWindow.java 8265985 macosx-all

‎test/jdk/java/awt/Headless/HeadlessMalfunctionAgent.java

+25-31
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -20,12 +20,9 @@
2020
* or visit www.oracle.com if you need additional information or have any
2121
* questions.
2222
*/
23-
import jdk.internal.org.objectweb.asm.ClassReader;
24-
import jdk.internal.org.objectweb.asm.ClassVisitor;
25-
import jdk.internal.org.objectweb.asm.ClassWriter;
26-
import jdk.internal.org.objectweb.asm.MethodVisitor;
27-
import jdk.internal.org.objectweb.asm.Opcodes;
2823

24+
import java.lang.classfile.ClassFile;
25+
import java.lang.classfile.MethodModel;
2926
import java.lang.instrument.ClassFileTransformer;
3027
import java.lang.instrument.Instrumentation;
3128
import java.security.ProtectionDomain;
@@ -37,34 +34,31 @@ public class HeadlessMalfunctionAgent {
3734

3835
public static void premain(String agentArgs, Instrumentation inst) {
3936
inst.addTransformer(new ClassFileTransformer() {
40-
4137
@Override
42-
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
43-
ProtectionDomain pd, byte[] cb) {
44-
if ("java/awt/GraphicsEnvironment".equals(className)) {
45-
System.out.println("Transforming java.awt.GraphicsEnvironment.");
46-
try {
47-
final ClassReader cr = new ClassReader(cb);
48-
final ClassWriter cw = new ClassWriter(cr, 0);
49-
cr.accept(new ClassVisitor(Opcodes.ASM9, cw) {
50-
51-
@Override
52-
public MethodVisitor visitMethod(int access, String name, String descriptor, String signature,
53-
String[] exceptions) {
54-
if ("isHeadless".equals(name) && "()Z".equals(descriptor)) {
55-
System.out.println("isHeadless removed from java.awt.GraphicsEnvironment.");
56-
// WHACK! Remove the isHeadless method.
57-
return null;
58-
}
59-
return super.visitMethod(access, name, descriptor, signature, exceptions);
38+
public byte[] transform(ClassLoader loader,
39+
String className,
40+
Class<?> classBeingRedefined,
41+
ProtectionDomain pd,
42+
byte[] cb) {
43+
if (!"java/awt/GraphicsEnvironment".equals(className)) {
44+
return null;
45+
}
46+
System.out.println("Transforming java.awt.GraphicsEnvironment.");
47+
try {
48+
return ClassFile.of().transformClass(ClassFile.of().parse(cb), (classBuilder, element) -> {
49+
if (element instanceof MethodModel method) {
50+
if ("isHeadless".equals(method.methodName().stringValue()) &&
51+
"()Z".equals(method.methodType().stringValue())) {
52+
System.out.println("isHeadless removed from java.awt.GraphicsEnvironment.");
53+
return;
6054
}
61-
}, 0);
62-
return cw.toByteArray();
63-
} catch (Exception e) {
64-
e.printStackTrace();
65-
}
55+
}
56+
classBuilder.with(element);
57+
});
58+
} catch (Exception e) {
59+
e.printStackTrace();
60+
return null;
6661
}
67-
return null;
6862
}
6963
});
7064
}

‎test/jdk/java/awt/Headless/HeadlessMalfunctionTest.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -33,12 +33,11 @@
3333
* @bug 8336382
3434
* @summary Test that in absence of isHeadless method, the JDK throws a meaningful error message.
3535
* @library /test/lib
36-
* @modules java.base/jdk.internal.org.objectweb.asm
36+
* @requires os.family == "linux"
3737
* @build HeadlessMalfunctionAgent
3838
* @run driver jdk.test.lib.helpers.ClassFileInstaller
3939
* HeadlessMalfunctionAgent
4040
* HeadlessMalfunctionAgent$1
41-
* HeadlessMalfunctionAgent$1$1
4241
* @run driver HeadlessMalfunctionTest
4342
*/
4443
public class HeadlessMalfunctionTest {
@@ -49,19 +48,20 @@ public static void main(String[] args) throws Exception {
4948
final ProcessBuilder pbJar = new ProcessBuilder()
5049
.command(JDKToolFinder.getJDKTool("jar"), "cmf", "MANIFEST.MF", "agent.jar",
5150
"HeadlessMalfunctionAgent.class",
52-
"HeadlessMalfunctionAgent$1.class",
53-
"HeadlessMalfunctionAgent$1$1.class");
51+
"HeadlessMalfunctionAgent$1.class");
5452
ProcessTools.executeProcess(pbJar).shouldHaveExitValue(0);
5553

5654
// Run test
5755
final ProcessBuilder pbJava = ProcessTools.createTestJavaProcessBuilder(
58-
"--add-opens",
59-
"java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED",
6056
"-javaagent:agent.jar",
6157
"HeadlessMalfunctionTest$Runner"
6258
);
6359
final OutputAnalyzer output = ProcessTools.executeProcess(pbJava);
6460
// Unpatched JDK logs: "FATAL ERROR in native method: Could not allocate library name"
61+
// Patched should mention that isHeadless is missing, log message differs between OSes;
62+
// e.g. LWCToolkit toolkit path on MacOS and Win32GraphicsEnvironment code path on Windows
63+
// logs "java.lang.NoSuchMethodError: 'boolean java.awt.GraphicsEnvironment.isHeadless()'",
64+
// whereas Linux logs "FATAL ERROR in native method: GetStaticMethodID isHeadless failed"
6565
output.shouldContain("FATAL ERROR in native method: GetStaticMethodID isHeadless failed");
6666
output.shouldNotHaveExitValue(0);
6767
}

0 commit comments

Comments
 (0)