diff --git a/adb-server/adbserver-desktop/src/main/java/com/kaspersky/adbserver/desktop/AdbCommandPerformer.kt b/adb-server/adbserver-desktop/src/main/java/com/kaspersky/adbserver/desktop/AdbCommandPerformer.kt index fb017ae75..e9767b75f 100644 --- a/adb-server/adbserver-desktop/src/main/java/com/kaspersky/adbserver/desktop/AdbCommandPerformer.kt +++ b/adb-server/adbserver-desktop/src/main/java/com/kaspersky/adbserver/desktop/AdbCommandPerformer.kt @@ -4,10 +4,10 @@ import com.kaspersky.adbserver.common.api.CommandResult import java.nio.file.Path /** - * @param adbPath - path to adb binary if null when used "adb" command + * @param adbPath - path to adb binary */ class AdbCommandPerformer( - private val adbPath: Path?, + private val adbPath: Path, private val cmdCommandPerformer: CmdCommandPerformer, ) { @@ -16,7 +16,6 @@ class AdbCommandPerformer( * @param command - adb command without path to adb binaries */ fun perform(command: String): CommandResult { - val adbPath = adbPath?.toString() ?: "adb" return cmdCommandPerformer.perform("$adbPath $command") } } diff --git a/adb-server/adbserver-desktop/src/main/java/com/kaspersky/adbserver/desktop/Main.kt b/adb-server/adbserver-desktop/src/main/java/com/kaspersky/adbserver/desktop/Main.kt index 7072a9994..c41c9b87c 100644 --- a/adb-server/adbserver-desktop/src/main/java/com/kaspersky/adbserver/desktop/Main.kt +++ b/adb-server/adbserver-desktop/src/main/java/com/kaspersky/adbserver/desktop/Main.kt @@ -6,10 +6,13 @@ import kotlinx.cli.ArgParser import kotlinx.cli.ArgType import kotlinx.cli.default import kotlinx.cli.delimiter +import java.io.File import java.lang.management.ManagementFactory import java.nio.file.Path +import kotlin.system.exitProcess private const val DESKTOP = "Desktop-" +private const val ERROR_EXIT_CODE = -1 internal fun main(args: Array) { val parser = ArgParser("Adb Server") @@ -35,7 +38,7 @@ internal fun main(args: Array) { description = "Logs Level" ).default(LogLevel.INFO) - val adbPath by parser.option( + val adbPathFromArguments by parser.option( type = ArgType.String, fullName = "adbPath", description = "Path to adb binary, if not set when use 'adb' from process environment" @@ -46,10 +49,17 @@ internal fun main(args: Array) { val desktopName = getDesktopName() val desktopLogger = LoggerFactory.getDesktopLogger(logLevel, desktopName) - desktopLogger.i("Desktop started with arguments: emulators=$emulators, adbServerPort=$port") + val adbPath = adbPathFromArguments?.let { Path.of(it) } ?: findAdbAtPath() + + if (adbPath == null) { + desktopLogger.e("Adb path not passed via arguments. Adb not found at path variable. Aborting...") + exitProcess(ERROR_EXIT_CODE) + } + + desktopLogger.i("Desktop started with arguments: emulators=$emulators, adbServerPort=$port, adbPath=$adbPath") val cmdCommandPerformer = CmdCommandPerformer(desktopName) - val adbCommandPerformer = AdbCommandPerformer(adbPath?.let { Path.of(it) }, cmdCommandPerformer) + val adbCommandPerformer = AdbCommandPerformer(adbPath, cmdCommandPerformer) val desktop = Desktop( cmdCommandPerformer = cmdCommandPerformer, adbCommandPerformer = adbCommandPerformer, @@ -65,3 +75,15 @@ private fun getDesktopName(): String { val pid = processName.split("@".toRegex()).toTypedArray()[0].toLong() return DESKTOP + pid } + +/** + * Search for adb executable at environment PATH variable + */ +private fun findAdbAtPath(): Path? { + return System.getenv("PATH") + .split(":") + .asSequence() + .map { File(it) } + .flatMap { it.listFiles()?.toList() ?: emptyList() } + .firstOrNull { it.nameWithoutExtension == "adb" }?.toPath() +} diff --git a/kaspresso-plugin/src/main/kotlin/com/kaspersky/kaspresso/plugin/DesktopServerHolder.kt b/kaspresso-plugin/src/main/kotlin/com/kaspersky/kaspresso/plugin/DesktopServerHolder.kt index e9a3cc85d..03d002cd3 100644 --- a/kaspresso-plugin/src/main/kotlin/com/kaspersky/kaspresso/plugin/DesktopServerHolder.kt +++ b/kaspresso-plugin/src/main/kotlin/com/kaspersky/kaspresso/plugin/DesktopServerHolder.kt @@ -18,6 +18,9 @@ internal class DesktopServerHolder(private val logger: Logger) { @Synchronized fun start(workingDirectory: Path, adbPath: Path) { check(desktop == null) { "Desktop already started" } + + logger.debug("Starting Desktop server. workingDir=$workingDirectory, adbPath=$adbPath") + val cmdCommandPerformer = CmdCommandPerformer(DESKTOP_NAME, workingDirectory) val adbCommandPerformer = AdbCommandPerformer(adbPath, cmdCommandPerformer) val logger = LoggerFactory.getDesktopLogger(LogLevel.VERBOSE, DESKTOP_NAME, GradleFullLogger(logger))