From 21a155d35f668409673c1f1300fbe2596ab6c45d Mon Sep 17 00:00:00 2001 From: Workbench IA Date: Thu, 1 Oct 2026 07:16:40 +0000 Subject: [PATCH] Valider iPhone OS 2.1.1 et documenter les tests des applications --- contrib/ipod-emu/HANDOFF.md | 35 +++++++++++++-- contrib/ipod-emu/README.md | 42 +++++++++++++++++- contrib/ipod-emu/tests/http-fixture.py | 59 ++++++++++++++++++++++++++ 3 files changed, 131 insertions(+), 5 deletions(-) create mode 100644 contrib/ipod-emu/tests/http-fixture.py diff --git a/contrib/ipod-emu/HANDOFF.md b/contrib/ipod-emu/HANDOFF.md index e20e182ef8..d3e694acfd 100644 --- a/contrib/ipod-emu/HANDOFF.md +++ b/contrib/ipod-emu/HANDOFF.md @@ -2,7 +2,36 @@ État au 2026-09-30. Environnement : conteneur Arch Linux, utilisateur `dev` avec sudo, sans `CAP_NET_ADMIN`, sans `/dev/ppp` ni TUN. -## Dernière mise à jour — fiabilisation GPIO/SPI et agent v12 +## Validation du 1er octobre 2026 — iPhone OS 2.1.1 + +- Image distincte `5F138-validation-20261001`, créée depuis la base 5F138 conservée, + avec agent v12, TouchProbe et HelloEmu. Session : `work/validation-20261001/`. + `system-version.plist` confirme 2.1.1 / 5F138 ; démarrage déverrouillé en 28 s. +- Calibration : sept points exacts de `(20,40)` à `(300,460)` dans + `calibration-complete.log`, après attente du marqueur `TouchProbe ready`. + Les ordonnées du journal sont relatives à la vue, située à y=20. +- Six cycles alternant Power/Home et Power/Power passent, sans perte du tactile. +- Safari : clavier virtuel QWERTY, formulaire envoyé avec `texte=bonjour`, + défilement jusqu'au lien final et requête `/fin` reçue par le serveur HTTP local. + Journal : `http/requests.jsonl`. Une version réutilisable de la page et du serveur + est fournie dans `tests/http-fixture.py` ; aucun site extérieur n'est requis. +- Calculatrice : `7 × 8 = 56`, capture `calculatrice-56.png`. +- Notes : note « Bonjour » créée par le clavier virtuel puis sauvegardée. + Les lignes de `Note` et `note_bodies` sont identiques dans `notes-avant.db` et + `notes-apres.db`, et la note réapparaît dans l'interface après redémarrage. +- Nouvelle app `HelloEmu21.app` (bundle-id `com.ioslegacy.hello21`) installée via + `push-app`, cache reconstruit, redémarrage sans réinitialiser la NAND en 50 s, + lancement au premier plan et journal HelloEmu validés. Captures : + `hello21-apres-push.png` et `note-apres-reboot.png`. +- Synthèse locale : `validation.json`. Session et serveur HTTP de test arrêtés. + Aucun défaut `Killing device`, `Fatal Exception` ou `MACH Reboot` relevé dans + la console finale. Les images et NAND d'origine sont conservées. +- Particularités : l'image 5F138 conserve ses réglages de langue et de fuseau + d'origine ; les captures sont en anglais. Le lancement `--url` d'un Safari + déjà ouvert n'a pas changé la page pendant le test : passer par les liens ou + relancer le navigateur. Le RTC matériel et la veille profonde restent à faire. + +## Fiabilisation du 30 septembre — GPIO/SPI et agent v12 Les sections de diagnostic plus anciennes ci-dessous décrivent les étapes précédentes. Le workflow `push-app` puis déverrouillage/lancement a été validé avec l'agent v11. @@ -26,8 +55,8 @@ puis HelloEmu se lance au premier plan avec son journal. Diagnostics locaux : Les sessions de validation sont arrêtées. Les fichiers générés, images et diagnostics restent hors du dépôt. Les images 5H11a et les NAND d'origine sont conservées ; le RTC, le Wi-Fi matériel, l'audio -et la veille profonde restent à implémenter. Les nouveaux correctifs ne sont -pas encore validés sur 5F138. +et la veille profonde restent à implémenter. Les nouveaux correctifs n’étaient +pas encore validés sur 5F138 à cette étape. ## Objectif diff --git a/contrib/ipod-emu/README.md b/contrib/ipod-emu/README.md index 17ca517249..1ae57e360e 100644 --- a/contrib/ipod-emu/README.md +++ b/contrib/ipod-emu/README.md @@ -131,8 +131,7 @@ La vitesse verticale utilise `y`, les vitesses conservent leur signe et sont bornées à 16 bits. `apps/TouchProbe` permet de mesurer la calibration : compiler avec son Makefile, lancer avec `--log`, puis comparer les gestes QMP au marqueur bleu et aux coordonnées du journal (ajouter 20 pixels à l'ordonnée locale de la vue). -La calibration a été vérifiée sur 5H11a, sur sept points de `(20,40)` à `(300,460)`. -Les modifications n'ont pas encore été validées sur 5F138. +La calibration a été vérifiée sur 5H11a et 5F138, sur sept points de `(20,40)` à `(300,460)`. Agent **v12** : `put` et `get` utilisent des blocs de 64 Kio au lieu d'allouer le fichier entier dans l'iPod. Un upload incomplet supprime son temporaire et @@ -147,6 +146,45 @@ contrib/ipod-emu/tests/run-multitouch # build QEMU arm existant, Ninja, compi python3 contrib/ipod-emu/tests/test-transfers.py # Python et compilateur C, sockets locales ``` +## Validation sous iPhone OS 2.1.1 + +Le firmware 5F138 a été vérifié avec l'agent v12 et les mêmes corrections QEMU. +Conserver l'image 5F138 d'origine et produire une image dérivée avec un nom absent : + +```bash +ipod-mkimage -b 5F138 -o 5F138-agent-v12 agent/overlay apps/TouchProbe/TouchProbe.app apps/HelloEmu/HelloEmu.app +``` + +Utiliser ensuite un environnement `IPOD_EMU_HOME` indépendant pour démarrer cette +image ; un changement de firmware remplace la NAND de la session choisie. +`SystemVersion.plist` confirme iPhone OS 2.1.1 / 5F138. Les sept points de +calibration sont exacts et six cycles de veille/réveil alternant Home et Power +passent, sans désactivation du tactile. + +Pour tester Safari sans dépendre d'un site extérieur, depuis le dépôt : + +```bash +python3 contrib/ipod-emu/tests/http-fixture.py --output /chemin/diagnostic-http +``` + +Ouvrir l'URL `http://10.0.2.2:/` affichée dans Safari invité. Le serveur +écoute uniquement sur la boucle locale de l'hôte ; il conserve le port et les +requêtes dans le dossier choisi. Saisir `bonjour` avec le clavier virtuel et +soumettre : le journal doit contenir `/submit?texte=bonjour`. Suivre le lien de +défilement, glisser jusqu'au bas, attendre la fin de l'inertie et toucher le lien +final : `/fin` doit apparaître. Arrêter le serveur avec Ctrl-C après le test. + +Attendre l'affichage réel d'une application avant d'envoyer des gestes. Pour +TouchProbe, attendre `TouchProbe ready` dans le journal ; une réponse de lancement +ne garantit pas que la vue soit déjà prête. Sous 2.1.1, lancer Safari avec `--url` +alors qu'il est déjà ouvert n'a pas changé la page lors du test ; utiliser les +liens de la page ou relancer Safari pour ouvrir une autre URL. + +Notes et la calculatrice complètent ce contrôle : saisir une note, la sauvegarder, +puis comparer son texte dans `Library/Notes/notes.db` avant et après redémarrage ; +vérifier visuellement `7 × 8 = 56` dans la calculatrice. Les diagnostics et le +résultat détaillé de la validation du 1er octobre sont décrits dans `HANDOFF.md`. + ## Limites - **Persistance NAND** : les pages et métadonnées écrites par iOS, ainsi que les effacements de blocs, sont conservés diff --git a/contrib/ipod-emu/tests/http-fixture.py b/contrib/ipod-emu/tests/http-fixture.py new file mode 100644 index 0000000000..5ce4d933e5 --- /dev/null +++ b/contrib/ipod-emu/tests/http-fixture.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +"""Page HTTP compatible Safari mobile 3 pour valider saisie et défilement. + +Lancer sur l'hôte avec --output DOSSIER ; ouvrir l'URL 10.0.2.2 affichée dans +Safari invité. Le port et les requêtes reçues sont enregistrés dans ce dossier. +Arrêter avec Ctrl-C après le test. Aucun accès Internet n'est nécessaire. +""" +import argparse +from datetime import datetime, timezone +from html import escape +from http.server import BaseHTTPRequestHandler, HTTPServer +import json +from pathlib import Path +from urllib.parse import parse_qs, urlparse + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--output', type=Path, required=True) + args = parser.parse_args() + args.output.mkdir(parents=True, exist_ok=True) + + class Handler(BaseHTTPRequestHandler): + def do_GET(self): + with (args.output / 'requests.jsonl').open('a', encoding='utf-8') as log: + log.write(json.dumps({'utc': datetime.now(timezone.utc).isoformat(), + 'path': self.path}, ensure_ascii=False) + '\n') + url = urlparse(self.path) + if url.path == '/submit': + content = 'Recu : ' + escape(parse_qs(url.query).get('texte', [''])[0]) + elif url.path == '/scroll': + content = '

Debut

' + ''.join( + '

Ligne %02d

' % i for i in range(24)) + content += 'Fin du defilement' + elif url.path == '/fin': + content = '

Defilement OK

' + else: + content = ('

Validation HTTP

' + '' + '

Test de defilement

') + body = ('' + 'Test iPhone OS' + content + '').encode('utf-8') + self.send_response(200) + self.send_header('Content-Type', 'text/html; charset=utf-8') + self.send_header('Content-Length', str(len(body))) + self.end_headers() + self.wfile.write(body) + + with HTTPServer(('127.0.0.1', 0), Handler) as server: + (args.output / 'port').write_text(str(server.server_port) + '\n', encoding='utf-8') + print(f'URL depuis l’iPod : http://10.0.2.2:{server.server_port}/', flush=True) + try: + server.serve_forever() + except KeyboardInterrupt: + pass + + +if __name__ == '__main__': + main() -- 2.54.0