startup_presentation_hooks_test.go RawHistoryFolder
1package cef
2
3import (
4 "bytes"
5 "encoding/json"
6 "strings"
7 "testing"
8 "time"
9
10 "github.com/rs/zerolog"
11 "github.com/stretchr/testify/require"
12)
13
14func TestStartupPresentationHooksWireEveryUpstreamFirstPresentationCallback(t *testing.T) {
15 var output bytes.Buffer
16 trace := newStartupTrace(time.Now, time.Now())
17 trace.SetBackend("gdk-dmabuf")
18 logger := zerolog.New(&output)
19 trace.SetLogger(&logger)
20 for _, milestone := range []string{
21 "process_entry",
22 "config_complete",
23 "cef_library_load_begin",
24 "cef_initialized",
25 "browser_create_requested",
26 } {
27 require.Truef(t, trace.Mark(milestone), "seed milestone %q", milestone)
28 }
29
30 hooks := startupPresentationHooks(trace)
31 require.NotNil(t, hooks.OnFirstAcceleratedPaint)
32 require.NotNil(t, hooks.OnFirstDMABUFTextureSwap)
33 require.NotNil(t, hooks.OnFirstPresentation)
34 require.NotNil(t, hooks.OnDMABUFUnsupported)
35
36 // The unsupported fact may arrive before the successful presentation path.
37 // Each callback is invoked twice to make no-op, swapped, and duplicate bodies
38 // observable through the exact trace output below.
39 hooks.OnDMABUFUnsupported()
40 hooks.OnDMABUFUnsupported()
41 hooks.OnFirstAcceleratedPaint()
42 hooks.OnFirstAcceleratedPaint()
43 hooks.OnFirstDMABUFTextureSwap()
44 hooks.OnFirstDMABUFTextureSwap()
45 hooks.OnFirstPresentation()
46 hooks.OnFirstPresentation()
47
48 var milestones []string
49 summaryCount := 0
50 var incompleteReason string
51 for _, line := range strings.Split(strings.TrimSpace(output.String()), "\n") {
52 var event struct {
53 Message string `json:"message"`
54 Milestone string `json:"milestone"`
55 IncompleteReason string `json:"incomplete_reason"`
56 }
57 require.NoError(t, json.Unmarshal([]byte(line), &event))
58 switch event.Message {
59 case "startup_trace: milestone":
60 milestones = append(milestones, event.Milestone)
61 case "startup_trace: first presentation":
62 summaryCount++
63 incompleteReason = event.IncompleteReason
64 }
65 }
66
67 require.Equal(t, []string{
68 "process_entry",
69 "config_complete",
70 "cef_library_load_begin",
71 "cef_initialized",
72 "browser_create_requested",
73 "first_accelerated_paint_received",
74 "first_dmabuf_texture_swap",
75 "first_gtk_presentation",
76 }, milestones)
77 require.Equal(t, "dmabuf_texture_swap_unavailable", incompleteReason)
78 require.Equal(t, 1, summaryCount)
79}