8144164: [macosx] Test java/awt/Focus/MouseClickRequestFocusRaceTest/MouseClickRequestFocusRaceTest failed
authorserb
Wed, 09 Mar 2016 14:23:20 +0300
changeset 36863 bb90b1f70b42
parent 36862 c4d9697fee63
child 36864 b05a43581a5a
8144164: [macosx] Test java/awt/Focus/MouseClickRequestFocusRaceTest/MouseClickRequestFocusRaceTest failed Reviewed-by: avstepan, yan
jdk/test/java/awt/Focus/MouseClickRequestFocusRaceTest/MouseClickRequestFocusRaceTest.html
jdk/test/java/awt/Focus/MouseClickRequestFocusRaceTest/MouseClickRequestFocusRaceTest.java
--- a/jdk/test/java/awt/Focus/MouseClickRequestFocusRaceTest/MouseClickRequestFocusRaceTest.html	Wed Mar 09 12:38:42 2016 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-<!--
- Copyright (c) 2006, 2014, 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
- under the terms of the GNU General Public License version 2 only, as
- published by the Free Software Foundation.
-
- This code is distributed in the hope that it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- version 2 for more details (a copy is included in the LICENSE file that
- accompanied this code).
-
- You should have received a copy of the GNU General Public License version
- 2 along with this work; if not, write to the Free Software Foundation,
- Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-
- Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- or visit www.oracle.com if you need additional information or have any
- questions.
--->
-
-<html>
-<!--
-  @test
-  @bug        5028014
-  @summary    Focus request & mouse click being performed nearly synchronously shouldn't break the focus subsystem
-  @author     anton.tarasov@sun.com: area=awt-focus
-  @run        applet MouseClickRequestFocusRaceTest.html
-  -->
-<head>
-<title>MouseClickRequestFocusRaceTest</title>
-</head>
-<body>
- 
-<h1>MouseClickRequestFocusRaceTest<br>Bug ID: 5028014</h1>
- 
-<p>See the dialog box (usually in upper left corner) for instructions</p>
- 
-<APPLET CODE=MouseClickRequestFocusRaceTest.class WIDTH=200 HEIGHT=200></APPLET>
-</body>
-</html>
--- a/jdk/test/java/awt/Focus/MouseClickRequestFocusRaceTest/MouseClickRequestFocusRaceTest.java	Wed Mar 09 12:38:42 2016 +0300
+++ b/jdk/test/java/awt/Focus/MouseClickRequestFocusRaceTest/MouseClickRequestFocusRaceTest.java	Wed Mar 09 14:23:20 2016 +0300
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2016, 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,57 +21,59 @@
  * questions.
  */
 
-/*
-  test
-  @bug       5028014
-  @summary   Focus request & mouse click performed nearly synchronously shouldn't lead to a focus race.
-  @author    anton.tarasov@sun.com: area=awt-focus
-  @run       applet MouseClickRequestFocusRaceTest.html
-*/
+import java.awt.AWTException;
+import java.awt.FlowLayout;
+import java.awt.KeyboardFocusManager;
+import java.awt.Point;
+import java.awt.Robot;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
 
-import java.awt.*;
-import javax.swing.*;
-import java.awt.event.*;
-import java.applet.Applet;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.WindowConstants;
+
+import jdk.testlibrary.OSInfo;
 
