Обнаружение устройств в Tradefed

При подключении нового устройства запускается серия асинхронных событий, которые не очевидны, но их стоит понимать.

Физическое подключение

Tradefed использует библиотеку ddmlib (библиотека Java adb) для обеспечения базового взаимодействия с adb и устройствами. Частью этого решения является интерфейс IDeviceChangeListener, который позволяет получать события новых устройств, например:

  • deviceConnected: когда adb обнаруживает новое устройство.
  • deviceDisconnected: когда устройство больше не отправляет данные в adb.
  • deviceChanged – когда происходит важное событие, связанное с устройством (например, оно переходит в режим офлайн или онлайн).

На уровне adb этих событий достаточно, чтобы определить, подключено ли устройство к интернету. Однако для тестовой платформы требуется более надежное состояние, чтобы устройство было действительно готово к запуску тестов. Оно не должно зависеть от возможных нестабильных состояний, которые могут возникнуть при подключении нового устройства.

Вот последовательность событий в Tradefed:

  1. Устройство распознано как deviceConnected и готово к обычным событиям от adb.
  2. Создается внутреннее событие Tradefed, которое:

    • Проверьте, известно ли уже устройство. Tradefed сохраняет внутренние ссылки на некоторые устройства (особенно на те, которые в настоящее время выделены и на которых выполняются тесты), чтобы TF не терял их случайным образом.
    • Проверьте, является ли устройство ONLINE или OFFLINE.
  3. Если устройство:

    • OFFLINE: устройство будет переведено в состояние Tradefed CONNECTED_OFFLINE, в котором пока нельзя запускать тесты. Если устройство позже подключится к интернету, оно пройдет цикл ONLINE. Если мы получим событие deviceDisconnect, устройство будет просто удалено из списка.

    • ONLINE (как видно в adb): устройство будет переведено в состояние CONNECTED_ONLINE, и будет проверена его доступность для распределения тестов: checking_availability.

  4. Если проверка availability будет пройдена, устройство будет отмечено как доступное для тестирования и сможет выполнять тесты. В противном случае устройство будет помечено как unavailable для распределения и не сможет получать тесты.

Все эти состояния отражаются в консоли Tradefed при выводе списка устройств с помощью команды tf> list devices.

Важно отметить, что если устройство в данный момент выделено для тестирования, большинство описанных выше действий не произойдет, а Tradefed определит состояние устройства самостоятельно. Поэтому устройство может исчезнуть из adb devices, но при этом остаться в списке Tradefed. Это может произойти, например, когда тест перезагружает устройство.

Виртуальное устройство, подключенное с помощью adb connect

Когда создается удаленное виртуальное устройство, Tradefed подключается к нему с помощью adb connect. Обычно после этого устройство отображается в adb devices как <some ip>:<port number> и проходит ту же последовательность действий, что и физически подключенные устройства.

Отслеживание устройства при возникновении события deviceConnected

Когда происходит событие deviceConnected, ddmlib создает новую ссылку на IDevice, чтобы отслеживать подключенное устройство.

Tradefed использует эту ссылку и добавляет ее в собственную реализацию интерфейса устройства ITestDevice, чтобы предоставлять более продвинутые сервисы. но базовый IDevice всегда поступает от ddmlib.

Это означает, что при подключении нового устройства создается новый объект ITestDevice, связанный с IDevice. Если это происходит во время вызова и используется ITestDevice, базовый IDevice все равно заменяется, чтобы тестирование можно было продолжить с правильной ссылкой. Это происходит каждый раз, когда устройство отключается или подключается (например, во время перезагрузки).