Skip to content

Commit 03575f2

Browse files
committed
atomic boolean
1 parent 0c29dde commit 03575f2

File tree

2 files changed

+25
-21
lines changed

2 files changed

+25
-21
lines changed

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/credentials/ToolkitAuthManager.kt

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import com.intellij.openapi.extensions.ExtensionPointName
1010
import com.intellij.openapi.progress.ProcessCanceledException
1111
import com.intellij.openapi.project.Project
1212
import migration.software.aws.toolkits.jetbrains.services.telemetry.TelemetryService
13+
import org.jetbrains.annotations.VisibleForTesting
1314
import software.amazon.awssdk.services.ssooidc.model.SsoOidcException
1415
import software.aws.toolkits.core.ClientConnectionSettings
1516
import software.aws.toolkits.core.ConnectionSettings
@@ -36,6 +37,7 @@ import software.aws.toolkits.telemetry.CredentialType
3637
import software.aws.toolkits.telemetry.Result
3738
import java.net.UnknownHostException
3839
import java.time.Instant
40+
import java.util.concurrent.atomic.AtomicBoolean
3941

4042
sealed interface ToolkitConnection {
4143
val id: String
@@ -276,7 +278,7 @@ fun reauthConnectionIfNeeded(
276278
source = source,
277279
)
278280
}
279-
hasSeenFirstNetworkError = false
281+
hasSeenFirstNetworkError.set(false)
280282
} catch (e: Exception) {
281283
if (isReAuth) {
282284
val result = if (e is ProcessCanceledException) Result.Cancelled else Result.Failed
@@ -328,7 +330,7 @@ fun maybeReauthProviderIfNeeded(
328330
return runUnderProgressIfNeeded(project, AwsCoreBundle.message("credentials.refreshing"), true) {
329331
tokenProvider.resolveToken()
330332
BearerTokenProviderListener.notifyCredUpdate(tokenProvider.id)
331-
hasSeenFirstNetworkError = false
333+
hasSeenFirstNetworkError.set(false)
332334
return@runUnderProgressIfNeeded false
333335
}
334336
} catch (e: Exception) {
@@ -339,17 +341,14 @@ fun maybeReauthProviderIfNeeded(
339341
onReauthRequired(e)
340342
return true
341343
}
342-
e is UnknownHostException || e.message?.contains("Unable to execute HTTP request") == true -> {
344+
e is UnknownHostException || e is RuntimeException -> {
343345
getLogger<ToolkitAuthManager>().warn(e) { "Failed to refresh token" }
344-
synchronized(networkErrorLock) {
345-
if (!hasSeenFirstNetworkError) {
346-
hasSeenFirstNetworkError = true
347-
notifyInfo(
348-
message("general.auth.network.error"),
349-
message("general.auth.network.error.message"),
350-
project
351-
)
352-
}
346+
if (hasSeenFirstNetworkError.compareAndSet(false, true)) {
347+
notifyInfo(
348+
message("general.auth.network.error"),
349+
message("general.auth.network.error.message"),
350+
project
351+
)
353352
}
354353
return false
355354
}
@@ -435,8 +434,12 @@ private fun recordAddConnection(
435434
}
436435
}
437436

438-
private var hasSeenFirstNetworkError = false
439-
private val networkErrorLock = Object()
437+
private var hasSeenFirstNetworkError: AtomicBoolean = AtomicBoolean(false)
438+
439+
@VisibleForTesting
440+
internal fun resetNetworkErrorState() {
441+
hasSeenFirstNetworkError.set(false)
442+
}
440443

441444
data class ConnectionMetadata(
442445
val sourceId: String? = null,

plugins/core/jetbrains-community/tst/software/aws/toolkits/jetbrains/core/credentials/ToolkitAuthManagerTest.kt

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
package software.aws.toolkits.jetbrains.core.credentials
55

6-
import com.intellij.ide.util.PropertiesComponent
6+
77
import com.intellij.openapi.project.Project
88
import com.intellij.testFramework.ApplicationExtension
99
import io.mockk.every
@@ -12,7 +12,11 @@ import io.mockk.mockkObject
1212
import io.mockk.mockkStatic
1313
import io.mockk.runs
1414
import io.mockk.verify
15-
import org.junit.jupiter.api.Assertions.*
15+
import io.mockk.every
16+
import io.mockk.mockk
17+
import io.mockk.clearAllMocks
18+
import org.junit.jupiter.api.Assertions.assertFalse
19+
import org.junit.jupiter.api.Assertions.assertEquals
1620
import org.junit.jupiter.api.BeforeEach
1721
import org.junit.jupiter.api.Test
1822
import org.junit.jupiter.api.TestInstance
@@ -43,24 +47,21 @@ class ToolkitAuthManagerTest {
4347
tokenProvider = mock()
4448
reauthCallCount = 0
4549

46-
val field = Class.forName("software.aws.toolkits.jetbrains.core.credentials.ToolkitAuthManagerKt")
47-
.getDeclaredField("hasSeenFirstNetworkError")
48-
field.isAccessible = true
49-
field.set(null, false)
5050

5151
mockkObject(BearerTokenProviderListener)
5252
mockkStatic("software.aws.toolkits.jetbrains.utils.NotificationUtilsKt")
5353
every {
5454
notifyInfo(any(), any(), any())
5555
} just runs
5656
every { BearerTokenProviderListener.notifyCredUpdate(any<String>()) } just runs
57+
resetNetworkErrorState()
5758
}
5859

5960
@Test
6061
fun `test NEEDS_REFRESH state with network error - first occurrence`() {
6162
whenever(tokenProvider.state()).thenReturn(BearerTokenAuthState.NEEDS_REFRESH)
6263
doThrow(RuntimeException("Unable to execute HTTP request"))
63-
.`when`(tokenProvider)
64+
.whenever(tokenProvider)
6465
.resolveToken()
6566

6667
val result = maybeReauthProviderIfNeeded(

0 commit comments

Comments
 (0)