1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
package probes
import (
"testing"
"ior/internal/probemanager"
tea "charm.land/bubbletea/v2"
)
type fakeManager struct {
states []probemanager.ProbeState
toggles []string
}
func (f *fakeManager) States() []probemanager.ProbeState {
out := make([]probemanager.ProbeState, len(f.states))
copy(out, f.states)
return out
}
func (f *fakeManager) Toggle(syscall string) error {
f.toggles = append(f.toggles, syscall)
for i := range f.states {
if f.states[i].Syscall == syscall {
f.states[i].Active = !f.states[i].Active
}
}
return nil
}
func (f *fakeManager) ActiveCount() (int, int) {
active := 0
for _, s := range f.states {
if s.Active {
active++
}
}
return active, len(f.states)
}
func TestOpenRefreshesFromManager(t *testing.T) {
fm := &fakeManager{
states: []probemanager.ProbeState{{Syscall: "read", Active: true}},
}
m := NewModel(fm)
m = m.Open()
if len(m.probes) != 1 || m.probes[0].Syscall != "read" {
t.Fatalf("unexpected probes after first open: %+v", m.probes)
}
fm.states = append(fm.states, probemanager.ProbeState{Syscall: "write", Active: true})
m = m.Close().Open()
if len(m.probes) != 2 {
t.Fatalf("expected probes refreshed on open, got %+v", m.probes)
}
}
func TestToggleEmitsProbeToggledMsg(t *testing.T) {
fm := &fakeManager{
states: []probemanager.ProbeState{{Syscall: "read", Active: true}},
}
m := NewModel(fm).Open()
next, cmd := m.Update(tea.KeyPressMsg{Code: []rune{' '}[0], Text: string([]rune{' '})})
if cmd == nil {
t.Fatalf("expected toggle command")
}
msg := cmd()
toggled, ok := msg.(ProbeToggledMsg)
if !ok {
t.Fatalf("expected ProbeToggledMsg, got %T", msg)
}
if toggled.Err != nil {
t.Fatalf("unexpected toggle err: %v", toggled.Err)
}
if len(fm.toggles) != 1 || fm.toggles[0] != "read" {
t.Fatalf("expected read toggle, got %+v", fm.toggles)
}
_ = next
}
func TestBulkKeysApplyGloballyNotOnlyFiltered(t *testing.T) {
fm := &fakeManager{
states: []probemanager.ProbeState{
{Syscall: "read", Active: true},
{Syscall: "write", Active: true},
{Syscall: "openat", Active: true},
},
}
m := NewModel(fm).Open()
m.search = "read"
_, cmd := m.Update(tea.KeyPressMsg{Code: []rune{'n'}[0], Text: string([]rune{'n'})})
if cmd == nil {
t.Fatalf("expected bulk off command")
}
msg := cmd()
if toggled, ok := msg.(ProbeToggledMsg); !ok || toggled.Err != nil {
t.Fatalf("unexpected bulk off msg: %#v", msg)
}
if len(fm.toggles) != 3 {
t.Fatalf("expected all probes toggled off despite filter, got toggles=%+v", fm.toggles)
}
// Re-open with all inactive and filtered search still present; "a" should
// toggle all probes back on.
m = NewModel(fm).Open()
m.search = "read"
fm.toggles = nil
_, cmd = m.Update(tea.KeyPressMsg{Code: []rune{'a'}[0], Text: string([]rune{'a'})})
if cmd == nil {
t.Fatalf("expected bulk on command")
}
msg = cmd()
if toggled, ok := msg.(ProbeToggledMsg); !ok || toggled.Err != nil {
t.Fatalf("unexpected bulk on msg: %#v", msg)
}
if len(fm.toggles) != 3 {
t.Fatalf("expected all probes toggled on despite filter, got toggles=%+v", fm.toggles)
}
}
|