# HG changeset patch # User volk # Date 1208115700 -14400 # Node ID b49bc385fa7e628fc5a6ce28dc242691468af80a # Parent 3488710b02f8ad115a3f98bd615e6666fd2e31b1 6686273: Some AWT reg. tests should be moved to open repository (for CRs 6444769, 6480547, and 6560348) Summary: Some AWT reg. tests are moved to open repository (for CRs 6444769, 6480547, and 6560348) Reviewed-by: ant diff -r 3488710b02f8 -r b49bc385fa7e jdk/test/java/awt/Insets/WindowWithWarningTest/WindowWithWarningTest.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/Insets/WindowWithWarningTest/WindowWithWarningTest.html Sun Apr 13 23:41:40 2008 +0400 @@ -0,0 +1,20 @@ + + + + + WindowWithWarningTest + +
+  This test will run automatically.
+  
+ + + + + diff -r 3488710b02f8 -r b49bc385fa7e jdk/test/java/awt/Insets/WindowWithWarningTest/WindowWithWarningTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/Insets/WindowWithWarningTest/WindowWithWarningTest.java Sun Apr 13 23:41:40 2008 +0400 @@ -0,0 +1,315 @@ +/* + * Copyright 2006-2008 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + + +/* + test + @bug 6391770 + @summary Content of the Window should be laid out in the area left after WarningWindow was added. + @author yuri nesterenko: area= + @run applet WindowWithWarningTest.html +*/ + +// Note there is no @ in front of test above. This is so that the +// harness will not mistake this file as a test file. It should +// only see the html file as a test file. (the harness runs all +// valid test files, so it would run this test twice if this file +// were valid as well as the html file.) +// Also, note the area= after Your Name in the author tag. Here, you +// should put which functional area the test falls in. See the +// AWT-core home page -> test areas and/or -> AWT team for a list of +// areas. +// Note also the 'AutomaticAppletTest.html' in the run tag. This should +// be changed to the name of the test. + + +/** + * WindowWithWarningTest.java + * + * summary: + */ + +import java.applet.Applet; +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; + +//Automated tests should run as applet tests if possible because they +// get their environments cleaned up, including AWT threads, any +// test created threads, and any system resources used by the test +// such as file descriptors. (This is normally not a problem as +// main tests usually run in a separate VM, however on some platforms +// such as the Mac, separate VMs are not possible and non-applet +// tests will cause problems). Also, you don't have to worry about +// synchronisation stuff in Applet tests they way you do in main +// tests... + + +public class WindowWithWarningTest extends Applet +{ + //Declare things used in the test, like buttons and labels here + boolean buttonClicked = false; + public static final int MAX_COUNT = 100; + + public void init() + { + //Create instructions for the user here, as well as set up + // the environment -- set the layout manager, add buttons, + // etc. + + this.setLayout (new BorderLayout ()); + + String[] instructions = + { + "This is an AUTOMATIC test", + "simply wait until it is done" + }; + //Sysout.createDialog( ); + //Sysout.printInstructions( instructions ); + + }//End init() + public void start () + { + //Get things going. Request focus, set size, et cetera + System.setSecurityManager( new SecurityManager() { + // deny AWTPermission("showWindowWithoutWarningBanner") + public boolean checkTopLevelWindow(Object window) { + return false; + } + }); + JFrame frame = new JFrame("Window Test"); + frame.setBounds(50, 50, 200, 200); + frame.show(); + + JWindow window = new JWindow( frame ); + JButton jbutton1 = new JButton( "First" ); + jbutton1.addMouseListener( new MouseAdapter() { + public void mousePressed( MouseEvent me ) { + buttonClicked = true; + } + }); + JButton jbutton2 = new JButton( "Second" ); + window.setLocation( 300, 300 ); + + window.add("North", jbutton1); + window.add("South", jbutton2); + + window.pack(); + window.show(); + //wait for frame to show: + getLocation( frame ); + window.toFront(); + + Dimension size0 = window.getSize(); + Dimension size1 = null; + try { + Robot robot = new Robot(); + + robot.delay(500); + window.pack(); + robot.delay(500); + window.pack(); + // size1 must be the same as size0 + size1 = window.getSize(); + robot.delay(500); + Point pt = jbutton1.getLocationOnScreen(); + robot.mouseMove((int) jbutton1.getLocationOnScreen().x + jbutton1.getWidth() / 2, + (int) jbutton1.getLocationOnScreen().y + jbutton1.getHeight() / 2); + robot.delay(500); + robot.mousePress(MouseEvent.BUTTON1_MASK); + robot.delay(100); + robot.mouseRelease(MouseEvent.BUTTON1_MASK); + robot.delay(2000); + }catch(Exception e) { + throw new RuntimeException( "Exception "+e ); + } + if( !size0.equals(size1) ) { + throw new RuntimeException( "Wrong Window size after multiple pack()s"); + } + if( !buttonClicked ) { + throw new RuntimeException( "Button was not clicked"); + } + window.dispose(); + frame.dispose(); + + System.out.println("Test Passed."); + }// start() + public static Point getLocation( Component co ) throws RuntimeException { + Point pt = null; + boolean bFound = false; + int count = 0; + while( !bFound ) { + try { + pt = co.getLocationOnScreen(); + bFound = true; + }catch( Exception ex ) { + bFound = false; + count++; + } + if( !bFound && count > MAX_COUNT ) { + throw new RuntimeException("don't see a component to get location"); + } + } + return pt; + } + + +}// class AutomaticAppletTest + + +/**************************************************** + 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 +{ + private 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(); + + show(); + }// 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 diff -r 3488710b02f8 -r b49bc385fa7e jdk/test/java/awt/TextField/ScrollSelectionTest/ScrollSelectionTest.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/TextField/ScrollSelectionTest/ScrollSelectionTest.html Sun Apr 13 23:41:40 2008 +0400 @@ -0,0 +1,20 @@ + + + + ScrollSelectionTest + + + +

