Files
view-mate/TESTING.md
T
Hermes Agent 6069400b88 feat(app-phone): полноценный UI телефона — каталог Jellyfin, детали, пульт очков, реальное скачивание с S3
- 4 экрана по макету sketches/phone-ui: Каталог (табы Фильмы/Сериалы/Папки, поиск, бейджи зеркала), Детали (озвучки, статус конвертации, чипы скачивания), Очки (пульт, статус), Чат-заглушка
- S3 SigV4 presign (S3Presigner): mirror-client read-only креды; watch() и DownloadManager подписывают URL (бакет приватный)
- DownloadManager: реальное скачивание video+audio с прогрессом, readTimeout=0 (длинные файлы)
- PhoneActions.watch: параметр presign (app-host работает без изменений)
- TESTING.md: блок телефонных кейсов TP-1..6
2026-08-19 09:13:56 +03:00

274 lines
14 KiB
Markdown
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.
# TESTING.md — view-mate, app-glasses (очки RayNeo X2)
Тест-план для стенда (88.19): AVD `glasses35` (emulator-5554, 1280×480), app-host на :8080
(консоль FIFO `/tmp/host.in`, лог `/tmp/host.log`), http.server :8081 с `test-video.mp4`,
APK `pw.binom.viewmate.glasses` установлен.
Кейсы написаны человеческим языком, без координат. Координаты/точные значения агент
добывает сам (скрины, logcat, uiautomator). «Консоль хоста» = FIFO `/tmp/host.in`
(команды: `play <url>`, `mode <MODE>`, `cmd <CMD> [ms]`, `catalog`, `watch`, `mirror`).
## Общие предусловия
- Стенд поднят: app-host слушает :8080, http.server :8081, AVD загружен
- Приложение очков установлено (последняя сборка) и запущено
- Logcat очищен перед кейсом (`adb logcat -c`)
---
## TC-01 Подключение очков к серверу
**Предусловия:** app-host запущен и слушает :8080.
**Шаги:**
1. Запусти приложение очков (launch `pw.binom.viewmate.glasses/.MainActivity`)
2. Подожди 5–10 секунд
3. Посмотри на экран очков (скрин)
4. Загляни в лог приложения (logcat) и в лог хоста
**Ожидаемо:**
- На экране статус «подключено к телефону» (ConnectionScreen, без системных панелей)
- В logcat: «соединение установлено», «Welcome: режим MOVIE...»
- В `/tmp/host.log` приходят периодические `glasses статус: батарея 80%...`
- Крашей и ошибок нет
---
## TC-02 Воспроизведение тестового видео (play по прямому URL)
**Предусловия:** TC-01 пройден.
**Шаги:**
1. Через консоль хоста пошли: `play http://10.0.2.2:8081/test-video.mp4`
2. Подожди 5–10 секунд
3. Сними скрин экрана очков
4. Проверь logcat и лог хоста
**Ожидаемо:**
- В обеих половинах экрана (левой и правой) — **одинаковое** видеоизображение
(движущийся тестовый паттерн: цветные полосы, сетка)
- В logcat: «получено видео», «SimpleExoPlayer создан», «EglVideoRenderer: GL-стэйт создан»
- Крашей нет; процесс жив
---
## TC-03 Воспроизведение видео из живого Jellyfin
**Предусловия:** TC-01 пройден. Живой стрим-URL (например, фильм «Акира»:
`https://jellyfin.binom.pw/Videos/a3ca9fbf926fe9f60448f591ea945ac8/stream?static=true&MediaSourceId=a3ca9fbf926fe9f60448f591ea945ac8&api_key=59e6380a96a94364ae25d2b7cf9f1359`).
**Шаги:**
1. Через консоль хоста пошли: `play <jellyfin-url>`
2. Подожди 10–15 секунд (стрим с сетевой задержкой)
3. Сними скрин экрана очков
4. Проверь logcat: ошибок загрузки быть не должно (если была ошибка — проверь, что приложение не упало)
**Ожидаемо:**
- На экране кадр фильма (не чёрный экран), одинаковый в обеих половинах
- Приложение живо, крашей нет
- В логе хоста позиция растёт
---
## TC-04 Полноэкранный режим (без системных панелей)
**Предусловия:** приложение запущено (любой экран: статус или кино).
**Шаги:**
1. Посмотри на экран очков (скрин) — и на статус-экране, и во время кино
2. Убедись, что сверху нет системной панели (часы, зарядка, иконки)
3. Убедись, что снизу нет навигационной панели
**Ожидаемо:**
- Системные панели скрыты: приложение занимает весь экран 1280×480
- Даже после паузы/воспроизведения панели не появляются сами
- ⚠️ При первом входе в иммерсивный режим система может показать разовый оверлей
«Viewing full screen / To exit, swipe down... [Got it]» — это НЕ баг приложения,
это системная подсказка. Нажми «Got it» (или свайпни) и проверь, что панели скрыты.
---
## TC-05 Пауза и продолжение (media PAUSE / PLAY)
**Предусловия:** TC-02 пройден (видео играет).
**Шаги:**
1. Через консоль хоста пошли: `cmd PAUSE`
2. Подожди 3–5 секунд
3. Проверь лог хоста (позиция) и сними скрин
4. Через консоль пошли: `cmd PLAY`
5. Подожди 3–5 секунд, снова проверь лог хоста
**Ожидаемо:**
- После PAUSE: в логе хоста `позиция: N мс, пауза` (playing=false), позиция не растёт
- После PLAY: позиция снова растёт (playing=true)
- Кадр на экране не меняется на паузе (стоп-кадр)
---
## TC-06 Перемотка вперёд (media SEEK_FWD)
**Предусловия:** TC-02 пройден.
**Шаги:**
1. Запомни текущую позицию из лога хоста
2. Через консоль пошли: `cmd SEEK_FORWARD 10000`
3. Подожди 3–5 секунд
4. Проверь позицию в логе хоста
**Ожидаемо:**
- Позиция выросла примерно на 10 секунд относительно запомненной
- Видео продолжает играть, крашей нет
---
## TC-07 Закрытие фильма (media CLOSE)
**Предусловия:** TC-02 пройден.
**Шаги:**
1. Через консоль пошли: `cmd CLOSE`
2. Подожди 3–5 секунд
3. Посмотри на экран очков (скрин)
4. Проверь лог хоста (позиция)
**Ожидаемо:**
- Экран вернулся на статус-экран (ConnectionScreen)
- Позиция сброшена (0 мс / нет плеера)
- В logcat: «CLOSE: плеер остановлен и освобождён» (или эквивалент)
- Приложение живо
---
## TC-08 Ошибка загрузки (битый URL) — приложение не падает
**Предусловия:** TC-01 пройден.
**Шаги:**
1. Через консоль хоста пошли: `play http://10.0.2.2:8081/nonexistent.mp4`
2. Подожди 10–15 секунд
3. Проверь logcat и живость процесса
4. Сними скрин
**Ожидаемо:**
- В logcat ошибка загрузки (ExoPlaybackException / 404), НО:
- Приложение живо (pid существует), краша нет
- Экран не «завис» — можно вернуться в рабочее состояние командой `play <валидный url>`
---
## TC-09 Реконнект при обрыве связи
**Предусловия:** TC-01 пройден.
**Шаги:**
1. Останови app-host (убить процесс) — очки потеряют сервер
2. Подожди 10–15 секунд
3. Проверь logcat (сообщение о разрыве/реконнекте)
4. Запусти app-host заново
5. Подожди 10–15 секунд
6. Проверь logcat и экран
**Ожидаемо:**
- При обрыве: в logcat сообщение о потере соединения, приложение живо
- После подъёма хоста: «соединение установлено» снова, Welcome получен
- Повторный `play` работает
---
## TC-10 Статус очков уходит на хост
**Предусловия:** TC-01 пройден, видео играет.
**Шаги:**
1. Подожди 10–15 секунд
2. Загляни в `/tmp/host.log`
**Ожидаемо:**
- В логе периодически (раз в ~5 секунд): `glasses статус: батарея 80%, память 10.5/32.0 ГБ`
- И `glasses позиция: NNN мс, играет/пауза` с реально растущей позицией во время воспроизведения
---
## TC-11 Конвертация зеркала (media-mirror конвейер)
**Предусловия:** TC-01 пройден. Стенд достаёт `mirror.binom.pw` (проверено 19.08: отвечает 404 на корне = жив).
**Шаги:**
1. Через консоль хоста пошли: `open a3ca9fbf926fe9f60448f591ea945ac8` (фильм «Акира») — посмотри текущий статус зеркала
2. Через консоль пошли: `mirror a3ca9fbf926fe9f60448f591ea945ac8`
3. Подожди 30–60 секунд
4. Через консоль пошли: `mirror-status a3ca9fbf926fe9f60448f591ea945ac8`
5. Повторяй шаг 4 раз в 30–60 секунд, пока статус не станет `done` (может занять до 10–15 минут — это NVENC-транскодинг на сервере)
**Ожидаемо:**
- `mirror` вернул id джоба и статус (created/queued/processing)
- `mirror-status` показывает прогресс: queued → processing → done
- По завершении: статус `done` и ссылка на готовое зеркало (480p H.264)
---
## TC-12 Скачивание на устройство (эмуляция) и удаление
**Предусловия:** TC-01 пройден.
**Шаги:**
1. Через консоль хоста пошли: `dl a3ca9fbf926fe9f60448f591ea945ac8 телефон`
2. Через консоль пошли: `status` — найди в выводе отметку о скачанном
3. Через консоль пошли: `dl a3ca9fbf926fe9f60448f591ea945ac8 очки`
4. Через консоль пошли: `status` — проверь, что отметка изменилась (очки)
5. Через консоль пошли: `rm a3ca9fbf926fe9f60448f591ea945ac8`
6. Через консоль пошли: `status` — проверь, что скачанное удалено
**Ожидаемо:**
- `dl` отвечает «скачано … → телефон (эмуляция, отмечено в стейте)»
- `status` показывает скачанное с целевым устройством
- `rm` удаляет отметку, `status` больше её не показывает
- Ошибок и крашей нет
---
## TC-13 Воспроизведение зеркала (watch, после done)
**Предусловия:** TC-11 пройден (зеркало `done`), TC-01 пройден.
**Шаги:**
1. Через консоль хоста пошли: `watch a3ca9fbf926fe9f60448f591ea945ac8`
2. Подожди 10–15 секунд
3. Сними скрин экрана очков
4. Проверь лог хоста (позиция растёт)
**Ожидаемо:**
- `watch` отвечает «включил «Акира» на очках (озвучка #0): <url зеркала>»
- На экране кадр фильма (из зеркала 480p), одинаковый в обеих половинах
- Позиция растёт, крашей нет
---
# Телефон (app-phone) — тест-кейсы
Стенд: телефон = emulator-5556 (AVD test35, 1080x2400, app pw.binom.viewmate.phone), очки = emulator-5554 (glasses35), связь: adb forward tcp:8080 (хост → телефон), очки ходят на ws://10.0.2.2:8080/ws/glasses. app-host на стенде остановлен.
## TP-1 Каталог
- Вкладки Фильмы/Сериалы/Папки, сетка карточек (постер + название + бейдж зеркала: ✓/⟳%/нет/↓часть), нижняя навигация Каталог/Очки/Чат. Переключение вкладок работает.
- ПРОЙДЕН (QA 19.08: P1)
## TP-2 Поиск
- Ввод «акира» → найден фильм «Акира». Кириллица через ADBKeyboard (input text кириллицу не принимает).
- ПРОЙДЕН (QA: P2)
## TP-3 Детали
- Клик по карточке: постер, название, статус конвертации (нет/processing %/done/failed+перезаказ), секция озвучки (если done — дорожки radio), 4 чипа скачивания (очки-видео/звук, телефон-видео/звук), кнопки «Смотреть на очках», «Скачать на телефон», «Удалить скачанное».
- ПРОЙДЕН частично (QA: P3 — до done зеркала; скачивание — после done)
## TP-4 Пульт (экран Очки)
- Карточка: связь (подключено), батарея, память, «сейчас на очках» + позиция. Пульт: −30с/+30с/Плей/Пауза/режимы. Команды доходят до очков (лог очков MediaCommand).
- ПРОЙДЕН (QA: P4; замечание: PLAY на «зависшей» старой сессии не возобновляет — перепроверить на свежей после watch)
## TP-5 Чат
- Заглушка «в разработке (следующий этап)».
- ПРОЙДЕН (QA: P5)
## TP-6 Скачивание на телефон (реальное)
- Зеркало done → детали → «Скачать на телефон»: прогресс %, файлы video.mkv + audio-{i}.ogg в filesDir, чипы «скачано». Удаление через «Удалить скачанное».