On Wed, 27 Oct 2021 16:33:27 GMT, Phil Race <[email protected]> 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