From 9f5701896f2aee25c94cbb6bddfff1153b46544a Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 22 Jun 2022 10:36:21 +0000 Subject: [PATCH] 8274597: Some of the dnd tests time out and fail intermittently 8028998: [TEST_BUG] [macosx] java/awt/dnd/DropTargetEnterExitTest/MissedDragExitTest.java failed Backport-of: 669ac611b269bbda5c53d84173e5c9d0eb4ce919 --- .../AcceptDropMultipleTimes.java | 63 ++++++++++++++--- .../ExtraDragEnterTest.java | 28 ++++++-- .../MissedDragExitTest.java | 38 ++++++---- .../MissingDragExitEventTest.java | 70 +++++++++++++------ 4 files changed, 147 insertions(+), 52 deletions(-) diff --git a/test/jdk/java/awt/dnd/AcceptDropMultipleTimes/AcceptDropMultipleTimes.java b/test/jdk/java/awt/dnd/AcceptDropMultipleTimes/AcceptDropMultipleTimes.java index f632be72a10..5c125dd9cf1 100644 --- a/test/jdk/java/awt/dnd/AcceptDropMultipleTimes/AcceptDropMultipleTimes.java +++ b/test/jdk/java/awt/dnd/AcceptDropMultipleTimes/AcceptDropMultipleTimes.java @@ -35,22 +35,44 @@ import test.java.awt.regtesthelpers.Util; -import javax.swing.*; -import java.awt.*; -import java.awt.datatransfer.*; -import java.awt.dnd.*; +import java.awt.Color; +import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.Panel; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.Toolkit; +import java.awt.datatransfer.StringSelection; +import java.awt.dnd.DnDConstants; +import java.awt.dnd.DragGestureEvent; +import java.awt.dnd.DragGestureListener; +import java.awt.dnd.DragSource; +import java.awt.dnd.DropTarget; +import java.awt.dnd.DropTargetAdapter; +import java.awt.dnd.DropTargetDropEvent; import java.awt.event.InputEvent; +import java.io.File; +import java.io.IOException; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; +import javax.imageio.ImageIO; +import javax.swing.SwingUtilities; public class AcceptDropMultipleTimes { private static final int FRAME_SIZE = 100; - private static final int FRAME_LOCATION = 100; + private static CountDownLatch dropCompleteLatch = new CountDownLatch(1); private static volatile Frame f; private static void initAndShowUI() { f = new Frame("Test frame"); - f.setBounds(FRAME_LOCATION, FRAME_LOCATION, FRAME_SIZE, FRAME_SIZE); + f.setSize(FRAME_SIZE, FRAME_SIZE); + f.setLocationRelativeTo(null); + f.setUndecorated(true); final DraggablePanel dragSource = new DraggablePanel(); dragSource.setBackground(Color.yellow); @@ -63,11 +85,12 @@ private static void initAndShowUI() { dtde.acceptDrop(DnDConstants.ACTION_MOVE); dtde.dropComplete(true); + dropCompleteLatch.countDown(); } }); dragSource.setDropTarget(dt); f.add(dragSource); - + f.setAlwaysOnTop(true); f.setVisible(true); } @@ -77,19 +100,37 @@ public static void main(String[] args) throws Throwable { SwingUtilities.invokeAndWait(() -> initAndShowUI()); Robot r = new Robot(); + r.setAutoDelay(50); Util.waitForIdle(r); + final AtomicReference frameLoc = new AtomicReference<>(); + SwingUtilities.invokeAndWait(() -> frameLoc.set(f.getLocationOnScreen())); + Point loc = frameLoc.get(); Util.drag(r, - new Point(FRAME_LOCATION + FRAME_SIZE / 3, FRAME_LOCATION + FRAME_SIZE / 3), - new Point(FRAME_LOCATION + FRAME_SIZE / 3 * 2, FRAME_LOCATION + FRAME_SIZE / 3 * 2), - InputEvent.BUTTON1_MASK); + new Point(loc.x + FRAME_SIZE / 3, loc.y + FRAME_SIZE / 3), + new Point(loc.x + FRAME_SIZE / 3 * 2, loc.y + FRAME_SIZE / 3 * 2), + InputEvent.BUTTON1_DOWN_MASK); Util.waitForIdle(r); + if(!dropCompleteLatch.await(10, TimeUnit.SECONDS)) { + captureScreen(r); + throw new RuntimeException("Waited too long, but the drop is not completed"); + } } finally { if (f != null) { f.dispose(); } } } - + private static void captureScreen(Robot r) { + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + try { + ImageIO.write( + r.createScreenCapture(new Rectangle(0, 0, screenSize.width, screenSize.height)), + "png", + new File("FailedScreenImage.png") + ); + } catch (IOException ignore) { + } + } private static class DraggablePanel extends Panel implements DragGestureListener { public DraggablePanel() { diff --git a/test/jdk/java/awt/dnd/DropTargetEnterExitTest/ExtraDragEnterTest.java b/test/jdk/java/awt/dnd/DropTargetEnterExitTest/ExtraDragEnterTest.java index cafd01b0daa..fc45b04c59a 100644 --- a/test/jdk/java/awt/dnd/DropTargetEnterExitTest/ExtraDragEnterTest.java +++ b/test/jdk/java/awt/dnd/DropTargetEnterExitTest/ExtraDragEnterTest.java @@ -35,8 +35,13 @@ import test.java.awt.regtesthelpers.Util; -import javax.swing.*; -import java.awt.*; +import java.awt.Color; +import java.awt.Cursor; +import java.awt.Frame; +import java.awt.GridLayout; +import java.awt.Panel; +import java.awt.Point; +import java.awt.Robot; import java.awt.datatransfer.StringSelection; import java.awt.dnd.DnDConstants; import java.awt.dnd.DragGestureEvent; @@ -47,23 +52,27 @@ import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.event.InputEvent; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import javax.swing.SwingUtilities; public class ExtraDragEnterTest { private static final int FRAME_SIZE = 100; - private static final int FRAME_LOCATION = 100; private static AtomicInteger dragEnterCalled = new AtomicInteger(0); private static volatile Panel mainPanel; private static volatile Frame f; + private static CountDownLatch dropCompleteLatch = new CountDownLatch(1); private static void initAndShowUI() { f = new Frame("Test frame"); - f.setBounds(FRAME_LOCATION,FRAME_LOCATION,FRAME_SIZE,FRAME_SIZE); + f.setLocationRelativeTo(null); + f.setSize(FRAME_SIZE,FRAME_SIZE); mainPanel = new Panel(); - mainPanel.setBounds(0, 0, FRAME_SIZE, FRAME_SIZE); + mainPanel.setSize(FRAME_SIZE, FRAME_SIZE); mainPanel.setBackground(Color.black); mainPanel.setLayout(new GridLayout(2, 1)); @@ -75,7 +84,10 @@ private static void initAndShowUI() { Panel dropTarget = new Panel(); dropTarget.setBackground(Color.red); DropTarget dt = new DropTarget(dropTarget, new DropTargetAdapter() { - @Override public void drop(DropTargetDropEvent dtde) { } + @Override public void drop(DropTargetDropEvent dtde) { + System.out.println("Drop complete"); + dropCompleteLatch.countDown(); + } @Override public void dragEnter(DropTargetDragEvent dtde) { @@ -86,6 +98,7 @@ public void dragEnter(DropTargetDragEvent dtde) { mainPanel.add(dropTarget); f.add(mainPanel); + f.setAlwaysOnTop(true); f.setVisible(true); } @@ -113,6 +126,9 @@ public void run() { if (called != 1) { throw new RuntimeException("Failed. Drag enter called " + called + " times. Expected 1" ); } + if(!dropCompleteLatch.await(10, TimeUnit.SECONDS)) { + throw new RuntimeException("Waited too long, but the drop is not completed"); + } } finally { if (f != null) { f.dispose(); diff --git a/test/jdk/java/awt/dnd/DropTargetEnterExitTest/MissedDragExitTest.java b/test/jdk/java/awt/dnd/DropTargetEnterExitTest/MissedDragExitTest.java index 28e1e5d3972..62aa99a38f2 100644 --- a/test/jdk/java/awt/dnd/DropTargetEnterExitTest/MissedDragExitTest.java +++ b/test/jdk/java/awt/dnd/DropTargetEnterExitTest/MissedDragExitTest.java @@ -35,8 +35,12 @@ import test.java.awt.regtesthelpers.Util; -import javax.swing.*; -import java.awt.*; +import java.awt.Color; +import java.awt.Cursor; +import java.awt.Frame; +import java.awt.Panel; +import java.awt.Point; +import java.awt.Robot; import java.awt.datatransfer.StringSelection; import java.awt.dnd.DnDConstants; import java.awt.dnd.DragGestureEvent; @@ -48,15 +52,17 @@ import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; import java.awt.event.InputEvent; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import javax.swing.SwingUtilities; public class MissedDragExitTest { private static final int FRAME_SIZE = 100; private static final int FRAME_LOCATION = 100; - private static volatile boolean dragExitCalled = false; - private static volatile Frame f; + private static CountDownLatch dragLatch = new CountDownLatch(2); private static void initAndShowUI() { f = new Frame("Test frame"); @@ -70,21 +76,30 @@ private static void initAndShowUI() { @Override public void dragExit(DropTargetEvent dte) { - dragExitCalled = true; + System.out.println("Drag Exit"); + dragLatch.countDown(); } @Override public void dragOver(DropTargetDragEvent dtde) { - Panel newDropTarget = new Panel(); - newDropTarget.setDropTarget(new DropTarget()); - newDropTarget.setBackground(Color.red); - newDropTarget.setBounds(0, 0, FRAME_SIZE, FRAME_SIZE); - dragSource.add(newDropTarget); + Panel newDropTargetPanel = new Panel(); + final DropTarget dropTarget = new DropTarget(null,new DropTargetAdapter() { + @Override + public void drop(DropTargetDropEvent dtde) { + System.out.println("Drop complete"); + dragLatch.countDown(); + } + }); + newDropTargetPanel.setDropTarget(dropTarget); + newDropTargetPanel.setBackground(Color.red); + newDropTargetPanel.setSize(FRAME_SIZE, FRAME_SIZE); + dragSource.add(newDropTargetPanel); } }); dragSource.setDropTarget(dt); f.add(dragSource); + f.setAlwaysOnTop(true); f.setVisible(true); } @@ -105,8 +120,7 @@ public void run() { new Point(FRAME_LOCATION + FRAME_SIZE / 3 * 2, FRAME_LOCATION + FRAME_SIZE / 3 * 2), InputEvent.BUTTON1_DOWN_MASK); Util.waitForIdle(r); - - if (!dragExitCalled) { + if(!dragLatch.await(10, TimeUnit.SECONDS)) { throw new RuntimeException("Failed. Drag exit was not called" ); } } finally { diff --git a/test/jdk/java/awt/dnd/MissingDragExitEventTest/MissingDragExitEventTest.java b/test/jdk/java/awt/dnd/MissingDragExitEventTest/MissingDragExitEventTest.java index 5a5b225f5a4..b572cffd17d 100644 --- a/test/jdk/java/awt/dnd/MissingDragExitEventTest/MissingDragExitEventTest.java +++ b/test/jdk/java/awt/dnd/MissingDragExitEventTest/MissingDragExitEventTest.java @@ -32,9 +32,14 @@ * @author Sergey Bylokhov */ +import test.java.awt.regtesthelpers.Util; + import java.awt.Color; +import java.awt.Dimension; import java.awt.Point; +import java.awt.Rectangle; import java.awt.Robot; +import java.awt.Toolkit; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTarget; import java.awt.dnd.DropTargetAdapter; @@ -44,13 +49,16 @@ import java.awt.event.InputEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; - +import java.io.File; +import java.io.IOException; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; +import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JTextArea; import javax.swing.SwingUtilities; -import test.java.awt.regtesthelpers.Util; - public class MissingDragExitEventTest { private static volatile JFrame frame; @@ -59,23 +67,26 @@ public class MissingDragExitEventTest { private static boolean MOUSE_ENTERED; private static boolean MOUSE_EXIT_TD; private static boolean MOUSE_EXIT; - private static int SIZE = 300; + private static int SIZE = 100; + private static CountDownLatch dropCompleteLatch = new CountDownLatch(1); private static void initAndShowUI() { frame = new JFrame("Test frame"); - + frame.setUndecorated(true); frame.setSize(SIZE, SIZE); frame.setLocationRelativeTo(null); final JTextArea jta = new JTextArea(); jta.setBackground(Color.RED); frame.add(jta); jta.setText("1234567890"); - jta.setFont(jta.getFont().deriveFont(150f)); + jta.setFont(jta.getFont().deriveFont(50f)); jta.setDragEnabled(true); jta.selectAll(); jta.setDropTarget(new DropTarget(jta, DnDConstants.ACTION_COPY, new TestdropTargetListener())); jta.addMouseListener(new TestMouseAdapter()); + frame.pack(); + frame.setAlwaysOnTop(true); frame.setVisible(true); } @@ -92,25 +103,36 @@ public void run() { initAndShowUI(); } }); - - final Point inside = new Point(frame.getLocationOnScreen()); - inside.translate(20, SIZE / 2); + final AtomicReference insidePoint = new AtomicReference<>(); + SwingUtilities.invokeAndWait(() -> insidePoint.set(frame.getLocationOnScreen())); + final Point inside = insidePoint.get(); + inside.translate(2,20); final Point outer = new Point(inside); - outer.translate(-40, 0); + outer.translate(-20, 0); r.mouseMove(inside.x, inside.y); - r.mousePress(InputEvent.BUTTON1_MASK); + r.mousePress(InputEvent.BUTTON1_DOWN_MASK); try { for (int i = 0; i < 3; ++i) { Util.mouseMove(r, inside, outer); Util.mouseMove(r, outer, inside); } } finally { - r.mouseRelease(InputEvent.BUTTON1_MASK); + r.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); } - sleep(r); - if (FAILED || !MOUSE_ENTERED || !MOUSE_ENTERED_DT || !MOUSE_EXIT - || !MOUSE_EXIT_TD) { + if (!dropCompleteLatch.await(10, TimeUnit.SECONDS)) { + captureScreen(r); + throw new RuntimeException( + "Waited too long, but the drop is not completed"); + } + if (FAILED || !MOUSE_ENTERED || !MOUSE_ENTERED_DT || !MOUSE_EXIT || + !MOUSE_EXIT_TD) { + System.out.println( + "Events, FAILED = " + FAILED + ", MOUSE_ENTERED = " + + MOUSE_ENTERED + ", MOUSE_ENTERED_DT = " + + MOUSE_ENTERED_DT + ", MOUSE_EXIT = " + MOUSE_EXIT + + ", MOUSE_EXIT_TD = " + MOUSE_EXIT_TD); + captureScreen(r); throw new RuntimeException("Failed"); } } finally { @@ -120,12 +142,14 @@ public void run() { } } - private static void sleep(Robot robot) { + private static void captureScreen(Robot r) { + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); try { - Thread.sleep(10000); - } catch (InterruptedException ignored) { + ImageIO.write(r.createScreenCapture( + new Rectangle(0, 0, screenSize.width, screenSize.height)), + "png", new File("FailedScreenImage.png")); + } catch (IOException ignore) { } - robot.waitForIdle(); } static class TestdropTargetListener extends DropTargetAdapter { @@ -140,10 +164,6 @@ public void dragEnter(final DropTargetDragEvent dtde) { } inside = true; MOUSE_ENTERED_DT = true; - try { - Thread.sleep(10000); // we should have time to leave a component - } catch (InterruptedException ignored) { - } } @Override @@ -162,6 +182,7 @@ public void dragExit(final DropTargetEvent dte) { } inside = false; MOUSE_EXIT_TD = true; + System.out.println("Drag exit"); } @Override @@ -171,6 +192,8 @@ public void drop(final DropTargetDropEvent dtde) { Thread.dumpStack(); } inside = false; + System.out.println("Drop complete"); + dropCompleteLatch.countDown(); } } @@ -190,6 +213,7 @@ public void mouseEntered(final MouseEvent e) { @Override public void mouseExited(final MouseEvent e) { + System.out.println( "Mouse exit"); if (!inside) { FAILED = true; Thread.dumpStack();