Add a cross-platform, standard-library-only Python package under scripts/device-testing/ that replicates LibreMail's on-device performance-test scenarios and logging capture, codifying the methodology run by hand on 2026-07-05 (Pixel 10 Pro XL). Modules: - breadcrumbs.py: a pure, unit-tested parser for the ImapPerf / MailReader / Reader / MailBackfiller breadcrumbs, plus open-correlation that reproduces the manual timing-tables.md figures exactly. - adb.py: a safety-guarded adb wrapper -- an allow-list of adb subcommands and a deny-list + assertions on shell commands. The only sanctioned app-state mutation is clearing LibreMail's own cache/ (exact-match); no pm clear / uninstall / data wipe, and no touching databases/ files/ shared_prefs/ datastore/ can be constructed. - uidump.py: uiautomator XML parser + screen recognition (mailbox rows with the cached "Available offline" flag, reader, and the keyguard / foreign-app guards). - scenarios.py: cold-open, message-open (uncached), back-nav, prefetch A/B (fetch-policy toggle) and cross-provider, each keyguard-guarded and driven through the guarded wrapper. - report.py + perf_harness.py: aggregates, a timing-tables.md renderer mirroring the manual write-up, and the CLI (timestamped run dir with the raw logcat, a filtered breadcrumb extract, and the tables). --dry-run prints the exact command plan without touching device state. Tests (stdlib unittest, 68 cases) validate the parser, guardrails, UI recognition and report against the manual run's real captures (fixtures include a verbatim perf-extract slice and the reader/lockscreen/alarm dumps). Track the *.log fixture past the gitignore *.log rule via a scoped negation. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2 lines
7.1 KiB
XML
2 lines
7.1 KiB
XML
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><hierarchy rotation="0"><node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[0,0][1344,2992]"><node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[0,0][1344,2992]"><node index="0" text="" resource-id="" class="android.view.View" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="true" bounds="[0,392][1344,2608]"><node index="0" text="" resource-id="" class="android.view.View" package="org.libremail.app" content-desc="" clickable="true" enabled="true" long-clickable="true" scrollable="false" bounds="[0,392][1344,617]"><node index="0" text="" resource-id="" class="android.view.View" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[36,433][180,577]"><node index="0" text="G" resource-id="" class="android.widget.TextView" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[89,464][127,546]" /></node><node index="1" text="github-actions[bot]" resource-id="" class="android.widget.TextView" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[216,428][1078,510]" /><node index="2" text="1 hour ago" resource-id="" class="android.widget.TextView" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[1102,441][1296,497]" /><node index="3" text="Re: [JMR-dev/LibreMail] perf(db): covering index (PR #285)" resource-id="" class="android.widget.TextView" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[216,510][1296,581]" /></node><node index="1" text="" resource-id="" class="android.view.View" package="org.libremail.app" content-desc="" clickable="true" enabled="true" long-clickable="true" scrollable="false" bounds="[0,620][1344,845]"><node index="0" text="" resource-id="" class="android.view.View" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[36,661][180,805]"><node index="0" text="S" resource-id="" class="android.widget.TextView" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[91,692][125,774]" /></node><node index="1" text="SIG SAUER" resource-id="" class="android.widget.TextView" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[216,656][1078,738]" /><node index="2" text="1 hour ago" resource-id="" class="android.widget.TextView" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[1102,669][1296,725]" /><node index="3" text="Offer Ending Soon: Save $250 On A CWS Pistol" resource-id="" class="android.widget.TextView" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[216,738][1274,809]" /></node><node index="2" text="" resource-id="" class="android.view.View" package="org.libremail.app" content-desc="" clickable="true" enabled="true" long-clickable="true" scrollable="false" bounds="[0,848][1344,1129]"><node index="0" text="" resource-id="" class="android.view.View" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[36,889][180,1033]"><node index="0" text="G" resource-id="" class="android.widget.TextView" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[89,920][127,1002]" /></node><node index="1" text="github-actions[bot]" resource-id="" class="android.widget.TextView" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[216,884][1024,966]" /><node index="2" text="" resource-id="" class="android.view.View" package="org.libremail.app" content-desc="Available offline" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[1048,904][1090,946]" /><node index="3" text="1 hour ago" resource-id="" class="android.widget.TextView" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[1102,897][1296,953]" /><node index="4" text="Re: [JMR-dev/LibreMail] fix(auth): drop redundant token (PR #317)" resource-id="" class="android.widget.TextView" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[216,966][1296,1037]" /></node></node><node index="1" text="" resource-id="" class="android.view.View" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[0,200][1344,392]"><node index="0" text="" resource-id="" class="android.view.View" package="org.libremail.app" content-desc="Show folders" clickable="true" enabled="true" long-clickable="false" scrollable="false" bounds="[12,224][156,368]" /><node index="1" text="Inbox" resource-id="" class="android.widget.TextView" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[168,251][340,341]" /><node index="2" text="" resource-id="" class="android.view.View" package="org.libremail.app" content-desc="Search" clickable="true" enabled="true" long-clickable="false" scrollable="false" bounds="[1188,224][1332,368]" /></node><node index="2" text="" resource-id="" class="android.view.View" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[0,2608][1344,2848]"><node index="0" text="" resource-id="" class="android.view.View" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[0,2608][660,2848]"><node index="0" text="Mail" resource-id="" class="android.widget.TextView" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[287,2748][372,2804]" /></node><node index="1" text="" resource-id="" class="android.view.View" package="org.libremail.app" content-desc="" clickable="true" enabled="true" long-clickable="false" scrollable="false" bounds="[684,2608][1344,2848]"><node index="0" text="Settings" resource-id="" class="android.widget.TextView" package="org.libremail.app" content-desc="" clickable="false" enabled="true" long-clickable="false" scrollable="false" bounds="[931,2748][1096,2804]" /></node></node></node></node></hierarchy>
|