320 lines
21 KiB
Markdown
320 lines
21 KiB
Markdown
# 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
|