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

Reply via email to