v0.2.0 13c6a90

security_close_test.go RawHistoryFolder

1package drm
2
3import (
4	"maps"
5	"sync/atomic"
6	"testing"
7
8	"github.com/stretchr/testify/mock"
9	"golang.org/x/sys/unix"
10)
11
12func TestInactiveOnCloseRequiresSuccessfulValidatedDisable(t *testing.T) {
13	for _, stage := range []string{"success", "commit-failure", "query-failure", "partial-primary", "partial-cursor", "partial-overlay", "partial-stray", "missing-active"} {
14		t.Run(stage, func(t *testing.T) {
15			var failures []error
16			if stage == "commit-failure" {
17				failures = []error{unix.EACCES}
18			}
19			o, k, commits := testOutput(t, failures...)
20			var state atomic.Uint64
21			securityGate(t, o, &state) // production gate, even unlocked: disable
22			o.off = true               // stale cached state is never terminal evidence
23			o.inactiveOnClose = true   // reset any earlier result at entry
24			o.saved = modeCrtc{crtcID: tCrtc, fbID: 123, modeValid: 1, mode: o.mode}
25			o.overlay = &plane{id: tOverlay, props: planeProps}
26			stray := &plane{id: 53, props: planeProps}
27			o.stray = []*plane{o.overlay, stray}
28			var readErr error
29			if stage == "query-failure" {
30				readErr = unix.EACCES
31			}
32			k.EXPECT().objProps(uint32(53), uint32(objPlane)).Return(map[string][2]uint64{"CRTC_ID": {pCrtcID, tCrtc}}, readErr).Once()
33			partial := func(p *plane) { p.props = maps.Clone(planeProps); p.props["FB_ID"] = 0 }
34			switch stage {
35			case "partial-primary":
36				partial(o.primary)
37			case "partial-cursor":
38				partial(o.cursor.plane)
39			case "partial-overlay":
40				partial(o.overlay)
41			case "partial-stray":
42				partial(stray)
43			case "missing-active":
44				o.crtcProps = maps.Clone(o.crtcProps)
45				o.crtcProps["ACTIVE"] = 0
46			}
47			k.EXPECT().rmFB(mock.Anything).Return(nil)
48			done := make(chan struct{})
49			go func() { o.Close(); close(done) }()
50			<-done // accessor is only read after owner-completion synchronization
51			if got := o.InactiveOnClose(); got != (stage == "success") {
52				t.Fatalf("inactiveOnClose=%v stage=%s", got, stage)
53			}
54			if len(*commits) != 1 {
55				t.Fatalf("commits %d", len(*commits))
56			}
57			if stage == "success" {
58				checkProtectedDisable(t, (*commits)[0], tPrimary, tCursor, tOverlay, 53)
59			}
60		})
61	}
62}
63
64func TestInactiveOnCloseSavedRestoreNeverCertifiesRemoval(t *testing.T) {
65	o, k, _ := testOutput(t)
66	o.saved = modeCrtc{crtcID: tCrtc, fbID: 123, modeValid: 1, mode: o.mode}
67	k.EXPECT().createBlob(mock.Anything).Return(99, nil).Once()
68	k.EXPECT().destroyBlob(uint32(99)).Return(nil).Once()
69	k.EXPECT().rmFB(mock.Anything).Return(nil)
70	o.Close()
71	if o.InactiveOnClose() {
72		t.Fatal("legacy saved desktop restoration certified inactivity")
73	}
74}

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 26

Tags 10

↑↓ moveenter openesc close