diff --git a/configuration/src/main/kotlin/com/malinskiy/marathon/config/vendor/android/ThreadingConfiguration.kt b/configuration/src/main/kotlin/com/malinskiy/marathon/config/vendor/android/ThreadingConfiguration.kt index 25ecac870..152a9421e 100644 --- a/configuration/src/main/kotlin/com/malinskiy/marathon/config/vendor/android/ThreadingConfiguration.kt +++ b/configuration/src/main/kotlin/com/malinskiy/marathon/config/vendor/android/ThreadingConfiguration.kt @@ -2,5 +2,6 @@ package com.malinskiy.marathon.config.vendor.android data class ThreadingConfiguration( val bootWaitingThreads: Int = 4, - val adbIoThreads: Int = 4 + val adbIoThreads: Int = 4, + val installThreads: Int = 8, ) diff --git a/vendor/vendor-android/src/main/kotlin/com/malinskiy/marathon/android/adam/AdamAndroidDevice.kt b/vendor/vendor-android/src/main/kotlin/com/malinskiy/marathon/android/adam/AdamAndroidDevice.kt index dc94ef6d0..414dda53b 100644 --- a/vendor/vendor-android/src/main/kotlin/com/malinskiy/marathon/android/adam/AdamAndroidDevice.kt +++ b/vendor/vendor-android/src/main/kotlin/com/malinskiy/marathon/android/adam/AdamAndroidDevice.kt @@ -72,6 +72,7 @@ import java.awt.image.BufferedImage import java.io.File import java.time.Duration import java.util.concurrent.CopyOnWriteArrayList +import kotlin.coroutines.CoroutineContext import com.malinskiy.marathon.android.model.ShellCommandResult as MarathonShellCommandResult class AdamAndroidDevice( @@ -79,6 +80,7 @@ class AdamAndroidDevice( private val deviceStateTracker: DeviceStateTracker, private val logcatManager: LogcatManager, private val testBundleIdentifier: AndroidTestBundleIdentifier, + private val installContext: CoroutineContext, adbSerial: String, configuration: Configuration, androidConfiguration: VendorConfiguration.AndroidConfiguration, @@ -199,7 +201,7 @@ class AdamAndroidDevice( try { measureFileTransfer(File(localFilePath)) { val channel = client.execute( - CompatPushFileRequest(file, remoteFilePath, supportedFeatures, coroutineScope = this), + CompatPushFileRequest(file, remoteFilePath, supportedFeatures, coroutineScope = this, mode = "0777", coroutineContext = installContext), serial = adbSerial ) for (update in channel) { diff --git a/vendor/vendor-android/src/main/kotlin/com/malinskiy/marathon/android/adam/AdamDeviceProvider.kt b/vendor/vendor-android/src/main/kotlin/com/malinskiy/marathon/android/adam/AdamDeviceProvider.kt index 1ad0ddf6e..5c7cda2bd 100644 --- a/vendor/vendor-android/src/main/kotlin/com/malinskiy/marathon/android/adam/AdamDeviceProvider.kt +++ b/vendor/vendor-android/src/main/kotlin/com/malinskiy/marathon/android/adam/AdamDeviceProvider.kt @@ -19,6 +19,7 @@ import com.malinskiy.marathon.exceptions.NoDevicesException import com.malinskiy.marathon.log.MarathonLogging import com.malinskiy.marathon.time.Timer import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.cancel @@ -53,6 +54,7 @@ class AdamDeviceProvider( private val channel: Channel = unboundedChannel() private val dispatcher = newFixedThreadPoolContext(1, "DeviceMonitor") + private val installDispatcher = Dispatchers.IO.limitedParallelism(vendorConfiguration.threadingConfiguration.installThreads) override val coroutineContext = dispatcher + newCoroutineExceptionHandler(logger) private val setupSupervisor = SupervisorJob() @@ -142,6 +144,7 @@ class AdamDeviceProvider( multiServerDeviceStateTracker.getTracker(client), logcatManager, testBundleIdentifier, + installDispatcher, serial, configuration, vendorConfiguration, diff --git a/vendor/vendor-android/src/test/kotlin/com/malinskiy/marathon/android/adam/TestDeviceFactory.kt b/vendor/vendor-android/src/test/kotlin/com/malinskiy/marathon/android/adam/TestDeviceFactory.kt index cae0327c2..02203f35e 100644 --- a/vendor/vendor-android/src/test/kotlin/com/malinskiy/marathon/android/adam/TestDeviceFactory.kt +++ b/vendor/vendor-android/src/test/kotlin/com/malinskiy/marathon/android/adam/TestDeviceFactory.kt @@ -8,6 +8,7 @@ import com.malinskiy.marathon.config.Configuration import com.malinskiy.marathon.config.vendor.VendorConfiguration import com.malinskiy.marathon.config.vendor.android.SerialStrategy import com.malinskiy.marathon.time.SystemTimer +import kotlinx.coroutines.Dispatchers import java.time.Clock object TestDeviceFactory { @@ -17,6 +18,7 @@ object TestDeviceFactory { deviceStateTracker = DeviceStateTracker(), logcatManager = logcatManager, AndroidTestBundleIdentifier(), + Dispatchers.IO, "emulator-5554", configuration, configuration.vendorConfiguration as VendorConfiguration.AndroidConfiguration,