On Wed, 27 Oct 2021 16:33:27 GMT, Phil Race <p...@openjdk.org> wrote:
>> As per JDK-8252813, some tests fails recurringly in CI macos system. This is >> an attempt to fix the swing tests. >> It was seen from the logs that we have color mismatch in these tests. >> >> For example, in PressedIcon test, we had following log >> >> ----------System.out:(1/75)---------- >> color java.awt.Color[r=55,g=55,b=55] COLOR_1Xjava.awt.Color[r=255,g=0,b=0] >> ----------System.err:(13/842)---------- >> java.lang.RuntimeException: Colors is different for scale=1! >> at PressedIconTest.main(PressedIconTest.java:97) >> at >> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native >> Method) >> at >> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:76) >> at >> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:51) >> at java.base/java.lang.reflect.Method.invoke(Method.java:569) >> at >> com.sun.javatest.regtest.agent.MainWrapper$MainThread.run(MainWrapper.java:127) >> at java.base/java.lang.Thread.run(Thread.java:833) >> >> and JInternalFrame test, we had >> ----------System.err:(15/939)---------- >> FRAME_COLOR Red: 255; Green: 200; Blue: 0 >> Pixel color Red: 55; Green: 55; Blue: 55 >> java.lang.RuntimeException: Internal frame is not correctly dragged! >> at bug8069348.main(bug8069348.java:96) >> at >> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native >> Method) >> at >> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:76) >> at >> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:51) >> at java.base/java.lang.reflect.Method.invoke(Method.java:569) >> at >> com.sun.javatest.regtest.agent.MainWrapper$MainThread.run(MainWrapper.java:127) >> at java.base/java.lang.Thread.run(Thread.java:833) >> >> where color is obtained as 55,55,55 instead of required color. The png image >> generated at failure also did not reveal anything abnormal apart from >> presence of mouse cursor around the same area where the getPixelColor >> location is pointing to. And since mouse cursor is also grayish black, it >> seems robot was wrongly picking up cursor pixels instead of background color. >> Modified tests to use location.x-10, location.y-10 to obtain the pixel >> color. It does not hamper the test as the whole area around the location is >> coloured with same color in the test so getting pixel color from a bit wide >> of the centre will not affect the test. >> Modified swing tests are passing in the affected system and also in other >> macos systems and platforms. Link in JBS. >> >> The awt tests that are failing seems to have different root cause and will >> be handled separately. > > test/jdk/javax/swing/JButton/8151303/PressedIconTest.java line 88: > >> 86: robot.waitForIdle(); >> 87: Color color = robot.getPixelColor(centerX-10, centerY-10); >> 88: > > So the problematic pattern is a mouse move to the location from which you > subsequently capture a pixel? > I can see how on a compositing window manager that might be an issue as the > cursor is part of the window > whereas on old X11 it isn't part of the root window .. but why isn't this > ALWAYS an issue on macOS ? > > I wonder how many other tests have the same issue ? > > And is an offset of 10 enough ? Its a bit arbitrary and cursors could be a > larger shape or different orientation .. Robot doesn't capture a cursor, we have a `Robot#createScreenCapture` spec which clearly says that: > Creates an image containing pixels read from the screen. > **This image does not include the mouse cursor.** Both `Robot#createScreenCapture` and `Robot#getPixelColor` are using the same `CRobot#nativeGetScreenPixels` method for getting pixel data. <details> <summary>So the mouse cursor should not affect `Robot#getPixelColor`, this is easy to check on practice</summary> import javax.imageio.ImageIO; import java.awt.AWTException; import java.awt.Color; import java.awt.Frame; import java.awt.Rectangle; import java.awt.Robot; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class CursorTest { public static void main(String[] args) throws AWTException, IOException { Robot robot = new Robot(); Frame frame = new Frame(); frame.setBackground(Color.red); frame.setUndecorated(true); Rectangle rectangle = new Rectangle(100,100,50,50); frame.setBounds(rectangle); frame.setVisible(true); robot.waitForIdle(); robot.delay(1000); robot.mouseMove(rectangle.x + 5, rectangle.y + 5); robot.waitForIdle(); System.err.println("Moved"); robot.waitForIdle(); robot.delay(3000); System.err.println("Starting"); BufferedImage screenCapture = robot.createScreenCapture(rectangle); ImageIO.write(screenCapture, "png", new File("/tmp/out.png")); for (int i = rectangle.x; i < rectangle.x + rectangle.width; i++) { for (int j = rectangle.y; j < rectangle.y + rectangle.height; j++) { Color pixelColor = robot.getPixelColor(i, j); if (!pixelColor.equals(Color.red)) { System.err.println(pixelColor); frame.dispose(); throw new RuntimeException("Unexpected pixel color " + pixelColor); } } } System.err.println("Finished"); frame.dispose(); } } </details> ------------- PR: https://git.openjdk.java.net/jdk/pull/6140