1//go:build linux
2
3package session
4
5import (
6 "errors"
7 "testing"
8
9 "github.com/bnema/nefergui/internal/presentation/buffers"
10 "github.com/bnema/nefergui/internal/presentation/vkdevice"
11)
12
13// No GPU needed: the old wait must remain owned until a later readiness check.
14func TestInstallReleaseWaitDefersUnreadySubmission(t *testing.T) {
15 old := &vkdevice.BinaryFence{}
16 next := &vkdevice.BinaryFence{}
17 slot := &Slot{Wait: old, WaitInFlight: true}
18 checked := 0
19 installed, err := installReleaseWait(slot, next, func() (bool, error) { checked++; return false, nil })
20 if err != nil || installed || checked != 1 || slot.Wait != old || slot.PendingWait != next || !slot.WaitInFlight {
21 t.Fatalf("premature replacement: installed=%v err=%v slot=%+v", installed, err, slot)
22 }
23 // Once ready, replacement clears the old (zero-handle) fake without waiting.
24 installed, err = installReleaseWait(slot, next, func() (bool, error) { checked++; return true, nil })
25 if err != nil || !installed || checked != 2 || slot.Wait != next || slot.PendingWait != nil || slot.WaitInFlight {
26 t.Fatalf("failed replacement: installed=%v err=%v slot=%+v", installed, err, slot)
27 }
28}
29
30// A resize while a release wait is outstanding leaves old-generation slots to
31// retire: finishPending must not touch them, even if their frame is not ready.
32func TestTargetFinishPendingSkipsOldGenerations(t *testing.T) {
33 pool, _ := buffers.New(1)
34 old := pool.Buffers[0]
35 if err := pool.Resize(1); err != nil {
36 t.Fatal(err)
37 }
38 // A nil Frame would panic if the old slot were examined.
39 tg := &Target{Pool: pool, Slots: map[uint64]*Slot{old.ID: {Buffer: old, PendingWait: &vkdevice.BinaryFence{}}}}
40 pending, err := tg.finishPending()
41 if err != nil || pending {
42 t.Fatalf("pending=%v err=%v", pending, err)
43 }
44 if old.State != buffers.Available || tg.Slots[old.ID].PendingWait == nil {
45 t.Fatal("old-generation slot was modified")
46 }
47}
48
49func TestTargetBrokenIsSticky(t *testing.T) {
50 tg := &Target{wantW: 1, wantH: 1}
51 boom := errors.New("boom")
52 first := tg.fail(boom)
53 if _, err := tg.Draw(nil, 1, &Output{}); !errors.Is(err, boom) || err != first {
54 t.Fatalf("Draw after failure: %v", err)
55 }
56}