1package daemon
2
3import (
4 "testing"
5
6 "github.com/stretchr/testify/require"
7
8 "github.com/bnema/vev/internal/domain"
9 "github.com/bnema/vev/internal/protocol"
10)
11
12func TestInactiveSessionPredicates(t *testing.T) {
13 pending := make(chan struct{})
14 settled := make(chan struct{})
15 close(settled)
16
17 tests := []struct {
18 name string
19 entry inactiveSession
20 visible bool
21 broken bool
22 canResume bool
23 restorePending bool
24 }{
25 {name: "healthy down", entry: inactiveSession{state: protocol.SessionDown}, visible: true, canResume: true},
26 {name: "restore pending remains resumable after wait", entry: inactiveSession{state: protocol.SessionDown, restoreDone: pending}, visible: true, canResume: true, restorePending: true},
27 {name: "settled restore", entry: inactiveSession{state: protocol.SessionDown, restoreDone: settled}, visible: true, canResume: true},
28 {name: "broken", entry: inactiveSession{state: protocol.SessionBroken}, visible: true, broken: true},
29 {name: "degraded", entry: inactiveSession{state: protocol.SessionDown, record: domain.CatalogueRecord{DegradedReason: "checkpoint unavailable"}}, visible: true, broken: true},
30 {name: "purging", entry: inactiveSession{state: protocol.SessionDown, purging: true}},
31 }
32
33 for _, test := range tests {
34 t.Run(test.name, func(t *testing.T) {
35 require.Equal(t, test.visible, test.entry.visible())
36 require.Equal(t, test.broken, test.entry.broken())
37 require.Equal(t, test.canResume, test.entry.canResume())
38 require.Equal(t, test.restorePending, test.entry.restorePending())
39 })
40 }
41}
42
43func TestInactiveSessionLifecycleMatch(t *testing.T) {
44 entry := inactiveSession{name: "work", createdAt: 7, incarnation: domain.IncarnationID{1}}
45 for _, test := range []struct {
46 name string
47 mutate func(*inactiveSession)
48 want bool
49 }{
50 {name: "same lifecycle", want: true},
51 {name: "different name", mutate: func(candidate *inactiveSession) { candidate.name = "other" }},
52 {name: "different creation time", mutate: func(candidate *inactiveSession) { candidate.createdAt++ }},
53 {name: "different incarnation", mutate: func(candidate *inactiveSession) { candidate.incarnation[0]++ }},
54 } {
55 t.Run(test.name, func(t *testing.T) {
56 candidate := entry
57 if test.mutate != nil {
58 test.mutate(&candidate)
59 }
60 require.Equal(t, test.want, entry.sameLifecycle(candidate))
61 })
62 }
63}