aboutsummaryrefslogtreecommitdiffstats
path: root/CLAUDE.md
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-08-13 10:00:31 +0200
committerDanilo M. <danix@danix.xyz>2026-08-13 10:00:31 +0200
commit9585674c9546079aa86f9943df39f700d8db331a (patch)
tree5d885eed06287ffcbbc05eacfd10d7d77a1751e0 /CLAUDE.md
parentf119afe9a3d30f5d320b99c90b47fe52e7133d84 (diff)
downloadqtmaildir-9585674c9546079aa86f9943df39f700d8db331a.tar.gz
qtmaildir-9585674c9546079aa86f9943df39f700d8db331a.zip
test(mainwindow): stop the suite reading the real kernel lock table
Item 61. An init() fixture gives every test its own empty lock table in a QTemporaryDir, so no test observes the machine's real sync state. The failure was never intermittent in the usual sense: 0 failures in 30 runs with no lock held, 30 in 30 with one held. It presented as three tests failing that never mention syncing, and cost three misdiagnoses. The three tests that already used the seam each restored "/proc/locks" when finished, which was itself the defect: it handed the real table to whichever test ran next, so one test opting in re-exposed all the others. Those restores are gone and cleanup() leaves the temporary path in place. noTestCanSeeTheRealLockTable guards the fixture, since a silent revert would go back to failing for reasons no assertion mentions. Verified with the lock deliberately held: 3 failures before, 119/119 after, full suite 19/19. Mutation-checked by disabling the fixture, where the guard fails first and a real test fails behind it.
Diffstat (limited to 'CLAUDE.md')
-rw-r--r--CLAUDE.md13
1 files changed, 13 insertions, 0 deletions
diff --git a/CLAUDE.md b/CLAUDE.md
index d652bb6..152b9e7 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -273,6 +273,19 @@ letting QCompleter overwrite the field. This has been hit twice, in
either class. A test that uses `setText()` passes against the bug, since
`setText` does not drive a completer at all: the keys must be typed.
+**No test may read the real `/proc/locks`, and restoring it after a test is a
+BUG, not cleanup.** `TestMainWindow::init()` points every test at an empty lock
+table in its own `QTemporaryDir`. Without that the suite observes the machine's
+real sync state, so a `mailsync.sh` run makes `SyncMonitor` report a sync in
+progress and tests that never mention syncing fail: measured 0 failures in 30
+runs with no lock held, 30 in 30 with one held, and it caused three separate
+misdiagnoses (item 61). Reproduce with `flock /tmp/mbsync.lock -c 'sleep 60'` in
+one shell and the suite in another. The three tests that observe a sync write
+their own table content; none of them restores `"/proc/locks"` at the end any
+more, because doing so handed the real table to the next test and re-exposed the
+whole suite. `noTestCanSeeTheRealLockTable` fails if that protection is ever
+lost.
+
**`QItemSelectionModel::currentRowChanged` is emitted BEFORE the selection model is
updated.** A handler on it reading `selectedRows()` sees the *previous* selection, not the
one the user just made. Verified against Qt 6.11. This produced two separate faults in one