Commit Graph
35 Commits
Author SHA1 Message Date
LGUG2Z 2f1df7decd fix(e2e): rewrite_config only writes the file
The daemon watches the configuration file it was started with, so the
extra replace-configuration after each write hid the reload that the
scenario is meant to check.
2026-10-30 18:22:44 -07:00
LGUG2Z 30b73be36e feat(e2e): sync the neutral core from kfde 22a81d0b 2026-10-30 18:22:44 -07:00
LGUG2Z ca4744e77e feat(e2e): sync the neutral core from kfde ff599907 2026-10-30 18:22:44 -07:00
LGUG2Z d990729e14 feat(e2e): record the scope of each check in the result file
A check made inside Checks.scoped("windows") has a scope field in
result.json, next to what it already had.
2026-10-30 18:22:44 -07:00
LGUG2Z 32af5164ef feat(e2e): sync the neutral core from kfde d4f67164 2026-10-30 18:22:44 -07:00
LGUG2Z 97712f7510 feat(e2e): name the exe of a rule with its extension on Windows
kfw matches a rule's id against the exe name of the window, which has the
extension, so exe_id returns program.exe.
2026-10-30 18:22:44 -07:00
LGUG2Z 27ce93fe17 feat(e2e): sync the neutral core from kfde 13edc355 2026-10-30 18:22:44 -07:00
LGUG2Z 206fa1748a feat(e2e): add probes of padding, exe rules and locking
w1_padding.py compares kfw's padding with its frames, w1_rules_exe.py runs
the exe rules with the extension in the id, w1_lock.py moves a window
while the screen is locked.
2026-10-30 18:22:44 -07:00
LGUG2Z 275e6b24ae feat(e2e): run the scenarios kfde added on the Windows guest
focus_follows_mouse, layouts, floating, minimizing, padding, maximizing,
workspace_moves, resize_commands, promoting, flipping, pausing, tiling_off,
lifecycle_hidden, scrolling and locking take the tiling windows; the others
are run as they are.
2026-10-30 18:22:44 -07:00
LGUG2Z d9c12d9fc0 feat(e2e): the Platform methods the new scenarios need on Windows
minimize, spawn with a class or an exe name (a copy of the test window
under that name), rewrite_config (writes the file and has the daemon read
it again), lock and unlock (the lock screen and the account's password
through QMP) and move_window (SetWindowPos, corrected for the invisible
border).
2026-10-30 18:22:44 -07:00
LGUG2Z 62ba64a573 feat(e2e): let the test window take its class from --class
The default stays KomorebiTestWin. A rule that matches by class needs
windows of different classes in the same run.
2026-10-30 18:22:44 -07:00
LGUG2Z ca2bb69587 feat(e2e): sync the neutral core from kfde f07c3eb8
Takes in kfde's revs d2745b80 (layouts, floating), 22e0ed01 (minimizing),
06e16878 (padding), 59777d7d (maximizing), 789e2a51 (workspace_moves),
7420cb58 (resize_commands), b66fe560 (promoting), 6f310858 (flipping),
33697a67 (pausing), d423f99b (tiling_off), aebdf2b0 (lifecycle_hidden),
cdac999a (scrolling), a9e5bd80 (rules_class) and f07c3eb8 (rules_exe,
config_reload, locking).
2026-10-30 18:22:44 -07:00
LGUG2Z a8d0a5096d feat(e2e): add the probes behind the Windows guest's findings
Each w1_*.py prints what it saw: the pointer, a second display, hotplug,
the drag, the placement rule, focus follows mouse and what stop leaves
hidden. W1.md has the results.
2026-10-30 18:22:44 -07:00
LGUG2Z 5840f36e1c feat(e2e): build the golden image in two layers
build-base.sh does the unattended install (about 18 minutes) and
build-golden.sh puts policies, Defender and the display driver on top of
it in about 2.5 minutes through the guest agent (provision.ps1). A qcow2
chain with a relative backing path keeps the two together.

