The GPU test framework enables headless GPU testing WITHOUT window handles or display requirements.
- OpenCL-based: Uses OpenCL for compute operations, NOT OpenGL (no window needed)
- CI-Compatible: Gracefully handles environments without GPU drivers
- Mock Platform: Provides mock OpenCL platform when real drivers unavailable
- No Window Handles: Never creates GLFW windows or requires display context
- Automatic Skipping: Tests skip gracefully in CI without crashes
LWJGLHeadlessTest (base)
└── OpenCLHeadlessTest (OpenCL initialization)
└── GPUComputeHeadlessTest (compute operations)
└── CICompatibleGPUTest (CI detection & skipping)
└── Your test class
-
CICompatibleGPUTest: Base class for ALL GPU tests
- Detects OpenCL availability
- Skips tests gracefully if unavailable
- Provides mock platform fallback
- NO WINDOW CREATION
-
MockPlatform: Fallback for CI environments
- Returns mock platform/device when real OpenCL unavailable
- Allows tests to run structure validation without real GPU
- Platform ID = 0 (special mock value)
class MyGPUTest extends CICompatibleGPUTest {
@Test
void testGPUCompute() {
// Discover platforms (returns mock if no real OpenCL)
var platforms = discoverPlatforms();
// Tests automatically skip if no platforms
assumeTrue(!platforms.isEmpty());
// Use first platform (may be mock)
var platform = platforms.get(0);
if (MockPlatform.isMockPlatform(platform)) {
// Running on mock - skip actual GPU operations
log.info("Using mock platform in CI");
return;
}
// Real GPU operations here
testGPUVectorAddition(platform.platformId(), deviceId);
}
}// WRONG - Creates window, will crash in headless
GLFW.glfwInit();
GLFW.glfwCreateWindow(...);
// WRONG - OpenGL requires display context
GL.createCapabilities();
glCreateShader(GL_COMPUTE_SHADER);
// WRONG - Direct GPU memory without checks
OctreeGPUMemory memory = new OctreeGPUMemory();
memory.uploadToGPU(); // Crashes without OpenGL context// RIGHT - Extend CICompatibleGPUTest
class MyTest extends CICompatibleGPUTest {
@Test
void testCompute() {
// Framework handles OpenCL init/detection
var platforms = discoverPlatforms();
// Graceful handling of no GPU
if (platforms.isEmpty() ||
MockPlatform.isMockPlatform(platforms.get(0))) {
log.info("No real GPU - testing structure only");
// Test data structures, not GPU operations
return;
}
// Real GPU test with OpenCL (no window needed)
testGPUVectorAddition(...);
}
}- Real OpenCL platforms detected
- Tests run actual GPU computations
- Full validation of GPU code
- OpenCL not found, mock platform returned
- Tests validate structure/logic only
- No crashes, tests skip gracefully
- Use
@EnabledIf("hasGPUDevice")for GPU-only tests - Use mock platform for structure validation
- Separate GPU operations from business logic
- CICompatibleGPUTest.java: Main test base class
- GPUComputeHeadlessTest.java: OpenCL compute operations
- OpenCLHeadlessTest.java: OpenCL initialization
- MockPlatform.java: CI fallback implementation
- BasicGPUComputeTest.java: Example test patterns
- Compute-only, no display needed
- Works headless with drivers
- Used for parallel computations
- No window handle required
- Requires display context
- Needs window handle (GLFW)
- Will crash in headless CI
- Only for rendering, not compute
# Tests will automatically detect environment
mvn test
# Force CI mode (uses mock platform)
CI=true mvn test
# With OpenCL drivers installed
mvn test # Full GPU tests run
# Without OpenCL drivers
mvn test # Tests skip gracefullydiscoverPlatforms(): Returns real or mock platformsdiscoverDevices(platformId, deviceType): Returns devicestestGPUVectorAddition(platformId, deviceId): Example compute testisOpenCLAvailable(): Static check for OpenCLisCIEnvironment(): Detects CI environment
shouldUseMockPlatform(): Checks if mock neededgetMockPlatforms(): Returns mock platform listgetMockDevices(): Returns mock device listisMockPlatform(platform): Checks if platform is mock
- Always extend CICompatibleGPUTest
- Never create windows or OpenGL contexts
- Use OpenCL for compute operations
- Check for mock platform before GPU operations
- Test data structures separately from GPU code
- Use assumeTrue() for graceful skipping
- Log clearly when using mock platform
The gpu-test-framework provides headless GPU testing through OpenCL, with automatic fallback to mock platforms in CI environments. Tests NEVER create windows, NEVER use OpenGL for testing, and ALWAYS skip gracefully when GPU unavailable. This prevents the crash loops seen when trying to create OpenGL contexts in headless environments.