The classroom desktop belongs to the classroom user and mako sits on that user's D-Bus session. An administrator over SSH is in a different session where nothing owns org.freedesktop.Notifications, so notify-send asked D-Bus to start a second mako, which had no display to open and timed out with NoReply. Find the running sway process for the classroom user and deliver into its session instead. XDG_RUNTIME_DIR and the bus address are read from that process, falling back to /run/user/<uid> and its bus socket when the environment cannot be read — root has ptrace access on the endpoint, but that is not somewhere to be brittle. The Wayland display is read the same way, and failing that from the wayland-N.lock sway holds open, so no socket name is ever assumed. notify-send only needs the bus, so a display that cannot be resolved is not worth refusing to send over. Refuses to send when mako is not already running, rather than letting D-Bus start one, and says plainly what is wrong when there is no session, no privileges, or no bus socket. --dry-run reports what it resolved without sending. Behaviour inside the session is unchanged, and the sample notifications and styling are untouched. The tests stand a real background process in for sway so /proc/<pid>/environ is genuine rather than mocked, and cover both invocation paths plus the fallbacks and every refusal. The build runs them. Co-Authored-By: Claude Opus 5 <[email protected]>
112 lines
4.4 KiB
Markdown
112 lines
4.4 KiB
Markdown
# Classroom test checklist
|
|
|
|
Run against the exact artifact published to canary, on the real endpoint,
|
|
before promoting to stable with `./update_stable.sh`.
|
|
|
|
## Boot
|
|
|
|
- [ ] Cold boot reaches the classroom shell with no terminal or window junk
|
|
- [ ] Reboot does the same
|
|
- [ ] Wallpaper appears
|
|
- [ ] Dock appears, centred
|
|
- [ ] Clock appears, bottom right
|
|
|
|
## Reserved bottom shell (regression)
|
|
|
|
The bottom strip is one full-width layer-shell surface with a 76px
|
|
exclusive zone. Dock and clock live inside it. Do not split them back
|
|
into separate layer-shell windows.
|
|
|
|
- [ ] A maximised Chrome window stops above the bottom strip
|
|
- [ ] The clock does not float over Chrome
|
|
- [ ] Dock stays centred, clock stays bottom right
|
|
- [ ] Wallpaper shows through the unused parts of the strip
|
|
- [ ] Every dock button still responds to clicks
|
|
- [ ] A fullscreen application covers the whole display, dock included
|
|
|
|
## Browser
|
|
|
|
- [ ] First Browser click launches Chrome
|
|
- [ ] Chrome opens on Wonder Ink (https://app.wonderink.org/)
|
|
- [ ] Clicking Browser while Chrome is focused minimises it
|
|
- [ ] Clicking Browser again restores it **maximised, not floating or draggable**
|
|
- [ ] Clicking Browser while Chrome is running but unfocused focuses it
|
|
- [ ] `Super+M` minimises the focused window
|
|
- [ ] `Super+Shift+M` restores the most recently minimised window
|
|
- [ ] Normal navigation to any other site works
|
|
- [ ] The Home button returns to Wonder Ink
|
|
- [ ] Fullscreen YouTube video uses the whole display
|
|
- [ ] Leaving fullscreen restores the correct geometry above the dock
|
|
- [ ] No first-run, default-browser or sign-in nag appears
|
|
- [ ] `chrome://policy` lists the Ekklesia policies as applied, with no
|
|
"unknown policy" entries
|
|
- [ ] Chrome does not start by itself at boot
|
|
- [ ] After a reboot, cookies and site logins are still there
|
|
- [ ] After an OTA update, cookies and site logins are still there
|
|
|
|
Known limitation: Chrome's own minimise button in its title bar does
|
|
nothing. Sway ignores the Wayland minimise request and gives no event to
|
|
hook. Minimising is the dock's Browser button or `Super+M`.
|
|
|
|
## Notifications
|
|
|
|
- [ ] `classroom-notify-test` renders with the classroom styling:
|
|
dark translucent, rounded, white text, top right
|
|
- [ ] `classroom-notify-test --critical "Parent Call" "Room 3 needs a parent."`
|
|
renders in the critical style and does not time out
|
|
- [ ] Notifications appear over a fullscreen video
|
|
|
|
Over SSH from an administrator account, run it with sudo:
|
|
|
|
```
|
|
sudo classroom-notify-test --dry-run # show the session it resolved
|
|
sudo classroom-notify-test # send into the classroom desktop
|
|
```
|
|
|
|
The classroom desktop belongs to the classroom user, and mako sits on
|
|
that user's D-Bus session. A plain notify-send from an SSH session lands
|
|
in the administrator's own session, where nothing owns
|
|
org.freedesktop.Notifications, so D-Bus tries to start a second mako with
|
|
no display and the call times out with NoReply. The script finds the
|
|
running sway process for the classroom user and delivers into its
|
|
session instead. It never starts mako.
|
|
|
|
- [ ] `sudo classroom-notify-test` from an SSH session displays on the
|
|
classroom screen
|
|
- [ ] `sudo classroom-notify-test --dry-run` reports the resolved
|
|
XDG_RUNTIME_DIR, bus address and Wayland display
|
|
- [ ] Running it as an unprivileged admin account explains it needs sudo
|
|
- [ ] `tests/test-classroom-notify-test.sh` passes (also run by the build)
|
|
|
|
## DVD
|
|
|
|
With `DVD_ENABLED=false`:
|
|
|
|
- [ ] No DVD button in the dock
|
|
|
|
With `DVD_ENABLED=true`:
|
|
|
|
- [ ] Drive unplugged: button present, icon held back, friendly notification on click
|
|
- [ ] Drive present, no disc: friendly notification on click, nothing crashes
|
|
- [ ] Inserting a disc produces one **DVD Ready** notification
|
|
- [ ] The DVD icon comes up to full strength while a disc is in
|
|
- [ ] Nothing plays until the button is pressed
|
|
- [ ] Clicking plays the disc
|
|
- [ ] Menus work
|
|
- [ ] Audio works
|
|
- [ ] Chapter navigation works
|
|
- [ ] Fullscreen works
|
|
- [ ] `Super+M` minimises the player, the DVD button restores it
|
|
- [ ] Closing the player works
|
|
- [ ] Ejecting is detected, the icon goes back
|
|
- [ ] Reinserting is detected again
|
|
- [ ] Commercial CSS disc, after `classroom-dvd-css-setup`
|
|
|
|
## OTA
|
|
|
|
- [ ] `./update_canary.sh` publishes package first, manifest last
|
|
- [ ] The endpoint on the canary channel picks the update up
|
|
- [ ] SHA-256 verification passes
|
|
- [ ] Install succeeds and the endpoint reboots
|
|
- [ ] Everything above still works after the update
|