detached 4cd14fa

test(startup): specify first-presentation trace transitions

commit
4cd14fac375e9784f901d7fe08a9b1b3068e2f10
author
brice · · 2026-07-14 07:29 UTC
committer
brice · · 2026-07-14 09:35 UTC
parent
aaec84c
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
1 file · +52 -0
A internal/logging/startup_trace_test.go +52 -0
@@ -0,0 +1,52 @@
1+package logging
2+
3+import (
4+ "bytes"
5+ "testing"
6+ "time"
7+
8+ "github.com/rs/zerolog"
9+ "github.com/stretchr/testify/require"
10+)
11+
12+func TestStartupTraceAcceptsOnlyOrderedOneShotMilestones(t *testing.T) {
13+ now := time.Unix(100, 0)
14+ trace := newStartupTrace(func() time.Time { return now })
15+
16+ require.True(t, trace.Mark("process_entry"))
17+ require.False(t, trace.Mark("cef_initialized"), "out-of-order transition must be rejected")
18+ require.False(t, trace.Mark("process_entry"), "duplicate transition must be rejected")
19+
20+ for _, name := range []string{
21+ "config_complete",
22+ "cef_library_load_begin",
23+ "cef_initialized",
24+ "browser_create_requested",
25+ "first_accelerated_paint_received",
26+ "first_dmabuf_texture_swap",
27+ "first_gtk_presentation",
28+ } {
29+ now = now.Add(time.Millisecond)
30+ require.Truef(t, trace.Mark(name), "milestone %s should be accepted", name)
31+ }
32+ require.False(t, trace.Mark("first_gtk_presentation"))
33+}
34+
35+func TestStartupTraceEmitsOneNormalSummaryAtFirstPresentation(t *testing.T) {
36+ var output bytes.Buffer
37+ logger := zerolog.New(&output)
38+ now := time.Unix(100, 0)
39+ trace := newStartupTrace(func() time.Time { return now })
40+ trace.SetBackend("gdk-dmabuf")
41+ trace.SetLogger(&logger)
42+
43+ for _, name := range startupMilestoneOrder {
44+ now = now.Add(time.Millisecond)
45+ require.True(t, trace.Mark(name))
46+ }
47+ trace.Mark("first_gtk_presentation")
48+
49+ require.Contains(t, output.String(), `"message":"startup_trace: first presentation"`)
50+ require.Contains(t, output.String(), `"backend":"gdk-dmabuf"`)
51+ require.Equal(t, 1, bytes.Count(output.Bytes(), []byte(`"message":"startup_trace: first presentation"`)))
52+}
@@ -0,0 +1,52 @@
1+package logging
2+
3+import (
4+ "bytes"
5+ "testing"
6+ "time"
7+
8+ "github.com/rs/zerolog"
9+ "github.com/stretchr/testify/require"
10+)
11+
12+func TestStartupTraceAcceptsOnlyOrderedOneShotMilestones(t *testing.T) {
13+ now := time.Unix(100, 0)
14+ trace := newStartupTrace(func() time.Time { return now })
15+
16+ require.True(t, trace.Mark("process_entry"))
17+ require.False(t, trace.Mark("cef_initialized"), "out-of-order transition must be rejected")
18+ require.False(t, trace.Mark("process_entry"), "duplicate transition must be rejected")
19+
20+ for _, name := range []string{
21+ "config_complete",
22+ "cef_library_load_begin",
23+ "cef_initialized",
24+ "browser_create_requested",
25+ "first_accelerated_paint_received",
26+ "first_dmabuf_texture_swap",
27+ "first_gtk_presentation",
28+ } {
29+ now = now.Add(time.Millisecond)
30+ require.Truef(t, trace.Mark(name), "milestone %s should be accepted", name)
31+ }
32+ require.False(t, trace.Mark("first_gtk_presentation"))
33+}
34+
35+func TestStartupTraceEmitsOneNormalSummaryAtFirstPresentation(t *testing.T) {
36+ var output bytes.Buffer
37+ logger := zerolog.New(&output)
38+ now := time.Unix(100, 0)
39+ trace := newStartupTrace(func() time.Time { return now })
40+ trace.SetBackend("gdk-dmabuf")
41+ trace.SetLogger(&logger)
42+
43+ for _, name := range startupMilestoneOrder {
44+ now = now.Add(time.Millisecond)
45+ require.True(t, trace.Mark(name))
46+ }
47+ trace.Mark("first_gtk_presentation")
48+
49+ require.Contains(t, output.String(), `"message":"startup_trace: first presentation"`)
50+ require.Contains(t, output.String(), `"backend":"gdk-dmabuf"`)
51+ require.Equal(t, 1, bytes.Count(output.Bytes(), []byte(`"message":"startup_trace: first presentation"`)))
52+}

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