Nowe połączenie urządzenia powoduje serię zdarzeń asynchronicznych, które nie są oczywiste, ale warto je poznać.
Fizyczne połączenie
Tradefed używa biblioteki ddmlib
(biblioteki Java adb
) do zapewnienia podstawowej interakcji z urządzeniami i usługą adb
. Częścią tego rozwiązania jest interfejs IDeviceChangeListener, który umożliwia odbieranie nowych zdarzeń dotyczących urządzenia, takich jak:
deviceConnected
: gdyadb
wykryje nowe urządzeniedeviceDisconnected
: gdy urządzenie przestaje raportować doadb
deviceChanged
: gdy nastąpi zmiana stanu urządzenia (np. urządzenie offline lub online).
Te zdarzenia na poziomie adb
wystarczają do określenia, czy urządzenie jest połączone, online czy offline. W przypadku testów potrzebujemy jednak bardziej szczegółowego stanu, aby mieć pewność, że urządzenie jest gotowe do rozpoczęcia testów. Nie może ono być podatne na potencjalne problemy ze stanem, które mogą wystąpić w przypadku nowo podłączonego urządzenia.
Oto sekwencja zdarzeń w ramach Tradefed:
- Urządzenie jest rozpoznawane jako
deviceConnected
i otwarte na zwykłe zdarzenia zadb
Zostanie utworzone wewnętrzne zdarzenie Tradefed, które:
- Sprawdź, czy urządzenie jest już znane. Tradefed zachowuje wewnętrzne odniesienie do niektórych urządzeń (zwłaszcza tego, które jest obecnie przydzielone i trwa testy), aby zapobiec przypadkowej utracie ich przez TF.
- Sprawdź, czy urządzenie jest
ONLINE
czyOFFLINE
.
Jeśli urządzenie:
OFFLINE
: urządzenie zostanie przełączone na stanCONNECTED_OFFLINE
Tradefed, co nie umożliwia jeszcze na nim przeprowadzania testów. Jeśli urządzenie będzie później online, przejdzie cyklONLINE
. Jeśli otrzymamy zdarzeniedeviceDisconnect
, urządzenie zostanie po prostu usunięte z listy.ONLINE
(z perspektywy adb): urządzenie zostanie przełączone do stanuCONNECTED_ONLINE
i jego dostępność zostanie sprawdzona na potrzeby testowej alokacji:checking_availability
.
Jeśli kontrola
availability
zakończy się powodzeniem, urządzenie zostanie oznaczone jako dostępne do przydziału testów i będzie mogło przeprowadzać testy. W przeciwnym razie urządzenie zostanie oznaczone jakounavailable
i nie będzie mogło otrzymywać testów.
Wszystkie te stany są odzwierciedlane w konsoli Tradefed podczas wyświetlania urządzeń za pomocą: tf> list devices
Pamiętaj, że gdy urządzenie jest obecnie przypisane do testu, większość z tych czynności nie będzie wykonywana, a Tradefed określi stan urządzenia wewnętrznie. Możliwe więc, że urządzenie zniknie z adb devices
, wciąż będzie widoczne na liście Tradefed. Może się tak zdarzyć, gdy test powoduje ponowne uruchomienie urządzenia.
Urządzenie wirtualne połączone za pomocą adb Connect
Po utworzeniu zdalnego urządzenia wirtualnego Tradefed łączy się z nim za pomocą adb
connect
. Zwykle spowoduje to wyświetlenie urządzenia w sekcji adb devices
jako <some ip>:<port number>
. Następnie nastąpi ta sama sekwencja jak w przypadku urządzeń fizycznie połączonych.
Śledzenie urządzenia po wystąpieniu zdarzenia deviceConnected
Gdy wystąpi deviceConnected
, ddmlib
utworzy nowe odwołanie IDevice, aby śledzić nowo podłączone urządzenie.
Tradefed używa tego odwołania i opakowuje je w ramach własnej implementacji interfejsu urządzenia ITestDevice, aby zapewnić bardziej zaawansowaną obsługę. Jednak podstawowa karta IDevice jest zawsze ta pochodząca z ddmlib
.
Oznacza to, że jeśli nowe urządzenie zostanie połączone, zostanie utworzone nowe ITestDevice i powiązane z IDevice. Gdy dzieje się tak podczas wywołania i użytkownik korzysta z ITestDevice, podrzędny IDevice jest nadal zastępowany, aby umożliwić przeprowadzenie testów na odpowiednim urządzeniu referencyjnym. Jest to wykonywane automatycznie za każdym razem, gdy urządzenie jest odłączane i ponownie łączone (np. podczas restartu).