Files
2026-08-19 23:38:54 +03:00

320 lines
21 KiB
Markdown
Raw Permalink 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, чипы «скачано». Удаление через «Удалить скачанное».
- ПРОЙДЕН частично (QA: F3 — скачано 1.86 ГБ, хэш совпал, чипы; **удаление файлов кнопкой — НЕ тестировалось**)
## TP-7 Персистентный статус + докачка (19.08)
- Переустановка APK → файлы с диска видны («✓ скачано на телефон», чипы «✓ скачано»), повторная качка невозможна.
- ПРОЙДЕН (QA: PERSIST + дамп после FIX)
- Resume «Продолжить (N%)» из .part — **НЕ тестировалось** (нет .part на стенде)
## TP-8 Звук с синхронизацией (19.08)
- watch → очки играют видео, телефон играет аудио; лог «audio sync: video=N audio=M diff=K», K<1000.
- A1 воспроизведение: ПРОЙДЕН (лог: K=327–358 мс, позиции растут)
- A2 пауза/плей (звук следует): ПРОЙДЕН (пауза — обе замерли, diff=162; плей — рост, diff=162–166)
- A3 ±30с (звук прыгает синхронно): ПРОЙДЕН (+30с: K=928–945; −30с: всплеск 2440 на переходе, стабилизация 172–397)
- ⚠️ Замечание QA: периодически аудио-плеер пересоздаётся без действий пользователя («state озвучка → #N», «audio плеер освобождён») — всплески diff до ~5000 мс, сходится за 10–15с. Причину проверить.
- A4 смена озвучки во время просмотра: **не гонялось**
- A5 CLOSE → звук остановлен: **не гонялось**
- Слуховая сверка с оригиналом — на реальном железе (эталон: /tmp/akira-original.mkv на 88.19)
## Не покрыто (пробелы)
- Удаление скачанного (реальное удаление файлов): ✅ ПРОЙДЕН (OFF3-2, шаг 7 — оба устройства пусты, скачано: 0)
- Автоматика: обрыв связи → пауза видео+звук; восстановление → продолжить (README «Автоматика»)
- Resume из .part («Продолжить (N%)»)
- Бейдж каталога «✓» после фикса приоритета (формально не подтверждён)
- Все кейсы на реальном железе RayNeo X2 (стенд — только эмуляторы)
## Офлайн-контент (этап «очки качают в память», 19.08)
- OFF2: качка на очки — ВСЕ 5 файлов в память очков (медиа 2.44 ГБ, скачано: 1), прогресс в UI (загрузка на очки N%), краш bytesToSize исправлен, кнопка «Смотреть» активна только при полном контенте на очках — ✅ ПРОЙДЕН
- OFF3-2: видео на очках — локальный file:// (позиция растёт ровно 5000мс/5с); пауза/плей/+30с — синхронно (позиции замерли/прыгнули); экран «Информация об очках» (модель RayNeo X2, батарея 100%, диск 3.82/1.98 ГБ, медиа 2.44 ГБ, версия 0.1.0); удаление — с обоих устройств — ✅ ПРОЙДЕН (7/7)
- ⚠️ Дефект A: звук при watch не запускается — ✅ ИСПРАВЛЕН и подтверждён (OFF5: audio sync diff 21–316 мс, «звук: N мс» растёт)
- ⚠️ Дефект B: самовозобновление качки после «Удалить скачанное» — ✅ ИСПРАВЛЕН (поколения; OFF5: 60с после удаления — качки нет)
- ✅ OFF5 5/5: качка на очки 0→2.6 ГБ (S3 ожил после IO-шторма Server3), звук синхронен, пауза/плей/+30с, удаление без воскрешения
- OFF6-3: resume качки из .part ✅ (2%→100%, не с 0%); A4 смена озвучки во время просмотра ✅ (state озвучка → #2, diff<1000); A5 CLOSE ❌ — кнопки «Закрыть» в пульте НЕТ (README обещает — реализуется); обрыв связи: WS рвётся (Ping timeout, reconnect, ресинк diff 210–228) ✅, но пауза при обрыве НЕ реализована (видео играет дальше — README «Автоматика» — реализуется)
- ✅ OFF7 3/3: кнопка «⏹ Закрыть» в пульте (стоп: плеер освобождён, sync стоп, кнопка снова активна); автоматика обрыва: разрыв → пауза видео+звук (позиция замерла), восстановление → «продолжаю» с того же места, ресинк diff 179–432 (<1000). Замечание: пауза звука — по факту таймаута (до ~25с), транзиентный рассинхрон до 23с при восстановлении — само лечится за ~5с
- Косметика (не блокер): после удаления UI держит остаточные чипы до перерисовки
- ⚠️ Примечание: лог очков в logcat забивается EGL-спамом (System.out вытесняется за секунды) — надёжный канал телеметрии — logcat ТЕЛЕФОНА
## OFF8. Гашение экрана очков (железо 19.08) ✅
- Просмотр → погасить экран очков: видео пауза мгновенно, звук ≤5-6с (watchdog)
- Включить: продолжение с места паузы (не начало, не «набежавшая» позиция),
звук синхронно (diff < 1000)
- Seek на середину → гашение → включение: позиция сохраняется (trusted markPosition)
## OFF9. Жесты на очках (железо 19.08) ✅
- Клик по трекпаду — пауза/плей (звук следует)
- Свайп вперёд/назад — перемотка ±30с, звук перескакивает сразу (не паузится)
- Системных щелчков касания трекпада нет (toggleSoundEffect + перехват)
- SDK: RayNeoARSDK V0.1.3 (aar libs/), BaseEventActivity