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.newt.opengl.GLWindow;
import com.jogamp.nativewindow.NativeWindowFactory;
import com.jogamp.opengl.DefaultGLCapabilitiesChooser;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLCapabilitiesImmutable;
import com.jogamp.opengl.GLDrawableFactory;
import com.jogamp.opengl.GLOffscreenAutoDrawable;
import com.jogamp.opengl.GLProfile;
/**
* Tests the closing the device of GLWindow and off-screen GLAutoDrawable using FBO and PBuffer in JOGL
*/
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class TestNEWTCloseX11DisplayBug565 {
@Test
public void test01X11WindowMemoryLeak() 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 GLWindow window = GLWindow.create(caps);
window.setTitle("NEWT Resource X11 Leak - #" + j );
window.setSize( 128, 128 );
window.setVisible(true);
window.display();
window.setVisible(false);
window.destroy();
if(NativeWindowFactory.TYPE_X11 == NativeWindowFactory.getNativeWindowType(false)) {
final int openD = X11Util.getOpenDisplayConnectionNumber() - open0;
if( openD > 0) {
X11Util.dumpOpenDisplayConnections();
X11Util.dumpPendingDisplayConnections();
Assert.assertEquals("New display connection didn't close", 0, openD);
}
}
}
}
catch ( final Exception e ) {
e.printStackTrace();
Assert.fail(e.getMessage());
}
}
@Test
public void test02X11WindowMemoryLeakPBufferAutoDrawable() 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 GLProfile glp = GLProfile.getDefault( );
final GLCapabilities caps = new GLCapabilities( glp );
caps.setPBuffer(true);
final GLAutoDrawable buffer = GLDrawableFactory.getFactory( glp ).createOffscreenAutoDrawable(null, caps, null, 256, 256);
buffer.display();
buffer.destroy();
if(NativeWindowFactory.TYPE_X11 == NativeWindowFactory.getNativeWindowType(false)) {
final int openD = X11Util.getOpenDisplayConnectionNumber() - open0;
if(openD > 0) {
X11Util.dumpOpenDisplayConnections();
X11Util.dumpPendingDisplayConnections();
Assert.assertEquals("New display connection didn't close", 0, openD);
}
}
}
}
catch ( final Exception e ) {
e.printStackTrace();
Assert.fail(e.getMessage());
}
}
@Test
public void test03X11WindowMemoryLeakFBOAutoDrawable() 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 GLProfile glp = GLProfile.getDefault( );
final GLCapabilitiesImmutable caps = new GLCapabilities( glp );
final GLOffscreenAutoDrawable buffer = GLDrawableFactory.getFactory( glp ).createOffscreenAutoDrawable(
null, caps, new DefaultGLCapabilitiesChooser(), 256, 256);
buffer.display();
buffer.destroy();
if(NativeWindowFactory.TYPE_X11 == NativeWindowFactory.getNativeWindowType(false)) {
final int openD = X11Util.getOpenDisplayConnectionNumber() - open0;
if(openD > 0) {
X11Util.dumpOpenDisplayConnections();
X11Util.dumpPendingDisplayConnections();
Assert.assertEquals("New display connection didn't close", 0, openD);
}
}
}
}
catch ( final Exception e ) {
e.printStackTrace();
Assert.fail(e.getMessage());
}
}
public static void main(final String args[]) {
org.junit.runner.JUnitCore.main(TestNEWTCloseX11DisplayBug565.class.getName());
}
}