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