package com.jogamp.opengl.test.junit.jogl.acore; import jogamp.nativewindow.x11.X11Util; import org.junit.Assert; import org.junit.Test; import org.junit.FixMethodOrder; import org.junit.runners.MethodSorters; import com.jogamp.nativewindow.NativeWindowFactory; import com.jogamp.opengl.GLCapabilities; import com.jogamp.opengl.GLCapabilitiesImmutable; import com.jogamp.opengl.GLProfile; import com.jogamp.opengl.awt.GLCanvas; import java.awt.Frame; /** * Tests the closing the device of GLCanvas in JOGL */ @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class TestAWTCloseX11DisplayBug565 { @Test public void testX11WindowMemoryLeak() throws Exception { GLProfile.initSingleton(); // ensure shared resource runner is done try { for ( int j = 0; j < 10; j++ ) { final int open0; if(NativeWindowFactory.TYPE_X11 == NativeWindowFactory.getNativeWindowType(false)) { open0 = X11Util.getOpenDisplayConnectionNumber(); } else { open0 = 0; } final GLCapabilitiesImmutable caps = new GLCapabilities( GLProfile.getDefault( ) ); final Frame frame = new Frame( "AWT Resource X11 Leak - #" + j ); final GLCanvas glCanvas = new GLCanvas( caps ); frame.add( glCanvas ); try { javax.swing.SwingUtilities.invokeAndWait( new Runnable() { public void run() { frame.setSize( 128, 128 ); frame.setVisible( true ); } } ); } catch ( final Throwable t ) { t.printStackTrace(); Assert.fail(t.getMessage()); } glCanvas.display(); try { javax.swing.SwingUtilities.invokeAndWait( new Runnable() { public void run() { frame.setVisible( false ); frame.remove( glCanvas ); frame.dispose(); } } ); } catch ( final Throwable t ) { t.printStackTrace(); Assert.fail(t.getMessage()); } if(NativeWindowFactory.TYPE_X11 == NativeWindowFactory.getNativeWindowType(false)) { final int openD = X11Util.getOpenDisplayConnectionNumber() - open0; if(openD>1) { X11Util.dumpOpenDisplayConnections(); X11Util.dumpPendingDisplayConnections(); Assert.assertTrue("More than 1 new open display connections", false); } } } } catch ( final Exception e ) { e.printStackTrace(); Assert.fail(e.getMessage()); } } public static void main(final String args[]) { org.junit.runner.JUnitCore.main(TestAWTCloseX11DisplayBug565.class.getName()); } }