build-ref.sh builds komorebi and komorebic of any commit, and
KOMOREBI_E2E_BINS makes nix run .#e2e-windows test those binaries.
2026-10-30 18:22:44 -07:00
LGUG2Z 9337042a0f feat(e2e): drive a Windows guest under QEMU with the neutral Platform
guest.py starts QEMU and swtpm on an overlay of the golden image, with
saved-state restore (state.py), qmp.py sends keys and the pointer, agent.py
talks to the guest agent, windows_platform.py implements the Platform
protocol and run.py runs the scenarios, one guest each.
2026-10-30 18:22:44 -07:00
LGUG2Z d2a6d34a6d fix(e2e): log what ends the guest agent's connections
A windowless program has nowhere to print a panic, so the agent
writes panics and ended connections to C:\e2e\agent.log.
2026-10-30 18:22:44 -07:00
LGUG2Z db7d8480ad feat(e2e): sync the neutral core from kfde a563bf9c 2026-10-30 18:22:44 -07:00
LGUG2Z 1874b1fc10 feat(e2e): sync the neutral core from kfde 13270678 2026-10-30 18:22:44 -07:00
LGUG2Z 52f4c96817 feat(e2e): sync the neutral core from kfde 2c7e13dd 2026-10-30 18:22:44 -07:00
LGUG2Z 632b6cc366 feat(e2e): sync the neutral core from kfde 7de53180 2026-10-30 18:22:44 -07:00
LGUG2Z 8a8674ac9b feat(e2e): sync the neutral core from kfde bf5da0e6 2026-10-30 18:22:44 -07:00
LGUG2Z fc38fbf739 feat(e2e): sync the neutral core from kfde a1024d16 2026-10-30 18:22:44 -07:00
LGUG2Z 8c990e4e1d feat(e2e): sync the neutral core from kfde 06c2b6e2 2026-10-30 18:22:44 -07:00
LGUG2Z e20e02bd12 feat(e2e): sync the neutral core from kfde 7db3f9c5 2026-10-30 18:22:44 -07:00
LGUG2Z 048cf3b951 feat(e2e): sync the neutral core from kfde 79f05a86 2026-10-30 18:22:44 -07:00
LGUG2Z 76918d5a88 feat(e2e): sync the neutral core from kfde 5e7e4ff1
Adds commands.unknown_monitor: a window sent to a monitor that does not
exist must stay managed. From kfde change lkprqpuv.
2026-10-30 18:22:44 -07:00
LGUG2Z d2adcc9c28 feat(e2e): sync the neutral core from kfde 8b86c8ee
The commands sweep plugs in a second display first when the platform has
only one. From kfde change xzwqolrv.
2026-10-30 18:22:44 -07:00
LGUG2Z 72681c9913 feat(e2e): sync the neutral core from kfde 934fa65a
Platform gains displays, add_display, remove_display and komorebic_status,
Checks gains skip, Snapshot gains workspace_of, and the core gains the
commands, rules and hotplug scenarios. From kfde change swulsqkl.
2026-10-30 18:22:44 -07:00
LGUG2Z 40a9aa3739 feat(e2e): sync the neutral core from kfde 57e510da
Platform gains close(client), and the core gains the monocle and closing
scenarios. From kfde change nykrktvm.
2026-10-30 18:22:44 -07:00
LGUG2Z 94333870d8 feat(e2e): sync the neutral core from kfde 0be4c6ee
The Platform protocol gains has() and a Pointer, and the core gains the
resize scenario that drags the edge two tiles share. From kfde change
wumvluop.
2026-10-30 18:22:44 -07:00
LGUG2Z b34b02814f feat(e2e): sync the neutral core from kfde 6b6b7bb5
The recorded kfw and kfde states are now fixtures read by test_recorded.py,
and the sync script copies them. The only change inside komorebi_vm.core is a
diagnostic print in the workspaces scenario. From kfde change vvplllnz.
2026-10-30 18:22:44 -07:00
LGUG2Z 5ea4057ec5 fix(e2e): give the guest agent no console window
The agent opened a console, which the daemon under test tiled as a window of
its own, so every scenario saw one window too many. Build it as a windows
subsystem program and start its children with CREATE_NO_WINDOW.
2026-10-30 18:22:44 -07:00
LGUG2Z d00c4436d0 feat(e2e): vendor the neutral core from kfde
komorebi_vm.core (Rect, Checks, pixels, Snapshot, the Platform protocol and
the first scenarios) and its unit tests, copied by kfde's scripts/sync-e2e-core
from kfde change mxoqrxnx (accdd653). kfde is the source of truth until the
core moves here; the copy is not to be edited in this tree.
2026-10-30 18:22:44 -07:00
LGUG2Z eee24dad36 feat(e2e): add the guest agent and the test window for the Windows guest
komorebi-e2e-agent runs in the interactive session of the guest and answers
the host over a forwarded TCP port: exec, spawn, os_windows (DWM frame, cloak
and focus), displays, window verbs and file transfer. komorebi-testwin is a
plain Win32 window with a stable exe name and class and a control channel on
stdin. Both cross-build from Linux and pass clippy; neither has run in a
guest yet.
2026-10-30 18:22:44 -07:00
LGUG2Z 0c6864b4bc feat(e2e): add the W0 probe for a Windows 11 guest under QEMU
An unattended install of the Windows 11 evaluation ISO under QEMU with nested
KVM on WSL2, and a boot script that times the golden image to a desktop.
Measured: install 21.6 min, desktop in 36 to 51 s, with other VMs running.
W0.md records the numbers and what was found on the way: no SMM under nested
SVM, so no secure-boot OVMF; the firmware needs TPM support for Setup to see
the TPM; and the evaluation reads as expired unless the guest clock is set
back.
2026-10-30 18:22:44 -07:00