1package cef
2
3import (
4 "context"
5 "os"
6 "testing"
7
8 "github.com/bnema/dumber/internal/application/port"
9)
10
11func TestApplyDefaultRenderStackEnvironment_DefaultsToGDKDMABUFWithANGLEVulkan(t *testing.T) {
12 t.Setenv(dumberRenderStackEnvVar, "")
13 t.Setenv("GSK_RENDERER", "")
14 t.Setenv("PUREGO_CEF2GTK_BACKEND", "")
15 t.Setenv("PUREGO_CEF2GTK_ANGLE_BACKEND", "")
16 t.Setenv(cef2gtkOSRBackingScaleEnvVar, "")
17
18 got := applyDefaultRenderStackEnvironment(nil)
19
20 if got != renderStackVulkanDMABUF {
21 t.Fatalf("render stack = %q, want %q", got, renderStackVulkanDMABUF)
22 }
23 if got := os.Getenv("GSK_RENDERER"); got != "vulkan" {
24 t.Fatalf("GSK_RENDERER = %q, want vulkan", got)
25 }
26 if got := os.Getenv("PUREGO_CEF2GTK_BACKEND"); got != "gdk-dmabuf" {
27 t.Fatalf("PUREGO_CEF2GTK_BACKEND = %q, want gdk-dmabuf", got)
28 }
29 if got := os.Getenv("PUREGO_CEF2GTK_ANGLE_BACKEND"); got != "vulkan" {
30 t.Fatalf("PUREGO_CEF2GTK_ANGLE_BACKEND = %q, want vulkan", got)
31 }
32 if got := os.Getenv(cef2gtkOSRBackingScaleEnvVar); got != "auto" {
33 t.Fatalf("%s = %q, want auto", cef2gtkOSRBackingScaleEnvVar, got)
34 }
35}
36
37func TestApplyDefaultRenderStackEnvironment_OverridesConflictingLowLevelDefaults(t *testing.T) {
38 t.Setenv(dumberRenderStackEnvVar, "")
39 t.Setenv(dumberRenderStackAllowSplitEnvVar, "")
40 t.Setenv("GSK_RENDERER", "ngl")
41 t.Setenv("PUREGO_CEF2GTK_BACKEND", "glarea")
42 t.Setenv("PUREGO_CEF2GTK_ANGLE_BACKEND", "gl-egl")
43 t.Setenv(cef2gtkOSRBackingScaleEnvVar, "")
44
45 got := applyDefaultRenderStackEnvironment(nil)
46
47 if got != renderStackVulkanDMABUF {
48 t.Fatalf("render stack = %q, want %q", got, renderStackVulkanDMABUF)
49 }
50 if got := os.Getenv("GSK_RENDERER"); got != "vulkan" {
51 t.Fatalf("GSK_RENDERER = %q, want coherent vulkan default", got)
52 }
53 if got := os.Getenv("PUREGO_CEF2GTK_BACKEND"); got != "gdk-dmabuf" {
54 t.Fatalf("PUREGO_CEF2GTK_BACKEND = %q, want coherent gdk-dmabuf default", got)
55 }
56 if got := os.Getenv("PUREGO_CEF2GTK_ANGLE_BACKEND"); got != "vulkan" {
57 t.Fatalf("PUREGO_CEF2GTK_ANGLE_BACKEND = %q, want coherent vulkan default", got)
58 }
59 if got := os.Getenv(cef2gtkOSRBackingScaleEnvVar); got != "auto" {
60 t.Fatalf("%s = %q, want auto", cef2gtkOSRBackingScaleEnvVar, got)
61 }
62}
63
64func TestApplyDefaultRenderStackEnvironment_AllowSplitPreservesExplicitLowLevelOverrides(t *testing.T) {
65 t.Setenv(dumberRenderStackEnvVar, "")
66 t.Setenv(dumberRenderStackAllowSplitEnvVar, "1")
67 t.Setenv("GSK_RENDERER", "ngl")
68 t.Setenv("PUREGO_CEF2GTK_BACKEND", "glarea")
69 t.Setenv("PUREGO_CEF2GTK_ANGLE_BACKEND", "gl-egl")
70 t.Setenv(cef2gtkOSRBackingScaleEnvVar, "off")
71
72 got := applyDefaultRenderStackEnvironment(nil)
73
74 if got != renderStackVulkanDMABUF {
75 t.Fatalf("render stack = %q, want %q", got, renderStackVulkanDMABUF)
76 }
77 if got := os.Getenv("GSK_RENDERER"); got != "ngl" {
78 t.Fatalf("GSK_RENDERER = %q, want explicit ngl", got)
79 }
80 if got := os.Getenv("PUREGO_CEF2GTK_BACKEND"); got != "glarea" {
81 t.Fatalf("PUREGO_CEF2GTK_BACKEND = %q, want explicit glarea", got)
82 }
83 if got := os.Getenv("PUREGO_CEF2GTK_ANGLE_BACKEND"); got != "gl-egl" {
84 t.Fatalf("PUREGO_CEF2GTK_ANGLE_BACKEND = %q, want explicit gl-egl", got)
85 }
86 if got := os.Getenv(cef2gtkOSRBackingScaleEnvVar); got != "off" {
87 t.Fatalf("%s = %q, want explicit off", cef2gtkOSRBackingScaleEnvVar, got)
88 }
89}
90
91func TestApplyDefaultRenderStackEnvironment_LegacyGLUsesGLArea(t *testing.T) {
92 t.Setenv(dumberRenderStackEnvVar, "legacy-gl")
93 t.Setenv("GSK_RENDERER", "")
94 t.Setenv("PUREGO_CEF2GTK_BACKEND", "")
95 t.Setenv("PUREGO_CEF2GTK_ANGLE_BACKEND", "")
96 t.Setenv(cef2gtkOSRBackingScaleEnvVar, "")
97
98 got := applyDefaultRenderStackEnvironment(nil)
99
100 if got != renderStackLegacyGL {
101 t.Fatalf("render stack = %q, want %q", got, renderStackLegacyGL)
102 }
103 if got := os.Getenv("PUREGO_CEF2GTK_BACKEND"); got != "glarea" {
104 t.Fatalf("PUREGO_CEF2GTK_BACKEND = %q, want glarea", got)
105 }
106 if got := os.Getenv("PUREGO_CEF2GTK_ANGLE_BACKEND"); got != "gl-egl" {
107 t.Fatalf("PUREGO_CEF2GTK_ANGLE_BACKEND = %q, want gl-egl", got)
108 }
109 if got := os.Getenv(cef2gtkOSRBackingScaleEnvVar); got != "" {
110 t.Fatalf("%s = %q, want unset for legacy-gl", cef2gtkOSRBackingScaleEnvVar, got)
111 }
112}
113
114func TestNormalizeRenderStackUnknownFallsBackToGDKDMABUF(t *testing.T) {
115 got := normalizeRenderStack(nil, "vulkan-dmabuff")
116
117 if got != renderStackVulkanDMABUF {
118 t.Fatalf("render stack = %q, want %q", got, renderStackVulkanDMABUF)
119 }
120}
121
122func TestApplyDefaultHardwareDecodeEnvironment_DefaultsCEFToVAAPIForAuto(t *testing.T) {
123 t.Setenv(cefEnableVAAPIEnvVar, "")
124
125 ApplyDefaultHardwareDecodeEnvironment(context.Background(), HardwareDecodeEnvironmentOptions{EngineType: cefEngineType})
126
127 if got := os.Getenv(cefEnableVAAPIEnvVar); got != "1" {
128 t.Fatalf("%s = %q, want 1", cefEnableVAAPIEnvVar, got)
129 }
130}
131
132func TestApplyDefaultHardwareDecodeEnvironment_PreservesExplicitLIBVADriver(t *testing.T) {
133 t.Setenv(cefEnableVAAPIEnvVar, "")
134 t.Setenv("LIBVA_DRIVER_NAME", "custom-driver")
135
136 ApplyDefaultHardwareDecodeEnvironment(context.Background(), HardwareDecodeEnvironmentOptions{
137 EngineType: cefEngineType,
138 RenderingEnvManager: stubRenderingEnvManager{},
139 })
140
141 if got := os.Getenv("LIBVA_DRIVER_NAME"); got != "custom-driver" {
142 t.Fatalf("LIBVA_DRIVER_NAME = %q, want explicit custom-driver", got)
143 }
144}
145
146func TestApplyDefaultHardwareDecodeEnvironment_DisablesCEFVAAPIWhenMediaDisabled(t *testing.T) {
147 t.Setenv(cefEnableVAAPIEnvVar, "")
148
149 ApplyDefaultHardwareDecodeEnvironment(context.Background(), HardwareDecodeEnvironmentOptions{
150 EngineType: cefEngineType,
151 HardwareDecodingDisabled: true,
152 })
153
154 if got := os.Getenv(cefEnableVAAPIEnvVar); got != "0" {
155 t.Fatalf("%s = %q, want 0", cefEnableVAAPIEnvVar, got)
156 }
157}
158
159func TestApplyDefaultHardwareDecodeEnvironment_PreservesExplicitCEFVAAPIOverride(t *testing.T) {
160 t.Setenv(cefEnableVAAPIEnvVar, "0")
161
162 ApplyDefaultHardwareDecodeEnvironment(context.Background(), HardwareDecodeEnvironmentOptions{EngineType: cefEngineType})
163
164 if got := os.Getenv(cefEnableVAAPIEnvVar); got != "0" {
165 t.Fatalf("%s = %q, want explicit 0", cefEnableVAAPIEnvVar, got)
166 }
167}
168
169type stubRenderingEnvManager struct{}
170
171func (stubRenderingEnvManager) DetectGPUVendor(context.Context) port.GPUVendor {
172 return port.GPUVendorAMD
173}
174func (stubRenderingEnvManager) GetAppliedVars() map[string]string { return nil }