Skip to content

Commit af54b0f

Browse files
committed
ETag fix
1 parent b2b9849 commit af54b0f

File tree

4 files changed

+14
-46
lines changed

4 files changed

+14
-46
lines changed

plugins/core/core/src/software/aws/toolkits/core/utils/RemoteResourceResolver.kt

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

44
package software.aws.toolkits.core.utils
55

6-
import com.intellij.util.io.HttpRequests
76
import java.io.FileInputStream
87
import java.io.InputStream
98
import java.nio.file.Files
@@ -126,13 +125,9 @@ class DefaultRemoteResourceResolver(
126125

127126
private fun getEndpointETag(endpoint: String): String =
128127
try {
129-
HttpRequests.head(endpoint)
130-
.userAgent("AWS Toolkit for JetBrains")
131-
.connect { request ->
132-
request.connection.headerFields["ETag"]?.firstOrNull().orEmpty()
133-
}
128+
urlFetcher.getETag(endpoint)
134129
} catch (e: Exception) {
135-
LOG.warn { "Failed to fetch notification ETag: ${e.message}" }
130+
LOG.warn(e) { "Failed to fetch ETag: $e.message" }
136131
throw e
137132
}
138133

@@ -157,6 +152,7 @@ class DefaultRemoteResourceResolver(
157152

158153
interface UrlFetcher {
159154
fun fetch(url: String, file: Path)
155+
fun getETag(url: String): String
160156
}
161157

162158
/**

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package software.aws.toolkits.jetbrains.core
55

66
import com.intellij.openapi.application.PathManager
7+
import com.intellij.util.io.HttpRequests
78
import com.intellij.util.io.createDirectories
89
import software.aws.toolkits.core.utils.DefaultRemoteResourceResolver
910
import software.aws.toolkits.core.utils.UrlFetcher
@@ -38,6 +39,13 @@ class DefaultRemoteResourceResolverProvider : RemoteResourceResolverProvider {
3839
override fun fetch(url: String, file: Path) {
3940
saveFileFromUrl(url, file)
4041
}
42+
43+
override fun getETag(url: String): String =
44+
HttpRequests.head(url)
45+
.userAgent("AWS Toolkit for JetBrains")
46+
.connect { request ->
47+
request.connection.headerFields["ETag"]?.firstOrNull().orEmpty()
48+
}
4149
}
4250
}
4351
}

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/ProcessNotificationsBase.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import software.aws.toolkits.jetbrains.utils.notifyStickyWithData
2121
import software.aws.toolkits.telemetry.Component
2222
import software.aws.toolkits.telemetry.Result
2323
import software.aws.toolkits.telemetry.ToolkitTelemetry
24-
import java.nio.file.Paths
2524
import java.util.concurrent.atomic.AtomicBoolean
2625

2726
object NotificationMapperUtil {

plugins/core/jetbrains-community/tst/software/aws/toolkits/jetbrains/core/notifications/NotificationResourceResolverTest.kt

Lines changed: 3 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@ package software.aws.toolkits.jetbrains.core.notifications
55

66
import com.intellij.testFramework.ApplicationExtension
77
import io.mockk.every
8-
import io.mockk.just
98
import io.mockk.mockk
10-
import io.mockk.mockkConstructor
11-
import io.mockk.runs
129
import org.assertj.core.api.Assertions.assertThat
1310
import org.junit.jupiter.api.BeforeEach
1411
import org.junit.jupiter.api.Test
@@ -17,8 +14,6 @@ import org.junit.jupiter.api.io.TempDir
1714
import software.aws.toolkits.core.utils.DefaultRemoteResourceResolver
1815
import software.aws.toolkits.core.utils.UpdateCheckResult
1916
import software.aws.toolkits.core.utils.UrlFetcher
20-
import java.net.HttpURLConnection
21-
import java.net.URL
2217
import java.nio.file.Path
2318
import java.util.concurrent.Callable
2419
import java.util.concurrent.CompletableFuture
@@ -45,39 +40,17 @@ class NotificationResourceResolverTest {
4540
fun `first poll with no ETag changes returns FirstPollCheck`() {
4641
NotificationEtagState.getInstance().etag = "same-etag"
4742
val expectedETag = "same-etag"
48-
val mockConnection = mockk<HttpURLConnection> {
49-
every { requestMethod = any() } just runs
50-
every { setRequestProperty(any(), any()) } just runs
51-
every { connect() } just runs
52-
every { getHeaderField("ETag") } returns expectedETag
53-
every { disconnect() } just runs
54-
}
55-
56-
mockkConstructor(URL::class)
57-
every { anyConstructed<URL>().openConnection() } returns mockConnection
43+
every { urlFetcher.getETag(any()) } returns expectedETag
5844

5945
val result = sut.checkForUpdates("http://notification.test", NotificationEtagState.getInstance())
6046
assertThat(result).isEqualTo(UpdateCheckResult.FirstPollCheck)
61-
62-
// Second call should not return FirstPollCheck
63-
val secondResult = sut.checkForUpdates("http://notification.test", NotificationEtagState.getInstance())
64-
assertThat(secondResult).isEqualTo(UpdateCheckResult.NoUpdates)
6547
}
6648

6749
@Test
6850
fun `ETag changes returns HasUpdates`() {
6951
NotificationEtagState.getInstance().etag = "old-etag"
7052
val expectedETag = "new-etag"
71-
val mockConnection = mockk<HttpURLConnection> {
72-
every { requestMethod = any() } just runs
73-
every { setRequestProperty(any(), any()) } just runs
74-
every { connect() } just runs
75-
every { getHeaderField("ETag") } returns expectedETag
76-
every { disconnect() } just runs
77-
}
78-
79-
mockkConstructor(URL::class)
80-
every { anyConstructed<URL>().openConnection() } returns mockConnection
53+
every { urlFetcher.getETag(any()) } returns expectedETag
8154

8255
val result = sut.checkForUpdates("http://notification.test", NotificationEtagState.getInstance())
8356
assertThat(result).isEqualTo(UpdateCheckResult.HasUpdates)
@@ -87,16 +60,8 @@ class NotificationResourceResolverTest {
8760
fun `no ETag changes returns NoUpdates after first poll`() {
8861
NotificationEtagState.getInstance().etag = "same-etag"
8962
val expectedETag = "same-etag"
90-
val mockConnection = mockk<HttpURLConnection> {
91-
every { requestMethod = any() } just runs
92-
every { setRequestProperty(any(), any()) } just runs
93-
every { connect() } just runs
94-
every { getHeaderField("ETag") } returns expectedETag
95-
every { disconnect() } just runs
96-
}
63+
every { urlFetcher.getETag(any()) } returns expectedETag
9764

98-
mockkConstructor(URL::class)
99-
every { anyConstructed<URL>().openConnection() } returns mockConnection
10065
// sets isFirstPoll to false
10166
val firstResult = sut.checkForUpdates("http://notification.test", NotificationEtagState.getInstance())
10267
assertThat(firstResult).isEqualTo(UpdateCheckResult.FirstPollCheck)

0 commit comments

Comments
 (0)