jetbrains-rider/it/software/aws/toolkits/jetbrains/services/lambda/dotnet/DotnetLocalLambdaRunConfigurationIntegrationTest.kt (155 lines of code) (raw):
// Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package software.aws.toolkits.jetbrains.services.lambda.dotnet
import base.AwsReuseSolutionTestBase
import com.intellij.execution.executors.DefaultDebugExecutor
import com.intellij.ide.util.PropertiesComponent
import com.jetbrains.rider.projectView.solutionDirectory
import com.jetbrains.rider.test.scriptingApi.removeAllBreakpoints
import org.assertj.core.api.Assertions.assertThat
import org.testng.annotations.AfterMethod
import org.testng.annotations.BeforeMethod
import org.testng.annotations.Test
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials
import software.aws.toolkits.core.lambda.LambdaRuntime
import software.aws.toolkits.core.utils.writeText
import software.aws.toolkits.jetbrains.core.credentials.MockCredentialsManager
import software.aws.toolkits.jetbrains.core.region.getDefaultRegion
import software.aws.toolkits.jetbrains.services.lambda.execution.local.createHandlerBasedRunConfiguration
import software.aws.toolkits.jetbrains.services.lambda.execution.local.createTemplateRunConfiguration
import software.aws.toolkits.jetbrains.utils.executeRunConfigurationAndWaitRider
import software.aws.toolkits.jetbrains.utils.jsonToMap
import software.aws.toolkits.jetbrains.utils.setSamExecutableFromEnvironment
import java.nio.file.Files
class Dotnet31LocalLambdaRunConfigurationIntegrationTest : DotnetLocalLambdaRunConfigurationIntegrationTestBase("EchoLambda3X", LambdaRuntime.DOTNETCORE3_1)
class Dotnet31LocalLambdaImageRunConfigurationIntegrationTest :
DotnetLocalLambdaImageRunConfigurationIntegrationTestBase("ImageLambda3X", LambdaRuntime.DOTNETCORE3_1)
class Dotnet50LocalLambdaImageRunConfigurationIntegrationTest :
DotnetLocalLambdaImageRunConfigurationIntegrationTestBase("ImageLambda5X", LambdaRuntime.DOTNET5_0)
abstract class DotnetLocalLambdaRunConfigurationIntegrationTestBase(private val solutionName: String, private val runtime: LambdaRuntime) :
AwsReuseSolutionTestBase() {
override val waitForCaches = false
private val mockId = "MockCredsId"
private val mockCreds = AwsBasicCredentials.create("Access", "ItsASecret")
private val handler = "EchoLambda::EchoLambda.Function::FunctionHandler"
private var initialImmediateWindow: Boolean = false
@BeforeMethod
fun setUp() {
// Disable the immediate window due to double release of editor in 203, this issue should be fixed in later Rider versions FIX_WHEN_MIN_IS_211
initialImmediateWindow = PropertiesComponent.getInstance().getBoolean("debugger.immediate.window.in.watches")
PropertiesComponent.getInstance().setValue("debugger.immediate.window.in.watches", false, true)
setSamExecutableFromEnvironment()
MockCredentialsManager.getInstance().addCredentials(mockId, mockCreds)
}
@AfterMethod
fun tearDown() {
PropertiesComponent.getInstance().setValue("debugger.immediate.window.in.watches", initialImmediateWindow)
}
override fun getSolutionDirectoryName(): String = solutionName
@Test
fun samIsExecutedDebugger() {
setBreakpoint()
val runConfiguration = createHandlerBasedRunConfiguration(
project = project,
runtime = runtime.toSdkRuntime(),
credentialsProviderId = mockId,
handler = handler
)
val executeLambda = executeRunConfigurationAndWaitRider(runConfiguration, DefaultDebugExecutor.EXECUTOR_ID)
assertThat(executeLambda.exitCode).isEqualTo(0)
}
@Test
fun samIsExecuted() {
val envVars = mutableMapOf("Foo" to "Bar", "Bat" to "Baz")
val runConfiguration = createHandlerBasedRunConfiguration(
project = project,
runtime = runtime.toSdkRuntime(),
credentialsProviderId = mockId,
handler = handler,
environmentVariables = envVars
)
val executeLambda = executeRunConfigurationAndWaitRider(runConfiguration)
assertThat(executeLambda.exitCode).isEqualTo(0)
assertThat(jsonToMap(executeLambda.stdout))
.describedAs("Environment variables are passed")
.containsEntry("Foo", "Bar")
.containsEntry("Bat", "Baz")
assertThat(jsonToMap(executeLambda.stdout))
.describedAs("Region is set")
.containsEntry("AWS_REGION", getDefaultRegion().id)
assertThat(jsonToMap(executeLambda.stdout))
.describedAs("Credentials are passed")
.containsEntry("AWS_ACCESS_KEY_ID", mockCreds.accessKeyId())
.containsEntry("AWS_SECRET_ACCESS_KEY", mockCreds.secretAccessKey())
// An empty AWS_SESSION_TOKEN is inserted by Samcli/the Lambda runtime as of 1.13.1
.containsEntry("AWS_SESSION_TOKEN", "")
}
@Test
fun samIsExecutedWithFileInput() {
val input = Files.createTempFile(tempTestDirectory.toPath(), "tmp", null).also {
it.writeText("Hello World")
}
val runConfiguration = createHandlerBasedRunConfiguration(
project = project,
runtime = runtime.toSdkRuntime(),
input = input.toString(),
inputIsFile = true,
credentialsProviderId = mockId,
handler = handler,
)
val executeLambda = executeRunConfigurationAndWaitRider(runConfiguration)
assertThat(executeLambda.exitCode).isEqualTo(0)
}
}
abstract class DotnetLocalLambdaImageRunConfigurationIntegrationTestBase(private val solutionName: String, private val runtime: LambdaRuntime) :
AwsReuseSolutionTestBase() {
override val waitForCaches = false
private val mockId = "MockCredsId"
private val mockCreds = AwsBasicCredentials.create("Access", "ItsASecret")
private var initialImmediateWindow: Boolean = false
@BeforeMethod
fun setUp() {
// Disable the immediate window due to double release of editor in 203, this issue should be fixed in later Rider versions FIX_WHEN_MIN_IS_211
initialImmediateWindow = PropertiesComponent.getInstance().getBoolean("debugger.immediate.window.in.watches")
PropertiesComponent.getInstance().setValue("debugger.immediate.window.in.watches", false, true)
setSamExecutableFromEnvironment()
MockCredentialsManager.getInstance().addCredentials(mockId, mockCreds)
}
@AfterMethod(alwaysRun = true)
fun tearDown() {
PropertiesComponent.getInstance().setValue("debugger.immediate.window.in.watches", initialImmediateWindow)
removeAllBreakpoints(project)
}
override fun getSolutionDirectoryName(): String = solutionName
@Test
fun samIsExecutedImage() {
val template = "${project.solutionDirectory}/template.yaml"
val runConfiguration = createTemplateRunConfiguration(
project = project,
runtime = runtime,
templateFile = template,
logicalId = "HelloWorldFunction",
input = "\"Hello World\"",
credentialsProviderId = mockId,
isImage = true
)
val executeLambda = executeRunConfigurationAndWaitRider(runConfiguration)
assertThat(executeLambda.exitCode).isEqualTo(0)
assertThat(jsonToMap(executeLambda.stdout))
.describedAs("Credentials are passed")
.containsEntry("AWS_ACCESS_KEY_ID", mockCreds.accessKeyId())
.containsEntry("AWS_SECRET_ACCESS_KEY", mockCreds.secretAccessKey())
// An empty AWS_SESSION_TOKEN is inserted by Samcli/the Lambda runtime as of 1.13.1
.containsEntry("AWS_SESSION_TOKEN", "")
}
@Test
fun samIsExecutedDebuggerImage() {
setBreakpoint()
val template = "${project.solutionDirectory}/template.yaml"
val runConfiguration = createTemplateRunConfiguration(
project = project,
runtime = runtime,
templateFile = template,
logicalId = "HelloWorldFunction",
input = "\"Hello World\"",
credentialsProviderId = mockId,
isImage = true
)
val executeLambda = executeRunConfigurationAndWaitRider(runConfiguration, DefaultDebugExecutor.EXECUTOR_ID)
assertThat(executeLambda.exitCode).isEqualTo(0)
}
}