Skip to content

Commit 1b28f8b

Browse files
committed
tst
1 parent ae72817 commit 1b28f8b

File tree

3 files changed

+37
-5
lines changed

3 files changed

+37
-5
lines changed

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/actions/CodeWhispererRecommendationAction.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,15 @@ import com.intellij.openapi.actionSystem.AnAction
88
import com.intellij.openapi.actionSystem.AnActionEvent
99
import com.intellij.openapi.actionSystem.CommonDataKeys
1010
import com.intellij.openapi.project.DumbAware
11+
import com.intellij.openapi.util.Key
12+
import kotlinx.coroutines.Job
1113
import software.aws.toolkits.jetbrains.services.codewhisperer.model.LatencyContext
1214
import software.aws.toolkits.jetbrains.services.codewhisperer.model.TriggerTypeInfo
1315
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererAutomatedTriggerType
1416
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererService
1517
import software.aws.toolkits.resources.message
1618
import software.aws.toolkits.telemetry.CodewhispererTriggerType
19+
import java.util.concurrent.atomic.AtomicReference
1720

1821
class CodeWhispererRecommendationAction : AnAction(message("codewhisperer.trigger.service")), DumbAware {
1922
override fun getActionUpdateThread() = ActionUpdateThread.BGT
@@ -32,6 +35,12 @@ class CodeWhispererRecommendationAction : AnAction(message("codewhisperer.trigge
3235
}
3336

3437
val triggerType = TriggerTypeInfo(CodewhispererTriggerType.OnDemand, CodeWhispererAutomatedTriggerType.Unknown())
35-
CodeWhispererService.getInstance().showRecommendationsInPopup(editor, triggerType, latencyContext)
38+
val job = CodeWhispererService.getInstance().showRecommendationsInPopup(editor, triggerType, latencyContext)
39+
40+
e.getData(CommonDataKeys.EDITOR)?.getUserData(ACTION_JOB_KEY)?.set(job)
41+
}
42+
43+
companion object {
44+
val ACTION_JOB_KEY = Key.create<AtomicReference<Job?>>("amazonq.codewhisperer.job")
3645
}
3746
}

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,15 +104,17 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable {
104104
editor: Editor,
105105
triggerTypeInfo: TriggerTypeInfo,
106106
latencyContext: LatencyContext
107-
) {
107+
): Job? {
108108
if (job == null || job?.isCompleted == true) {
109109
job = cs.launch(getCoroutineBgContext()) {
110110
doShowRecommendationsInPopup(editor, triggerTypeInfo, latencyContext)
111111
}
112112
}
113+
114+
// did some wrangling, but compiler didn't believe this can't be null
115+
return job
113116
}
114117

115-
@RequiresEdt
116118
private suspend fun doShowRecommendationsInPopup(
117119
editor: Editor,
118120
triggerTypeInfo: TriggerTypeInfo,
@@ -123,6 +125,7 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable {
123125

124126
latencyContext.credentialFetchingStart = System.nanoTime()
125127

128+
// try to refresh automatically if possible, otherwise ask user to login again
126129
if (isQExpired(project)) {
127130
// consider changing to only running once a ~minute since this is relatively expensive
128131
// say the connection is un-refreshable if refresh fails for 3 times

plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTestBase.kt

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ import com.intellij.testFramework.DisposableRule
88
import com.intellij.testFramework.RuleChain
99
import com.intellij.testFramework.replaceService
1010
import com.intellij.testFramework.runInEdtAndWait
11+
import kotlinx.coroutines.Job
12+
import kotlinx.coroutines.delay
13+
import kotlinx.coroutines.test.runTest
14+
import kotlinx.coroutines.yield
1115
import org.assertj.core.api.Assertions.assertThat
1216
import org.junit.After
1317
import org.junit.Before
@@ -32,6 +36,7 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.CodeWhispererTestU
3236
import software.aws.toolkits.jetbrains.services.codewhisperer.CodeWhispererTestUtil.pythonResponse
3337
import software.aws.toolkits.jetbrains.services.codewhisperer.CodeWhispererTestUtil.pythonTestLeftContext
3438
import software.aws.toolkits.jetbrains.services.codewhisperer.CodeWhispererTestUtil.testValidAccessToken
39+
import software.aws.toolkits.jetbrains.services.codewhisperer.actions.CodeWhispererRecommendationAction
3540
import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor
3641
import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererLoginType
3742
import software.aws.toolkits.jetbrains.services.codewhisperer.editor.CodeWhispererEditorManager
@@ -51,6 +56,7 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.settings.CodeWhisp
5156
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererColorUtil.POPUP_DIM_HEX
5257
import software.aws.toolkits.jetbrains.utils.rules.PythonCodeInsightTestFixtureRule
5358
import software.aws.toolkits.resources.message
59+
import java.util.concurrent.atomic.AtomicReference
5460

5561
// TODO: restructure testbase, too bulky and hard to debug
5662
open class CodeWhispererTestBase {
@@ -180,12 +186,26 @@ open class CodeWhispererTestBase {
180186
runInEdtAndWait {}
181187
}
182188

189+
/**
190+
* Block until manual action has either failed or completed
191+
*/
183192
fun invokeCodeWhispererService() {
193+
val jobRef = AtomicReference<Job?>()
184194
runInEdtAndWait {
195+
projectRule.fixture.editor.putUserData(CodeWhispererRecommendationAction.ACTION_JOB_KEY, jobRef)
196+
// does not block, so we need to extract something to track the async task
185197
projectRule.fixture.performEditorAction(codeWhispererRecommendationActionId)
186198
}
187-
while (CodeWhispererInvocationStatus.getInstance().hasExistingInvocation()) {
188-
Thread.sleep(10)
199+
200+
runTest {
201+
// wait for CodeWhispererService#showRecommendationsInPopup to complete, if started
202+
jobRef.get()?.join()
203+
204+
// wait for subsequent background operations to be complete
205+
while (CodeWhispererInvocationStatus.getInstance().hasExistingInvocation()) {
206+
yield()
207+
delay(10)
208+
}
189209
}
190210
}
191211

0 commit comments

Comments
 (0)