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 Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· 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 | + | } | |||