Skip to content

Commit 578aec1

Browse files
authored
CW: Removing unnecessary code duplication in security scans. (#4049)
* CW: Simplifying Test cases * CW: Test case for Go * CW: Code Changes * CW: Text changes for invalid file in MessagesBundle.properties * CW: Change in payload size from 1MB to 200KB * CW: Removal of TS Dependency and merge with JS Dependency * CW: Addressing comments --------- Co-authored-by: Laxman Reddy <[email protected]>
1 parent 79d2fdc commit 578aec1

16 files changed

+107
-264
lines changed

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/sessionconfig/CodeScanSessionConfig.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,8 @@ sealed class CodeScanSessionConfig(
216216
when (file.programmingLanguage().toTelemetryType()) {
217217
CodewhispererLanguage.Java -> JavaCodeScanSessionConfig(file, project)
218218
CodewhispererLanguage.Python -> PythonCodeScanSessionConfig(file, project)
219-
CodewhispererLanguage.Javascript -> JavaScriptCodeScanSessionConfig(file, project)
220-
CodewhispererLanguage.Typescript -> TypeScriptCodeScanSessionConfig(file, project)
219+
CodewhispererLanguage.Javascript -> JavaScriptCodeScanSessionConfig(file, project, CodewhispererLanguage.Javascript)
220+
CodewhispererLanguage.Typescript -> JavaScriptCodeScanSessionConfig(file, project, CodewhispererLanguage.Typescript)
221221
CodewhispererLanguage.Csharp -> CsharpCodeScanSessionConfig(file, project)
222222
CodewhispererLanguage.Yaml -> CloudFormationYamlCodeScanSessionConfig(file, project)
223223
CodewhispererLanguage.Json -> CloudFormationJsonCodeScanSessionConfig(file, project)

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/sessionconfig/JavaScriptCodeScanSessionConfig.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,25 @@ import software.aws.toolkits.core.utils.exists
1010
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.JS_CODE_SCAN_TIMEOUT_IN_SECONDS
1111
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.JS_PAYLOAD_LIMIT_IN_BYTES
1212
import software.aws.toolkits.resources.message
13+
import software.aws.toolkits.telemetry.CodewhispererLanguage
1314
import java.io.IOException
1415
import java.nio.file.Path
1516

1617
internal class JavaScriptCodeScanSessionConfig(
1718
private val selectedFile: VirtualFile,
18-
private val project: Project
19+
private val project: Project,
20+
private val language: CodewhispererLanguage
1921
) : CodeScanSessionConfig(selectedFile, project) {
2022

2123
private val importRegex = Regex("^import.*(?:[\"'](.+)[\"']);?\$")
2224
private val requireRegex = Regex("^.+require\\(['\"](.+)['\"]\\)[ \\t]*;?")
23-
override val sourceExt: List<String> = listOf(".js")
25+
override val sourceExt by lazy {
26+
if (language === CodewhispererLanguage.Javascript) {
27+
listOf(".js")
28+
} else {
29+
listOf(".ts")
30+
}
31+
}
2432

2533
override fun overallJobTimeoutInSeconds(): Long = JS_CODE_SCAN_TIMEOUT_IN_SECONDS
2634

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/sessionconfig/TypeScriptCodeScanSessionConfig.kt

Lines changed: 0 additions & 81 deletions
This file was deleted.

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererConstants.kt

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,6 @@ object CodeWhispererConstants {
3636
val AWSTemplateKeyWordsRegex = Regex("(AWSTemplateFormatVersion|Resources|AWS::|Description)")
3737
val AWSTemplateCaseInsensitiveKeyWordsRegex = Regex("(cloudformation|cfn|template|description)")
3838

39-
const val USING: String = "using"
40-
const val GLOBAL_USING: String = "global using"
41-
const val STATIC: String = "static"
42-
const val REQUIRE: String = "require"
43-
const val REQUIRE_RELATIVE: String = "require_relative"
44-
const val LOAD: String = "load"
45-
const val INCLUDE: String = "include"
46-
const val EXTEND: String = "extend"
47-
const val AS: String = " as "
48-
4939
// TODO: this is currently set to 2050 to account for the server side 0.5 TPS and and extra 50 ms buffer to
5040
// avoid ThrottlingException as much as possible.
5141
const val INVOCATION_INTERVAL: Long = 2050
@@ -70,7 +60,7 @@ object CodeWhispererConstants {
7060
const val CSHARP_CODE_SCAN_TIMEOUT_IN_SECONDS: Long = 60
7161
const val CSHARP_PAYLOAD_LIMIT_IN_BYTES = 1024 * 1024 // 1MB
7262
const val RUBY_CODE_SCAN_TIMEOUT_IN_SECONDS: Long = 60
73-
const val RUBY_PAYLOAD_LIMIT_IN_BYTES = 1024 * 1024 // 1MB
63+
const val RUBY_PAYLOAD_LIMIT_IN_BYTES = 1024 * 200 // 200KB
7464
const val CLOUDFORMATION_CODE_SCAN_TIMEOUT_IN_SECONDS: Long = 60
7565
const val CLOUDFORMATION_PAYLOAD_LIMIT_IN_BYTES = 1024 * 200 // 200KB
7666
const val TERRAFORM_CODE_SCAN_TIMEOUT_IN_SECONDS: Long = 60
@@ -80,7 +70,7 @@ object CodeWhispererConstants {
8070
const val JS_CODE_SCAN_TIMEOUT_IN_SECONDS: Long = 60
8171
const val JS_PAYLOAD_LIMIT_IN_BYTES = 1024 * 200 // 200KB
8272
const val GO_CODE_SCAN_TIMEOUT_IN_SECONDS: Long = 60
83-
const val GO_PAYLOAD_LIMIT_IN_BYTES = 1024 * 1024 // 1MB
73+
const val GO_PAYLOAD_LIMIT_IN_BYTES = 1024 * 200 // 200KB
8474
const val CODE_SCAN_POLLING_INTERVAL_IN_SECONDS: Long = 5
8575
const val CODE_SCAN_CREATE_PAYLOAD_TIMEOUT_IN_SECONDS: Long = 10
8676
const val TOTAL_BYTES_IN_KB = 1024
@@ -89,6 +79,15 @@ object CodeWhispererConstants {
8979
const val TOTAL_SECONDS_IN_MINUTE: Long = 60L
9080
const val ACCOUNTLESS_START_URL = "accountless"
9181
const val FEATURE_CONFIG_POLL_INTERVAL_IN_MS: Long = 30 * 60 * 1000L // 30 mins
82+
const val USING: String = "using"
83+
const val GLOBAL_USING: String = "global using"
84+
const val STATIC: String = "static"
85+
const val REQUIRE: String = "require"
86+
const val REQUIRE_RELATIVE: String = "require_relative"
87+
const val LOAD: String = "load"
88+
const val INCLUDE: String = "include"
89+
const val EXTEND: String = "extend"
90+
const val AS: String = " as "
9291

9392
// Date when Accountless is not supported
9493
val EXPIRE_DATE = SimpleDateFormat("yyyy-MM-dd").parse("2023-01-31")

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.github.tomakehurst.wiremock.junit.WireMockRule
88
import com.intellij.analysis.problemsView.toolWindow.ProblemsView
99
import com.intellij.openapi.application.ApplicationManager
1010
import com.intellij.openapi.project.Project
11+
import com.intellij.openapi.vfs.VirtualFile
1112
import com.intellij.openapi.wm.RegisterToolWindowTask
1213
import com.intellij.openapi.wm.ToolWindowManager
1314
import com.intellij.testFramework.ApplicationRule
@@ -19,12 +20,14 @@ import org.assertj.core.api.Assertions.assertThat
1920
import org.gradle.internal.impldep.com.amazonaws.ResponseMetadata
2021
import org.junit.Before
2122
import org.junit.Rule
23+
import org.junit.jupiter.api.assertThrows
2224
import org.mockito.kotlin.any
2325
import org.mockito.kotlin.doNothing
2426
import org.mockito.kotlin.doReturn
2527
import org.mockito.kotlin.isNull
2628
import org.mockito.kotlin.mock
2729
import org.mockito.kotlin.spy
30+
import org.mockito.kotlin.stub
2831
import org.mockito.kotlin.whenever
2932
import software.amazon.awssdk.awscore.DefaultAwsResponseMetadata
3033
import software.amazon.awssdk.services.codewhisperer.model.CodeScanStatus
@@ -226,6 +229,39 @@ open class CodeWhispererCodeScanTestBase(projectRule: CodeInsightTestFixtureRule
226229
}
227230
]
228231
"""
232+
internal fun getSourceFilesUnderProjectRoot(sessionConfigSpy: CodeScanSessionConfig, testFile: VirtualFile, size: Int) = assertThat(
233+
sessionConfigSpy.getSourceFilesUnderProjectRoot(testFile).size
234+
).isEqualTo(size)
235+
236+
internal fun getTotalProjectSizeInBytes(sessionConfigSpy: CodeScanSessionConfig, totalSize: Long) = runBlocking {
237+
assertThat(sessionConfigSpy.getTotalProjectSizeInBytes()).isEqualTo(totalSize)
238+
}
239+
240+
internal fun selectedFileLargerThanPayloadSizeThrowsException(sessionConfigSpy: CodeScanSessionConfig) {
241+
sessionConfigSpy.stub {
242+
onGeneric { getPayloadLimitInBytes() }.thenReturn(100)
243+
}
244+
assertThrows<CodeWhispererCodeScanException> {
245+
sessionConfigSpy.createPayload()
246+
}
247+
}
248+
249+
internal fun includeDependencies(
250+
sessionConfigSpy: CodeScanSessionConfig,
251+
includedSourceFilesSize: Long,
252+
totalSize: Long,
253+
expectedTotalLines: Long,
254+
expectedBuilds: Int
255+
) {
256+
val payloadMetadata = sessionConfigSpy.includeDependencies()
257+
assertNotNull(payloadMetadata)
258+
val (includedSourceFiles, srcPayloadSize, totalLines) = payloadMetadata
259+
assertThat(includedSourceFiles.size).isEqualTo(includedSourceFilesSize)
260+
assertThat(srcPayloadSize).isEqualTo(totalSize)
261+
assertThat(totalLines).isEqualTo(expectedTotalLines)
262+
assertThat(sessionConfigSpy.isProjectTruncated()).isFalse
263+
assertThat(payloadMetadata.buildPaths).hasSize(expectedBuilds)
264+
}
229265

230266
internal fun assertE2ERunsSuccessfully(
231267
sessionConfigSpy: CodeScanSessionConfig,

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

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@
44
package software.aws.toolkits.jetbrains.services.codewhisperer.codescan
55

66
import com.intellij.openapi.vfs.VirtualFile
7-
import kotlinx.coroutines.runBlocking
87
import org.assertj.core.api.Assertions.assertThat
98
import org.junit.Before
109
import org.junit.Test
11-
import org.junit.jupiter.api.assertThrows
1210
import org.mockito.kotlin.any
1311
import org.mockito.kotlin.spy
1412
import org.mockito.kotlin.stub
@@ -71,7 +69,7 @@ class CodeWhispererCsharpCodeScanTest : CodeWhispererCodeScanTestBase(PythonCode
7169

7270
@Test
7371
fun `test getSourceFilesUnderProjectRoot`() {
74-
assertThat(sessionConfigSpy.getSourceFilesUnderProjectRoot(testCs).size).isEqualTo(3)
72+
getSourceFilesUnderProjectRoot(sessionConfigSpy, testCs, 3)
7573
}
7674

7775
@Test
@@ -97,29 +95,17 @@ class CodeWhispererCsharpCodeScanTest : CodeWhispererCodeScanTestBase(PythonCode
9795

9896
@Test
9997
fun `test includeDependencies()`() {
100-
val payloadMetadata = sessionConfigSpy.includeDependencies()
101-
assertNotNull(payloadMetadata)
102-
val (includedSourceFiles, srcPayloadSize, totalLines) = payloadMetadata
103-
assertThat(includedSourceFiles.size).isEqualTo(3)
104-
assertThat(srcPayloadSize).isEqualTo(totalSize)
105-
assertThat(totalLines).isEqualTo(this.totalLines)
98+
includeDependencies(sessionConfigSpy, 3, totalSize, this.totalLines, 0)
10699
}
107100

108101
@Test
109102
fun `test getTotalProjectSizeInBytes()`() {
110-
runBlocking {
111-
assertThat(sessionConfigSpy.getTotalProjectSizeInBytes()).isEqualTo(totalSize)
112-
}
103+
getTotalProjectSizeInBytes(sessionConfigSpy, this.totalSize)
113104
}
114105

115106
@Test
116107
fun `selected file larger than payload limit throws exception`() {
117-
sessionConfigSpy.stub {
118-
onGeneric { getPayloadLimitInBytes() }.thenReturn(100)
119-
}
120-
assertThrows<CodeWhispererCodeScanException> {
121-
sessionConfigSpy.createPayload()
122-
}
108+
selectedFileLargerThanPayloadSizeThrowsException(sessionConfigSpy)
123109
}
124110

125111
@Test

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

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import com.intellij.openapi.vfs.VirtualFile
77
import org.assertj.core.api.Assertions.assertThat
88
import org.junit.Before
99
import org.junit.Test
10-
import org.junit.jupiter.api.assertThrows
1110
import org.mockito.kotlin.any
1211
import org.mockito.kotlin.spy
1312
import org.mockito.kotlin.stub
@@ -44,6 +43,11 @@ class CodeWhispererGoCodeScanTest : CodeWhispererCodeScanTestBase(PythonCodeInsi
4443
}
4544
}
4645

46+
@Test
47+
fun `test getTotalProjectSizeInBytes()`() {
48+
getTotalProjectSizeInBytes(sessionConfigSpy, this.totalSize)
49+
}
50+
4751
@Test
4852
fun `test createPayload`() {
4953
val payload = sessionConfigSpy.createPayload()
@@ -70,7 +74,7 @@ class CodeWhispererGoCodeScanTest : CodeWhispererCodeScanTestBase(PythonCodeInsi
7074

7175
@Test
7276
fun `test getSourceFilesUnderProjectRoot`() {
73-
assertThat(sessionConfigSpy.getSourceFilesUnderProjectRoot(mainGo).size).isEqualTo(3)
77+
getSourceFilesUnderProjectRoot(sessionConfigSpy, mainGo, 3)
7478
}
7579

7680
@Test
@@ -96,23 +100,12 @@ class CodeWhispererGoCodeScanTest : CodeWhispererCodeScanTestBase(PythonCodeInsi
96100

97101
@Test
98102
fun `test includeDependencies()`() {
99-
val payloadMetadata = sessionConfigSpy.includeDependencies()
100-
assertNotNull(payloadMetadata)
101-
assertThat(sessionConfigSpy.isProjectTruncated()).isFalse
102-
assertThat(payloadMetadata.sourceFiles.size).isEqualTo(3)
103-
assertThat(payloadMetadata.payloadSize).isEqualTo(totalSize)
104-
assertThat(payloadMetadata.linesScanned).isEqualTo(totalLines)
105-
assertThat(payloadMetadata.buildPaths).hasSize(0)
103+
includeDependencies(sessionConfigSpy, 3, totalSize, this.totalLines, 0)
106104
}
107105

108106
@Test
109107
fun `selected file larger than payload limit throws exception`() {
110-
sessionConfigSpy.stub {
111-
onGeneric { getPayloadLimitInBytes() }.thenReturn(100)
112-
}
113-
assertThrows<CodeWhispererCodeScanException> {
114-
sessionConfigSpy.createPayload()
115-
}
108+
selectedFileLargerThanPayloadSizeThrowsException(sessionConfigSpy)
116109
}
117110

118111
@Test

0 commit comments

Comments
 (0)