field_ios

In-the-field app for Radroots on iOS
git clone https://radroots.dev/git/field_ios.git
Log | Files | Refs | README | LICENSE

commit bcf8ed3311af9c15d90cda212915d5309bcad347
parent 339625eb70c037193794dfef429b39569d070d2e
Author: triesap <tyson@radroots.org>
Date:   Sun,  9 Aug 2026 20:23:45 +0000

ios: add physical lock recovery gate

- Background Radroots before the governed physical lock window.
- Reserve a bounded interval for externally verified device locking.
- Reactivate the application after the user unlocks protected data.
- Fail when the two-tab shell does not recover on the exact device.

Diffstat:
MRadrootsUITests/RadrootsRemoteQualificationUITests.swift | 18++++++++++++++++++
1 file changed, 18 insertions(+), 0 deletions(-)

diff --git a/RadrootsUITests/RadrootsRemoteQualificationUITests.swift b/RadrootsUITests/RadrootsRemoteQualificationUITests.swift @@ -222,6 +222,24 @@ final class RadrootsRemoteQualificationUITests: XCTestCase { } @MainActor + func testManualDeviceLockAndProtectedDataRecovery() throws { + let configuration = try QualificationConfiguration.environment() + let app = launchToRoot(configuration) + XCTAssertTrue(app.tabBars.firstMatch.waitForExistence(timeout: 20)) + + XCUIDevice.shared.press(.home) + Thread.sleep(forTimeInterval: 60) + + for _ in 0 ..< 24 { + app.activate() + if app.tabBars.firstMatch.waitForExistence(timeout: 5) { + return + } + } + XCTFail("Radroots did not recover after the physical device was unlocked") + } + + @MainActor private func launchToRoot(_ configuration: QualificationConfiguration) -> XCUIApplication { let app = XCUIApplication() app.launchEnvironment = configuration.launchEnvironment