[rfc] [icedtea-web] Reproducer for clipboard (reopened PR708)

Adam Domurad adomurad at redhat.com
Thu Oct 18 09:30:20 PDT 2012


On 05/29/2012 11:21 AM, Jiri Vanek wrote:
> 2012-05-29 Jiri Vanek  <jvanek at redhat.com>
>
>     Added clipboard reproducers
>     * 
> tests/jnlp_tests/signed/ClipboardContentSigned/resources/ClipboardContentSignedCopy1.jnlp:
>     Jnlp to invoke manual copying to clipboard on signed app, please note
>     the delayed death of application
>     * 
> tests/jnlp_tests/signed/ClipboardContentSigned/resources/ClipboardContentSignedCopy2.jnlp:
>     Jnlp to invoke jtextfield like copying  signed app, please note the
>     delayed death of application
>     * 
> tests/jnlp_tests/signed/ClipboardContentSigned/resources/ClipboardContentSignedPaste1.jnlp:
>     Jnlp to invoke manual pasting on signed application
>     * 
> tests/jnlp_tests/signed/ClipboardContentSigned/resources/ClipboardContentSignedPaste2.jnlp:
>     Jnlp to invoke jtextfield like pasting on signed application
>     * 
> tests/jnlp_tests/signed/ClipboardContentSigned/srcs/ClipboardContentSigned.java:
>     Application which is trying to access clipboard by various ways.
>     * 
> tests/jnlp_tests/signed/ClipboardContentSigned/testcases/ClipboardContentSignedTests.java:
>     Automated tests for four above jnlps.
>     * 
> tests/jnlp_tests/simple/ClipboardContent/resources/ClipboardContentCopy1.jnlp:
>     Jnlp to invoke manual copying to clipboard on unsigned app, please 
> note
>     the delayed death of application
>     * 
> tests/jnlp_tests/simple/ClipboardContent/resources/ClipboardContentCopy2.jnlp:
>     Jnlp to invoke jtextfield like copying  unsigned app, please note the
>     delayed death of application
>     * 
> tests/jnlp_tests/simple/ClipboardContent/resources/ClipboardContentPaste1.jnlp:
>     Jnlp to invoke manual pasting on unsigned application
>     * 
> tests/jnlp_tests/simple/ClipboardContent/resources/ClipboardContentPaste2.jnlp:
>     Jnlp to invoke jtextfield like pasting on unsigned application
>     * 
> tests/jnlp_tests/simple/ClipboardContent/srcs/ClipboardContent.java:
>     Application which is trying to access clipboard by various ways.
>     * 
> tests/jnlp_tests/simple/ClipboardContent/testcases/ClipboardContentTests.java:
>     Automated tests for first and third of above four jnlps. The tests of
>     second and fourth is disabled due to necessary manual interaction
>
> Hi all ! whatever happens in PR708  this reproducers should remains 
> green ;)
>
> There is one part of in testcases which may be unclear to reviewer, 
> and it is parallel run of copier (test/application) and paster 
> (application/test). In way that test have copied to clipboard and 
> javaws have paste from it, then there is no issue, because test is 
> eternal running clipboard owner (who is waiting for his javaws to 
> finish) so javaws can paste without problems.
> The problem occurred when  javaws copied to clipboard and test have to 
> read from it. In this case I had to make javaws run in parallel with 
> test for a while (I have 10seconds timeout, and test is NOT waiting 
> for it to time-out, I just neede to have clipboard owner 
> (javaws)alive, until I test the value. The issue is that when (java 
> as) clipboard owner ends, everything it puts to clipboard die with it.
>
> I was on doubt just to test access to clipboard and so get rid of this 
> paralelisation  but it did not seems to me enough. I would rather test 
> the real value in clipboard.
>
>
> So rfc! Best regards
>    J.
>

Hi Jiri, I remember looking at this a while back, sorry for letting it 
sit for so long (although you should have pinged it meanwhile :).

Thanks for tackling this, comments inline.

> diff -r 526df16b6e27 
> tests/jnlp_tests/signed/ClipboardContentSigned/resources/ClipboardContentSignedCopy1.jnlp
> --- /dev/null    Thu Jan 01 00:00:00 1970 +0000
> +++ 
> b/tests/jnlp_tests/signed/ClipboardContentSigned/resources/ClipboardContentSignedCopy1.jnlp 
>  Tue May 29 17:20:14 2012 +0200
> @@ -0,0 +1,58 @@
> +<!--
> +
> +This file is part of IcedTea.
> +
> +IcedTea is free software; you can redistribute it and/or modify
> +it under the terms of the GNU General Public License as published by
> +the Free Software Foundation; either version 2, or (at your option)
> +any later version.
> +
> +IcedTea 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 for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with IcedTea; see the file COPYING.  If not, write to the
> +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
> Boston, MA
> +02110-1301 USA.
> +
> +Linking this library statically or dynamically with other modules is
> +making a combined work based on this library.  Thus, the terms and
> +conditions of the GNU General Public License cover the whole
> +combination.
> +
> +As a special exception, the copyright holders of this library give you
> +permission to link this library with independent modules to produce an
> +executable, regardless of the license terms of these independent
> +modules, and to copy and distribute the resulting executable under
> +terms of your choice, provided that you also meet, for each linked
> +independent module, the terms and conditions of the license of that
> +module.  An independent module is a module which is not derived from
> +or based on this library.  If you modify this library, you may extend
> +this exception to your version of the library, but you are not
> +obligated to do so.  If you do not wish to do so, delete this
> +exception statement from your version.
> +
> + -->
> +<?xml version="1.0" encoding="utf-8"?>
> +<jnlp spec="1.0" href="ClipboardContentSignedCopy1.jnlp" codebase=".">
> +    <information>
> +        <title>ClipboardContentSignedCopy1</title>
> +        <vendor>IcedTea</vendor>
> +        <homepage 
> href="http://icedtea.classpath.org/wiki/IcedTea-Web#Testing_IcedTea-Web"/>
> + <description>ClipboardContentSignedCopy1</description>
> +        <offline/>
> +    </information>
> +    <resources>
> +        <j2se version="1.4+"/>
> +        <jar href="ClipboardContentSigned.jar"/>
> +    </resources>
> +    <application-desc main-class="ClipboardContentSigned">
> +        <argument>copy1</argument>
> +        <argument>10</argument>
> +    </application-desc>
> +    <security>
> +        <all-permissions/>
> +    </security>
> +</jnlp>
> diff -r 526df16b6e27 
> tests/jnlp_tests/signed/ClipboardContentSigned/resources/ClipboardContentSignedCopy2.jnlp
> --- /dev/null    Thu Jan 01 00:00:00 1970 +0000
> +++ 
> b/tests/jnlp_tests/signed/ClipboardContentSigned/resources/ClipboardContentSignedCopy2.jnlp 
>  Tue May 29 17:20:14 2012 +0200
> @@ -0,0 +1,58 @@
> +<!--
> +
> +This file is part of IcedTea.
> +
> +IcedTea is free software; you can redistribute it and/or modify
> +it under the terms of the GNU General Public License as published by
> +the Free Software Foundation; either version 2, or (at your option)
> +any later version.
> +
> +IcedTea 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 for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with IcedTea; see the file COPYING.  If not, write to the
> +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
> Boston, MA
> +02110-1301 USA.
> +
> +Linking this library statically or dynamically with other modules is
> +making a combined work based on this library.  Thus, the terms and
> +conditions of the GNU General Public License cover the whole
> +combination.
> +
> +As a special exception, the copyright holders of this library give you
> +permission to link this library with independent modules to produce an
> +executable, regardless of the license terms of these independent
> +modules, and to copy and distribute the resulting executable under
> +terms of your choice, provided that you also meet, for each linked
> +independent module, the terms and conditions of the license of that
> +module.  An independent module is a module which is not derived from
> +or based on this library.  If you modify this library, you may extend
> +this exception to your version of the library, but you are not
> +obligated to do so.  If you do not wish to do so, delete this
> +exception statement from your version.
> +
> + -->
> +<?xml version="1.0" encoding="utf-8"?>
> +<jnlp spec="1.0" href="ClipboardContentSignedCopy2.jnlp" codebase=".">
> +    <information>
> +        <title>ClipboardContentSignedCopy2</title>
> +        <vendor>IcedTea</vendor>
> +        <homepage 
> href="http://icedtea.classpath.org/wiki/IcedTea-Web#Testing_IcedTea-Web"/>
> + <description>ClipboardContentSignedCopy2</description>
> +        <offline/>
> +    </information>
> +    <resources>
> +        <j2se version="1.4+"/>
> +        <jar href="ClipboardContentSigned.jar"/>
> +    </resources>
> +    <application-desc main-class="ClipboardContentSigned">
> +        <argument>copy2</argument>
> +        <argument>10</argument>
> +    </application-desc>
> +    <security>
> +        <all-permissions/>
> +    </security>
> +</jnlp>
> diff -r 526df16b6e27 
> tests/jnlp_tests/signed/ClipboardContentSigned/resources/ClipboardContentSignedPaste1.jnlp
> --- /dev/null    Thu Jan 01 00:00:00 1970 +0000
> +++ 
> b/tests/jnlp_tests/signed/ClipboardContentSigned/resources/ClipboardContentSignedPaste1.jnlp 
>  Tue May 29 17:20:14 2012 +0200
> @@ -0,0 +1,57 @@
> +<!--
> +
> +This file is part of IcedTea.
> +
> +IcedTea is free software; you can redistribute it and/or modify
> +it under the terms of the GNU General Public License as published by
> +the Free Software Foundation; either version 2, or (at your option)
> +any later version.
> +
> +IcedTea 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 for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with IcedTea; see the file COPYING.  If not, write to the
> +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
> Boston, MA
> +02110-1301 USA.
> +
> +Linking this library statically or dynamically with other modules is
> +making a combined work based on this library.  Thus, the terms and
> +conditions of the GNU General Public License cover the whole
> +combination.
> +
> +As a special exception, the copyright holders of this library give you
> +permission to link this library with independent modules to produce an
> +executable, regardless of the license terms of these independent
> +modules, and to copy and distribute the resulting executable under
> +terms of your choice, provided that you also meet, for each linked
> +independent module, the terms and conditions of the license of that
> +module.  An independent module is a module which is not derived from
> +or based on this library.  If you modify this library, you may extend
> +this exception to your version of the library, but you are not
> +obligated to do so.  If you do not wish to do so, delete this
> +exception statement from your version.
> +
> + -->
> +<?xml version="1.0" encoding="utf-8"?>
> +<jnlp spec="1.0" href="ClipboardContentSignedPaste1.jnlp" codebase=".">
> +    <information>
> +        <title>ClipboardContentSignedPaste1</title>
> +        <vendor>IcedTea</vendor>
> +        <homepage 
> href="http://icedtea.classpath.org/wiki/IcedTea-Web#Testing_IcedTea-Web"/>
> + <description>ClipboardContentSignedPaste1</description>
> +        <offline/>
> +    </information>
> +    <resources>
> +        <j2se version="1.4+"/>
> +        <jar href="ClipboardContentSigned.jar"/>
> +    </resources>
> +    <application-desc main-class="ClipboardContentSigned">
> +        <argument>paste1</argument>
> +    </application-desc>
> +    <security>
> +        <all-permissions/>
> +    </security>
> +</jnlp>
> diff -r 526df16b6e27 
> tests/jnlp_tests/signed/ClipboardContentSigned/resources/ClipboardContentSignedPaste2.jnlp
> --- /dev/null    Thu Jan 01 00:00:00 1970 +0000
> +++ 
> b/tests/jnlp_tests/signed/ClipboardContentSigned/resources/ClipboardContentSignedPaste2.jnlp 
>  Tue May 29 17:20:14 2012 +0200
> @@ -0,0 +1,57 @@
> +<!--
> +
> +This file is part of IcedTea.
> +
> +IcedTea is free software; you can redistribute it and/or modify
> +it under the terms of the GNU General Public License as published by
> +the Free Software Foundation; either version 2, or (at your option)
> +any later version.
> +
> +IcedTea 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 for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with IcedTea; see the file COPYING.  If not, write to the
> +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
> Boston, MA
> +02110-1301 USA.
> +
> +Linking this library statically or dynamically with other modules is
> +making a combined work based on this library.  Thus, the terms and
> +conditions of the GNU General Public License cover the whole
> +combination.
> +
> +As a special exception, the copyright holders of this library give you
> +permission to link this library with independent modules to produce an
> +executable, regardless of the license terms of these independent
> +modules, and to copy and distribute the resulting executable under
> +terms of your choice, provided that you also meet, for each linked
> +independent module, the terms and conditions of the license of that
> +module.  An independent module is a module which is not derived from
> +or based on this library.  If you modify this library, you may extend
> +this exception to your version of the library, but you are not
> +obligated to do so.  If you do not wish to do so, delete this
> +exception statement from your version.
> +
> + -->
> +<?xml version="1.0" encoding="utf-8"?>
> +<jnlp spec="1.0" href="ClipboardContentSignedPaste2.jnlp" codebase=".">
> +    <information>
> +        <title>ClipboardContentSignedPaste2</title>
> +        <vendor>IcedTea</vendor>
> +        <homepage 
> href="http://icedtea.classpath.org/wiki/IcedTea-Web#Testing_IcedTea-Web"/>
> + <description>ClipboardContentSignedPaste2</description>
> +        <offline/>
> +    </information>
> +    <resources>
> +        <j2se version="1.4+"/>
> +        <jar href="ClipboardContentSigned.jar"/>
> +    </resources>
> +    <application-desc main-class="ClipboardContentSigned">
> +        <argument>paste2</argument>
> +    </application-desc>
> +    <security>
> +        <all-permissions/>
> +    </security>
> +</jnlp>
> diff -r 526df16b6e27 
> tests/jnlp_tests/signed/ClipboardContentSigned/srcs/ClipboardContentSigned.java
> --- /dev/null    Thu Jan 01 00:00:00 1970 +0000
> +++ 
> b/tests/jnlp_tests/signed/ClipboardContentSigned/srcs/ClipboardContentSigned.java 
>  Tue May 29 17:20:14 2012 +0200
> @@ -0,0 +1,183 @@
> +/* ClipboardContentSigned.java
> +Copyright (C) 2012 Red Hat, Inc.
> +
> +This file is part of IcedTea.
> +
> +IcedTea is free software; you can redistribute it and/or
> +modify it under the terms of the GNU General Public License as 
> published by
> +the Free Software Foundation, version 2.
> +
> +IcedTea 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 for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with IcedTea; see the file COPYING.  If not, write to
> +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
> Boston, MA
> +02110-1301 USA.
> +
> +Linking this library statically or dynamically with other modules is
> +making a combined work based on this library.  Thus, the terms and
> +conditions of the GNU General Public License cover the whole
> +combination.
> +
> +As a special exception, the copyright holders of this library give you
> +permission to link this library with independent modules to produce an
> +executable, regardless of the license terms of these independent
> +modules, and to copy and distribute the resulting executable under
> +terms of your choice, provided that you also meet, for each linked
> +independent module, the terms and conditions of the license of that
> +module.  An independent module is a module which is not derived from
> +or based on this library.  If you modify this library, you may extend
> +this exception to your version of the library, but you are not
> +obligated to do so.  If you do not wish to do so, delete this
> +exception statement from your version.
> + */
> +
> +import java.awt.Toolkit;
> +import java.awt.datatransfer.Clipboard;
> +import java.awt.datatransfer.DataFlavor;
> +import java.awt.datatransfer.StringSelection;
> +import java.awt.datatransfer.Transferable;
> +import java.awt.datatransfer.UnsupportedFlavorException;
> +import java.io.IOException;
> +import java.lang.reflect.InvocationTargetException;
> +import java.util.concurrent.TimeUnit;
> +import javax.swing.JFrame;
> +import javax.swing.JPanel;
> +import javax.swing.JTextField;
> +import javax.swing.SwingUtilities;
> +import javax.swing.text.JTextComponent;
> +
> +public class ClipboardContentSigned extends JPanel {
> +
> +    private static final String contentC = "COPY#$REPRODUCER";
> +    private static final String contentP = "PASTE#$REPRODUCER";
> +
> +    private static class LocalFrame extends JFrame {
> +
> +        JTextField t;
> +
> +        public LocalFrame(String str) {
> +            super();
> +            t = new JTextField(str);
> +            this.add(t);
> +            this.setSize(100, 100);
> +            this.pack();
> +            t.selectAll();
> +            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
> +        }
> +
> +        public void run() throws InterruptedException {
> +            SwingUtilities.invokeLater(new Runnable() {
> +
> +                @Override
> +                public void run() {
> +                    setVisible(true);
> +
> +                }
> +            });
> +            while (!this.isVisible()) {
> +                Thread.sleep(100);
> +            }
> +        }
> +
> +        public JTextField getT() {
> +            return t;
> +        }
> +    }
> +
> +    public void putToClipboard1(String str) {
> +        Toolkit toolkit = Toolkit.getDefaultToolkit();
> +        Clipboard clipboard = toolkit.getSystemClipboard();
> +        StringSelection strSel = new StringSelection(str);
> +        clipboard.setContents(strSel, null);
> +        printFlavors();
> +    }
> +
> +    public void putToClipboard2(final String str) throws 
> InterruptedException, NoSuchMethodException, IllegalAccessException, 
> UnsupportedFlavorException, IllegalArgumentException, 
> InvocationTargetException, IOException {
> +        final LocalFrame lf = new LocalFrame(str);
> +        lf.run();
> +        ((JTextComponent) (lf.getT())).copy();
> +        printFlavors();
> +        lf.dispose();
> +    }
> +
> +    public String pasteFromClipboard2() throws InterruptedException, 
> NoSuchMethodException, IllegalAccessException, 
> UnsupportedFlavorException, IllegalArgumentException, 
> InvocationTargetException, IOException {
> +        final LocalFrame lf = new LocalFrame("xxx");
> +        lf.run();
> +        ((JTextComponent) (lf.getT())).paste();
> +        printFlavors();
> +        String s = lf.getT().getText();
> +        lf.dispose();
> +        return s;
> +    }
> +
> +    private void printFlavors() {
> +//jsut for debuging

jsut -> just, debuging -> debugging.

> +//        Toolkit toolkit = Toolkit.getDefaultToolkit();
> +//        Clipboard clipboard = toolkit.getSystemClipboard();
> +//        Transferable clipData = clipboard.getContents(clipboard);
> +//        DataFlavor[] cd = clipData.getTransferDataFlavors();
> +//        for (DataFlavor dataFlavor : cd) {
> +//            System.out.println(dataFlavor.getMimeType());
> +//        }
> +    }
> +
> +    public String pasteFromClipboard1() throws 
> UnsupportedFlavorException, IOException {
> +        Toolkit toolkit = Toolkit.getDefaultToolkit();
> +        Clipboard clipboard = toolkit.getSystemClipboard();
> +        Transferable clipData = clipboard.getContents(clipboard);
> +        printFlavors();
> +        String s = (String) (clipData.getTransferData(
> +                DataFlavor.stringFlavor));
> +        return s;
> +    }
> +
> +    public static void main(String[] args) throws Exception {
> +        ClipboardContentSigned cl = new ClipboardContentSigned();
> +        if (args.length == 0) {
> +            throw new IllegalArgumentException("at least copy1|2 or 
> paste1|2 must be as argument (+mandatory number giving use timeout in 
> seconds before termination)");
> +        } else if (args.length == 1) {
> +            cl.proceeed(args[0]);
> +        } else {
> +            cl.proceeed(args[0], args[1]);
> +        }
> +
> +    }
> +
> +    public void proceeed(String arg) throws Exception {
> +        proceeed(arg, 0);
> +    }
> +
> +    public void proceeed(String arg, String keepAliveFor) throws 
> Exception {
> +        proceeed(arg, Long.valueOf(keepAliveFor));
> +    }
> +
> +    public void proceeed(String arg, long timeOut) throws Exception {
> +        if (arg.equals("copy1")) {
> +            System.out.println(this.getClass().getName() + " copying1 
> to clipboard " + contentC);
> +            putToClipboard1(contentC);
> +            System.out.println(this.getClass().getName() + " copied1 
> to clipboard " + pasteFromClipboard1());
> +        } else if (arg.equals("paste1")) {
> +            System.out.println(this.getClass().getName() + " pasting1 
> from clipboard ");
> +            String nwContent = pasteFromClipboard1();
> +            System.out.println(this.getClass().getName() + " pasted1 
> from clipboard " + nwContent);
> +        } else if (arg.equals("copy2")) {
> +            System.out.println(this.getClass().getName() + " copying2 
> to clipboard " + contentC);
> +            putToClipboard2(contentC);
> +            System.out.println(this.getClass().getName() + " copied2 
> to clipboard " + pasteFromClipboard2());
> +        } else if (arg.equals("paste2")) {
> +            System.out.println(this.getClass().getName() + " pasting2 
> from clipboard ");
> +            String nwContent = pasteFromClipboard2();
> +            System.out.println(this.getClass().getName() + " pasted2 
> from clipboard " + nwContent);
> +        } else {
> +            throw new IllegalArgumentException("supported copy1|2 
> paste1|2");
> +        }
> +        long start = System.nanoTime();
> +        while (TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - 
> start) < timeOut) {
> +            Thread.sleep(500);
> +        }
> +    }
> +}
> diff -r 526df16b6e27 
> tests/jnlp_tests/signed/ClipboardContentSigned/testcases/ClipboardContentSignedTests.java
> --- /dev/null    Thu Jan 01 00:00:00 1970 +0000
> +++ 
> b/tests/jnlp_tests/signed/ClipboardContentSigned/testcases/ClipboardContentSignedTests.java 
>  Tue May 29 17:20:14 2012 +0200
> @@ -0,0 +1,263 @@
> +/* ClipboardContentSignedTests.java
> +Copyright (C) 2012 Red Hat, Inc.
> +
> +This file is part of IcedTea.
> +
> +IcedTea is free software; you can redistribute it and/or
> +modify it under the terms of the GNU General Public License as 
> published by
> +the Free Software Foundation, version 2.
> +
> +IcedTea 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 for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with IcedTea; see the file COPYING.  If not, write to
> +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
> Boston, MA
> +02110-1301 USA.
> +
> +Linking this library statically or dynamically with other modules is
> +making a combined work based on this library.  Thus, the terms and
> +conditions of the GNU General Public License cover the whole
> +combination.
> +
> +As a special exception, the copyright holders of this library give you
> +permission to link this library with independent modules to produce an
> +executable, regardless of the license terms of these independent
> +modules, and to copy and distribute the resulting executable under
> +terms of your choice, provided that you also meet, for each linked
> +independent module, the terms and conditions of the license of that
> +module.  An independent module is a module which is not derived from
> +or based on this library.  If you modify this library, you may extend
> +this exception to your version of the library, but you are not
> +obligated to do so.  If you do not wish to do so, delete this
> +exception statement from your version.
> + */
> +
> +import java.awt.Toolkit;
> +import java.awt.datatransfer.Clipboard;
> +import java.awt.datatransfer.DataFlavor;
> +import java.awt.datatransfer.StringSelection;
> +import java.awt.datatransfer.Transferable;
> +import java.awt.datatransfer.UnsupportedFlavorException;
> +import java.io.IOException;
> +import java.util.Arrays;
> +import java.util.Collections;
> +import java.util.List;
> +import net.sourceforge.jnlp.ContentReaderListener;
> +import net.sourceforge.jnlp.ServerAccess;
> +import net.sourceforge.jnlp.ServerAccess.ProcessResult;

Since this has been deprecated, use the new location, s'il vous plaît.

> +import net.sourceforge.jnlp.annotations.Bug;
> +import net.sourceforge.jnlp.annotations.NeedsDisplay;
> +import org.junit.Assert;
> +
> +import org.junit.Test;
> +
> +public class ClipboardContentSignedTests {
> +
> +    private static final String contentC = "COPY#$REPRODUCER";
> +    private static final String contentP = "PASTE#$REPRODUCER";
> +    private static final String emptyContent = "empty content";
> +    private static ServerAccess server = new ServerAccess();
> +    private static final List<String> l = 
> Collections.unmodifiableList(Arrays.asList(new String[]{"-Xtrustall"}));

I don't like this 'l' being used to describe this list (yes, I know that 
its everywhere :D), but, do as you will.

> +
> +    public static void putToClipboard(String str) {
> +        Toolkit toolkit = Toolkit.getDefaultToolkit();
> +        Clipboard clipboard = toolkit.getSystemClipboard();
> +        StringSelection strSel = new StringSelection(str);
> +        clipboard.setContents(strSel, null);
> +    }
> +
> +    public static String pasteFromClipboard() throws 
> UnsupportedFlavorException, IOException {
> +        Toolkit toolkit = Toolkit.getDefaultToolkit();
> +        Clipboard clipboard = toolkit.getSystemClipboard();
> +        Transferable clipData = clipboard.getContents(clipboard);
> +        String s = (String) (clipData.getTransferData(
> +                DataFlavor.stringFlavor));
> +        return s;
> +    }
> +
> +    @Test
> +    public void assertClipboardIsWorking() throws Exception {
> +        putToClipboard(emptyContent);
> +        Assert.assertEquals("Clipboard must contains new value, did 
> not", emptyContent, pasteFromClipboard());
> +        putToClipboard(contentC);
> +        Assert.assertEquals("Clipboard must contains new value, did 
> not", contentC, pasteFromClipboard());
> +    }
> +
> +    private static class AsyncJavaws implements Runnable {

The copypasting of the helper classes between ClipboardContentTest and 
ClipboardContentSignedTest is pretty hard for me to accept ... Do you 
think these are general enough to be pushed into 'test extensions' ? It 
would also keep intent of the tests clear. I'd be happy if you had other 
solutions.
Perhaps you should have only one testing class, and have the 
signed/unsigned components be 'resources'? (Custom reproducer could 
handle this on one test, but its probably better to have custom 
reproducers always be 'specially prepared' tests)

> +
> +        private final boolean headless;
> +        private final String url;
> +        private ProcessResult result;
> +        private ContentReaderListener contentReaderListener;
> +        private ContentReaderListener errorReaderListener;
> +
> +        public AsyncJavaws(String url, boolean headless, 
> ContentReaderListener contentReaderListener, ContentReaderListener 
> errorReaderListener) {
> +            this.url = url;
> +            this.headless = headless;
> +            this.contentReaderListener = contentReaderListener;
> +            this.errorReaderListener = errorReaderListener;
> +        }
> +
> +        @Override
> +        public void run() {
> +            try {
> +                if (headless) {
> +                    result = server.executeJavawsHeadless(l, url, 
> contentReaderListener, errorReaderListener);

This method signature doesn't exist now, can you either add 'null' to 
the end, or add a new delegate with the patch ?

> +                } else {
> +                    result = server.executeJavaws(l, url, 
> contentReaderListener, errorReaderListener);
> +                }
> +            } catch (Exception ex) {
> +                if (result == null) {
> +                    result = new ProcessResult("", ex.getMessage(), 
> null, true, 1, ex);
> +                }
> +                throw new RuntimeException(ex);
> +            }
> +        }
> +
> +        public ProcessResult getResult() {
> +            return result;
> +        }
> +    }
> +
> +    private static class WaitingForStringProcess implements 
> ContentReaderListener, Runnable {
> +
> +        private final boolean headless;
> +        private final String url;
> +        private StringBuilder output = new StringBuilder();
> +        private StringBuilder err = new StringBuilder();
> +        private AsyncJavaws aj;
> +        ContentReaderListener errListener = new ContentReaderListener() {
> +
> +            @Override
> +            public void charReaded(char ch) {
> +                err.append(ch);
> +            }
> +
> +            @Override
> +            public void lineReaded(String s) {
> +            }
> +        };
> +        private final String waitingFor;
> +        private boolean canRun = true;
> +
> +        public WaitingForStringProcess(String url, boolean headless, 
> String waitingFor) {
> +            this.url = url;
> +            this.headless = headless;
> +            this.waitingFor = waitingFor;
> +            Assert.assertNotNull(waitingFor);
> +            Assert.assertNotNull(url);
> +        }
> +
> +        @Override
> +        public void charReaded(char ch) {
> +            output.append(ch);
> +        }
> +
> +        @Override
> +        public void lineReaded(String s) {
> +            if (s.contains(waitingFor)) {
> +                canRun = false;
> +            }
> +        }
> +
> +        @Override
> +        public void run() {
> +            aj = new AsyncJavaws(url, headless, this, errListener);
> +            ServerAccess.logOutputReprint("Starting tread with " + 
> url + " and waiting for result or string " + waitingFor);

tread -> thread

> +            new Thread(aj).start();
> +            while (canRun && aj.getResult() == null) {
> +                try {
> +                    Thread.sleep(100);
> +                } catch (InterruptedException ex) {
> +                    ServerAccess.logErrorReprint("itteration 
> interrupted");
> +                    throw new RuntimeException(ex);
> +                }
> +            }
> +            if (aj.getResult() != null) {
> +                ServerAccess.logOutputReprint("Waiting done. Ressult 
> have been delivered");

Ressult -> result

> +            }
> +            if (!canRun) {
> +                ServerAccess.logOutputReprint("Waiting done. String " 
> + waitingFor + " delivered");
> +            }
> +        }
> +
> +        public String getErr() {
> +            return err.toString();
> +        }
> +
> +        public String getOutput() {
> +            return output.toString();
> +        }
> +
> +        public AsyncJavaws getAj() {

I prefer the more verbose getAsyncJavaws() (if nothing else, Java coding 
is great typing practice :), especially if it becomes a general 
test-extension. If it stays within this test file, I can live with it.

> +            return aj;
> +        }
> +    }
> +
> +    @Test
> +    @Bug(id = "PR708")
> +    public void ClipboardContentSignedTestCopy1() throws Exception {
> +        putToClipboard(emptyContent);
> +        Assert.assertEquals("Clipboard must contains new value, did 
> not", emptyContent, pasteFromClipboard());
> +        WaitingForStringProcess wfsp = new 
> WaitingForStringProcess("/ClipboardContentSignedCopy1.jnlp", true, 
> "copied");
> +        wfsp.run();
> +        String ss = pasteFromClipboard();
> +        Assert.assertEquals("Clipboard must contains new value, did 
> not", contentC, ss);
> +        String s = "xception";

I'm assuming no problems exist for javaws and matching 'xception'. Can 
you extract 's' as a meaningfully named constant ? Eg, XCEPTION would do 
fine.

> + Assert.assertFalse("ClipboardContentSignedCopy stderr should not 
> contains " + s + " but did ", wfsp.getErr().contains(s));
> +    }
> +
> +    @Test
> +    @Bug(id = "PR708")
> +    @NeedsDisplay
> +    public void ClipboardContentSignedTestCopy2() throws Exception {
> +        putToClipboard(emptyContent);
> +        Assert.assertEquals("Clipboard must contains new value, did 
> not", emptyContent, pasteFromClipboard());
> +        WaitingForStringProcess wfsp = new 
> WaitingForStringProcess("/ClipboardContentSignedCopy2.jnlp", false, 
> "copied");
> +        wfsp.run();
> +        String ss = pasteFromClipboard();
> +        Assert.assertEquals("Clipboard must contains new value, did 
> not", contentC, ss);
> +        String s = "xception";
> +        Assert.assertFalse("ClipboardContentSignedCopy stderr should 
> not contains " + s + " but did ", wfsp.getErr().contains(s));
> +
> +    }
> +
> +    @Test
> +    @Bug(id = "PR708")
> +    public void ClipboardContentSignedTestPaste1() throws Exception {
> +        //necessery errasing
> +        putToClipboard(emptyContent);
> +        Assert.assertEquals("Clipboard must contains new value, did 
> not", emptyContent, pasteFromClipboard());
> +        //now put the tested data
> +        putToClipboard(contentP);
> +        Assert.assertEquals("Clipboard must contains new value, did 
> not", contentP, pasteFromClipboard());
> +        ServerAccess.ProcessResult pr = 
> server.executeJavawsHeadless(l, "/ClipboardContentSignedPaste1.jnlp");
> +        Assert.assertTrue("ClipboardContentSignedTestPaste stdout 
> should contains " + contentP + " but didn't", 
> pr.stdout.contains(contentP));
> +        String s = "xception";
> +        Assert.assertFalse("ClipboardContentSignedTestPaste stderr 
> shouldnot contains " + s + " but did ", pr.stderr.contains(s));
> +        Assert.assertFalse(pr.wasTerminated);
> +        Assert.assertEquals((Integer) 0, pr.returnValue);
> +    }
> +
> +    @Test
> +    @Bug(id = "PR708")
> +    @NeedsDisplay
> +    public void ClipboardContentSignedTestPaste2() throws Exception {
> +        //necessery errasing
> +        putToClipboard(emptyContent);
> +        Assert.assertEquals("Clipboard must contains new value, did 
> not", emptyContent, pasteFromClipboard());

contains -> contain

> +        //now put the tested data
> +        putToClipboard(contentP);
> +        Assert.assertEquals("Clipboard must contains new value, did 
> not", contentP, pasteFromClipboard());
> +        Assert.assertEquals("Clipboard must contains new value, did 
> not", contentP, pasteFromClipboard());
> +        ServerAccess.ProcessResult pr = server.executeJavaws(l, 
> "/ClipboardContentSignedPaste2.jnlp");
> +        Assert.assertTrue("ClipboardContentSignedTestPaste stdout 
> should contains " + contentP + " but didn't", 
> pr.stdout.contains(contentP));
> +        String s = "xception";
> +        Assert.assertFalse("ClipboardContentSignedTestPaste stderr 
> shouldnot contains " + s + " but did ", pr.stderr.contains(s));

shouldnot contains -> should not contain

> + Assert.assertFalse(pr.wasTerminated);
> +        Assert.assertEquals((Integer) 0, pr.returnValue);
> +    }
> +}
> diff -r 526df16b6e27 
> tests/jnlp_tests/simple/ClipboardContent/resources/ClipboardContentCopy1.jnlp
> --- /dev/null    Thu Jan 01 00:00:00 1970 +0000
> +++ 
> b/tests/jnlp_tests/simple/ClipboardContent/resources/ClipboardContentCopy1.jnlp 
>  Tue May 29 17:20:14 2012 +0200
> @@ -0,0 +1,58 @@
> +<!--
> +
> +This file is part of IcedTea.
> +
> +IcedTea is free software; you can redistribute it and/or modify
> +it under the terms of the GNU General Public License as published by
> +the Free Software Foundation; either version 2, or (at your option)
> +any later version.
> +
> +IcedTea 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 for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with IcedTea; see the file COPYING.  If not, write to the
> +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
> Boston, MA
> +02110-1301 USA.
> +
> +Linking this library statically or dynamically with other modules is
> +making a combined work based on this library.  Thus, the terms and
> +conditions of the GNU General Public License cover the whole
> +combination.
> +
> +As a special exception, the copyright holders of this library give you
> +permission to link this library with independent modules to produce an
> +executable, regardless of the license terms of these independent
> +modules, and to copy and distribute the resulting executable under
> +terms of your choice, provided that you also meet, for each linked
> +independent module, the terms and conditions of the license of that
> +module.  An independent module is a module which is not derived from
> +or based on this library.  If you modify this library, you may extend
> +this exception to your version of the library, but you are not
> +obligated to do so.  If you do not wish to do so, delete this
> +exception statement from your version.
> +
> + -->
> +<?xml version="1.0" encoding="utf-8"?>
> +<jnlp spec="1.0" href="ClipboardContentCopy1.jnlp" codebase=".">
> +    <information>
> +        <title>ClipboardContentCopy1</title>
> +        <vendor>IcedTea</vendor>
> +        <homepage 
> href="http://icedtea.classpath.org/wiki/IcedTea-Web#Testing_IcedTea-Web"/>
> + <description>ClipboardContentCopy1</description>
> +        <offline/>
> +    </information>
> +    <resources>
> +        <j2se version="1.4+"/>
> +        <jar href="ClipboardContent.jar"/>
> +    </resources>
> +    <application-desc main-class="ClipboardContent">
> +        <argument>copy1</argument>
> +        <argument>10</argument>
> +    </application-desc>
> +    <security>
> +        <all-permissions/>
> +    </security>
> +</jnlp>
> diff -r 526df16b6e27 
> tests/jnlp_tests/simple/ClipboardContent/resources/ClipboardContentCopy2.jnlp
> --- /dev/null    Thu Jan 01 00:00:00 1970 +0000
> +++ 
> b/tests/jnlp_tests/simple/ClipboardContent/resources/ClipboardContentCopy2.jnlp 
>  Tue May 29 17:20:14 2012 +0200
> @@ -0,0 +1,58 @@
> +<!--
> +
> +This file is part of IcedTea.
> +
> +IcedTea is free software; you can redistribute it and/or modify
> +it under the terms of the GNU General Public License as published by
> +the Free Software Foundation; either version 2, or (at your option)
> +any later version.
> +
> +IcedTea 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 for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with IcedTea; see the file COPYING.  If not, write to the
> +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
> Boston, MA
> +02110-1301 USA.
> +
> +Linking this library statically or dynamically with other modules is
> +making a combined work based on this library.  Thus, the terms and
> +conditions of the GNU General Public License cover the whole
> +combination.
> +
> +As a special exception, the copyright holders of this library give you
> +permission to link this library with independent modules to produce an
> +executable, regardless of the license terms of these independent
> +modules, and to copy and distribute the resulting executable under
> +terms of your choice, provided that you also meet, for each linked
> +independent module, the terms and conditions of the license of that
> +module.  An independent module is a module which is not derived from
> +or based on this library.  If you modify this library, you may extend
> +this exception to your version of the library, but you are not
> +obligated to do so.  If you do not wish to do so, delete this
> +exception statement from your version.
> +
> + -->
> +<?xml version="1.0" encoding="utf-8"?>
> +<jnlp spec="1.0" href="ClipboardContentCopy2.jnlp" codebase=".">
> +    <information>
> +        <title>ClipboardContentCopy2</title>
> +        <vendor>IcedTea</vendor>
> +        <homepage 
> href="http://icedtea.classpath.org/wiki/IcedTea-Web#Testing_IcedTea-Web"/>
> + <description>ClipboardContentCopy2</description>
> +        <offline/>
> +    </information>
> +    <resources>
> +        <j2se version="1.4+"/>
> +        <jar href="ClipboardContent.jar"/>
> +    </resources>
> +    <application-desc main-class="ClipboardContent">
> +        <argument>copy2</argument>
> +        <argument>10</argument>
> +    </application-desc>
> +    <security>
> +        <all-permissions/>
> +    </security>
> +</jnlp>
> diff -r 526df16b6e27 
> tests/jnlp_tests/simple/ClipboardContent/resources/ClipboardContentPaste1.jnlp
> --- /dev/null    Thu Jan 01 00:00:00 1970 +0000
> +++ 
> b/tests/jnlp_tests/simple/ClipboardContent/resources/ClipboardContentPaste1.jnlp 
>  Tue May 29 17:20:14 2012 +0200
> @@ -0,0 +1,57 @@
> +<!--
> +
> +This file is part of IcedTea.
> +
> +IcedTea is free software; you can redistribute it and/or modify
> +it under the terms of the GNU General Public License as published by
> +the Free Software Foundation; either version 2, or (at your option)
> +any later version.
> +
> +IcedTea 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 for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with IcedTea; see the file COPYING.  If not, write to the
> +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
> Boston, MA
> +02110-1301 USA.
> +
> +Linking this library statically or dynamically with other modules is
> +making a combined work based on this library.  Thus, the terms and
> +conditions of the GNU General Public License cover the whole
> +combination.
> +
> +As a special exception, the copyright holders of this library give you
> +permission to link this library with independent modules to produce an
> +executable, regardless of the license terms of these independent
> +modules, and to copy and distribute the resulting executable under
> +terms of your choice, provided that you also meet, for each linked
> +independent module, the terms and conditions of the license of that
> +module.  An independent module is a module which is not derived from
> +or based on this library.  If you modify this library, you may extend
> +this exception to your version of the library, but you are not
> +obligated to do so.  If you do not wish to do so, delete this
> +exception statement from your version.
> +
> + -->
> +<?xml version="1.0" encoding="utf-8"?>
> +<jnlp spec="1.0" href="ClipboardContentPaste1.jnlp" codebase=".">
> +    <information>
> +        <title>ClipboardContentPaste1</title>
> +        <vendor>IcedTea</vendor>
> +        <homepage 
> href="http://icedtea.classpath.org/wiki/IcedTea-Web#Testing_IcedTea-Web"/>
> + <description>ClipboardContentPaste1</description>
> +        <offline/>
> +    </information>
> +    <resources>
> +        <j2se version="1.4+"/>
> +        <jar href="ClipboardContent.jar"/>
> +    </resources>
> +    <application-desc main-class="ClipboardContent">
> +        <argument>paste1</argument>
> +    </application-desc>
> +    <security>
> +        <all-permissions/>
> +    </security>
> +</jnlp>
> diff -r 526df16b6e27 
> tests/jnlp_tests/simple/ClipboardContent/resources/ClipboardContentPaste2.jnlp
> --- /dev/null    Thu Jan 01 00:00:00 1970 +0000
> +++ 
> b/tests/jnlp_tests/simple/ClipboardContent/resources/ClipboardContentPaste2.jnlp 
>  Tue May 29 17:20:14 2012 +0200
> @@ -0,0 +1,57 @@
> +<!--
> +
> +This file is part of IcedTea.
> +
> +IcedTea is free software; you can redistribute it and/or modify
> +it under the terms of the GNU General Public License as published by
> +the Free Software Foundation; either version 2, or (at your option)
> +any later version.
> +
> +IcedTea 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 for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with IcedTea; see the file COPYING.  If not, write to the
> +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
> Boston, MA
> +02110-1301 USA.
> +
> +Linking this library statically or dynamically with other modules is
> +making a combined work based on this library.  Thus, the terms and
> +conditions of the GNU General Public License cover the whole
> +combination.
> +
> +As a special exception, the copyright holders of this library give you
> +permission to link this library with independent modules to produce an
> +executable, regardless of the license terms of these independent
> +modules, and to copy and distribute the resulting executable under
> +terms of your choice, provided that you also meet, for each linked
> +independent module, the terms and conditions of the license of that
> +module.  An independent module is a module which is not derived from
> +or based on this library.  If you modify this library, you may extend
> +this exception to your version of the library, but you are not
> +obligated to do so.  If you do not wish to do so, delete this
> +exception statement from your version.
> +
> + -->
> +<?xml version="1.0" encoding="utf-8"?>
> +<jnlp spec="1.0" href="ClipboardContentPaste2.jnlp" codebase=".">
> +    <information>
> +        <title>ClipboardContentPaste2</title>
> +        <vendor>IcedTea</vendor>
> +        <homepage 
> href="http://icedtea.classpath.org/wiki/IcedTea-Web#Testing_IcedTea-Web"/>
> + <description>ClipboardContentPaste2</description>
> +        <offline/>
> +    </information>
> +    <resources>
> +        <j2se version="1.4+"/>
> +        <jar href="ClipboardContent.jar"/>
> +    </resources>
> +    <application-desc main-class="ClipboardContent">
> +        <argument>paste2</argument>
> +    </application-desc>
> +    <security>
> +        <all-permissions/>
> +    </security>
> +</jnlp>
> diff -r 526df16b6e27 
> tests/jnlp_tests/simple/ClipboardContent/srcs/ClipboardContent.java
> --- /dev/null    Thu Jan 01 00:00:00 1970 +0000
> +++ 
> b/tests/jnlp_tests/simple/ClipboardContent/srcs/ClipboardContent.java 
>  Tue May 29 17:20:14 2012 +0200
> @@ -0,0 +1,183 @@
> +/* ClipboardContent.java
> +Copyright (C) 2012 Red Hat, Inc.
> +
> +This file is part of IcedTea.
> +
> +IcedTea is free software; you can redistribute it and/or
> +modify it under the terms of the GNU General Public License as 
> published by
> +the Free Software Foundation, version 2.
> +
> +IcedTea 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 for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with IcedTea; see the file COPYING.  If not, write to
> +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
> Boston, MA
> +02110-1301 USA.
> +
> +Linking this library statically or dynamically with other modules is
> +making a combined work based on this library.  Thus, the terms and
> +conditions of the GNU General Public License cover the whole
> +combination.
> +
> +As a special exception, the copyright holders of this library give you
> +permission to link this library with independent modules to produce an
> +executable, regardless of the license terms of these independent
> +modules, and to copy and distribute the resulting executable under
> +terms of your choice, provided that you also meet, for each linked
> +independent module, the terms and conditions of the license of that
> +module.  An independent module is a module which is not derived from
> +or based on this library.  If you modify this library, you may extend
> +this exception to your version of the library, but you are not
> +obligated to do so.  If you do not wish to do so, delete this
> +exception statement from your version.
> + */
> +
> +import java.awt.Toolkit;
> +import java.awt.datatransfer.Clipboard;
> +import java.awt.datatransfer.DataFlavor;
> +import java.awt.datatransfer.StringSelection;
> +import java.awt.datatransfer.Transferable;
> +import java.awt.datatransfer.UnsupportedFlavorException;
> +import java.io.IOException;
> +import java.lang.reflect.InvocationTargetException;
> +import java.util.concurrent.TimeUnit;
> +import javax.swing.JFrame;
> +import javax.swing.JPanel;
> +import javax.swing.JTextField;
> +import javax.swing.SwingUtilities;
> +import javax.swing.text.JTextComponent;
> +
> +public class ClipboardContent extends JPanel {
> +
> +    private static final String contentC = "COPY#$REPRODUCER";
> +    private static final String contentP = "PASTE#$REPRODUCER";
> +
> +    private static class LocalFrame extends JFrame {
> +
> +        JTextField t;
> +
> +        public LocalFrame(String str) {
> +            super();
> +            t = new JTextField(str);
> +            this.add(t);
> +            this.setSize(100, 100);
> +            this.pack();
> +            t.selectAll();
> +            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
> +        }
> +
> +        public void run() throws InterruptedException {
> +            SwingUtilities.invokeLater(new Runnable() {
> +
> +                @Override
> +                public void run() {
> +                    setVisible(true);
> +
> +                }
> +            });
> +            while (!this.isVisible()) {
> +                Thread.sleep(100);
> +            }
> +        }
> +
> +        public JTextField getT() {
> +            return t;
> +        }
> +    }
> +
> +    public void putToClipboard1(String str) {
> +        Toolkit toolkit = Toolkit.getDefaultToolkit();
> +        Clipboard clipboard = toolkit.getSystemClipboard();
> +        StringSelection strSel = new StringSelection(str);
> +        clipboard.setContents(strSel, null);
> +        printFlavors();
> +    }
> +
> +    public void putToClipboard2(final String str) throws 
> InterruptedException, NoSuchMethodException, IllegalAccessException, 
> UnsupportedFlavorException, IllegalArgumentException, 
> InvocationTargetException, IOException {
> +        final LocalFrame lf = new LocalFrame(str);
> +        lf.run();
> +        ((JTextComponent) (lf.getT())).copy();
> +        printFlavors();
> +        lf.dispose();
> +    }
> +
> +    public String pasteFromClipboard2() throws InterruptedException, 
> NoSuchMethodException, IllegalAccessException, 
> UnsupportedFlavorException, IllegalArgumentException, 
> InvocationTargetException, IOException {
> +        final LocalFrame lf = new LocalFrame("xxx");
> +        lf.run();
> +        ((JTextComponent) (lf.getT())).paste();
> +        printFlavors();
> +        String s = lf.getT().getText();
> +        lf.dispose();
> +        return s;
> +    }
> +
> +    private void printFlavors() {
> +//jsut for debuging
> +//        Toolkit toolkit = Toolkit.getDefaultToolkit();
> +//        Clipboard clipboard = toolkit.getSystemClipboard();
> +//        Transferable clipData = clipboard.getContents(clipboard);
> +//        DataFlavor[] cd = clipData.getTransferDataFlavors();
> +//        for (DataFlavor dataFlavor : cd) {
> +//            System.out.println(dataFlavor.getMimeType());
> +//        }
> +    }
> +
> +    public String pasteFromClipboard1() throws 
> UnsupportedFlavorException, IOException {
> +        Toolkit toolkit = Toolkit.getDefaultToolkit();
> +        Clipboard clipboard = toolkit.getSystemClipboard();
> +        Transferable clipData = clipboard.getContents(clipboard);
> +        printFlavors();
> +        String s = (String) (clipData.getTransferData(
> +                DataFlavor.stringFlavor));
> +        return s;
> +    }
> +
> +    public static void main(String[] args) throws Exception {
> +        ClipboardContent cl = new ClipboardContent();
> +        if (args.length == 0) {
> +            throw new IllegalArgumentException("at least copy1|2 or 
> paste1|2 must be as argument (+mandatory number giving use timeout in 
> seconds before termination)");
> +        } else if (args.length == 1) {
> +            cl.proceeed(args[0]);
> +        } else {
> +            cl.proceeed(args[0], args[1]);
> +        }
> +
> +    }
> +
> +    public void proceeed(String arg) throws Exception {

proceeed -> proceed ? Unless you have a reason for three e's :)

> +        proceeed(arg, 0);
> +    }
> +
> +    public void proceeed(String arg, String keepAliveFor) throws 
> Exception {
> +        proceeed(arg, Long.valueOf(keepAliveFor));
> +    }
> +
> +    public void proceeed(String arg, long timeOut) throws Exception {
> +        if (arg.equals("copy1")) {
> +            System.out.println(this.getClass().getName() + " copying1 
> to clipboard " + contentC);
> +            putToClipboard1(contentC);
> +            System.out.println(this.getClass().getName() + " copied1 
> to clipboard " + pasteFromClipboard1());
> +        } else if (arg.equals("paste1")) {
> +            System.out.println(this.getClass().getName() + " pasting1 
> from clipboard ");
> +            String nwContent = pasteFromClipboard1();
> +            System.out.println(this.getClass().getName() + " pasted1 
> from clipboard " + nwContent);
> +        } else if (arg.equals("copy2")) {
> +            System.out.println(this.getClass().getName() + " copying2 
> to clipboard " + contentC);
> +            putToClipboard2(contentC);
> +            System.out.println(this.getClass().getName() + " copied2 
> to clipboard " + pasteFromClipboard2());
> +        } else if (arg.equals("paste2")) {
> +            System.out.println(this.getClass().getName() + " pasting2 
> from clipboard ");
> +            String nwContent = pasteFromClipboard2();
> +            System.out.println(this.getClass().getName() + " pasted2 
> from clipboard " + nwContent);
> +        } else {
> +            throw new IllegalArgumentException("supported copy1|2 
> paste1|2");
> +        }
> +        long start = System.nanoTime();
> +        while (TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - 
> start) < timeOut) {
> +            Thread.sleep(500);
> +        }
> +    }
> +}
> diff -r 526df16b6e27 
> tests/jnlp_tests/simple/ClipboardContent/testcases/ClipboardContentTests.java
> --- /dev/null    Thu Jan 01 00:00:00 1970 +0000
> +++ 
> b/tests/jnlp_tests/simple/ClipboardContent/testcases/ClipboardContentTests.java 
>  Tue May 29 17:20:14 2012 +0200
> @@ -0,0 +1,265 @@
> +/* ClipboardContentTests.java
> +Copyright (C) 2012 Red Hat, Inc.
> +
> +This file is part of IcedTea.
> +
> +IcedTea is free software; you can redistribute it and/or
> +modify it under the terms of the GNU General Public License as 
> published by
> +the Free Software Foundation, version 2.
> +
> +IcedTea 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 for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with IcedTea; see the file COPYING.  If not, write to
> +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
> Boston, MA
> +02110-1301 USA.
> +
> +Linking this library statically or dynamically with other modules is
> +making a combined work based on this library.  Thus, the terms and
> +conditions of the GNU General Public License cover the whole
> +combination.
> +
> +As a special exception, the copyright holders of this library give you
> +permission to link this library with independent modules to produce an
> +executable, regardless of the license terms of these independent
> +modules, and to copy and distribute the resulting executable under
> +terms of your choice, provided that you also meet, for each linked
> +independent module, the terms and conditions of the license of that
> +module.  An independent module is a module which is not derived from
> +or based on this library.  If you modify this library, you may extend
> +this exception to your version of the library, but you are not
> +obligated to do so.  If you do not wish to do so, delete this
> +exception statement from your version.
> + */
> +
> +import java.awt.Toolkit;
> +import java.awt.datatransfer.Clipboard;
> +import java.awt.datatransfer.DataFlavor;
> +import java.awt.datatransfer.StringSelection;
> +import java.awt.datatransfer.Transferable;
> +import java.awt.datatransfer.UnsupportedFlavorException;
> +import java.io.IOException;
> +import java.util.Arrays;
> +import java.util.Collections;
> +import java.util.List;
> +import net.sourceforge.jnlp.ContentReaderListener;
> +import net.sourceforge.jnlp.ServerAccess;
> +import net.sourceforge.jnlp.ServerAccess.ProcessResult;
> +import net.sourceforge.jnlp.annotations.Bug;
> +import net.sourceforge.jnlp.annotations.NeedsDisplay;
> +import org.junit.Assert;
> +
> +import org.junit.Test;
> +
> +public class ClipboardContentTests {
> +
> +    private static final String contentC = "COPY#$REPRODUCER";
> +    private static final String contentP = "PASTE#$REPRODUCER";
> +    private static final String emptyContent = "empty content";
> +    private static ServerAccess server = new ServerAccess();
> +    private static final List<String> l = 
> Collections.unmodifiableList(Arrays.asList(new String[]{"-Xtrustall"}));
> +
> +    public static void putToClipboard(String str) {
> +        Toolkit toolkit = Toolkit.getDefaultToolkit();
> +        Clipboard clipboard = toolkit.getSystemClipboard();
> +        StringSelection strSel = new StringSelection(str);
> +        clipboard.setContents(strSel, null);
> +    }

Its not an issue at all, but the 'public' is a little funny for 
something that has no external existence :)

> +
> +    public static String pasteFromClipboard() throws 
> UnsupportedFlavorException, IOException {
> +        Toolkit toolkit = Toolkit.getDefaultToolkit();
> +        Clipboard clipboard = toolkit.getSystemClipboard();
> +        Transferable clipData = clipboard.getContents(clipboard);
> +        String s = (String) (clipData.getTransferData(
> +                DataFlavor.stringFlavor));
> +        return s;
> +    }
> +
> +    @Test
> +    public void assertClipboardIsWorking() throws Exception {
> +        putToClipboard(emptyContent);
> +        Assert.assertEquals(emptyContent, pasteFromClipboard());
> +        putToClipboard(contentC);
> +        Assert.assertEquals(contentC, pasteFromClipboard());
> +    }
> +[ ... Duplicate classes snipped for own sanity ...]
> +
> +    @Test
> +    @Bug(id = "PR708")
> +    public void ClipboardContentTestCopy1() throws Exception {
> +        putToClipboard(emptyContent);
> +        Assert.assertEquals("Clipboard must contains new value, did 
> not", emptyContent, pasteFromClipboard());
> +        WaitingForStringProcess wfsp = new 
> WaitingForStringProcess("/ClipboardContentCopy1.jnlp", true, "copied");
> +        wfsp.run();
> +        String ss = pasteFromClipboard();
> +        Assert.assertEquals("Clipboard content must not be changed, 
> was, did not", emptyContent, ss);

Should this be 'must not be changed, but was' ?

> +        Assert.assertNotNull("Result had to be delivered, was not", 
> wfsp.getAj().getResult());
> +        String s = "xception";
> +        Assert.assertTrue("ClipboardContentSignedCopy stderr should 
> contains " + s + " but did ", 
> wfsp.getAj().getResult().stderr.contains(s));

'but did' -> 'but did not'.

> +    }
> +
> +    //@Test needs awt robot to close dialog

Surely simply adding HEADLESS will stop this dialog from occurring (and 
thus needing to be closed) ?

> +    @Bug(id = "PR708")
> +    @NeedsDisplay
> +    public void ClipboardContentTestCopy2() throws Exception {
> +        putToClipboard(emptyContent);
> +        Assert.assertEquals("Clipboard must contains new value, did 
> not", emptyContent, pasteFromClipboard());
> +        WaitingForStringProcess wfsp = new 
> WaitingForStringProcess("/ClipboardContentCopy2.jnlp", false, "copied");
> +        wfsp.run();
> +        String ss = pasteFromClipboard();
> +        Assert.assertEquals("Clipboard content must not be changed, 
> was", emptyContent, ss);
> +        Assert.assertNotNull("Result had to be delivered, was not", 
> wfsp.getAj().getResult());
> +        String s = "xception";
> +        Assert.assertTrue("ClipboardContentSignedCopy stderr should 
> contains " + s + " but did ", 
> wfsp.getAj().getResult().stderr.contains(s));

should contains -> should contain
but did -> but did not

> +
> +    }
> +
> +    @Test
> +    @Bug(id = "PR708")
> +    public void ClipboardContentTestPaste1() throws Exception {
> +        //necessery errasing
> +        putToClipboard(emptyContent);
> +        Assert.assertEquals("Clipboard must contains new value, did 
> not", emptyContent, pasteFromClipboard());

contains -> contain

> +        //now put the tested data
> +        putToClipboard(contentP);
> +        Assert.assertEquals("Clipboard must contains new value, did 
> not", contentP, pasteFromClipboard());
> +        ServerAccess.ProcessResult pr = 
> server.executeJavawsHeadless(l, "/ClipboardContentPaste1.jnlp");
> +        Assert.assertFalse("ClipboardContentTestPaste stdout should 
> not contains " + contentP + " but didn", pr.stdout.contains(contentP));

didn -> didn't

> +        String s = "xception";
> +        Assert.assertTrue("ClipboardContentTestPaste stderr should 
> contains " + s + " but didn't ", pr.stderr.contains(s));
> +        Assert.assertFalse(pr.wasTerminated);
> +        Assert.assertEquals((Integer) 0, pr.returnValue);
> +    }
> +
> +    //@Test needs awt robot to close dialog

Same as above, seems to me making the run headless will suffice to have 
this as an automated test.

> +    @Bug(id = "PR708")
> +    @NeedsDisplay
> +    public void ClipboardContentTestPaste2() throws Exception {
> +        //necessery errasing
> +        putToClipboard(emptyContent);
> +        Assert.assertEquals("Clipboard must contains new value, did 
> not", emptyContent, pasteFromClipboard());
> +        //now put the tested data
> +        putToClipboard(contentP);
> +        Assert.assertEquals("Clipboard must contains new value, did 
> not", contentP, pasteFromClipboard());
> +        Assert.assertEquals("Clipboard must contains new value, did 
> not", contentP, pasteFromClipboard());
> +        ServerAccess.ProcessResult pr = server.executeJavaws(l, 
> "/ClipboardContentPaste2.jnlp");
> +        Assert.assertFalse("ClipboardContentTestPaste stdout should 
> not contains " + contentP + " but didn", pr.stdout.contains(contentP));
> +        String s = "xception";
> +        Assert.assertTrue("ClipboardContentTestPaste stderr should 
> contains " + s + " but didn't ", pr.stderr.contains(s));
> +        Assert.assertFalse(pr.wasTerminated);
> +        Assert.assertEquals((Integer) 0, pr.returnValue);
> +    }
> +}

Content-wise the patch is good, nice work handling this tricky-to-test 
feature!
Apologies for the nitpicking :)

Thanks,
- Adam



More information about the distro-pkg-dev mailing list