Skip to content

Commit 8a6f9e8

Browse files
authored
fix "container is already disposed" in tests (#3922)
1 parent 109be66 commit 8a6f9e8

File tree

2 files changed

+95
-87
lines changed

2 files changed

+95
-87
lines changed

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -219,36 +219,40 @@ class DefaultCodeWhispererModelConfigurator : CodeWhispererModelConfigurator, Pe
219219
* This method will return the result in memory first and fallback to false if there is no value exist in the memory,
220220
* then will try fetch the latest from the server in the background thread and update the UI correspondingly
221221
*/
222-
override fun shouldDisplayCustomNode(project: Project, forceUpdate: Boolean): Boolean = calculateIfIamIdentityCenterConnection(project) {
223-
val cachedValue = connectionIdToIsAllowlisted[it.id]
224-
when (cachedValue) {
225-
true -> true
226-
227-
null -> run {
228-
ApplicationManager.getApplication().executeOnPooledThread {
229-
// will update devTool tree
230-
listCustomizations(project, passive = true) != null
231-
project.refreshDevToolTree()
232-
}
233-
234-
false
235-
}
222+
override fun shouldDisplayCustomNode(project: Project, forceUpdate: Boolean): Boolean = if (ApplicationManager.getApplication().isUnitTestMode) {
223+
false
224+
} else {
225+
calculateIfIamIdentityCenterConnection(project) {
226+
val cachedValue = connectionIdToIsAllowlisted[it.id]
227+
when (cachedValue) {
228+
true -> true
236229

237-
false -> run {
238-
if (forceUpdate) {
230+
null -> run {
239231
ApplicationManager.getApplication().executeOnPooledThread {
240232
// will update devTool tree
241-
val updatedValue = listCustomizations(project, passive = true) != null
242-
if (updatedValue != cachedValue) {
243-
project.refreshDevToolTree()
244-
}
233+
listCustomizations(project, passive = true)
234+
project.refreshDevToolTree()
245235
}
236+
237+
false
246238
}
247239

248-
cachedValue
240+
false -> run {
241+
if (forceUpdate) {
242+
ApplicationManager.getApplication().executeOnPooledThread {
243+
// will update devTool tree
244+
val updatedValue = listCustomizations(project, passive = true) != null
245+
if (updatedValue != cachedValue) {
246+
project.refreshDevToolTree()
247+
}
248+
}
249+
}
250+
251+
cachedValue
252+
}
249253
}
250-
}
251-
} ?: false
254+
} ?: false
255+
}
252256

253257
override fun getNewUpdate(connectionId: String) = connectionToCustomizationUiItems[connectionId]
254258

jetbrains-core/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererCodeCoverageTrackerTest.kt

Lines changed: 68 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ internal abstract class CodeWhispererCodeCoverageTrackerTestBase(myProjectRule:
103103
protected lateinit var telemetryServiceSpy: TelemetryService
104104
protected lateinit var batcher: TelemetryBatcher
105105
protected lateinit var exploreActionManagerMock: CodeWhispererExplorerActionManager
106+
protected lateinit var sut: CodeWhispererCodeCoverageTracker
106107

107108
init {
108109
this.projectRule = myProjectRule
@@ -126,6 +127,9 @@ internal abstract class CodeWhispererCodeCoverageTrackerTestBase(myProjectRule:
126127
@After
127128
fun tearDown() {
128129
CodeWhispererCodeCoverageTracker.getInstancesMap().clear()
130+
if (::sut.isInitialized) {
131+
sut.forceTrackerFlush()
132+
}
129133
}
130134

131135
protected companion object {
@@ -205,26 +209,26 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
205209
}
206210

207211
@Test
208-
fun `test tracker is listening to cwspr recommendation service invocation`() {
209-
val pythonTracker = TestCodePercentageTracker(project, TOTAL_SECONDS_IN_MINUTE, CodeWhispererPython.INSTANCE)
212+
fun `test tracker is listening to codewhisperer recommendation service invocation`() {
213+
sut = TestCodePercentageTracker(project, TOTAL_SECONDS_IN_MINUTE, CodeWhispererPython.INSTANCE)
210214
val jsxTracker = TestCodePercentageTracker(project, TOTAL_SECONDS_IN_MINUTE, CodeWhispererJsx.INSTANCE)
211-
CodeWhispererCodeCoverageTracker.getInstancesMap()[CodeWhispererPython.INSTANCE] = pythonTracker
215+
CodeWhispererCodeCoverageTracker.getInstancesMap()[CodeWhispererPython.INSTANCE] = sut
212216
CodeWhispererCodeCoverageTracker.getInstancesMap()[CodeWhispererJsx.INSTANCE] = jsxTracker
213-
pythonTracker.activateTrackerIfNotActive()
214-
assertThat(pythonTracker.serviceInvocationCount).isEqualTo(0)
217+
sut.activateTrackerIfNotActive()
218+
assertThat(sut.serviceInvocationCount).isEqualTo(0)
215219
assertThat(jsxTracker.serviceInvocationCount).isEqualTo(0)
216220

217221
val fileContextInfo = mock<FileContextInfo> { on { programmingLanguage } doReturn CodeWhispererPython.INSTANCE }
218222
ApplicationManager.getApplication().messageBus.syncPublisher(CodeWhispererService.CODEWHISPERER_CODE_COMPLETION_PERFORMED).onSuccess(fileContextInfo)
219-
assertThat(pythonTracker.serviceInvocationCount).isEqualTo(1)
223+
assertThat(sut.serviceInvocationCount).isEqualTo(1)
220224
assertThat(jsxTracker.serviceInvocationCount).isEqualTo(0)
221225
}
222226

223227
@Test
224228
fun `test tracker is listening to document changes and increment totalTokens - add new code`() {
225-
val pythonTracker = spy(TestCodePercentageTracker(project, TOTAL_SECONDS_IN_MINUTE, CodeWhispererPython.INSTANCE))
226-
CodeWhispererCodeCoverageTracker.getInstancesMap()[CodeWhispererPython.INSTANCE] = pythonTracker
227-
pythonTracker.activateTrackerIfNotActive()
229+
sut = spy(TestCodePercentageTracker(project, TOTAL_SECONDS_IN_MINUTE, CodeWhispererPython.INSTANCE))
230+
CodeWhispererCodeCoverageTracker.getInstancesMap()[CodeWhispererPython.INSTANCE] = sut
231+
sut.activateTrackerIfNotActive()
228232

229233
fixture.configureByText(pythonFileName, "")
230234
runInEdtAndWait {
@@ -233,32 +237,32 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
233237
}
234238
}
235239
val captor = argumentCaptor<DocumentEvent>()
236-
verify(pythonTracker, Times(1)).documentChanged(captor.capture())
240+
verify(sut, Times(1)).documentChanged(captor.capture())
237241
assertThat(captor.firstValue.newFragment.toString()).isEqualTo(pythonTestLeftContext)
238-
val oldSize = pythonTracker.totalTokensSize
239-
assertThat(pythonTracker.totalTokensSize).isEqualTo(pythonTestLeftContext.length)
242+
val oldSize = sut.totalTokensSize
243+
assertThat(sut.totalTokensSize).isEqualTo(pythonTestLeftContext.length)
240244

241245
val anotherCode = "(x, y):"
242246
runInEdtAndWait {
243247
WriteCommandAction.runWriteCommandAction(project) {
244248
fixture.editor.appendString(anotherCode)
245249
}
246250
}
247-
assertThat(pythonTracker.totalTokensSize).isEqualTo(oldSize + anotherCode.length)
251+
assertThat(sut.totalTokensSize).isEqualTo(oldSize + anotherCode.length)
248252
}
249253

250254
@Test
251255
fun `test tracker is listening to document changes and increment totalTokens - delete code should not affect`() {
252-
val pythonTracker = TestCodePercentageTracker(
256+
sut = TestCodePercentageTracker(
253257
project,
254258
TOTAL_SECONDS_IN_MINUTE,
255259
CodeWhispererPython.INSTANCE,
256260
codeCoverageTokens = mutableMapOf(fixture.editor.document to CodeCoverageTokens(pythonTestLeftContext.length, 0))
257261
)
258262

259-
CodeWhispererCodeCoverageTracker.getInstancesMap()[CodeWhispererPython.INSTANCE] = pythonTracker
260-
pythonTracker.activateTrackerIfNotActive()
261-
assertThat(pythonTracker.totalTokensSize).isEqualTo(pythonTestLeftContext.length)
263+
CodeWhispererCodeCoverageTracker.getInstancesMap()[CodeWhispererPython.INSTANCE] = sut
264+
sut.activateTrackerIfNotActive()
265+
assertThat(sut.totalTokensSize).isEqualTo(pythonTestLeftContext.length)
262266

263267
runInEdtAndWait {
264268
fixture.editor.caretModel.primaryCaret.moveToOffset(fixture.editor.document.textLength)
@@ -267,34 +271,34 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
267271
}
268272
}
269273

270-
assertThat(pythonTracker.totalTokensSize).isEqualTo(pythonTestLeftContext.length)
274+
assertThat(sut.totalTokensSize).isEqualTo(pythonTestLeftContext.length)
271275
}
272276

273277
@Test
274278
fun `test tracker documentChanged - will not increment tokens on blank string of length greater than 1`() {
275-
val pythonTracker = TestCodePercentageTracker(
279+
sut = TestCodePercentageTracker(
276280
project,
277281
TOTAL_SECONDS_IN_MINUTE,
278282
CodeWhispererPython.INSTANCE,
279283
codeCoverageTokens = mutableMapOf(fixture.editor.document to CodeCoverageTokens(pythonTestLeftContext.length, 0))
280284
)
281-
CodeWhispererCodeCoverageTracker.getInstancesMap()[CodeWhispererPython.INSTANCE] = pythonTracker
282-
pythonTracker.activateTrackerIfNotActive()
283-
assertThat(pythonTracker.totalTokensSize).isEqualTo(pythonTestLeftContext.length)
285+
CodeWhispererCodeCoverageTracker.getInstancesMap()[CodeWhispererPython.INSTANCE] = sut
286+
sut.activateTrackerIfNotActive()
287+
assertThat(sut.totalTokensSize).isEqualTo(pythonTestLeftContext.length)
284288

285289
runInEdtAndWait {
286290
WriteCommandAction.runWriteCommandAction(project) {
287291
fixture.editor.document.insertString(fixture.editor.caretModel.offset, "\t")
288292
}
289293
}
290294

291-
assertThat(pythonTracker.totalTokensSize).isEqualTo(pythonTestLeftContext.length)
295+
assertThat(sut.totalTokensSize).isEqualTo(pythonTestLeftContext.length)
292296
}
293297

294298
@Test
295299
fun `test msg CODEWHISPERER_USER_ACTION_PERFORMED will add rangeMarker in the list`() {
296-
val pythonTracker = spy(TestCodePercentageTracker(project, TOTAL_SECONDS_IN_MINUTE, language = CodeWhispererPython.INSTANCE))
297-
pythonTracker.activateTrackerIfNotActive()
300+
sut = spy(TestCodePercentageTracker(project, TOTAL_SECONDS_IN_MINUTE, language = CodeWhispererPython.INSTANCE))
301+
sut.activateTrackerIfNotActive()
298302
val rangeMarkerMock = runInEdtAndGet {
299303
spy(fixture.editor.document.createRangeMarker(0, 3)) {
300304
on { isValid } doReturn true
@@ -307,46 +311,46 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
307311
rangeMarkerMock
308312
)
309313

310-
assertThat(pythonTracker.acceptedRecommendationsCount).isEqualTo(1)
314+
assertThat(sut.acceptedRecommendationsCount).isEqualTo(1)
311315
val argumentCaptor = argumentCaptor<String>()
312316
verify(rangeMarkerMock, atLeastOnce()).putUserData(any<Key<String>>(), argumentCaptor.capture())
313317
assertThat(argumentCaptor.firstValue).isEqualTo(pythonTestLeftContext.substring(0, 3))
314318
}
315319

316320
@Test
317321
fun `test 0 totalTokens will return null`() {
318-
val javaTracker = spy(TestCodePercentageTracker(project, TOTAL_SECONDS_IN_MINUTE, language = CodeWhispererJava.INSTANCE))
319-
CodeWhispererCodeCoverageTracker.getInstancesMap()[CodeWhispererJava.INSTANCE] = javaTracker
320-
assertThat(javaTracker.percentage).isNull()
322+
sut = spy(TestCodePercentageTracker(project, TOTAL_SECONDS_IN_MINUTE, language = CodeWhispererJava.INSTANCE))
323+
CodeWhispererCodeCoverageTracker.getInstancesMap()[CodeWhispererJava.INSTANCE] = sut
324+
assertThat(sut.percentage).isNull()
321325
}
322326

323327
@Test
324328
fun `test flush() will reset tokens and reschedule next telemetry sending`() {
325-
val pythonTracker = TestCodePercentageTracker(
329+
sut = TestCodePercentageTracker(
326330
project,
327331
TOTAL_SECONDS_IN_MINUTE,
328332
CodeWhispererPython.INSTANCE,
329333
codeCoverageTokens = mutableMapOf(mock<Document>() to CodeCoverageTokens("foobar".length, "bar".length))
330334
)
331335

332-
pythonTracker.activateTrackerIfNotActive()
333-
assertThat(pythonTracker.activeRequestCount()).isEqualTo(1)
334-
assertThat(pythonTracker.acceptedTokensSize).isEqualTo("bar".length)
335-
assertThat(pythonTracker.totalTokensSize).isEqualTo("foobar".length)
336+
sut.activateTrackerIfNotActive()
337+
assertThat(sut.activeRequestCount()).isEqualTo(1)
338+
assertThat(sut.acceptedTokensSize).isEqualTo("bar".length)
339+
assertThat(sut.totalTokensSize).isEqualTo("foobar".length)
336340

337-
pythonTracker.forceTrackerFlush()
341+
sut.forceTrackerFlush()
338342

339-
assertThat(pythonTracker.activeRequestCount()).isEqualTo(1)
340-
assertThat(pythonTracker.acceptedTokensSize).isEqualTo(0)
341-
assertThat(pythonTracker.totalTokensSize).isEqualTo(0)
343+
assertThat(sut.activeRequestCount()).isEqualTo(1)
344+
assertThat(sut.acceptedTokensSize).isEqualTo(0)
345+
assertThat(sut.totalTokensSize).isEqualTo(0)
342346
}
343347

344348
@Test
345349
fun `test when rangeMarker is not vaild, acceptedToken will not be updated`() {
346350
// when user delete whole recommendation, rangeMarker will be isValid = false
347351
val rangeMarkerMock: RangeMarker = mock()
348352
whenever(rangeMarkerMock.isValid).thenReturn(false)
349-
val pythonTracker = spy(
353+
sut = spy(
350354
TestCodePercentageTracker(
351355
project,
352356
TOTAL_SECONDS_IN_MINUTE,
@@ -357,29 +361,29 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
357361
onGeneric { getAcceptedTokensDelta(any(), any()) } doReturn 100
358362
}
359363

360-
pythonTracker.activateTrackerIfNotActive()
361-
pythonTracker.forceTrackerFlush()
364+
sut.activateTrackerIfNotActive()
365+
sut.forceTrackerFlush()
362366

363-
verify(pythonTracker, Times(0)).getAcceptedTokensDelta(any(), any())
367+
verify(sut, Times(0)).getAcceptedTokensDelta(any(), any())
364368
}
365369

366370
@Test
367371
fun `test flush() will call emitTelemetry automatically schedule next call`() {
368-
val pythonTracker = spy(
372+
sut = spy(
369373
TestCodePercentageTracker(
370374
project,
371375
TOTAL_SECONDS_IN_MINUTE,
372376
CodeWhispererPython.INSTANCE,
373377
)
374378
)
375-
doNothing().whenever(pythonTracker).emitCodeWhispererCodeContribution()
379+
doNothing().whenever(sut).emitCodeWhispererCodeContribution()
376380

377-
pythonTracker.activateTrackerIfNotActive()
378-
assertThat(pythonTracker.activeRequestCount()).isEqualTo(1)
379-
pythonTracker.forceTrackerFlush()
381+
sut.activateTrackerIfNotActive()
382+
assertThat(sut.activeRequestCount()).isEqualTo(1)
383+
sut.forceTrackerFlush()
380384

381-
verify(pythonTracker, Times(1)).emitCodeWhispererCodeContribution()
382-
assertThat(pythonTracker.activeRequestCount()).isEqualTo(1)
385+
verify(sut, Times(1)).emitCodeWhispererCodeContribution()
386+
assertThat(sut.activeRequestCount()).isEqualTo(1)
383387
}
384388

385389
@Test
@@ -391,7 +395,7 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
391395
on { document } doReturn fixture.editor.document
392396
}
393397

394-
val pythonTracker = spy(
398+
sut = spy(
395399
TestCodePercentageTracker(
396400
project,
397401
TOTAL_SECONDS_IN_MINUTE,
@@ -404,7 +408,7 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
404408
onGeneric { getAcceptedTokensDelta(any(), any()) } doReturn 99
405409
}
406410

407-
pythonTracker.emitCodeWhispererCodeContribution()
411+
sut.emitCodeWhispererCodeContribution()
408412

409413
val metricCaptor = argumentCaptor<MetricEvent>()
410414
verify(batcher, Times(1)).enqueue(metricCaptor.capture())
@@ -422,13 +426,13 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
422426
@Test
423427
fun `test flush() won't emit telemetry event when users not enabling telemetry`() {
424428
AwsSettings.getInstance().isTelemetryEnabled = false
425-
val pythonTracker = spy(TestCodePercentageTracker(project, TOTAL_SECONDS_IN_MINUTE, CodeWhispererPython.INSTANCE))
426-
doNothing().whenever(pythonTracker).emitCodeWhispererCodeContribution()
429+
sut = spy(TestCodePercentageTracker(project, TOTAL_SECONDS_IN_MINUTE, CodeWhispererPython.INSTANCE))
430+
doNothing().whenever(sut).emitCodeWhispererCodeContribution()
427431

428-
pythonTracker.activateTrackerIfNotActive()
429-
pythonTracker.forceTrackerFlush()
432+
sut.activateTrackerIfNotActive()
433+
sut.forceTrackerFlush()
430434

431-
verify(pythonTracker, Times(0)).emitCodeWhispererCodeContribution()
435+
verify(sut, Times(0)).emitCodeWhispererCodeContribution()
432436
}
433437

434438
@Test
@@ -478,10 +482,10 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
478482

479483
@Test
480484
fun `test flush() won't emit telemetry when users are not editing the document (totalTokens == 0)`() {
481-
val pythonTracker = TestCodePercentageTracker(project, TOTAL_SECONDS_IN_MINUTE, CodeWhispererPython.INSTANCE)
482-
pythonTracker.activateTrackerIfNotActive()
483-
assertThat(pythonTracker.activeRequestCount()).isEqualTo(1)
484-
pythonTracker.forceTrackerFlush()
485+
sut = TestCodePercentageTracker(project, TOTAL_SECONDS_IN_MINUTE, CodeWhispererPython.INSTANCE)
486+
sut.activateTrackerIfNotActive()
487+
assertThat(sut.activeRequestCount()).isEqualTo(1)
488+
sut.forceTrackerFlush()
485489
verify(batcher, Times(0)).enqueue(any())
486490
}
487491

@@ -518,23 +522,23 @@ internal class CodeWhispererCodeCoverageTrackerTestJava : CodeWhispererCodeCover
518522
}
519523
""".trimIndent()
520524
val file = fixture.configureByText("test.java", codeNeedToBeReformatted)
521-
val tracker = spy(
525+
sut = spy(
522526
TestCodePercentageTracker(
523527
project,
524528
TOTAL_SECONDS_IN_MINUTE,
525529
language = CodeWhispererJava.INSTANCE,
526530
codeCoverageTokens = mutableMapOf(fixture.editor.document to CodeCoverageTokens(totalTokens = codeNeedToBeReformatted.length))
527531
)
528532
)
529-
CodeWhispererCodeCoverageTracker.getInstancesMap()[CodeWhispererJava.INSTANCE] = tracker
533+
CodeWhispererCodeCoverageTracker.getInstancesMap()[CodeWhispererJava.INSTANCE] = sut
530534
runInEdtAndWait {
531535
WriteCommandAction.runWriteCommandAction(project) {
532536
CodeStyleManager.getInstance(project).reformatText(file, 0, fixture.editor.document.textLength)
533537
}
534538
}
535539
// reformat should fire documentChanged events, but tracker should not update token from these events
536-
verify(tracker, atLeastOnce()).documentChanged(any())
537-
assertThat(tracker.totalTokensSize).isEqualTo(codeNeedToBeReformatted.length)
540+
verify(sut, atLeastOnce()).documentChanged(any())
541+
assertThat(sut.totalTokensSize).isEqualTo(codeNeedToBeReformatted.length)
538542

539543
val formatted = """
540544
class Answer {

0 commit comments

Comments
 (0)