package drm import ( "sync/atomic" "testing" "testing/synctest" "time" "github.com/bnema/neferwl/internal/ports" "github.com/stretchr/testify/mock" "golang.org/x/sys/unix" ) func TestNoMemRetriesWithoutModeset(t *testing.T) { synctest.Test(t, func(t *testing.T) { h := startStuck(t, nil, unix.ENOMEM, unix.ENOMEM, nil) h.scenes <- ports.Scene{Seq: 1} synctest.Wait() for _, delay := range []time.Duration{nomemRetryMin, 2 * nomemRetryMin} { select { case p := <-h.presented: t.Fatalf("refused frame reported: %+v", p) default: } time.Sleep(delay) synctest.Wait() } c := h.snapshot() if len(c) != 5 { t.Fatalf("commits %d, want 5", len(c)) } for _, r := range c[2:] { if r.flags&atomicAllowModes != 0 || r.user&3 != userFrame { t.Fatalf("not a frame retry: %+v", r) } } select { case p := <-h.presented: t.Fatalf("reported before successful flip: %+v", p) default: } h.flipped <- eventOf(c[4]) synctest.Wait() select { case <-h.presented: default: t.Fatal("successful flip not reported") } select { case p := <-h.presented: t.Fatalf("extra report: %+v", p) default: } h.stop() }) } func TestLastingNoMemKeepsOutput(t *testing.T) { synctest.Test(t, func(t *testing.T) { errs := make([]error, 21) for i := range errs { errs[i] = unix.ENOMEM } h := startStuck(t, nil, errs...) h.scenes <- ports.Scene{Seq: 1} synctest.Wait() for i := range 19 { time.Sleep(min(nomemRetryMax, nomemRetryMin*time.Duration(1<