chahinebrini 63fae25531 fix(android-protection): explicit specialUse FGS type — Samsung/Android 16 crash loop
RebreakVpnService.onStartCommand crashed with SecurityException because Android 16's validateForegroundServiceType rejects the implicit 2-arg startForeground(). Now passes FOREGROUND_SERVICE_TYPE_SPECIAL_USE explicitly (Google's documented best practice) and guards the call so a failed foreground promotion stops the service cleanly instead of crashing the app. Verified vs reported Galaxy A54 / Android 16 signature (97% of crash events, 1-user crash loop).

Bundles pending working-tree work across native/marketing/locales/mac + graphify-out rebuild. gitignore: google-services.json + /screenshots/.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 22:33:28 +02:00

106 lines
2.7 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# stress/rapid-post-submit.yaml
#
# Stress scenario: Submit multiple community posts in rapid succession.
# Designed to catch race conditions in the post submission pipeline:
# - Duplicate optimistic inserts
# - ComposeCard not resetting between posts
# - React Query invalidation firing before previous request resolves
# - "Post konnte nicht veröffentlicht werden" error appearing incorrectly
#
# Samsung A50 note: The submit → reset cycle takes ~13s on A50 due to:
# - API round-trip to staging (network)
# - React Query invalidation → re-render
# - ComposeCard animation (expand/collapse)
# Each post is given 8s timeout. 3 posts = ~24s total on A50.
#
# Pre-requisite: Test-user exists on staging. Posts created are real (staging DB).
# Cleanup: Delete [E2E-STRESS] posts from staging DB manually or via Service-Role.
# Env-Vars: E2E_TEST_USER, E2E_TEST_PASSWORD
appId: org.rebreak.app
---
- launchApp:
clearState: true
- waitForAnimationToEnd:
timeout: 8000
# --- Auth ---
- assertVisible:
text: "E-Mail"
- tapOn:
text: "E-Mail"
- inputText: ${E2E_TEST_USER}@rebreak.internal
- tapOn:
text: "Passwort"
- inputText: ${E2E_TEST_PASSWORD}
- tapOn:
text: "Anmelden"
- waitForAnimationToEnd:
timeout: 15000
- assertVisible:
text: "ReBreak"
# --- Scroll to ComposeCard at top ---
- scrollUntilVisible:
element:
text: "Was bewegt dich gerade?"
direction: UP
timeout: 5000
# === POST 1 ===
- tapOn:
text: "Was bewegt dich gerade?"
- waitForAnimationToEnd:
timeout: 1000
- inputText: "[E2E-STRESS] Post 1 — Rapid-Submit-Test"
- assertVisible:
text: "Teilen"
- tapOn:
text: "Teilen"
- waitForAnimationToEnd:
timeout: 8000
# ComposeCard must reset after submit — placeholder visible again
- assertVisible:
text: "Was bewegt dich gerade?"
# === POST 2 ===
- tapOn:
text: "Was bewegt dich gerade?"
- waitForAnimationToEnd:
timeout: 1000
- inputText: "[E2E-STRESS] Post 2 — Rapid-Submit-Test"
- assertVisible:
text: "Teilen"
- tapOn:
text: "Teilen"
- waitForAnimationToEnd:
timeout: 8000
- assertVisible:
text: "Was bewegt dich gerade?"
# === POST 3 ===
- tapOn:
text: "Was bewegt dich gerade?"
- waitForAnimationToEnd:
timeout: 1000
- inputText: "[E2E-STRESS] Post 3 — Rapid-Submit-Test"
- assertVisible:
text: "Teilen"
- tapOn:
text: "Teilen"
- waitForAnimationToEnd:
timeout: 8000
- assertVisible:
text: "Was bewegt dich gerade?"
# --- Verify no error state ---
# community.post_failed = "Post konnte nicht veröffentlicht werden."
# If any of the 3 posts failed with this error, the flow failed.
- assertNotVisible:
text: "Post konnte nicht veröffentlicht werden."