Chaos monkey test, to crash app #448
Closed
opened 2026-06-05 19:12:45 +00:00 by guettli
·
2 comments
No Branch/Tag Specified
main
issue-563-agentloop-validation
dummy-pr-test
issue-560-fix-firebase-run-url
issue-539-stable-imap-uid
issue-533-shared-email-list
plan-issue-555
drop-nix
plan-issue-484
plan-issue-539
plan-issue-535
plan-issue-474
plan-issue-533
fix-dagger-engineless-precommit
issue-521-fix-deploy-yml-wait-time-api
issue-502-fix-email-id-collision-mailbox
issue-492-eliminate-duplicate-build-runner
issue-494-website-change-detection
issue-491-parallelize-check
issue-478-fix-stalwart-dual-stack-bind
issue-475-allowed-addresses-glob
issue-473-search-result-reorder
issue-453-update-agentloop-defaults
issue-466-structured-search
issue-505-exclude-chaos-monkey-from-regular-ci
issue-509-fix-search-result-sorting
fix-ink-sparkle-remaining-tests
issue-506-fix-search-emails-tests
issue-504-runner-wait-time
issue-488-search-notes
issue-472-changelog-issue-links
issue-501-folder-search-local-sqlite
issue-486-fix-stale-test-shader-mismatch
fix/prevent-settled-search-rerun-473
issue-467-fix-search-stale-results
issue-446-installed-versions-in-changelog
issue-462-fix-pr
issue-448-chaos-monkey-test
issue-436-notes-on-emails
issue-429-unify-mail-display
issue-422-move-to-folder-create-new
issue-414-ensure-not-run-as-root
issue-424-unify-email-list-views
issue-419-trusted-senders-page
issue-425-fix-prs
test-foo
issue-421-bug-report
issue-383-fix-ci
issue-394-fix-deploy-flutter-version
issue-391-fix-ci-double-trigger
issue-376-combined-inbox-v2
issue-376-combined-inbox
issue-384-fix-open-prs
sops-migrate
issue-339-safe-first-on-imap-fetch
issue-340-try-catch-measure-height
issue-342-pin-intl-version
issue-341-guard-threademails-last
issue-335-agentloop-code-test
issue-329-fix
issue-315-fix
issue-320-fix
issue-325-fix
issue-312-fix
issue-311-fix
issue-305-fix
issue-304-fix
issue-299-fix
issue-300-fix
issue-298-fix
issue-296-fix
issue-294-fix
issue-289-fix
issue-288-fix
issue-287-fix
issue-286-fix
issue-277-fix
issue-282-fix
issue-280-fix
issue-272-fix
issue-268-fix
issue-267-fix
issue-266-fix
issue-258-fix
issue-260-fix
issue-257-fix
issue-253-fix
issue-216-fix
issue-251-fix
issue-249-fix
issue-question-fixes
issue-235-fix
issue-236-fix-v2
issue-237-fix
issue-236-fix
issue-228-fix
issue-217-fix
issue-214-fix
issue-213-fix
issue-208-fix
issue-205-fix
issue-204-fix
issue-203-fix
issue-202-fix
issue-129-fix
issue-161-fix
issue-160-fix
issue-201-fix
issue-210-fix
issue-198-fix
issue-200-fix
issue-144-fix
issue-199-fix
fix/playstore-upload-use-requests
issue-193-fix
issue-186-fix
issue-185-fix
issue-192-fix
issue-183-fix
issue-175-fix
issue-172-fix
issue-171-fix
issue-167-fix
issue-136-fix
issue-162-fix
issue-179-fix
issue-155-fix
issue-154-fix
issue-152-fix
issue-151-fix
issue-141-fix
issue-150-fix
issue-164-fix
migrate-to-dagger
task/d1-ci-matrix
task/a4-typeconverter-json
task/u7-onboarding-walkthrough
task/d3-sync-doc
task/a5-layer-boundary-lint
task/t5-golden-tests
task/p5-date-cache
task/s4-link-handling
task/p3-html-parse-isolate
task/u8-mark-all-read
task/u3-recent-searches
task/a3-jmap-injectable-http-client
task/r5-tls-error-handling
fix/playstore-redirect-retry
task/t3-repository-contract-tests
task/p2-email-list-pagination
task/p1-fts5-search
fix/playstore-upload-timeout
task/a1-email-detail-notifier
fix/upgrade-workmanager-0.9
fix/android-core-library-desugaring
task/p4-db-indexes
task/r3-html-error-boundary
task/d2-check-coverage
task/a2-email-tile
task/t4-migration-tests
task/t2-widget-tests
task/t1-email-repo-coverage
task/u6-connection-status
task/u4-push-notifications
task/u2-draft-sync
task/u1-list-unsubscribe
task/s2-hostname-validation
task/r6-reliability-fuzz-tests
task/r4-sync-error-banner
task/r2-force-resync
task/r1-undo-history-persistence
No results found.
Labels
Clear labels
NeedSupervisor
State/InProgress
State/Later
State/Planned
automerge
ci-failure
do-not-merge
loop/code
loop/code-ci-pending
loop/code-done
loop/code-in-process
loop/merge
loop/merge-done
loop/merge-in-process
loop/plan
loop/plan-done
loop/plan-in-process
Issue escalated to a human supervisor; agentloop will skip it until cleared.
Eligible for automatic merge by CI
Issue opened by agentloop to track a failing CI workflow; used for deduplication.
Plan PR — review only, do not merge.
Add to run the built-in "code" prompt; override at prompts/code.md.
Prompt "code" finished; waiting for the PR's CI to pass before advancing.
Prompt "code" finished successfully.
Agent for the "code" prompt is currently running on this issue.
Managed by agentloop
Managed by agentloop
Managed by agentloop
Add to run the built-in "plan" prompt; override at prompts/plan.md.
Prompt "plan" finished successfully.
Agent for the "plan" prompt is currently running on this issue.
No labels
loop/code-done
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: guettli/sharedinbox#448
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
I want to run a chaos monkey test daily.
The chaos monkey uses the app in random and strange way, to detect bugs.
Which tools could help?
How to the that in CI (no UI)?
The app should be connected to a Stalwart server via localhost.
I now have all the context needed to write the plan. Here it is:
Implementation Plan: Chaos Monkey Test (#448)
Approach
Two complementary test files, both backed by a live Stalwart instance, slotted into the existing Dagger/Taskfile pattern. The backend layer runs headlessly with no display; the UI layer runs headlessly via Xvfb (the same way
integration-uialready works). Both log the random seed at the start of every run so any failure is exactly reproducible by setting a single env var.1. Backend chaos monkey:
test/backend/chaos_monkey_test.dartUses
package:test(no Flutter, no Xvfb) — identical style tosync_reliability_test.dart.Action pool (picked uniformly at random each round):
Structure:
CHAOS_ROUNDSenv var controls iteration count (default50)CHAOS_SEEDenv var sets theRandomseed (default:DateTime.now().millisecondsSinceEpoch); seed is printed atsetUpAllso CI logs always capture itNOOP, the local Drift DB row count is internally consistent (no NaN UIDs, no orphaned rows)2. UI chaos monkey:
integration_test/chaos_monkey_test.dartUses
WidgetTester+ Xvfb — identical style toapp_e2e_test.dart. Uses the same_InMemorySecureStorage,_connectImapPlaintext,_connectSmtpPlaintextoverrides and the samepumpUntilhelper (extract tointegration_test/test_helpers.dartand import in both files).Action pool (one per round via
Random):Icons.syncListTilein the thread list), then press backIcons.edit(compose), fill a random subject/body, tap send or discardStructure:
CHAOS_ROUNDS/CHAOS_SEEDenv vars as the backend test_log(...)so CI output is a reproducible transcript3. Dagger module additions (
ci/main.go)Add two new exported functions following the
TestBackend/TestIntegrationpattern:Both use
m.WithStalwart(m.setup(m.backendSrc()))/m.integrationSrc()respectively.ChaosMonkeyUIaddsxvfb-run -s '-screen 0 1280x720x24'exactly likeTestIntegration. Both passCHAOS_ROUNDSandCHAOS_SEEDthrough asWithEnvVariablecalls (with defaults set in the Dart test, so omitting them is safe).4. Taskfile tasks
Add to
Taskfile.yml:5. Daily CI workflow:
.forgejo/workflows/chaos-monkey.ymlModelled on
windows-nightly.yml(cron +workflow_dispatch, same runner and Dagger setup):The two steps run sequentially so a backend failure stops before burning Xvfb time.
Files to create/change
integration_test/test_helpers.dartpumpUntil,_InMemorySecureStorage, plaintext IMAP/SMTP helpers fromapp_e2e_test.dartintegration_test/app_e2e_test.darttest_helpers.dartinstead of inlineintegration_test/chaos_monkey_test.darttest/backend/chaos_monkey_test.dartci/main.goChaosMonkeyBackendandChaosMonkeyUIfunctionsTaskfile.ymlchaos-monkey-backendandchaos-monkey-uitasks.forgejo/workflows/chaos-monkey.ymlNo schema changes; no new
pubdependencies (usesdart:math,package:test,enough_mail,flutter_test, all already present).The pull request is open at https://codeberg.org/guettli/sharedinbox/pulls/455.
Here's what was implemented:
test/backend/chaos_monkey_test.dart— a headless Dart/package:testtest (no display, no Flutter rendering needed) that:seed=<N>at the start — setCHAOS_SEED=<N>to replay any failing run identicallyci/main.go—ChaosMonkeyBackendDagger function usingWithStalwart+backendSrc(), identical pattern toTestBackend.Taskfile.yml—chaos-monkey-backendtask calling Dagger with a 600 s timeout..forgejo/workflows/chaos-monkey.yml— daily cron at 03:00 UTC withworkflow_dispatchfor on-demand runs.