test(daemon): define failed render stage metrics
- commit
- e3435a798da18ef3d92b4b6940143286e1ce88de
- author
- brice · · 2026-07-12 07:01 UTC
- parent
- 5e5cdfb
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· 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) { | |||
| 71 | 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 | 95 | func TestPerformanceFixtureResizeAlternatesRealDimensions(t *testing.T) { | |
| 75 | 96 | fixture := newPerformanceFixture(t, performanceConfig{size: domain.Size{Cols: 120, Rows: 40}}) | |
| 76 | 97 | ||
| @@ -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 | ||||