1package drm
2
3import (
4 "context"
5 "image"
6 "os"
7 "testing"
8
9 "github.com/bnema/neferwl/internal/adapters/outputkit/capture"
10 portsmocks "github.com/bnema/neferwl/internal/mocks/ports"
11 "github.com/bnema/neferwl/internal/ports"
12 "github.com/stretchr/testify/mock"
13)
14
15func TestCaptureOwnershipTransferredBeforeCommitPanic(t *testing.T) {
16 o, _, _ := testOutput(t)
17 o.cursor = nil
18 k := newMockkms(t)
19 o.k = k
20 k.EXPECT().commit(mock.Anything, mock.Anything, mock.Anything).RunAndReturn(func(*atomicReq, uint32, uint64) error { panic("commit panic") }).Once()
21 r := portsmocks.NewMockRenderer(t)
22 r.EXPECT().UseTarget(0).Return().Once()
23 r.EXPECT().Render(mock.Anything, mock.Anything).Return(nil, nil).Once()
24 frame := portsmocks.NewMockCaptureFrame(t)
25 frame.EXPECT().Done().Return(nil).Maybe()
26 frame.EXPECT().Read(mock.Anything, mock.Anything, 8).Return(nil).Maybe()
27 r.EXPECT().BeginCapture().Return(frame, nil).Once()
28 r.EXPECT().EndCapture(frame).Return().Once()
29 f, err := os.CreateTemp(t.TempDir(), "capture")
30 if err != nil {
31 t.Fatal(err)
32 }
33 if err := f.Truncate(16); err != nil {
34 t.Fatal(err)
35 }
36 requests := []ports.CaptureRequest{{ID: 1, Dst: ports.SHMBuffer{File: f}, Region: image.Rect(0, 0, 2, 2), Width: 2, Height: 2, Stride: 8, Format: 1}}
37 replies := make(chan ports.CaptureDone, 2)
38 pipeline := capture.NewPipeline(context.Background(), replies)
39 func() {
40 defer func() {
41 if p := recover(); p != "commit panic" {
42 t.Fatalf("panic %v", p)
43 }
44 }()
45 _, _ = o.submitFrame(context.Background(), r, ports.Scene{Seq: 1}, nil, nil, requests, pipeline)
46 }()
47 pipeline.Close(r)
48 if requests[0].ID != 0 || requests[0].Dst.File != nil {
49 t.Fatal("owner retained handed-off request")
50 }
51 if result := <-replies; result.ID != 1 {
52 t.Fatalf("reply %+v", result)
53 }
54 select {
55 case result := <-replies:
56 t.Fatalf("duplicate reply %+v", result)
57 default:
58 }
59 if _, err := f.Stat(); err == nil {
60 t.Fatal("descriptor leaked")
61 }
62 frame.Calls = nil
63}