Skip to content

Commit 4f5f56d

Browse files
authored
Add E2E test for gateway connect (#3577)
1 parent 0a8ab64 commit 4f5f56d

File tree

25 files changed

+461
-35
lines changed

25 files changed

+461
-35
lines changed

buildspec/linuxIntegrationTests.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ phases:
2424
- export PATH="${PATH}:${DOTNET_ROOT}"
2525
- export PATH="$PATH:$HOME/.dotnet/tools"
2626
- dotnet codeartifact-creds install
27+
# should probably be managed as an extension/rule in any tests that need a screen available
28+
- /usr/bin/Xvfb :22 -screen 0 1920x1080x24 &
2729

2830
build:
2931
commands:
@@ -41,7 +43,7 @@ phases:
4143
credential_source=EcsContainer"
4244
4345
- chmod +x gradlew
44-
- ./gradlew -PideProfileName=$ALTERNATIVE_IDE_PROFILE_NAME integrationTest coverageReport --info --console plain
46+
- DISPLAY=:22 ./gradlew -PideProfileName=$ALTERNATIVE_IDE_PROFILE_NAME integrationTest coverageReport --info --console plain
4547
- |
4648
if [ $(docker ps -q | wc -l) -gt 0 ]; then
4749
echo 'Docker containers were not completely cleaned up!';

jetbrains-core/detekt-baseline-test.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,6 @@
135135
<ID>UseCheckOrError:JavaTestUtils.kt$throw IllegalStateException("Failed to locate gradlew")</ID>
136136
<ID>UseCheckOrError:MockClientManager.kt$MockClientManager$throw IllegalStateException("No mock registered for $sdkClass")</ID>
137137
<ID>UseCheckOrError:MockRegionProvider.kt$MockRegionProviderRule$throw IllegalStateException("Failed to generate a unique region ID")</ID>
138-
<ID>UseCheckOrError:MockToolManager.kt$MockToolManager$throw IllegalStateException("Must register ManagedToolType via a MockMockToolManagerRule before using it in a test")</ID>
139138
<ID>UseCheckOrError:RunWithRealCredentials.kt$RunWithRealCredentials.&lt;no name provided>$throw IllegalStateException("Can't locate us-west-2")</ID>
140139
<ID>UseCheckOrError:RunWithRealCredentials.kt$RunWithRealCredentials.&lt;no name provided>$throw IllegalStateException("RunWithRealCredentials requires a default AWS profile!")</ID>
141140
<ID>UseOrEmpty:EditAttributesDialogTest.kt$EditAttributesDialogTest$testMessageSize?.toString() ?: ""</ID>

jetbrains-core/detekt-baseline.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,6 @@
166166
<ID>UseCheckOrError:LocalLambdaRunSettings.kt$throw IllegalStateException("Can't find debugger support for $this")</ID>
167167
<ID>UseCheckOrError:MockClientManager.kt$MockClientManager$throw IllegalStateException("No mock registered for $sdkClass")</ID>
168168
<ID>UseCheckOrError:MockRegionProvider.kt$MockRegionProviderRule$throw IllegalStateException("Failed to generate a unique region ID")</ID>
169-
<ID>UseCheckOrError:MockToolManager.kt$MockToolManager$throw IllegalStateException("Must register ManagedToolType via a MockMockToolManagerRule before using it in a test")</ID>
170169
<ID>UseCheckOrError:OpenShellInContainerDialog.kt$OpenShellInContainerDialog$throw IllegalStateException("Task not Selected")</ID>
171170
<ID>UseCheckOrError:ProfileCredentialProviderFactory.kt$ProfileCredentialProviderFactory$throw IllegalStateException("Profile $sourceProfileName looks to have been removed")</ID>
172171
<ID>UseCheckOrError:ProfileCredentialProviderFactory.kt$ProfileCredentialProviderFactory$throw IllegalStateException("Profile ${profileProviderId.profileName} looks to have been removed")</ID>

jetbrains-core/src-222+/software/aws/toolkits/jetbrains/services/caws/CawsParameterDescriptions.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,21 +44,19 @@ data class Ram(
4444
)
4545

4646
fun isSubscriptionFreeTier(
47-
existingProject: CawsProject?,
4847
client: CodeCatalystClient,
4948
space: String?
5049
): Boolean {
5150
val subscriptionTier = if (space != null) {
52-
checkIfSubscriptionIsFreeTier(client, space)
51+
client.getSubscription {
52+
it.spaceName(space)
53+
}.subscriptionType()
5354
} else {
5455
return true
5556
}
5657

5758
return subscriptionTier == "FREE"
5859
}
59-
fun checkIfSubscriptionIsFreeTier(client: CodeCatalystClient, org: String): String = client.getSubscription {
60-
it.spaceName(org)
61-
}.subscriptionType()
6260

6361
fun InstanceType.isSupportedInFreeTier() =
6462
when (this) {

jetbrains-core/src/software/aws/toolkits/jetbrains/AwsToolkit.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
package software.aws.toolkits.jetbrains
55

66
import com.intellij.ide.plugins.PluginManagerCore
7+
import com.intellij.openapi.application.ApplicationManager
78
import com.intellij.openapi.extensions.PluginDescriptor
89
import com.intellij.openapi.extensions.PluginId
910
import com.intellij.openapi.util.registry.Registry
11+
import java.nio.file.Paths
1012

1113
object AwsToolkit {
1214
const val PLUGIN_ID = "aws.toolkit"
@@ -21,7 +23,11 @@ object AwsToolkit {
2123
PluginManagerCore.getPlugin(PluginId.getId(PLUGIN_ID))
2224
}
2325

24-
fun pluginPath() = DESCRIPTOR?.pluginPath ?: throw RuntimeException("Toolkit root not available")
26+
fun pluginPath() = if (ApplicationManager.getApplication().isUnitTestMode) {
27+
Paths.get(System.getProperty("plugin.path"))
28+
} else {
29+
DESCRIPTOR?.pluginPath ?: throw RuntimeException("Toolkit root not available")
30+
}
2531

2632
fun isDeveloperMode() = Registry.`is`("aws.toolkit.developerMode", false)
2733
}

jetbrains-core/tst/software/aws/toolkits/jetbrains/core/credentials/sso/MockSsoLoginCallbackProvider.kt

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,32 @@ import software.aws.toolkits.jetbrains.utils.scrubException
1818

1919
internal class MockSsoLoginCallbackProvider : SsoLoginCallbackProvider {
2020
internal var provider: SsoLoginCallback? = null
21-
private object NoOpSsoLoginCallback : SsoLoginCallback {
22-
override fun tokenPending(authorization: Authorization) {}
21+
private object ErrorSsoLoginCallback : SsoLoginCallback {
22+
override fun tokenPending(authorization: Authorization) {
23+
error("Not implemented")
24+
}
2325

2426
override fun tokenRetrieved() {}
2527

2628
override fun tokenRetrievalFailure(e: Exception) {}
2729
}
2830

2931
override fun getProvider(ssoUrl: String): SsoLoginCallback =
30-
provider ?: NoOpSsoLoginCallback
32+
provider ?: ErrorSsoLoginCallback
3133

3234
companion object {
3335
fun getInstance() = service<SsoLoginCallbackProvider>() as MockSsoLoginCallbackProvider
3436
}
3537
}
3638

39+
object NoOpSsoLoginCallback : SsoLoginCallback {
40+
override fun tokenPending(authorization: Authorization) {}
41+
42+
override fun tokenRetrieved() {}
43+
44+
override fun tokenRetrievalFailure(e: Exception) {}
45+
}
46+
3747
internal class TestSsoPrompt(private val secretName: String) : SsoLoginCallback {
3848
override fun tokenPending(authorization: Authorization) {
3949
val authLambda = System.getenv(authLambdaArn)

jetbrains-core/tst/software/aws/toolkits/jetbrains/core/credentials/sso/SsoAccessTokenProviderTest.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package software.aws.toolkits.jetbrains.core.credentials.sso
55

66
import com.intellij.testFramework.ApplicationRule
7+
import com.intellij.testFramework.RuleChain
78
import kotlinx.coroutines.runBlocking
89
import org.assertj.core.api.Assertions.assertThat
910
import org.assertj.core.api.Assertions.assertThatThrownBy
@@ -32,6 +33,7 @@ import software.amazon.awssdk.services.ssooidc.model.StartDeviceAuthorizationRes
3233
import software.aws.toolkits.core.region.aRegionId
3334
import software.aws.toolkits.core.utils.delegateMock
3435
import software.aws.toolkits.core.utils.test.aString
36+
import software.aws.toolkits.jetbrains.utils.rules.SsoLoginCallbackProviderRule
3537
import java.time.Clock
3638
import java.time.Duration
3739
import java.time.Instant
@@ -50,9 +52,12 @@ class SsoAccessTokenProviderTest {
5052
private lateinit var sut: SsoAccessTokenProvider
5153
private lateinit var ssoCache: SsoCache
5254

55+
private val applicationRule = ApplicationRule()
56+
private val ssoCallbackRule = SsoLoginCallbackProviderRule()
57+
5358
@JvmField
5459
@Rule
55-
val applicationRule = ApplicationRule()
60+
val ruleChain = RuleChain(applicationRule, ssoCallbackRule)
5661

5762
@Before
5863
fun setUp() {

jetbrains-core/tst/software/aws/toolkits/jetbrains/core/tools/MockToolManager.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@
33

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

6+
import com.intellij.openapi.Disposable
7+
import com.intellij.openapi.application.ApplicationManager
68
import com.intellij.openapi.components.service
79
import com.intellij.openapi.project.Project
810
import com.intellij.testFramework.ApplicationRule
11+
import com.intellij.testFramework.replaceService
912
import java.nio.file.Path
1013

1114
@Suppress("UNCHECKED_CAST")
@@ -16,7 +19,7 @@ internal class MockToolManager : ToolManager {
1619
override fun <V : Version> getTool(type: ToolType<V>): Tool<ToolType<V>>? = tools[type]?.let { it as Tool<ToolType<V>> }
1720

1821
override fun <V : Version> getOrInstallTool(type: ManagedToolType<V>, project: Project?): Tool<ToolType<V>> =
19-
getTool(type) ?: throw IllegalStateException("Must register ManagedToolType via a MockMockToolManagerRule before using it in a test")
22+
getTool(type) ?: error("Must register ManagedToolType via a MockToolManagerRule before using it in a test")
2023

2124
override fun <V : Version> getToolForPath(type: ToolType<V>, toolExecutablePath: Path): Tool<ToolType<V>> {
2225
TODO("Not yet implemented")
@@ -42,4 +45,11 @@ class MockToolManagerRule : ApplicationRule() {
4245
override fun after() {
4346
getMockInstance().tools.clear()
4447
}
48+
49+
companion object {
50+
fun useRealTools(disposable: Disposable) {
51+
val toolManager = DefaultToolManager()
52+
ApplicationManager.getApplication().replaceService(ToolManager::class.java, toolManager, disposable)
53+
}
54+
}
4555
}

jetbrains-ultimate/it/software/aws/toolkits/jetbrains/utils/UltimateTestUtils.kt renamed to jetbrains-core/tst/software/aws/toolkits/jetbrains/utils/FrameworkTestUtils.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
// Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
1+
// Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
// SPDX-License-Identifier: Apache-2.0
33

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

66
import org.jetbrains.ide.BuiltInServerManager
77
import java.util.concurrent.atomic.AtomicReference
88

9-
object UltimateTestUtils {
9+
object FrameworkTestUtils {
1010
private val serverStarted = AtomicReference(false)
1111

12-
// Make sure the built in sever is started. This is not done in unit test mode, so it must be done
13-
// for several integration tests
12+
// Make sure the built in server is started. This is not done in unit test mode, so it must be done
13+
// for several integration tests in ultimate/gateway
1414
fun ensureBuiltInServerStarted() {
1515
serverStarted.getAndUpdate { started ->
1616
if (!started) {
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package software.aws.toolkits.jetbrains.utils.extensions
5+
6+
import org.junit.jupiter.api.extension.AfterAllCallback
7+
import org.junit.jupiter.api.extension.ExtensionContext
8+
import software.amazon.awssdk.services.codecatalyst.CodeCatalystClient
9+
import software.amazon.awssdk.services.codecatalyst.model.CreateDevEnvironmentRequest
10+
import software.aws.toolkits.jetbrains.core.AwsClientManager
11+
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection
12+
13+
class DevEnvironmentExtension(
14+
connection: () -> ToolkitConnection,
15+
environmentBuilder: (CodeCatalystClient, CreateDevEnvironmentRequest.Builder) -> Unit
16+
) : AfterAllCallback {
17+
private val client: CodeCatalystClient by lazy {
18+
AwsClientManager.getInstance().getClient(connection().getConnectionSettings())
19+
}
20+
21+
private val lazyEnvironment = lazy {
22+
client.createDevEnvironment {
23+
environmentBuilder(client, it)
24+
}.let {
25+
DevEnvironment(
26+
spaceName = it.spaceName(),
27+
projectName = it.projectName(),
28+
id = it.id()
29+
)
30+
}
31+
}
32+
val environment: DevEnvironment by lazyEnvironment
33+
34+
override fun afterAll(context: ExtensionContext) {
35+
if (lazyEnvironment.isInitialized()) {
36+
client.deleteDevEnvironment {
37+
it.spaceName(environment.spaceName)
38+
it.projectName(environment.projectName)
39+
it.id(environment.id)
40+
}
41+
}
42+
}
43+
}
44+
45+
data class DevEnvironment(
46+
val spaceName: String,
47+
val projectName: String,
48+
val id: String
49+
)

0 commit comments

Comments
 (0)