aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xmake/scripts/tests.sh3
-rw-r--r--src/junit/com/jogamp/test/junit/jogl/awt/TestSwingAWTRobotUsageBeforeJOGLInitBug411.java4
-rw-r--r--src/junit/com/jogamp/test/junit/newt/TestFocus01SwingAWTRobot.java7
-rw-r--r--src/junit/com/jogamp/test/junit/newt/TestFocus02SwingAWTRobot.java7
-rw-r--r--src/junit/com/jogamp/test/junit/util/AWTRobotUtil.java8
-rw-r--r--src/junit/com/jogamp/test/junit/util/SingletonInstance.java140
6 files changed, 168 insertions, 1 deletions
diff --git a/make/scripts/tests.sh b/make/scripts/tests.sh
index e2f13ead2..e3d9f8711 100755
--- a/make/scripts/tests.sh
+++ b/make/scripts/tests.sh
@@ -32,7 +32,8 @@ spath=`dirname $0`
# $spath/java-run-all.sh ../build-x86_64 com.jogamp.test.junit.newt.TestFocus01SwingAWTRobot $*
# $spath/java-run-all.sh ../build-x86_64 com.jogamp.test.junit.newt.TestFocus02SwingAWTRobot $*
-# $spath/java-run-all.sh ../build-x86 com.jogamp.test.junit.newt.TestFocus01SwingAWTRobot $*
+$spath/java-run-all.sh ../build-x86 com.jogamp.test.junit.jogl.awt.TestSwingAWTRobotUsageBeforeJOGLInitBug411 $*
+$spath/java-run-all.sh ../build-x86 com.jogamp.test.junit.newt.TestFocus01SwingAWTRobot $*
$spath/java-run-all.sh ../build-x86 com.jogamp.test.junit.newt.TestFocus02SwingAWTRobot $*
# $spath/java-run-all.sh ../build-x86 com.jogamp.test.junit.newt.parenting.TestParenting01aAWT $*
diff --git a/src/junit/com/jogamp/test/junit/jogl/awt/TestSwingAWTRobotUsageBeforeJOGLInitBug411.java b/src/junit/com/jogamp/test/junit/jogl/awt/TestSwingAWTRobotUsageBeforeJOGLInitBug411.java
index 1af1c68f0..1d72406f1 100644
--- a/src/junit/com/jogamp/test/junit/jogl/awt/TestSwingAWTRobotUsageBeforeJOGLInitBug411.java
+++ b/src/junit/com/jogamp/test/junit/jogl/awt/TestSwingAWTRobotUsageBeforeJOGLInitBug411.java
@@ -81,6 +81,7 @@ public class TestSwingAWTRobotUsageBeforeJOGLInitBug411 {
static JPanel panel;
static JPanel colorPanel;
static boolean windowClosing;
+ static SingletonInstance instance;
boolean modLightBrighter = true;
@@ -117,6 +118,8 @@ public class TestSwingAWTRobotUsageBeforeJOGLInitBug411 {
public static void setup() throws InterruptedException, InvocationTargetException, AWTException {
int count;
+ instance = AWTRobotUtil.lock();
+
// simulate AWT usage before JOGL's initialization of X11 threading
windowClosing=false;
border = BorderFactory.createLineBorder (Color.yellow, 2);
@@ -175,6 +178,7 @@ public class TestSwingAWTRobotUsageBeforeJOGLInitBug411 {
Assert.assertNotNull(frame);
frame.dispose();
frame=null;
+ instance.unlock();
}
protected void runTestGL(final Canvas canvas, GLAutoDrawable drawable)
diff --git a/src/junit/com/jogamp/test/junit/newt/TestFocus01SwingAWTRobot.java b/src/junit/com/jogamp/test/junit/newt/TestFocus01SwingAWTRobot.java
index d6a408061..0740af912 100644
--- a/src/junit/com/jogamp/test/junit/newt/TestFocus01SwingAWTRobot.java
+++ b/src/junit/com/jogamp/test/junit/newt/TestFocus01SwingAWTRobot.java
@@ -74,12 +74,19 @@ public class TestFocus01SwingAWTRobot {
static long durationPerTest = 800;
static GLCapabilities glCaps;
+ static SingletonInstance instance;
@BeforeClass
public static void initClass() {
width = 640;
height = 480;
glCaps = new GLCapabilities(null);
+ instance = AWTRobotUtil.lock();
+ }
+
+ @AfterClass
+ public static void release() {
+ instance.unlock();
}
@Test
diff --git a/src/junit/com/jogamp/test/junit/newt/TestFocus02SwingAWTRobot.java b/src/junit/com/jogamp/test/junit/newt/TestFocus02SwingAWTRobot.java
index cee4c31df..547dc646e 100644
--- a/src/junit/com/jogamp/test/junit/newt/TestFocus02SwingAWTRobot.java
+++ b/src/junit/com/jogamp/test/junit/newt/TestFocus02SwingAWTRobot.java
@@ -75,6 +75,7 @@ public class TestFocus02SwingAWTRobot {
static long durationPerTest = 800;
static long waitReparent = 0;
static GLCapabilities glCaps;
+ static SingletonInstance instance;
@BeforeClass
public static void initClass() throws AWTException {
@@ -89,8 +90,14 @@ public class TestFocus02SwingAWTRobot {
GLProfile.initSingleton();
glCaps = new GLCapabilities(null);
+
+ instance = AWTRobotUtil.lock();
}
+ @AfterClass
+ public static void release() {
+ instance.unlock();
+ }
private void testFocus01ProgrFocusImpl(Robot robot)
throws AWTException, InterruptedException, InvocationTargetException {
diff --git a/src/junit/com/jogamp/test/junit/util/AWTRobotUtil.java b/src/junit/com/jogamp/test/junit/util/AWTRobotUtil.java
index b654b2693..fd3d690e3 100644
--- a/src/junit/com/jogamp/test/junit/util/AWTRobotUtil.java
+++ b/src/junit/com/jogamp/test/junit/util/AWTRobotUtil.java
@@ -44,6 +44,14 @@ public class AWTRobotUtil {
public static int TIME_OUT = 1000; // 1s
+ public static final String SINGLE_INSTANCE_LOCK_FILE = "AWTRobotUtil.lock";
+
+ public static SingletonInstance lock() {
+ SingletonInstance si = new SingletonInstance(SINGLE_INSTANCE_LOCK_FILE);
+ si.lock(3*60*1000, 500); // wait up to 3 min, poll every 500ms
+ return si;
+ }
+
/**
* toFront, call setVisible(true) and toFront(),
* after positioning the mouse in the middle of the window via robot.
diff --git a/src/junit/com/jogamp/test/junit/util/SingletonInstance.java b/src/junit/com/jogamp/test/junit/util/SingletonInstance.java
new file mode 100644
index 000000000..52775116b
--- /dev/null
+++ b/src/junit/com/jogamp/test/junit/util/SingletonInstance.java
@@ -0,0 +1,140 @@
+/**
+ * Copyright 2010 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+
+package com.jogamp.test.junit.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.channels.FileLock;
+
+public class SingletonInstance {
+
+ static final boolean DEBUG = true;
+ static final String temp_file_path;
+
+ static {
+ String s = null;
+ try {
+ File tmpFile = File.createTempFile("TEST", "tst");
+ String absTmpFile = tmpFile.getCanonicalPath();
+ tmpFile.delete();
+ s = absTmpFile.substring(0, absTmpFile.lastIndexOf(File.separator));
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ temp_file_path = s;
+ }
+
+ public static String getCanonicalTempPath() {
+ return temp_file_path;
+ }
+
+ public static String getCanonicalTempLockFilePath(String basename) {
+ return getCanonicalTempPath() + File.separator + basename;
+ }
+
+ public SingletonInstance(String lockFileBasename) {
+ this.file = new File ( getCanonicalTempLockFilePath ( lockFileBasename ) );
+ }
+
+ public SingletonInstance(File lockFile) {
+ this.file = lockFile ;
+ }
+
+ public synchronized void lock(long timeout_ms, long poll_ms) {
+ long i=0;
+ try {
+ do {
+ if(tryLock()) {
+ return;
+ }
+ i++;
+ Thread.sleep(poll_ms);
+ } while ( i < timeout_ms / poll_ms ) ;
+ } catch ( InterruptedException ie ) {
+ throw new RuntimeException(ie);
+ }
+ throw new RuntimeException("SingletonInstance couldn't get lock within "+timeout_ms+"ms");
+ }
+
+ public synchronized boolean tryLock() {
+ try {
+ randomAccessFile = new RandomAccessFile(file, "rw");
+ fileLock = randomAccessFile.getChannel().tryLock();
+
+ if (fileLock != null) {
+ //final File f_file = file;
+ //final RandomAccessFile f_randomAccessFile = randomAccessFile;
+ //final FileLock f_fileLock = fileLock;
+ Runtime.getRuntime().addShutdownHook(new Thread() {
+ public void run() {
+ unlock();
+ }
+ });
+ locked = true;
+ if(DEBUG) {
+ System.err.println("Locked " + file);
+ }
+ return true;
+ }
+ } catch (Exception e) {
+ System.err.println("Unable to create and/or lock file: " + file);
+ e.printStackTrace();
+ }
+ return false;
+ }
+
+ public synchronized boolean unlock() {
+ if(locked) {
+ try {
+ fileLock.release();
+ randomAccessFile.close();
+ file.delete();
+ return true;
+ } catch (Exception e) {
+ System.err.println("Unable to remove lock file: " + file);
+ e.printStackTrace();
+ } finally {
+ fileLock = null;
+ randomAccessFile = null;
+ locked = false;
+ }
+ }
+ return false;
+ }
+
+ public synchronized boolean isLocked() {
+ return locked;
+ }
+
+ File file = null;
+ RandomAccessFile randomAccessFile = null;
+ FileLock fileLock = null;
+ boolean locked = false;
+}