ScrollSelectionTest
4118621:

+ +

See the dialog box (usually in upper left corner) for instructions

+ + + + diff -r 3488710b02f8 -r b49bc385fa7e jdk/test/java/awt/TextField/ScrollSelectionTest/ScrollSelectionTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/TextField/ScrollSelectionTest/ScrollSelectionTest.java Sun Apr 13 23:41:40 2008 +0400 @@ -0,0 +1,213 @@ +/* + * Copyright 1999-2008 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + test + @bug 4118621 + @summary tests that selected text isn't scrolled when there is enough room. + @author prs: area=TextField + @run applet/manual=yesno ScrollSelectionTest.html +*/ + +/** + * ScrollSelectionTest.java + * + * summary: tests that selected text isn't scrolled when there is enough room. + */ + +import java.applet.Applet; +import java.awt.Dialog; +import java.awt.Frame; +import java.awt.TextField; +import java.awt.TextArea; + +public class ScrollSelectionTest extends Applet + { + + Frame frame = new Frame("ScrollSelectionTest frame"); + TextField tf = new TextField(40); + + public void init() + { + tf.setText("abcdefghijklmnopqrstuvwxyz"); + frame.add(tf); + tf.select(0, 20); + + String[] instructions = + { + "INSTRUCTIONS:", + "This is a test for a win32 specific problem", + "If you see all the letters from 'a' to 'z' and", + "letters from 'a' to 't' are selected then test passes" + }; + Sysout.createDialogWithInstructions( instructions ); + + }// init() + + public void start () + { + setSize (300,300); + setVisible(true); + + frame.setVisible(true); + frame.setBounds (400, 0, 300, 300); + + }// start() + + }// class ScrollSelectionTest + +/**************************************************** + 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 + { + private static TestDialog dialog; + + public static void createDialogWithInstructions( String[] instructions ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + dialog.printInstructions( instructions ); + dialog.show(); + 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.show(); + 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("South", messageText); + + pack(); + + show(); + }// 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" ); + } + + }// TestDialog class diff -r 3488710b02f8 -r b49bc385fa7e jdk/test/java/awt/xembed/server/JavaClient.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/xembed/server/JavaClient.java Sun Apr 13 23:41:40 2008 +0400 @@ -0,0 +1,126 @@ +/* + * Copyright 2004-2008 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.awt.*; +import sun.awt.*; +import java.awt.event.*; +import java.lang.reflect.*; +import java.awt.dnd.*; +import java.awt.datatransfer.*; + +public class JavaClient { + ClientContainer cont; + public static void main(String[] args) { + if (System.getProperty("os.name").toLowerCase().startsWith("win")) { + return; + } + + // Enable testing extensions in XEmbed server + System.setProperty("sun.awt.xembed.testing", "true"); + + boolean xtoolkit = "sun.awt.X11.XToolkit".equals(Toolkit.getDefaultToolkit().getClass().getName()); + final EmbeddedFrame ef = createEmbeddedFrame(xtoolkit, Long.parseLong(args[0])); + ef.setBackground(new Color(100, 100, 200)); + ef.setLayout(new BorderLayout()); + ef.add(new ClientContainer(ef), BorderLayout.CENTER); + ef.pack(); + ef.registerListeners(); + ef.setVisible(true); + } + private static EmbeddedFrame createEmbeddedFrame(boolean xtoolkit, long window) { + try { + Class cl = (xtoolkit?Class.forName("sun.awt.X11.XEmbeddedFrame"):Class.forName("sun.awt.motif.MEmbeddedFrame")); + Constructor cons = cl.getConstructor(new Class[]{Long.TYPE, Boolean.TYPE}); + return (EmbeddedFrame)cons.newInstance(new Object[] {window, true}); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("Can't create embedded frame"); + } + } +} + +class ClientContainer extends Container { + Window parent; + int width, height; + public ClientContainer(Window w) { + parent = w; + width = 500; + height = 50; + final TextField tf = new TextField(30); + + DragSource ds = new DragSource(); + final DragSourceListener dsl = new DragSourceAdapter() { + public void dragDropEnd(DragSourceDropEvent dsde) { + } + }; + final DragGestureListener dgl = new DragGestureListener() { + public void dragGestureRecognized(DragGestureEvent dge) { + dge.startDrag(null, new StringSelection(tf.getText()), dsl); + } + }; + ds.createDefaultDragGestureRecognizer(tf, DnDConstants.ACTION_COPY, dgl); + + final DropTargetListener dtl = new DropTargetAdapter() { + public void drop(DropTargetDropEvent dtde) { + dtde.acceptDrop(DnDConstants.ACTION_COPY); + try { + tf.setText(tf.getText() + (String)dtde.getTransferable().getTransferData(DataFlavor.stringFlavor)); + } catch (Exception e) { + } + } + }; + final DropTarget dt = new DropTarget(tf, dtl); + + setLayout(new FlowLayout()); + add(tf); + Button close = new Button("Close"); + close.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + parent.dispose(); + } + }); + Button inc = new Button("Increase size"); + inc.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + changeSize(10); + } + }); + Button dec = new Button("Decrease size"); + dec.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + changeSize(-10); + } + }); + add(close); + add(inc); + add(dec); + } + void changeSize(int step) { + width += step; + height += step; + parent.pack(); + } + public Dimension getPreferredSize() { + return new Dimension(width, height); + } +} diff -r 3488710b02f8 -r b49bc385fa7e jdk/test/java/awt/xembed/server/RunTestXEmbed.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/xembed/server/RunTestXEmbed.java Sun Apr 13 23:41:40 2008 +0400 @@ -0,0 +1,176 @@ +/* + * Copyright 2004-2008 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/** + * @test + * @bug 4931668 + * @summary Tests XEmbed server/client functionality + * @author Denis Mikhalkin: area=awt.xembed + * @compile JavaClient.java TesterClient.java TestXEmbedServer.java + * @run main/timeout=6000 RunTestXEmbed + */ + +import java.awt.Rectangle; +import java.lang.reflect.Method; +import java.util.logging.*; +import java.util.*; +import java.io.*; + +public class RunTestXEmbed extends TestXEmbedServer { + private static final Logger log = Logger.getLogger("test.xembed"); + private Method test; + private boolean passed = false; + public RunTestXEmbed(Method test) { + super(false); + this.test = test; + } + + public Process startClient(Rectangle bounds[], long window) { + try { + String java_home = System.getProperty("java.home"); + StringBuilder buf = new StringBuilder(); + for (int i = 0; i < bounds.length; i++) { + buf.append(" " + bounds[i].x); + buf.append(" " + bounds[i].y); + buf.append(" " + bounds[i].width); + buf.append(" " + bounds[i].height); + } + Map envs = System.getenv(); + String enva[] = new String[envs.size()]; + int ind = 0; + Iterator iter = envs.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = (Map.Entry)iter.next(); + if (!"AWT_TOOLKIT".equals(entry.getKey())) { + enva[ind++] = entry.getKey() + "=" + entry.getValue(); + } else { + enva[ind++] = "AWT_TOOLKIT=sun.awt.X11.XToolkit"; + } + } + Process proc = Runtime.getRuntime().exec(java_home + + "/bin/java -Dawt.toolkit=sun.awt.X11.XToolkit TesterClient " + + test.getName() + " " + window + buf, + enva); + System.err.println("Test for " + test.getName() + " has started."); + log.fine("Test for " + test.getName() + " has started."); + new InputReader(proc.getInputStream()); + new InputReader(proc.getErrorStream()); + try { + passed = (proc.waitFor() == 0); + } catch (InterruptedException ie) { + } + log.fine("Test for " + test.getName() + " has finished."); + File logFile = new File("java3.txt"); + if (logFile.exists()) { + logFile.renameTo(new File(test.getName() + ".txt")); + } + return proc; + } catch (IOException ex1) { + ex1.printStackTrace(); + } + return null; + } + + public static void main(String[] args) throws Throwable { + if (System.getProperty("os.name").toLowerCase().startsWith("win")) { + return; + } + + // Enabled XEmbed + System.setProperty("sun.awt.xembedserver", "true"); + + if (args.length == 1) { + Class cl = Class.forName("sun.awt.X11.XEmbedServerTester"); + Method meth = cl.getMethod(args[0], new Class[0]); + System.err.println("Performing single test " + args[0]); + boolean res = performTest(meth); + if (!res) { + System.err.println("Test " + args[0] + " has failed"); + } else { + System.err.println("Test " + args[0] + " has passed"); + } + } else { + Class cl = Class.forName("sun.awt.X11.XEmbedServerTester"); + Method[] meths = cl.getMethods(); + LinkedList failed = new LinkedList(); + for (int i = 0; i < meths.length; i++) { + Method meth = meths[i]; + if (meth.getReturnType() == Void.TYPE && meth.getName().startsWith("test") && meth.getParameterTypes().length == 0) { + System.err.println("Performing " + meth.getName()); + boolean res = performTest(meth); + if (!res) { + failed.add(meth); + } + } + } + log.info("Testing finished."); + if (failed.size() != 0) { + System.err.println("Some tests have failed:"); + Iterator iter = failed.iterator(); + while(iter.hasNext()) { + Method meth = (Method)iter.next(); + System.err.println(meth.getName()); + } + throw new RuntimeException("TestFAILED: some of the testcases are failed"); + } else { + System.err.println("All PASSED"); + } + } + } + + private static boolean performTest(Method meth) { + RunTestXEmbed test = new RunTestXEmbed(meth); + test.addClient(); + test.dispose(); + return test.isPassed(); + } + + public boolean isPassed() { + return passed; + } +} + +class InputReader extends Thread { + private InputStream stream; + public InputReader(InputStream stream) { + this.stream = stream; + start(); + } + public void run() { + while (!interrupted()) { + try { + int inp = stream.read(); + if (inp != -1) { + System.out.write(inp); + } else { + try { + Thread.sleep(100); + } catch (Exception iie) { + } + } + } catch (IOException ie) { + break; + } + } + } +} diff -r 3488710b02f8 -r b49bc385fa7e jdk/test/java/awt/xembed/server/TestXEmbedServer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/xembed/server/TestXEmbedServer.java Sun Apr 13 23:41:40 2008 +0400 @@ -0,0 +1,228 @@ +/* + * Copyright 2004-2008 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import java.io.*; +import java.util.logging.*; +import sun.awt.WindowIDProvider; +import java.awt.dnd.*; +import java.awt.datatransfer.*; + +public abstract class TestXEmbedServer { + private static final Logger log = Logger.getLogger("test.xembed"); + Frame f; + Canvas client; + Button toFocus; + Button b_modal; + JButton b_close; + JDialog modal_d; + JFrame dummy; + Container clientCont; + boolean passed; + + public boolean isPassed() { + return passed; + } + + public TestXEmbedServer(boolean manual) { + + // Enable testing extensions in XEmbed server + System.setProperty("sun.awt.xembed.testing", "true"); + + f = new Frame("Main frame"); + f.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + synchronized(TestXEmbedServer.this) { + TestXEmbedServer.this.notifyAll(); + } + dummy.dispose(); + f.dispose(); + } + }); + + f.setLayout(new BorderLayout()); + + Container bcont = new Container(); + + toFocus = new Button("Click to focus server"); + final TextField tf = new TextField(20); + tf.setName("0"); + DragSource ds = new DragSource(); + final DragSourceListener dsl = new DragSourceAdapter() { + public void dragDropEnd(DragSourceDropEvent dsde) { + } + }; + final DragGestureListener dgl = new DragGestureListener() { + public void dragGestureRecognized(DragGestureEvent dge) { + dge.startDrag(null, new StringSelection(tf.getText()), dsl); + } + }; + ds.createDefaultDragGestureRecognizer(tf, DnDConstants.ACTION_COPY, dgl); + + final DropTargetListener dtl = new DropTargetAdapter() { + public void drop(DropTargetDropEvent dtde) { + dtde.acceptDrop(DnDConstants.ACTION_COPY); + try { + tf.setText(tf.getText() + (String)dtde.getTransferable().getTransferData(DataFlavor.stringFlavor)); + } catch (Exception e) { + } + } + }; + final DropTarget dt = new DropTarget(tf, dtl); + + Button b_add = new Button("Add client"); + b_add.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + addClient(); + } + }); + Button b_remove = new Button("Remove client"); + b_remove.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (clientCont.getComponentCount() != 0) { + clientCont.remove(clientCont.getComponentCount()-1); + } + } + }); + b_close = new JButton("Close modal dialog"); + b_close.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + modal_d.dispose(); + } + }); + b_modal = new Button("Show modal dialog"); + b_modal.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + modal_d = new JDialog(f, "Modal dialog", true); + modal_d.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + modal_d.setBounds(0, 100, 200, 50); + modal_d.getContentPane().add(b_close); + modal_d.validate(); + modal_d.show(); + } + }); + + bcont.add(tf); + bcont.add(toFocus); + bcont.add(b_add); + bcont.add(b_remove); + bcont.add(b_modal); + if (manual) { + Button pass = new Button("Pass"); + pass.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + passed = true; + synchronized(TestXEmbedServer.this) { + TestXEmbedServer.this.notifyAll(); + } + } + }); + bcont.add(pass); + Button fail = new Button("Fail"); + fail.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + passed = false; + synchronized(TestXEmbedServer.this) { + TestXEmbedServer.this.notifyAll(); + } + } + }); + bcont.add(fail); + } + b_modal.setName("2"); + bcont.setLayout(new FlowLayout()); + f.add(bcont, BorderLayout.NORTH); + + clientCont = Box.createVerticalBox(); + f.add(clientCont, BorderLayout.CENTER); + + dummy = new JFrame("Dummy"); + dummy.getContentPane().add(new JButton("Button")); + dummy.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + dummy.setBounds(0, 0, 100, 100); + dummy.setVisible(true); + + f.setBounds(300, 0, 800, 300); + f.setVisible(true); + } + + public abstract Process startClient(Rectangle bounds[], long window); + + public void addClient() { + client = new Canvas() { + public void paint(Graphics g) { + super.paint(g); + } + }; + client.setBackground(new Color(30, 220, 40)); + clientCont.add(client); + clientCont.validate(); + WindowIDProvider pid = (WindowIDProvider)client.getPeer(); + log.fine("Added XEmbed server(Canvas) with X window ID " + pid.getWindow()); + Rectangle toFocusBounds = toFocus.getBounds(); + toFocusBounds.setLocation(toFocus.getLocationOnScreen()); + f.validate(); + + // KDE doesn't accept clicks on title as activation - click below title + Rectangle fbounds = f.getBounds(); + fbounds.y += f.getInsets().top; + fbounds.height -= f.getInsets().top; + + Process proc = startClient(new Rectangle[] {fbounds, dummy.getBounds(), toFocusBounds, + new Rectangle(b_modal.getLocationOnScreen(), b_modal.getSize()), + new Rectangle(10, 130, 20, 20)}, pid.getWindow()); + new ClientWatcher(client, proc, clientCont).start(); + } + + public void dispose() { + f.dispose(); + f = null; + dummy.dispose(); + dummy = null; + if (modal_d != null) { + modal_d.dispose(); + modal_d = null; + } + } +} + +class ClientWatcher extends Thread { + private Process clientProcess; + private Canvas client; + private Container parent; + public ClientWatcher(Canvas client, Process proc, Container parent) { + this.client = client; + this.clientProcess = proc; + this.parent = parent; + } + + public void run() { + try { + clientProcess.waitFor(); + } catch (InterruptedException ie) { + } + parent.remove(client); + } +} diff -r 3488710b02f8 -r b49bc385fa7e jdk/test/java/awt/xembed/server/TestXEmbedServerJava.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/xembed/server/TestXEmbedServerJava.java Sun Apr 13 23:41:40 2008 +0400 @@ -0,0 +1,86 @@ +/* + * Copyright 2004-2008 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/** + * @test + * @bug 4931668 + * @summary Tests XEmbed server/client functionality + * @author denis mikhalkin: area=awt.xembed + * @compile JavaClient.java TesterClient.java TestXEmbedServer.java + * @run main/manual TestXEmbedServerJava + */ + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import java.io.*; + +public class TestXEmbedServerJava extends TestXEmbedServer { + public static void main(String[] args) { + if (System.getProperty("os.name").toLowerCase().startsWith("win")) { + return; + } + + // Enabled XEmbed + System.setProperty("sun.awt.xembedserver", "true"); + + String instruction = + "This is a manual test for XEmbed server functionality. \n" + + "You may start XEmbed client by pressing 'Add client' button.\n" + + "Check that focus transfer with mouse works, that focus traversal with Tab/Shift-Tab works.\n" + + "Check that XEmbed server client's growing and shrinking.\n" + + "Check that Drag&Drop works in all combinations.\n" + + "Check the keyboard input works in both text fields.\n"; + Frame f = new Frame("Instructions"); + f.setLayout(new BorderLayout()); + f.add(new TextArea(instruction), BorderLayout.CENTER); + f.pack(); + f.setLocation(0, 400); + f.setVisible(true); + + TestXEmbedServerJava lock = new TestXEmbedServerJava(); + try { + synchronized(lock) { + lock.wait(); + } + } catch (InterruptedException e) { + } + if (!lock.isPassed()) { + throw new RuntimeException("Test failed"); + } + } + + public TestXEmbedServerJava() { + super(true); + } + + public Process startClient(Rectangle[] bounds, long window) { + try { + String java_home = System.getProperty("java.home"); + return Runtime.getRuntime().exec(java_home + "/bin/java JavaClient " + window); + } catch (IOException ex1) { + ex1.printStackTrace(); + } + return null; + } +} diff -r 3488710b02f8 -r b49bc385fa7e jdk/test/java/awt/xembed/server/TesterClient.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/xembed/server/TesterClient.java Sun Apr 13 23:41:40 2008 +0400 @@ -0,0 +1,59 @@ +/* + * Copyright 2004-2008 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.lang.reflect.*; +import java.awt.Rectangle; +import java.util.logging.*; + +public class TesterClient { + private static final Logger log = Logger.getLogger("test.xembed.TesterClient"); + private static Method test; + private static boolean passed = false; + public static void main(String[] args) throws Throwable { + // First parameter is the name of the test, second is the window, the rest are rectangles + Class cl = Class.forName("sun.awt.X11.XEmbedServerTester"); + test = cl.getMethod(args[0], new Class[0]); + long window = Long.parseLong(args[1]); + Rectangle r[] = new Rectangle[(args.length-2)/4]; + for (int i = 0; i < r.length; i++) { + r[i] = new Rectangle(Integer.parseInt(args[2+i*4]), Integer.parseInt(args[2+i*4+1]), + Integer.parseInt(args[2+i*4+2]), Integer.parseInt(args[2+i*4+3])); + } + startClient(r, window); + } + + public static void startClient(Rectangle bounds[], long window) throws Throwable { + Method m_getTester = Class.forName("sun.awt.X11.XEmbedServerTester"). + getMethod("getTester", new Class[] {bounds.getClass(), Long.TYPE}); + final Object tester = m_getTester.invoke(null, new Object[] {bounds, window}); + try { + log.info("Starting test " + test.getName()); + test.invoke(tester, (Object[])null); + log.info("Test " + test.getName() + " PASSED."); + passed = true; + } catch (Exception e) { + log.log(Level.WARNING, "Test " + test.getName() + " FAILED.", e); + } + System.exit(passed?0:1); + } +}