diff --git a/dadb/src/main/kotlin/dadb/adbserver/AdbServer.kt b/dadb/src/main/kotlin/dadb/adbserver/AdbServer.kt index a481f13..36ea342 100644 --- a/dadb/src/main/kotlin/dadb/adbserver/AdbServer.kt +++ b/dadb/src/main/kotlin/dadb/adbserver/AdbServer.kt @@ -72,17 +72,29 @@ object AdbServer { send(socket, "host:devices") readString(DataInputStream(socket.getInputStream())) } - return output.lines() - .filter { it.isNotBlank() } - .mapNotNull { - val parts = it.split("\t") - if (parts.size != 2) { + return connectOnlineDevices(output) { serial -> + createDadb(adbServerHost, adbServerPort, "host:transport:$serial") + } + } + + internal fun connectOnlineDevices( + output: String, + connect: (String) -> T, + ): List { + return output.lineSequence() + .mapNotNull { line -> + val parts = line.split("\t", limit = 2) + if (parts.size != 2 || parts[1] != "device") { + return@mapNotNull null + } + + try { + connect(parts[0]) + } catch (_: IOException) { null - } else { - parts[0] } } - .map { createDadb(adbServerHost, adbServerPort, "host:transport:${it}") } + .toList() } internal fun readString(inputStream: DataInputStream): String { diff --git a/dadb/src/test/kotlin/dadb/adbserver/AdbServerDeviceListTest.kt b/dadb/src/test/kotlin/dadb/adbserver/AdbServerDeviceListTest.kt new file mode 100644 index 0000000..0079713 --- /dev/null +++ b/dadb/src/test/kotlin/dadb/adbserver/AdbServerDeviceListTest.kt @@ -0,0 +1,39 @@ +package dadb.adbserver + +import com.google.common.truth.Truth.assertThat +import java.io.IOException +import kotlin.test.Test + +internal class AdbServerDeviceListTest { + + @Test + fun mixedStatesOnlyConnectOnlineDevices() { + val output = """ + healthy-serial device + unauthorized-serial unauthorized + offline-serial offline + """.trimIndent() + + val devices = AdbServer.connectOnlineDevices(output) { it } + + assertThat(devices).containsExactly("healthy-serial") + } + + @Test + fun oneConnectionFailureDoesNotHideOtherOnlineDevices() { + val output = """ + healthy-1 device + raced-offline device + healthy-2 device + """.trimIndent() + + val devices = AdbServer.connectOnlineDevices(output) { serial -> + if (serial == "raced-offline") { + throw IOException("transport changed") + } + serial + } + + assertThat(devices).containsExactly("healthy-1", "healthy-2").inOrder() + } +}