detached dc2f115

test(daemon): pin atomic toast detach handoff

commit
dc2f115036009e7fbc0c4c49bb397564b20e5cf6
author
brice · · 2026-07-23 21:51 UTC
parent
9e796e1
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
1 file · +14 -3
M internal/usecase/daemon/notify_test.go +14 -3
@@ -528,19 +528,30 @@ func TestNotifyRoutesToSessionClientOnly(t *testing.T) {
528528 func TestNotifySessionScopedSerializesDetachThroughToastPublication(t *testing.T) {
529529 d, sess, ac, _ := newNoticeFixture(t, newNoticeClock())
530530
531- selected := make(chan struct{})
531+ selected := make(chan bool, 1)
532532 releasePublication := make(chan struct{})
533533 d.notices.beforeSessionDelivery = func() {
534- close(selected)
534+ unlocked := d.notices.routingMu.TryLock()
535+ if unlocked {
536+ d.notices.routingMu.Unlock()
537+ }
538+ selected <- !unlocked
535539 <-releasePublication
536540 }
541+ t.Cleanup(func() {
542+ select {
543+ case <-releasePublication:
544+ default:
545+ close(releasePublication)
546+ }
547+ })
537548
538549 notifyDone := make(chan struct{})
539550 go func() {
540551 d.notify(sess, domain.NoticeInfo, domain.NoticeUser, "hello", nil)
541552 close(notifyDone)
542553 }()
543- <-selected
554+ require.True(t, <-selected, "routingMu must remain held from attachment selection through toast publication")
544555
545556 detachStarted := make(chan struct{})
546557 detachDone := make(chan bool, 1)
@@ -528,19 +528,30 @@ func TestNotifyRoutesToSessionClientOnly(t *testing.T) {
528 func TestNotifySessionScopedSerializesDetachThroughToastPublication(t *testing.T) {528 func TestNotifySessionScopedSerializesDetachThroughToastPublication(t *testing.T) {
529 d, sess, ac, _ := newNoticeFixture(t, newNoticeClock())529 d, sess, ac, _ := newNoticeFixture(t, newNoticeClock())
530 530
531- selected := make(chan struct{})531+ selected := make(chan bool, 1)
532 releasePublication := make(chan struct{})532 releasePublication := make(chan struct{})
533 d.notices.beforeSessionDelivery = func() {533 d.notices.beforeSessionDelivery = func() {
534- close(selected)534+ unlocked := d.notices.routingMu.TryLock()
535+ if unlocked {
536+ d.notices.routingMu.Unlock()
537+ }
538+ selected <- !unlocked
535 <-releasePublication539 <-releasePublication
536 }540 }
541+ t.Cleanup(func() {
542+ select {
543+ case <-releasePublication:
544+ default:
545+ close(releasePublication)
546+ }
547+ })
537 548
538 notifyDone := make(chan struct{})549 notifyDone := make(chan struct{})
539 go func() {550 go func() {
540 d.notify(sess, domain.NoticeInfo, domain.NoticeUser, "hello", nil)551 d.notify(sess, domain.NoticeInfo, domain.NoticeUser, "hello", nil)
541 close(notifyDone)552 close(notifyDone)
542 }()553 }()
543- <-selected554+ require.True(t, <-selected, "routingMu must remain held from attachment selection through toast publication")
544 555
545 detachStarted := make(chan struct{})556 detachStarted := make(chan struct{})
546 detachDone := make(chan bool, 1)557 detachDone := make(chan bool, 1)

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