attachment_transition_prelocked_test.go RawHistoryFolder
1package daemon
2
3import (
4 "testing"
5
6 "github.com/stretchr/testify/require"
7
8 "github.com/bnema/vev/internal/domain"
9)
10
11func TestValidateAttachmentTransitionPrelockedLeavesMembershipUntouchedOnFailure(t *testing.T) {
12 t.Parallel()
13
14 d := newTestDaemon(t, nil, stubClock{})
15 source := &session{sessionCore: sessionCore{id: domain.SessionID("source")}}
16 target := &session{sessionCore: sessionCore{id: domain.SessionID("target")}}
17 next := &attachedClient{tr: &closeTrackingTransport{}}
18 next.setSession(source)
19 source.registerAttachmentLocked(next)
20 old := &attachedClient{tr: &closeTrackingTransport{}}
21 old.setSession(target)
22 target.registerAttachment(old)
23 d.sessions[source.id] = source
24 d.sessions[target.id] = target
25
26 frozen := freezeAttachmentEffectGates(next, old)
27 require.True(t, frozen.acquired)
28 require.True(t, frozen.drained)
29 defer frozen.unfreeze()
30
31 req := attachmentTransitionRequest{
32 source: source,
33 target: target,
34 next: next,
35
36 expectedTransport: next.transportSnapshot(),
37
38 preflighted: true,
39 attachmentEffectsFrozen: true,
40 activateTargetTab: true,
41 targetTabIndex: 1,
42 }
43
44 d.mu.Lock()
45 d.notices.routingMu.Lock()
46 unlockSessions := lockAttachmentSessions(source, target)
47 publication, err := d.validateAttachmentTransitionPrelocked(req)
48 unlockSessions()
49 d.notices.routingMu.Unlock()
50 d.mu.Unlock()
51
52 require.ErrorIs(t, err, errAttachmentTransition)
53 require.Nil(t, publication)
54 require.Equal(t, true, source.attachmentRegistered(next))
55 require.Equal(t, false, target.attachmentRegistered(next))
56 require.Equal(t, true, target.attachmentRegistered(old))
57 require.Same(t, source, next.currentSession())
58 require.Equal(t, uint64(0), next.lifecycle.generationValue())
59 require.Equal(t, uint64(0), old.lifecycle.generationValue())
60 require.Equal(t, 0, testAttachmentTabIndex(target))
61}