detached e3435a7

test(daemon): define failed render stage metrics

commit
e3435a798da18ef3d92b4b6940143286e1ce88de
author
brice · · 2026-07-12 07:01 UTC
parent
5e5cdfb
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
1 file · +21 -0
M internal/usecase/daemon/performance_benchmark_test.go +21 -0
@@ -71,6 +71,27 @@ func TestPerformanceFixtureCounters(t *testing.T) {
7171 require.True(t, fixture.resized())
7272 }
7373
74+func TestRenderStageHooksCountProductionBoundariesOnFailedSend(t *testing.T) {
75+ d, sess, ac, sends := newManualSessionWithPTYs(t, nil)
76+ d.paint(sess, ac, true)
77+ <-sends
78+ var captures, compositions, emissions int
79+ ac.renderStages = renderStageHooks{
80+ capture: func() { captures++ },
81+ compose: func() { compositions++ },
82+ emit: func() { emissions++ },
83+ }
84+ ac.replaceTransport(cacheFailTransport{})
85+ p := sess.tabs[0].focusedPane()
86+ p.mu.Lock()
87+ p.screen.Write([]byte("hook"))
88+ p.mu.Unlock()
89+ d.paint(sess, ac, false)
90+ require.Equal(t, 1, captures, "a completed capture counts even when its emission fails")
91+ require.Equal(t, 1, compositions, "a completed composition counts even when its emission fails")
92+ require.Zero(t, emissions, "emit counts only prepare and transport success")
93+}
94+
7495 func TestPerformanceFixtureResizeAlternatesRealDimensions(t *testing.T) {
7596 fixture := newPerformanceFixture(t, performanceConfig{size: domain.Size{Cols: 120, Rows: 40}})
7697
@@ -71,6 +71,27 @@ func TestPerformanceFixtureCounters(t *testing.T) {
71 require.True(t, fixture.resized())71 require.True(t, fixture.resized())
72 }72 }
73 73
74+func TestRenderStageHooksCountProductionBoundariesOnFailedSend(t *testing.T) {
75+ d, sess, ac, sends := newManualSessionWithPTYs(t, nil)
76+ d.paint(sess, ac, true)
77+ <-sends
78+ var captures, compositions, emissions int
79+ ac.renderStages = renderStageHooks{
80+ capture: func() { captures++ },
81+ compose: func() { compositions++ },
82+ emit: func() { emissions++ },
83+ }
84+ ac.replaceTransport(cacheFailTransport{})
85+ p := sess.tabs[0].focusedPane()
86+ p.mu.Lock()
87+ p.screen.Write([]byte("hook"))
88+ p.mu.Unlock()
89+ d.paint(sess, ac, false)
90+ require.Equal(t, 1, captures, "a completed capture counts even when its emission fails")
91+ require.Equal(t, 1, compositions, "a completed composition counts even when its emission fails")
92+ require.Zero(t, emissions, "emit counts only prepare and transport success")
93+}
94+
74 func TestPerformanceFixtureResizeAlternatesRealDimensions(t *testing.T) {95 func TestPerformanceFixtureResizeAlternatesRealDimensions(t *testing.T) {
75 fixture := newPerformanceFixture(t, performanceConfig{size: domain.Size{Cols: 120, Rows: 40}})96 fixture := newPerformanceFixture(t, performanceConfig{size: domain.Size{Cols: 120, Rows: 40}})
76 97

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 12

Tags 11

↑↓ moveenter openesc close