From: "Steve McKay☄" <smckay@google.com>
To: "Thomas Fitzsimmons" <fitzsim@redhat.com>
Cc: "David Herron" <David.Herron@sun.com>,
mauve-discuss@sources.redhat.com,
"Dan Kegel" <dkegel@google.com>
Subject: Re: Tweaking default java.awt.Robot settings
Date: Thu, 04 Oct 2007 00:43:00 -0000 [thread overview]
Message-ID: <4f2ee4520710031742u7a569385j60bf46067be98359@mail.gmail.com> (raw)
In-Reply-To: <4f2ee4520709251328s388c16ebs46f66ce3232cb48f@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 875 bytes --]
Here's a patch for the test. Everything seems to be working well. I
haven't looked through the other tests yet to see how this might be
shared.
--steve
On 9/25/07, Steve McKay☄ <smckay@google.com> wrote:
> Thomas,
>
> > Even after you've ensured that the frame has responded, subsequent checks will
> > still need to be synchronized, since Robot calls are not synchronous.
>
> That was just a code snippet to demonstrate how to solve one part of
> the problem. The code that does the actual testing is synchronized on
> the lock as well. But like I said, there were liveness issues. I'll
> try to work those out. Still, I can't honestly say that I'd want to go
> through the same amount of effort for every test involving Robot, so
> this change is sorta speculative rather than practical.
>
> --
> Steve McKay <smckay@google.com>
>
--
Steve McKay <smckay@google.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: KeyPressTest.patch --]
[-- Type: text/x-patch; name="KeyPressTest.patch", Size: 3663 bytes --]
Index: keyPressTest.java
===================================================================
RCS file: /cvs/mauve/mauve/gnu/testlet/java/awt/Component/keyPressTest.java,v
retrieving revision 1.2
diff -u -r1.2 keyPressTest.java
--- keyPressTest.java 31 Mar 2006 23:08:06 -0000 1.2
+++ keyPressTest.java 4 Oct 2007 00:36:00 -0000
@@ -31,17 +31,26 @@
public class keyPressTest implements Testlet
{
- int key = 0;
+ //arbitrary lock for use in synchronizing test and awt threads
+ final Object lock = new Object();
+
+ volatile Integer key = null;
+
Robot r;
myFrame f;
TestHarness h;
-
+
public void test (TestHarness h)
{
f = new myFrame();
r = h.createRobot ();
this.h = h;
-
+
+ f.setSize(200,200); // assumes that the window is positioned at 0,0.
+ f.show();
+
+ waitForWindow();
+
runTest(KeyEvent.VK_A, 'a');
runTest(KeyEvent.VK_B, 'b');
runTest(KeyEvent.VK_C, 'c');
@@ -68,31 +77,84 @@
runTest(KeyEvent.VK_X, 'x');
runTest(KeyEvent.VK_Y, 'y');
runTest(KeyEvent.VK_Z, 'z');
+
+ f.dispose();
}
-
+
public void runTest(int code, char chr)
{
- KeyEvent e = new KeyEvent(f, KeyEvent.KEY_PRESSED, 0, 0, code, chr, KeyEvent.KEY_LOCATION_STANDARD);
- f.dispatchEvent(e);
-
-
- f.setSize(200,200);
- f.show();
+ int k; // assigned in the synchronized block
r.mouseMove(60, 60);
- r.keyPress(code);
- r.keyRelease(code);
- h.check(key, (int) chr);
- }
+ synchronized(lock) {
+ key = null; // reset the key
+
+ // queue the events
+ r.keyPress(code);
+ r.keyRelease(code); // don't press they key forever
- class myFrame
- extends Frame
- {
-
- public boolean keyDown(Event e, int i)
- {
- key = e.key;
+ try {
+
+ // release the lock so that the frame can handle the keypress event
+ // once it has handled the event, it will notify on the lock.
+ // at this point the key should be non-null. We test the result
+ // and return
+ lock.wait();
+ } catch (InterruptedException e) {
+ // ignore, we want to get started again
+ }
+
+ k = key.intValue();
+ }
+
+ h.check(k, chr);
+ }
+
+ class myFrame extends Frame {
+
+ public boolean keyDown(Event e, int i) {
+ synchronized(lock) {
+ key = new Integer(e.key);
+ lock.notifyAll();
+ }
return super.keyDown(e, i);
}
}
+
+ /**
+ * Blocks until the frame has able to respond to keypress events
+ */
+ private void waitForWindow() {
+
+ // wait until the window starts process events
+ synchronized(lock) {
+ while (key == null) {
+ r.keyPress(KeyEvent.VK_EQUALS); // send a key press event
+ r.keyRelease(KeyEvent.VK_EQUALS); // don't press the key forever
+ try {
+
+ // wait for a notify from the frame, or timeout in case the
+ // window missed the key press event entirely
+ lock.wait(100);
+ }
+ catch (InterruptedException ie) {
+ // interrupted, if key is still null, we'll try again
+ }
+ }
+
+ // send one more "magic" key press as a marker that we've processed
+ // all of our probing key strokes
+ r.keyPress(KeyEvent.VK_SEMICOLON); // send a key press event
+ r.keyRelease(KeyEvent.VK_SEMICOLON); // don't press the key forever
+ }
+
+ // Eat up any straggler key strokes, wait for the final magic key press
+ while(key != KeyEvent.VK_SEMICOLON) {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ // shouldn't happen
+ }
+ }
+ }
}
next prev parent reply other threads:[~2007-10-04 0:43 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-09-24 20:31 Steve McKay☄
2007-09-24 20:50 ` David Herron
2007-09-24 21:22 ` Steve McKay☄
2007-09-24 21:41 ` David Herron
2007-09-25 18:33 ` Lillian Angel
2007-09-25 19:13 ` Steve McKay☄
2007-09-25 19:27 ` Lillian Angel
2007-09-25 19:37 ` Steve McKay☄
2007-09-25 19:45 ` Lillian Angel
2007-09-25 19:27 ` David Herron
2007-09-25 18:33 ` Thomas Fitzsimmons
2007-09-25 18:57 ` Steve McKay☄
2007-09-25 19:58 ` Thomas Fitzsimmons
2007-09-25 20:28 ` Steve McKay☄
2007-10-04 0:43 ` Steve McKay☄ [this message]
2007-10-04 13:04 ` Lillian Angel
2007-09-25 19:24 ` David Herron
2007-09-25 18:10 ` Thomas Fitzsimmons
2007-09-25 18:14 ` Steve McKay☄
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4f2ee4520710031742u7a569385j60bf46067be98359@mail.gmail.com \
--to=smckay@google.com \
--cc=David.Herron@sun.com \
--cc=dkegel@google.com \
--cc=fitzsim@redhat.com \
--cc=mauve-discuss@sources.redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).