summaryrefslogtreecommitdiff
path: root/android/testSrc
diff options
context:
space:
mode:
authorPolina Koval <kovalp@google.com>2022-03-03 10:20:01 +0000
committerTreeHugger Robot <treehugger-gerrit@google.com>2022-03-05 07:16:49 +0000
commita4bb560ea08a9b9a14117681283a31314e33dd46 (patch)
treefc67de70a973d4c9888b510441c04c7a6e549d38 /android/testSrc
parent9228cd610d9407a261107d68a4bcb894993563a1 (diff)
downloadidea-a4bb560ea08a9b9a14117681283a31314e33dd46.tar.gz
Start debugger for watch face and complications on a pooled thread.
Commands for complications and watch faces require attaching debugger in the middle of its execution, thus we start debugger and this command at the same time Bug: 222240529 Test: alter existing Change-Id: I0d77163615329689eb22aebc41f9db064a760c59
Diffstat (limited to 'android/testSrc')
-rw-r--r--android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidActivityConfigurationExecutorTest.kt11
-rw-r--r--android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidComplicationConfigurationExecutorTest.kt71
-rw-r--r--android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidComplicationRunConfigurationProducerTest.kt3
-rw-r--r--android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidConfigurationExecutorBaseTest.kt22
-rw-r--r--android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidTileConfigurationExecutorTest.kt27
-rw-r--r--android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidTileRunConfigurationProducerTest.kt3
-rw-r--r--android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidWatchFaceConfigurationExecutorTest.kt10
-rw-r--r--android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidWatchFaceRunConfigurationProducerTest.kt3
-rw-r--r--android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidWearRunLineMarkerContributorTest.kt5
-rw-r--r--android/testSrc/com/android/tools/idea/run/configuration/execution/RunnableClientService.kt1
10 files changed, 108 insertions, 48 deletions
diff --git a/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidActivityConfigurationExecutorTest.kt b/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidActivityConfigurationExecutorTest.kt
index 3cc36d1b8c5..c1928382d1c 100644
--- a/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidActivityConfigurationExecutorTest.kt
+++ b/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidActivityConfigurationExecutorTest.kt
@@ -26,8 +26,11 @@ import com.intellij.execution.RunManager
import com.intellij.execution.executors.DefaultDebugExecutor
import com.intellij.execution.executors.DefaultRunExecutor
import com.intellij.execution.runners.ExecutionEnvironment
+import org.junit.Test
import org.mockito.ArgumentCaptor
import org.mockito.Mockito
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
internal class AndroidActivityConfigurationExecutorTest : AndroidConfigurationExecutorBaseTest() {
private fun getExecutionEnvironment(executorInstance: Executor): ExecutionEnvironment {
@@ -38,6 +41,7 @@ internal class AndroidActivityConfigurationExecutorTest : AndroidConfigurationEx
return ExecutionEnvironment(executorInstance, AndroidConfigurationProgramRunner(), configSettings, project)
}
+ @Test
fun testRun() {
// Use DefaultRunExecutor, equivalent of pressing run button.
val env = getExecutionEnvironment(DefaultRunExecutor.getRunExecutorInstance())
@@ -69,6 +73,7 @@ internal class AndroidActivityConfigurationExecutorTest : AndroidConfigurationEx
"am start -n com.example.app/com.example.app.Component -a android.intent.action.MAIN -c android.intent.category.LAUNCHER --user 123")
}
+ @Test
fun testDebug() {
// Use DefaultRunExecutor, equivalent of pressing debug button.
val env = getExecutionEnvironment(DefaultDebugExecutor.getDebugExecutorInstance())
@@ -85,8 +90,10 @@ internal class AndroidActivityConfigurationExecutorTest : AndroidConfigurationEx
runnableClientsService.startClient(device, appId)
}
+ val processTerminatedLatch = CountDownLatch(1)
val stopActivityCommandHandler: CommandHandler = { device, _ ->
runnableClientsService.stopClient(device, appId)
+ processTerminatedLatch.countDown()
}
val device = getMockDevice(mapOf(
@@ -100,13 +107,13 @@ internal class AndroidActivityConfigurationExecutorTest : AndroidConfigurationEx
Mockito.doReturn(appInstaller).`when`(executor).getApplicationInstaller(any())
- val runContentDescriptor = executor.doOnDevices(listOf(device)).blockingGet(1000)
+ val runContentDescriptor = executor.doOnDevices(listOf(device)).blockingGet(10, TimeUnit.SECONDS)
assertThat(runContentDescriptor!!.processHandler).isNotNull()
// Emulate stopping debug session.
val processHandler = runContentDescriptor.processHandler!!
processHandler.destroyProcess()
- processHandler.waitFor()
+ processTerminatedLatch.await(1, TimeUnit.SECONDS)
// Verify commands sent to device.
val commandsCaptor = ArgumentCaptor.forClass(String::class.java)
diff --git a/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidComplicationConfigurationExecutorTest.kt b/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidComplicationConfigurationExecutorTest.kt
index 7ac6e0034d6..a1a6a61b049 100644
--- a/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidComplicationConfigurationExecutorTest.kt
+++ b/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidComplicationConfigurationExecutorTest.kt
@@ -20,16 +20,16 @@ import com.android.ddmlib.IShellOutputReceiver
import com.android.testutils.MockitoKt.any
import com.android.testutils.TestResources
import com.android.tools.deployer.model.component.AppComponent
+import com.android.tools.deployer.model.component.Complication
+import com.android.tools.deployer.model.component.Complication.ComplicationType.LONG_TEXT
import com.android.tools.deployer.model.component.Complication.ComplicationType.RANGED_VALUE
import com.android.tools.deployer.model.component.Complication.ComplicationType.SHORT_TEXT
-import com.android.tools.deployer.model.component.Complication.ComplicationType.LONG_TEXT
+import com.android.tools.idea.run.ApkInfo
import com.android.tools.idea.run.configuration.AndroidComplicationConfiguration
import com.android.tools.idea.run.configuration.AndroidComplicationConfigurationType
import com.android.tools.idea.run.configuration.AndroidConfigurationProgramRunner
import com.android.tools.idea.run.configuration.ComplicationSlot
import com.android.tools.idea.run.configuration.ComplicationWatchFaceInfo
-import com.android.tools.deployer.model.component.Complication
-import com.android.tools.idea.run.ApkInfo
import com.android.tools.idea.run.configuration.getComplicationSourceTypes
import com.google.common.truth.Truth.assertThat
import com.intellij.execution.RunManager
@@ -38,10 +38,13 @@ import com.intellij.execution.executors.DefaultRunExecutor
import com.intellij.execution.impl.ConsoleViewImpl
import com.intellij.execution.runners.ExecutionEnvironment
import com.intellij.execution.ui.ConsoleView
+import com.intellij.openapi.application.invokeLater
+import org.junit.Test
import org.mockito.ArgumentCaptor
import org.mockito.Mockito
import org.mockito.Mockito.doReturn
import org.mockito.Mockito.times
+import java.util.concurrent.CompletableFuture
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
@@ -65,15 +68,13 @@ class AndroidComplicationConfigurationExecutorTest : AndroidConfigurationExecuto
" --ecn component 'com.example.app/com.example.app.Component'" +
" --ecn watchface 'com.example.watchface/com.example.watchface.MyWatchFace'" +
" --ei slot 3 --ei type 5"
- private val setWatchFace = "am broadcast -a com.google.android.wearable.app.DEBUG_SURFACE" +
- " --es operation set-watchface" +
- " --ecn component com.example.watchface/com.example.watchface.MyWatchFace"
private val showWatchFace = "am broadcast -a com.google.android.wearable.app.DEBUG_SYSUI --es operation show-watchface"
private val setDebugAppAm = "am set-debug-app -w 'com.example.app'"
private val setDebugAppBroadcast = "am broadcast -a com.google.android.wearable.app.DEBUG_SURFACE --es operation set-debug-app --es package 'com.example.app'"
private val unsetComplication = "am broadcast -a com.google.android.wearable.app.DEBUG_SURFACE --es operation unset-complication --ecn component com.example.app/com.example.app.Component"
private val unsetWatchFace = "am broadcast -a com.google.android.wearable.app.DEBUG_SURFACE --es operation unset-watchface"
+ @Test
fun test() {
val configSettings = RunManager.getInstance(project).createConfiguration(
"run tile", AndroidComplicationConfigurationType().configurationFactories.single())
@@ -93,7 +94,6 @@ class AndroidComplicationConfigurationExecutorTest : AndroidConfigurationExecuto
checkVersion to "Broadcast completed: result=1, data=\"2\"",
setComplicationSlot1 to "Broadcast completed: result=1",
setComplicationSlot3 to "Broadcast completed: result=1",
- setWatchFace to "Broadcast completed: result=1",
showWatchFace to "Broadcast completed: result=1").toCommandHandlers()
)
@@ -114,11 +114,11 @@ class AndroidComplicationConfigurationExecutorTest : AndroidConfigurationExecuto
// Mock the binary xml extraction.
doReturn(listOf(RANGED_VALUE, SHORT_TEXT, LONG_TEXT)).`when`(executor).getComplicationSourceTypes(any())
- val runContentDescriptor = executor.doOnDevices(listOf(device)).blockingGet(1000)!!
+ val runContentDescriptor = executor.doOnDevices(listOf(device)).blockingGet(10, TimeUnit.SECONDS)!!
// Verify commands sent to device.
val commandsCaptor = ArgumentCaptor.forClass(String::class.java)
- Mockito.verify(device, times(5)).executeShellCommand(
+ Mockito.verify(device, times(4)).executeShellCommand(
commandsCaptor.capture(),
any(IShellOutputReceiver::class.java),
any(),
@@ -131,22 +131,25 @@ class AndroidComplicationConfigurationExecutorTest : AndroidConfigurationExecuto
assertThat(commands[1]).isEqualTo(setComplicationSlot1)
// ChosenSlot(3, Complication.ComplicationType.RANGED_VALUE).
assertThat(commands[2]).isEqualTo(setComplicationSlot3)
- // Set watch face.
- assertThat(commands[3]).isEqualTo(setWatchFace)
// Show watch face.
- assertThat(commands[4]).isEqualTo(showWatchFace)
+ assertThat(commands[3]).isEqualTo(showWatchFace)
// Verify that a warning was raised.
val consoleViewImpl = runContentDescriptor.executionConsole as ConsoleViewImpl
// Print deferred text
- consoleViewImpl.getComponent()
- consoleViewImpl.flushDeferredText()
- val consoleOutput = consoleViewImpl.editor.document.text
+ val consoleOutputPromise = CompletableFuture<String>()
+ invokeLater {
+ consoleViewImpl.getComponent()
+ consoleViewImpl.flushDeferredText()
+ consoleOutputPromise.complete(consoleViewImpl.editor.document.text)
+ }
+ val consoleOutput = consoleOutputPromise.get(1, TimeUnit.SECONDS)
assertThat(consoleOutput)
.contains("Warning: The chosen Wear device may kill background services if they take too long to respond, which can " +
"affect debugging. To avoid this, please update the Wear OS app on your device to the latest version.")
}
+ @Test
fun testDebug() {
val configSettings = RunManager.getInstance(project).createConfiguration(
"run tile", AndroidComplicationConfigurationType().configurationFactories.single())
@@ -164,7 +167,6 @@ class AndroidComplicationConfigurationExecutorTest : AndroidConfigurationExecuto
val commandHandlers: MutableMap<Command, CommandHandler> = mapOf(
checkVersion to "Broadcast completed: result=1, data=\"2\"",
- setComplicationSlot1 to "Broadcast completed: result=1",
setComplicationSlot3 to "Broadcast completed: result=1",
showWatchFace to "Broadcast completed: result=1",
setDebugAppAm to "Broadcast completed: result=1",
@@ -173,19 +175,21 @@ class AndroidComplicationConfigurationExecutorTest : AndroidConfigurationExecuto
val runnableClientsService = RunnableClientsService(testRootDisposable)
- val setWatchFaceCommandHandler: CommandHandler = { device, receiver ->
+ val setComplicationCommandHandler: CommandHandler = { device, receiver ->
runnableClientsService.startClient(device, appId)
receiver.addOutput("Broadcast completed: result=1")
}
+ val processTerminatedLatch = CountDownLatch(1)
val unsetWatchFaceCommandHandler: CommandHandler = { device, receiver ->
runnableClientsService.stopClient(device, appId)
receiver.addOutput("Broadcast completed: result=1")
+ processTerminatedLatch.countDown()
}
val device = getMockDevice(
commandHandlers +
- (setWatchFace to setWatchFaceCommandHandler) +
+ (setComplicationSlot1 to setComplicationCommandHandler) +
(unsetWatchFace to unsetWatchFaceCommandHandler)
)
@@ -207,16 +211,16 @@ class AndroidComplicationConfigurationExecutorTest : AndroidConfigurationExecuto
// Mock the binary xml extraction.
doReturn(listOf(RANGED_VALUE, SHORT_TEXT, LONG_TEXT)).`when`(executor).getComplicationSourceTypes(any())
- val runContentDescriptor = executor.doOnDevices(listOf(device)).blockingGet(1000)
+ val runContentDescriptor = executor.doOnDevices(listOf(device)).blockingGet(10, TimeUnit.SECONDS)
assertThat(runContentDescriptor!!.processHandler).isNotNull()
// Stop configuration.
runContentDescriptor.processHandler!!.destroyProcess()
- runContentDescriptor.processHandler!!.waitFor()
+ processTerminatedLatch.await(1, TimeUnit.SECONDS)
// Verify commands sent to device.
val commandsCaptor = ArgumentCaptor.forClass(String::class.java)
- Mockito.verify(device, times(11)).executeShellCommand(
+ Mockito.verify(device, times(10)).executeShellCommand(
commandsCaptor.capture(),
any(IShellOutputReceiver::class.java),
any(),
@@ -236,16 +240,15 @@ class AndroidComplicationConfigurationExecutorTest : AndroidConfigurationExecuto
assertThat(commands[5]).isEqualTo(setDebugAppBroadcast)
// ChosenSlot(3, Complication.ComplicationType.RANGED_VALUE).
assertThat(commands[6]).isEqualTo(setComplicationSlot3)
- // Set watch face.
- assertThat(commands[7]).isEqualTo(setWatchFace)
// Show watch face
- assertThat(commands[8]).isEqualTo(showWatchFace)
+ assertThat(commands[7]).isEqualTo(showWatchFace)
// Unset complication
- assertThat(commands[9]).isEqualTo(unsetComplication)
+ assertThat(commands[8]).isEqualTo(unsetComplication)
// Unset debug watchFace
- assertThat(commands[10]).isEqualTo(unsetWatchFace)
+ assertThat(commands[9]).isEqualTo(unsetWatchFace)
}
+ @Test
fun testWatchFaceWarning() {
val configSettings = RunManager.getInstance(project).createConfiguration(
"run tile", AndroidComplicationConfigurationType().configurationFactories.single())
@@ -264,7 +267,6 @@ class AndroidComplicationConfigurationExecutorTest : AndroidConfigurationExecuto
checkVersion to "Broadcast completed: result=1, data=\"2\"",
setComplicationSlot1 to "Broadcast completed: result=1",
setComplicationSlot3 to "Broadcast completed: result=1",
- setWatchFace to "Broadcast completed: result=1",
// Unsuccessful show watchface case.
showWatchFace to "Broadcast completed: result=2"
).toCommandHandlers())
@@ -286,19 +288,23 @@ class AndroidComplicationConfigurationExecutorTest : AndroidConfigurationExecuto
// Mock the binary xml extraction.
doReturn(listOf(RANGED_VALUE, SHORT_TEXT, LONG_TEXT)).`when`(executor).getComplicationSourceTypes(any())
- val runContentDescriptor = executor.doOnDevices(listOf(device)).blockingGet(1000)!!
+ val runContentDescriptor = executor.doOnDevices(listOf(device)).blockingGet(10, TimeUnit.SECONDS)!!
// Verify that a warning was raised in console.
val consoleViewImpl = runContentDescriptor.executionConsole as ConsoleViewImpl
// Print differed test
- consoleViewImpl.getComponent()
- consoleViewImpl.flushDeferredText()
-
- val consoleOutput = consoleViewImpl.editor.document.text
+ val consoleOutputPromise = CompletableFuture<String>()
+ invokeLater {
+ consoleViewImpl.getComponent()
+ consoleViewImpl.flushDeferredText()
+ consoleOutputPromise.complete(consoleViewImpl.editor.document.text)
+ }
+ val consoleOutput = consoleOutputPromise.get(1, TimeUnit.SECONDS)
assertThat(consoleOutput)
.contains("Warning: Launch was successful, but you may need to bring up the watch face manually")
}
+ @Test
fun testComplicationProcessHandler() {
val processHandler = ComplicationProcessHandler(AppComponent.getFQEscapedName(appId, componentName),
Mockito.mock(ConsoleView::class.java))
@@ -330,6 +336,7 @@ class AndroidComplicationConfigurationExecutorTest : AndroidConfigurationExecuto
assertThat(commands[1]).isEqualTo(unsetWatchFace)
}
+ @Test
fun testGetComplicationSourceTypes() {
val types = getComplicationSourceTypes(
listOf(ApkInfo(TestResources.getFile("/WearableTestApk.apk"), "com.example.android.wearable.watchface")),
diff --git a/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidComplicationRunConfigurationProducerTest.kt b/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidComplicationRunConfigurationProducerTest.kt
index 4dab0c4ee60..1fbd699b760 100644
--- a/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidComplicationRunConfigurationProducerTest.kt
+++ b/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidComplicationRunConfigurationProducerTest.kt
@@ -23,6 +23,7 @@ import com.intellij.execution.actions.ConfigurationContext
import com.intellij.openapi.util.Ref
import com.intellij.psi.PsiElement
import org.jetbrains.android.AndroidTestCase
+import org.junit.Test
class AndroidComplicationRunConfigurationProducerTest : AndroidTestCase() {
override fun setUp() {
@@ -37,6 +38,7 @@ class AndroidComplicationRunConfigurationProducerTest : AndroidTestCase() {
StudioFlags.ALLOW_RUN_WEAR_CONFIGURATIONS_FROM_GUTTER.clearOverride()
}
+ @Test
fun testSetupConfigurationFromContext() {
val complicationFile = myFixture.addFileToProject(
"src/com/example/myapplication/MyComplicationService.kt",
@@ -57,6 +59,7 @@ class AndroidComplicationRunConfigurationProducerTest : AndroidTestCase() {
assertEquals(myModule, configurationFromClass.module)
}
+ @Test
fun testJavaSetupConfigurationFromContext() {
val complicationFile = myFixture.addFileToProject(
"src/com/example/myapplication/MyComplicationService.java",
diff --git a/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidConfigurationExecutorBaseTest.kt b/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidConfigurationExecutorBaseTest.kt
index 0ca1a69d665..ab02c1ef298 100644
--- a/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidConfigurationExecutorBaseTest.kt
+++ b/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidConfigurationExecutorBaseTest.kt
@@ -26,10 +26,14 @@ import com.android.tools.idea.run.ApkInfo
import com.android.tools.idea.run.ApkProvider
import com.android.tools.idea.run.ApkProvisionException
import com.android.tools.idea.run.ApplicationIdProvider
+import com.android.tools.idea.testing.AndroidProjectRule
import com.google.common.collect.ImmutableList
import com.intellij.execution.configurations.RunConfiguration
+import com.intellij.openapi.Disposable
+import com.intellij.openapi.project.Project
import com.intellij.testFramework.replaceService
-import org.jetbrains.android.AndroidTestCase
+import org.junit.Before
+import org.junit.Rule
import org.mockito.Mockito
import java.io.File
@@ -43,12 +47,21 @@ fun Map<Command, String>.toCommandHandlers(): MutableMap<Command, CommandHandler
}.toMutableMap()
}
-abstract class AndroidConfigurationExecutorBaseTest : AndroidTestCase() {
+abstract class AndroidConfigurationExecutorBaseTest {
protected val appId = "com.example.app"
protected val componentName = "com.example.app.Component"
- override fun setUp() {
- super.setUp()
+ @get:Rule
+ val projectRule = AndroidProjectRule.onDisk()
+ val project: Project
+ get() = projectRule.project
+ val testRootDisposable: Disposable
+ get() = projectRule.testRootDisposable
+ val myModule: com.intellij.openapi.module.Module
+ get() = projectRule.module
+
+ @Before
+ fun setUp() {
val projectSystemMock = createProjectSystemMock()
Mockito.`when`(projectSystemMock.getApkProvider(MockitoKt.any(RunConfiguration::class.java))).thenReturn(TestApksProvider(appId))
Mockito.`when`(projectSystemMock.getApplicationIdProvider(
@@ -76,6 +89,7 @@ abstract class AndroidConfigurationExecutorBaseTest : AndroidTestCase() {
val handler = commandHandlers[command]
handler?.invoke(device, receiver)
}
+ Mockito.`when`(device.isOnline).thenReturn(true)
return device
}
diff --git a/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidTileConfigurationExecutorTest.kt b/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidTileConfigurationExecutorTest.kt
index 551aa5047a0..a002c4e1666 100644
--- a/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidTileConfigurationExecutorTest.kt
+++ b/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidTileConfigurationExecutorTest.kt
@@ -31,8 +31,11 @@ import com.intellij.execution.executors.DefaultRunExecutor
import com.intellij.execution.impl.ConsoleViewImpl
import com.intellij.execution.runners.ExecutionEnvironment
import com.intellij.execution.ui.ConsoleView
+import com.intellij.openapi.application.invokeLater
+import org.junit.Test
import org.mockito.ArgumentCaptor
import org.mockito.Mockito
+import java.util.concurrent.CompletableFuture
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
import kotlin.test.assertFailsWith
@@ -56,6 +59,7 @@ class AndroidTileConfigurationExecutorTest : AndroidConfigurationExecutorBaseTes
return ExecutionEnvironment(executorInstance, AndroidConfigurationProgramRunner(), configSettings, project)
}
+ @Test
fun testRun() {
// Use DefaultRunExecutor, equivalent of pressing run button.
val env = getExecutionEnvironment(DefaultRunExecutor.getRunExecutorInstance())
@@ -74,7 +78,7 @@ class AndroidTileConfigurationExecutorTest : AndroidConfigurationExecutorBaseTes
// Mock app installation.
Mockito.doReturn(appInstaller).`when`(executor).getApplicationInstaller(any())
- val runContentDescriptor = executor.doOnDevices(listOf(device)).blockingGet(1000)!!
+ val runContentDescriptor = executor.doOnDevices(listOf(device)).blockingGet(10, TimeUnit.SECONDS)!!
// Verify commands sent to device.
val commandsCaptor = ArgumentCaptor.forClass(String::class.java)
@@ -96,14 +100,18 @@ class AndroidTileConfigurationExecutorTest : AndroidConfigurationExecutorBaseTes
// Verify that a warning was raised in console.
val consoleViewImpl = runContentDescriptor.executionConsole as ConsoleViewImpl
// Print deferred text
- consoleViewImpl.getComponent()
- consoleViewImpl.flushDeferredText()
-
- val consoleOutput = consoleViewImpl.editor.document.text
+ val consoleOutputPromise = CompletableFuture<String>()
+ invokeLater {
+ consoleViewImpl.getComponent()
+ consoleViewImpl.flushDeferredText()
+ consoleOutputPromise.complete(consoleViewImpl.editor.document.text)
+ }
+ val consoleOutput = consoleOutputPromise.get(1, TimeUnit.SECONDS)
assertThat(consoleOutput)
.contains("Warning: Launch was successful, but you may need to bring up the tile manually.")
}
+ @Test
fun testException() {
// Use DefaultRunExecutor, equivalent of pressing run button.
val env = getExecutionEnvironment(DefaultRunExecutor.getRunExecutorInstance())
@@ -126,6 +134,7 @@ class AndroidTileConfigurationExecutorTest : AndroidConfigurationExecutorBaseTes
assertThat(e).hasMessageThat().contains("Error while setting the tile, message: $failedResponse")
}
+ @Test
fun testDebug() {
// Use DefaultRunExecutor, equivalent of pressing debug button.
val env = getExecutionEnvironment(DefaultDebugExecutor.getDebugExecutorInstance())
@@ -146,9 +155,12 @@ class AndroidTileConfigurationExecutorTest : AndroidConfigurationExecutorBaseTes
receiver.addOutput("Broadcast completed: result=1, Index=[101]")
}
+ val processTerminatedLatch = CountDownLatch(1)
+
val removeTileCommandHandler: CommandHandler = { device, receiver ->
runnableClientsService.stopClient(device, appId)
receiver.addOutput("Broadcast completed: result=1")
+ processTerminatedLatch.countDown()
}
val device = getMockDevice(
@@ -162,12 +174,12 @@ class AndroidTileConfigurationExecutorTest : AndroidConfigurationExecutorBaseTes
// Mock app installation.
Mockito.doReturn(appInstaller).`when`(executor).getApplicationInstaller(any())
- val runContentDescriptor = executor.doOnDevices(listOf(device)).blockingGet(1000)
+ val runContentDescriptor = executor.doOnDevices(listOf(device)).blockingGet(10, TimeUnit.SECONDS)
assertThat(runContentDescriptor!!.processHandler).isNotNull()
// Stop configuration.
runContentDescriptor.processHandler!!.destroyProcess()
- runContentDescriptor.processHandler!!.waitFor()
+ processTerminatedLatch.await(1, TimeUnit.SECONDS)
// Verify commands sent to device.
val commandsCaptor = ArgumentCaptor.forClass(String::class.java)
@@ -192,6 +204,7 @@ class AndroidTileConfigurationExecutorTest : AndroidConfigurationExecutorBaseTes
assertThat(commands[5]).isEqualTo(removeTile)
}
+ @Test
fun testTileProcessHandler() {
val processHandler = TileProcessHandler(AppComponent.getFQEscapedName(appId, componentName),
Mockito.mock(ConsoleView::class.java))
diff --git a/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidTileRunConfigurationProducerTest.kt b/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidTileRunConfigurationProducerTest.kt
index 22b2456215b..01eb8ab8af7 100644
--- a/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidTileRunConfigurationProducerTest.kt
+++ b/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidTileRunConfigurationProducerTest.kt
@@ -23,6 +23,7 @@ import com.intellij.execution.actions.ConfigurationContext
import com.intellij.openapi.util.Ref
import com.intellij.psi.PsiElement
import org.jetbrains.android.AndroidTestCase
+import org.junit.Test
class AndroidTileRunConfigurationProducerTest : AndroidTestCase() {
override fun setUp() {
@@ -37,6 +38,7 @@ class AndroidTileRunConfigurationProducerTest : AndroidTestCase() {
StudioFlags.ALLOW_RUN_WEAR_CONFIGURATIONS_FROM_GUTTER.clearOverride()
}
+ @Test
fun testSetupConfigurationFromContext() {
val tileFile = myFixture.addFileToProject(
"src/com/example/myapplication/MyTileService.kt",
@@ -57,6 +59,7 @@ class AndroidTileRunConfigurationProducerTest : AndroidTestCase() {
assertEquals(myModule, configurationFromClass.module)
}
+ @Test
fun testJavaSetupConfigurationFromContext() {
val tileFile = myFixture.addFileToProject(
"src/com/example/myapplication/MyTileService.java",
diff --git a/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidWatchFaceConfigurationExecutorTest.kt b/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidWatchFaceConfigurationExecutorTest.kt
index a0edb2cb141..e2e436ec35d 100644
--- a/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidWatchFaceConfigurationExecutorTest.kt
+++ b/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidWatchFaceConfigurationExecutorTest.kt
@@ -27,6 +27,7 @@ import com.intellij.execution.executors.DefaultDebugExecutor
import com.intellij.execution.executors.DefaultRunExecutor
import com.intellij.execution.runners.ExecutionEnvironment
import com.intellij.execution.ui.ConsoleView
+import org.junit.Test
import org.mockito.ArgumentCaptor
import org.mockito.Mockito
import java.util.concurrent.CountDownLatch
@@ -50,6 +51,7 @@ class AndroidWatchFaceConfigurationExecutorTest : AndroidConfigurationExecutorBa
return ExecutionEnvironment(executorInstance, AndroidConfigurationProgramRunner(), configSettings, project)
}
+ @Test
fun testRun() {
// Use DefaultRunExecutor, equivalent of pressing run button.
val env = getExecutionEnvironment(DefaultRunExecutor.getRunExecutorInstance())
@@ -91,6 +93,7 @@ class AndroidWatchFaceConfigurationExecutorTest : AndroidConfigurationExecutorBa
assertThat(commands[2]).isEqualTo(showWatchFace)
}
+ @Test
fun testDebug() {
// Use DefaultRunExecutor, equivalent of pressing debug button.
val env = getExecutionEnvironment(DefaultDebugExecutor.getDebugExecutorInstance())
@@ -112,9 +115,11 @@ class AndroidWatchFaceConfigurationExecutorTest : AndroidConfigurationExecutorBa
"Broadcast completed: result=1, data=\"Favorite Id=[2] Runtime=[1]\"")
}
+ val processTerminatedLatch = CountDownLatch(1)
val unsetWatchFaceCommandHandler: CommandHandler = { device, receiver ->
runnableClientsService.stopClient(device, appId)
receiver.addOutput("Broadcast completed: result=1")
+ processTerminatedLatch.countDown()
}
val device = getMockDevice(
@@ -128,12 +133,12 @@ class AndroidWatchFaceConfigurationExecutorTest : AndroidConfigurationExecutorBa
// Mock app installation.
Mockito.doReturn(appInstaller).`when`(executor).getApplicationInstaller(any())
- val runContentDescriptor = executor.doOnDevices(listOf(device)).blockingGet(1000)
+ val runContentDescriptor = executor.doOnDevices(listOf(device)).blockingGet(10, TimeUnit.SECONDS)
assertThat(runContentDescriptor!!.processHandler).isNotNull()
// Stop configuration.
runContentDescriptor.processHandler!!.destroyProcess()
- runContentDescriptor.processHandler!!.waitFor()
+ processTerminatedLatch.await(1, TimeUnit.SECONDS)
// Verify commands sent to device.
val commandsCaptor = ArgumentCaptor.forClass(String::class.java)
@@ -157,6 +162,7 @@ class AndroidWatchFaceConfigurationExecutorTest : AndroidConfigurationExecutorBa
assertThat(commands[4]).isEqualTo(unsetWatchFace)
}
+ @Test
fun testWatchFaceProcessHandler() {
val processHandler = WatchFaceProcessHandler(Mockito.mock(ConsoleView::class.java))
val countDownLatch = CountDownLatch(1)
diff --git a/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidWatchFaceRunConfigurationProducerTest.kt b/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidWatchFaceRunConfigurationProducerTest.kt
index 17fcb64fbb2..633e7034111 100644
--- a/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidWatchFaceRunConfigurationProducerTest.kt
+++ b/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidWatchFaceRunConfigurationProducerTest.kt
@@ -23,6 +23,7 @@ import com.intellij.execution.actions.ConfigurationContext
import com.intellij.openapi.util.Ref
import com.intellij.psi.PsiElement
import org.jetbrains.android.AndroidTestCase
+import org.junit.Test
class AndroidWatchFaceRunConfigurationProducerTest : AndroidTestCase() {
override fun setUp() {
@@ -37,6 +38,7 @@ class AndroidWatchFaceRunConfigurationProducerTest : AndroidTestCase() {
StudioFlags.ALLOW_RUN_WEAR_CONFIGURATIONS_FROM_GUTTER.clearOverride()
}
+ @Test
fun testSetupConfigurationFromContext() {
val watchFaceFile = myFixture.addFileToProject(
"src/com/example/myapplication/MyTestWatchFace.kt",
@@ -60,6 +62,7 @@ class AndroidWatchFaceRunConfigurationProducerTest : AndroidTestCase() {
assertEquals(myModule, configurationFromClass.module)
}
+ @Test
fun testJavaSetupConfigurationFromContext() {
val watchFaceFile = myFixture.addFileToProject(
"src/com/example/myapplication/MyWatchFaceService.java",
diff --git a/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidWearRunLineMarkerContributorTest.kt b/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidWearRunLineMarkerContributorTest.kt
index 96daf926741..f8ff00d9cc5 100644
--- a/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidWearRunLineMarkerContributorTest.kt
+++ b/android/testSrc/com/android/tools/idea/run/configuration/execution/AndroidWearRunLineMarkerContributorTest.kt
@@ -18,6 +18,7 @@ package com.android.tools.idea.run.configuration.execution
import com.android.tools.idea.flags.StudioFlags
import com.android.tools.idea.run.configuration.AndroidWearRunMarkerContributor
import org.jetbrains.android.AndroidTestCase
+import org.junit.Test
class AndroidWearRunLineMarkerContributorTest : AndroidTestCase() {
override fun setUp() {
@@ -32,6 +33,7 @@ class AndroidWearRunLineMarkerContributorTest : AndroidTestCase() {
StudioFlags.ALLOW_RUN_WEAR_CONFIGURATIONS_FROM_GUTTER.clearOverride()
}
+ @Test
fun testGetWatchFaceInfo() {
val watchFaceFile = myFixture.addFileToProject(
"src/com/example/myapplication/MyTestWatchFace.kt",
@@ -52,6 +54,7 @@ class AndroidWearRunLineMarkerContributorTest : AndroidTestCase() {
assertNull(contributor.getInfo(watchFaceFile.findElementByText("package com.example.myapplication")))
}
+ @Test
fun testGetTileInfo() {
val tileFile = myFixture.addFileToProject(
"src/com/example/myapplication/MyTileService.kt",
@@ -69,6 +72,7 @@ class AndroidWearRunLineMarkerContributorTest : AndroidTestCase() {
assertNull(contributor.getInfo(tileFile.findElementByText("package com.example.myapplication")))
}
+ @Test
fun testGetComplicationInfo() {
val complicationFile = myFixture.addFileToProject(
"src/com/example/myapplication/MyComplicationService.kt",
@@ -86,6 +90,7 @@ class AndroidWearRunLineMarkerContributorTest : AndroidTestCase() {
assertNull(contributor.getInfo(complicationFile.findElementByText("package com.example.myapplication")))
}
+ @Test
fun testGetComplicationInfoJava() {
val complicationFile = myFixture.addFileToProject(
"src/com/example/myapplication/MyComplicationService.java",
diff --git a/android/testSrc/com/android/tools/idea/run/configuration/execution/RunnableClientService.kt b/android/testSrc/com/android/tools/idea/run/configuration/execution/RunnableClientService.kt
index d3b52694fbd..964c7f42990 100644
--- a/android/testSrc/com/android/tools/idea/run/configuration/execution/RunnableClientService.kt
+++ b/android/testSrc/com/android/tools/idea/run/configuration/execution/RunnableClientService.kt
@@ -99,7 +99,6 @@ private class RunnableClient private constructor(private val device: IDevice, pr
// Do not reuse RunnableClient
assert(!this::client.isInitialized)
client = createMockClient(device, clientSocket.localPort)
- Mockito.`when`(device.isOnline).thenReturn(true)
isRunning.set(true)
task = mThreadPoolExecutor.submit {