8165213: [TESTBUG] [PIT] consistent failure of a new regtest for 8163193
authoraghaisas
Thu, 06 Jul 2017 16:45:56 +0530
changeset 47148 ebee0056e4ea
parent 47147 857d25fae728
child 47149 cc7390224989
8165213: [TESTBUG] [PIT] consistent failure of a new regtest for 8163193 Reviewed-by: psadhukhan, serb Contributed-by: shashidhara.veerabhadraiah@oracle.com
jdk/test/javax/swing/plaf/metal/MetalGradient/8163193/ButtonGradientTest.java
--- a/jdk/test/javax/swing/plaf/metal/MetalGradient/8163193/ButtonGradientTest.java	Fri Jun 30 16:32:18 2017 +0200
+++ b/jdk/test/javax/swing/plaf/metal/MetalGradient/8163193/ButtonGradientTest.java	Thu Jul 06 16:45:56 2017 +0530
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -21,13 +21,17 @@
  * questions.
  */
 
-import java.awt.BorderLayout;
+import java.awt.Image;
+import java.awt.Robot;
+import java.awt.Rectangle;
 import java.awt.Color;
+import java.awt.Point;
+import java.awt.Dimension;
 import java.awt.GradientPaint;
 import java.awt.Graphics2D;
-import java.awt.Rectangle;
-import java.awt.Robot;
+import java.awt.BorderLayout;
 import java.awt.image.BufferedImage;
+import java.awt.image.MultiResolutionImage;
 import java.util.List;
 import javax.swing.JButton;
 import javax.swing.JFrame;
@@ -38,18 +42,20 @@
 
 /*
  * @test
- * @bug 8163193
+ * @bug 8163193 8165213
  * @key headful
  * @summary Metal L&F gradient is lighter on HiDPI display
  * @run main/othervm -Dsun.java2d.uiScale=2 ButtonGradientTest
  */
 public class ButtonGradientTest {
-
     private static JFrame frame;
     private static JButton button;
+    private static List<Image> images;
+    private static Robot robot;
 
     public static void main(String[] args) throws Exception {
         try {
+            robot = new Robot();
             testGradient();
         } finally {
             SwingUtilities.invokeAndWait(() -> {
@@ -61,11 +67,10 @@
     }
 
     private static void testGradient() throws Exception {
-        Robot robot = new Robot();
-        robot.setAutoDelay(50);
-
+        // Create and show the GUI
         SwingUtilities.invokeAndWait(ButtonGradientTest::createAndShowGUI);
         robot.waitForIdle();
+        robot.delay(500);
 
         Rectangle rect = getButtonBounds();
         List<?> gradient = (List) UIManager.get("Button.gradient");
@@ -73,11 +78,15 @@
         Color c1 = (Color) gradient.get(2);
         Color c2 = (Color) gradient.get(3);
         int mid = (int) (ratio * rect.height);
+        // Get the expected gradient color
+        Color gradientColor = getGradientColor(rect.width, mid, c1, c2);
 
-        Color gradientColor = getGradientColor(rect.width, mid, c1, c2);
+        // Get color from robot captured hidpi image of the button
+        getImageFromRobot();
         int x = rect.x + rect.width / 2;
         int y = rect.y + mid / 2;
-        Color buttonColor = robot.getPixelColor(x, y);
+        Color buttonColor = new Color(((BufferedImage)(images.get(1))).getRGB(
+                (int)(x), (int)(y)));
 
         if (!similarColors(buttonColor, gradientColor)) {
             throw new RuntimeException("Button gradient is changed!");
@@ -103,6 +112,26 @@
         frame.setVisible(true);
     }
 
+    private static void getImageFromRobot() {
+        try {
+            Point butLoc = button.getLocationOnScreen();
+            Dimension butSize = button.getSize();
+            MultiResolutionImage multiResolutionImage =
+                    robot.createMultiResolutionScreenCapture(
+                            new Rectangle((int)butLoc.getX(),
+                                    (int)butLoc.getY(), (int)butSize.getWidth(),
+                                    (int)butSize.getHeight()));
+            images = multiResolutionImage.getResolutionVariants();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+        if(images.size() < 2) {
+            throw new RuntimeException("HiDpi Image not captured - " +
+                    "Check is this HiDpi display system?");
+        }
+    }
+
     private static Rectangle getButtonBounds() throws Exception {
         Rectangle[] rectangles = new Rectangle[1];
         SwingUtilities.invokeAndWait(() -> {
@@ -113,7 +142,8 @@
     }
 
     private static Color getGradientColor(int w, int h, Color c1, Color c2) {
-        GradientPaint gradient = new GradientPaint(0, 0, c1, 0, h, c2, true);
+        GradientPaint gradient = new GradientPaint(0, 0, c1, 0, h, c2,
+                true);
         BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
         Graphics2D g = img.createGraphics();
         g.setPaint(gradient);
@@ -129,6 +159,6 @@
     }
 
     private static boolean similar(int i1, int i2) {
-        return Math.abs(i2 - i1) < 7;
+        return Math.abs(i2 - i1) < 6;
     }
-}
+}
\ No newline at end of file