diff options
author | Polina Koval <kovalp@google.com> | 2022-03-03 10:20:01 +0000 |
---|---|---|
committer | TreeHugger Robot <treehugger-gerrit@google.com> | 2022-03-05 07:16:49 +0000 |
commit | a4bb560ea08a9b9a14117681283a31314e33dd46 (patch) | |
tree | fc67de70a973d4c9888b510441c04c7a6e549d38 /android/testSrc | |
parent | 9228cd610d9407a261107d68a4bcb894993563a1 (diff) | |
download | idea-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')
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 { |