-public class MouseClickRequestFocusRaceTest extends Applet {
-    Robot robot;
-    JFrame frame1 = new JFrame("Frame-1") {
+/**
+ * @test
+ * @bug 5028014
+ * @summary Focus request & mouse click being performed nearly synchronously
+ *          shouldn't break the focus subsystem
+ * @author  anton.tarasov@sun.com: area=awt-focus
+ * @library ../../../../lib/testlibrary
+ * @build jdk.testlibrary.OSInfo
+ * @run main MouseClickRequestFocusRaceTest
+ */
+public class MouseClickRequestFocusRaceTest {
+    static Robot robot;
+    static JFrame frame1 = new JFrame("Frame-1") {
             public String toString() { return "Frame-1";}
         };
-    JFrame frame2 = new JFrame("Frame-2") {
+    static JFrame frame2 = new JFrame("Frame-2") {
             public String toString() { return "Frame-2";}
         };
-    JButton button1 = new JButton("button-1") {
+    static JButton button1 = new JButton("button-1") {
             public String toString() { return "button-1";}
         };
-    JButton button2 = new JButton("button-2") {
+    static JButton button2 = new JButton("button-2") {
             public String toString() { return "button-2";}
         };
-    JPopupMenu popup = new JPopupMenu();
+    static JPopupMenu popup = new JPopupMenu();
 
     public static void main(String[] args) {
-        MouseClickRequestFocusRaceTest app = new MouseClickRequestFocusRaceTest();
-        app.init();
-        app.start();
-    }
-
-    public void init() {
         try {
             robot = new Robot();
+            robot.setAutoWaitForIdle(true);
+            robot.setAutoDelay(100);
         } catch (AWTException e) {
             throw new RuntimeException("Error: unable to create robot", e);
         }
-        // Create instructions for the user here, as well as set up
-        // the environment -- set the layout manager, add buttons,
-        // etc.
-        this.setLayout (new BorderLayout ());
-        Sysout.createDialogWithInstructions(new String[]
-            {"Automatic test. Simply wait until it is done."
-            });
-    }
-
-    public void start() {
         frame1.add(button1);
         frame2.add(button2);
         frame1.setBounds(0, 0, 200, 300);
@@ -110,198 +112,64 @@
 
         frame1.setVisible(true);
         frame2.setVisible(true);
-//        ((SunToolkit)Toolkit.getDefaultToolkit()).realSync();
+
         robot.delay(1000);
-
-        test();
+        try {
+            test();
+        } finally {
+            frame1.dispose();
+            frame2.dispose();
+        }
     }
 
-    public void test() {
+    public static void test() {
         // Right click Frame-1
         robot.mouseMove(frame1.getLocation().x + 100, frame1.getLocation().y + 200);
         robot.mousePress(InputEvent.BUTTON3_MASK);
-        robot.delay(100);
         robot.mouseRelease(InputEvent.BUTTON3_MASK);
 
-//        ((SunToolkit)Toolkit.getDefaultToolkit()).realSync();
         robot.delay(1000);
 
         // Left click Frame-2
         robot.mouseMove(frame2.getLocation().x + 100, frame1.getLocation().y + 200);
         robot.mousePress(InputEvent.BUTTON1_MASK);
-        robot.delay(100);
         robot.mouseRelease(InputEvent.BUTTON1_MASK);
 
-//        ((SunToolkit)Toolkit.getDefaultToolkit()).realSync();
         robot.delay(1000);
 
         JComponent focusOwner = (JComponent)KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
         JFrame focusedWindow = (JFrame)KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusedWindow();
 
-        Sysout.println("focus owner: " + focusOwner);
-        Sysout.println("focused window: " + focusedWindow);
+        System.out.println("focus owner: " + focusOwner);
+        System.out.println("focused window: " + focusedWindow);
 
         // Verify that the focused window is the ancestor of the focus owner
         if (!focusedWindow.isAncestorOf(focusOwner)) {
-            throw new TestFailedException("The focus owner is not in the focused window!");
+            throw new RuntimeException("The focus owner is not in the focused window!");
         }
 
-        // Try to close native focused window
-        robot.keyPress(KeyEvent.VK_ALT);
-        robot.keyPress(KeyEvent.VK_F4);
-        robot.keyRelease(KeyEvent.VK_F4);
-        robot.keyRelease(KeyEvent.VK_ALT);
-
-//        ((SunToolkit)Toolkit.getDefaultToolkit()).realSync();
-        robot.delay(1000);
-
-        // Verify that the Java focused window really mapped the native focused window.
-        if (focusedWindow.isVisible()) {
-            throw new TestFailedException("The focused window is different on Java and on the native level.");
-        }
-    }
-
-    class TestFailedException extends RuntimeException {
-        public TestFailedException(String cause) {
-            super("Test failed.");
-            Sysout.println(cause);
+        if (!OSInfo.getOSType().equals(OSInfo.OSType.MACOSX)) {
+            // Try to close native focused window
+            robot.keyPress(KeyEvent.VK_ALT);
+            robot.keyPress(KeyEvent.VK_F4);
+            robot.keyRelease(KeyEvent.VK_F4);
+            robot.keyRelease(KeyEvent.VK_ALT);
+            robot.delay(1000);
+            // Verify that the Java focused window really mapped the native focused window.
+            if (focusedWindow.isVisible()) {
+                throw new RuntimeException("The focused window is different on Java and on the native level.");
+            }
+        } else {
+            // Try to move native focus to previous window
+            robot.keyPress(KeyEvent.VK_CONTROL);
+            robot.keyPress(KeyEvent.VK_F4);
+            robot.keyRelease(KeyEvent.VK_F4);
+            robot.keyRelease(KeyEvent.VK_CONTROL);
+            robot.delay(1000);
+            // Verify that the Java focused window really mapped the native focused window.
+            if (focusedWindow.isFocused()) {
+                throw new RuntimeException("The focused window is different on Java and on the native level.");
+            }
         }
     }
 }
-
-/****************************************************
- Standard Test Machinery
- DO NOT modify anything below -- it's a standard
-  chunk of code whose purpose is to make user
-  interaction uniform, and thereby make it simpler
-  to read and understand someone else's test.
- ****************************************************/
-
-/**
- This is part of the standard test machinery.
- It creates a dialog (with the instructions), and is the interface
-  for sending text messages to the user.
- To print the instructions, send an array of strings to Sysout.createDialog
-  WithInstructions method.  Put one line of instructions per array entry.
- To display a message for the tester to see, simply call Sysout.println
-  with the string to be displayed.
- This mimics System.out.println but works within the test harness as well
-  as standalone.
- */
-
-class Sysout
-{
-    static TestDialog dialog;
-
-    public static void createDialogWithInstructions( String[] instructions )
-    {
-        dialog = new TestDialog( new Frame(), "Instructions" );
-        dialog.printInstructions( instructions );
-//        dialog.setVisible(true);
-        println( "Any messages for the tester will display here." );
-    }
-
-    public static void createDialog( )
-    {
-        dialog = new TestDialog( new Frame(), "Instructions" );
-        String[] defInstr = { "Instructions will appear here. ", "" } ;
-        dialog.printInstructions( defInstr );
-//        dialog.setVisible(true);
-        println( "Any messages for the tester will display here." );
-    }
-
-
-    public static void printInstructions( String[] instructions )
-    {
-        dialog.printInstructions( instructions );
-    }
-
-
-    public static void println( String messageIn )
-    {
-        dialog.displayMessage( messageIn );
-    }
-
-}// Sysout  class
-
-/**
-  This is part of the standard test machinery.  It provides a place for the
-   test instructions to be displayed, and a place for interactive messages
-   to the user to be displayed.
-  To have the test instructions displayed, see Sysout.
-  To have a message to the user be displayed, see Sysout.
-  Do not call anything in this dialog directly.
-  */
-class TestDialog extends Dialog
-{
-
-    TextArea instructionsText;
-    TextArea messageText;
-    int maxStringLength = 80;
-
-    //DO NOT call this directly, go through Sysout
-    public TestDialog( Frame frame, String name )
-    {
-        super( frame, name );
-        int scrollBoth = TextArea.SCROLLBARS_BOTH;
-        instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
-        add( "North", instructionsText );
-
-        messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
-        add("Center", messageText);
-
-        pack();
-
-//        setVisible(true);
-    }// TestDialog()
-
-    //DO NOT call this directly, go through Sysout
-    public void printInstructions( String[] instructions )
-    {
-        //Clear out any current instructions
-        instructionsText.setText( "" );
-
-        //Go down array of instruction strings
-
-        String printStr, remainingStr;
-        for( int i=0; i < instructions.length; i++ )
-        {
-            //chop up each into pieces maxSringLength long
-            remainingStr = instructions[ i ];
-            while( remainingStr.length() > 0 )
-            {
-                //if longer than max then chop off first max chars to print
-                if( remainingStr.length() >= maxStringLength )
-                {
-                    //Try to chop on a word boundary
-                    int posOfSpace = remainingStr.
-                        lastIndexOf( ' ', maxStringLength - 1 );
-
-                    if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
-
-                    printStr = remainingStr.substring( 0, posOfSpace + 1 );
-                    remainingStr = remainingStr.substring( posOfSpace + 1 );
-                }
-                //else just print
-                else
-                {
-                    printStr = remainingStr;
-                    remainingStr = "";
-                }
-
-                instructionsText.append( printStr + "\n" );
-
-            }// while
-
-        }// for
-
-    }//printInstructions()
-
-    //DO NOT call this directly, go through Sysout
-    public void displayMessage( String messageIn )
-    {
-        messageText.append( messageIn + "\n" );
-        System.out.println(messageIn);
-    }
-
-}// TestDialog  class