1package app
2
3import (
4 "strings"
5 "testing"
6
7 "github.com/bnema/neferwl/internal/adapters/config"
8 "github.com/bnema/neferwl/internal/adapters/logging"
9)
10
11// The headless renderer factory tells a real renderer it drives a virtual
12// output: without it ExportTargets(1, nil) refuses HDR targets on a real GPU
13// and a headless output falls back to SDR. Skips without Vulkan or without a
14// device that exports dmabufs (lavapipe in CI).
15func TestVirtualRendererExportsHDRTargets(t *testing.T) {
16 r, err := newVulkanRenderer(logging.For(t.Context(), "render"), true, false)(64, 16)
17 if err != nil {
18 t.Skipf("Vulkan unavailable: %v", err)
19 }
20 defer r.Close()
21 // A device that cannot export at all says nothing about the wiring.
22 sdr, err := r.ExportTargets(1, nil, false)
23 if err != nil {
24 t.Skipf("no exportable target: %v", err)
25 }
26 for _, b := range sdr {
27 for _, p := range b.Planes {
28 _ = p.File.Close()
29 }
30 }
31 r.SetHDR(203)
32 bufs, err := r.ExportTargets(1, nil, false)
33 if err != nil {
34 t.Fatalf("virtual HDR export: %v", err)
35 }
36 for _, b := range bufs {
37 for _, p := range b.Planes {
38 _ = p.File.Close()
39 }
40 }
41}
42
43// A failed assembly returns an error and releases what it acquired: without
44// a runtime directory wayland.New, the last fallible step, fails.
45func TestAssembleSessionFailure(t *testing.T) {
46 t.Setenv("XDG_RUNTIME_DIR", "")
47 s, err := assembleSession(t.Context(), Options{Backend: "headless", Config: config.Defaults(), NoXwayland: true})
48 if err == nil || !strings.Contains(err.Error(), "XDG_RUNTIME_DIR") {
49 t.Fatalf("expected runtime directory failure, got %v", err)
50 }
51 if s != nil {
52 t.Fatal("failed assembly returned a session")
53 }
54}