main 5041353

render_stack_env_test.go RawHistoryFolder

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 }

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 8

Tags 42

↑↓ moveenter openesc close