src/test/scala/org/embulk/input/dynamodb/AwsCredentialsTest.scala in embulk-input-dynamodb-0.2.0 vs src/test/scala/org/embulk/input/dynamodb/AwsCredentialsTest.scala in embulk-input-dynamodb-0.3.0

- old
+ new

@@ -1,135 +1,188 @@ package org.embulk.input.dynamodb -import java.io.File -import java.nio.charset.Charset -import java.nio.file.{FileSystems, Files} +import com.amazonaws.services.securitytoken.model.AWSSecurityTokenServiceException +import org.embulk.config.{ConfigException, ConfigSource} +import org.embulk.input.dynamodb.aws.AwsCredentials +import org.embulk.input.dynamodb.testutil.EmbulkTestBase +import org.hamcrest.CoreMatchers._ +import org.hamcrest.MatcherAssert.assertThat +import org.junit.{Assume, Test} -import com.google.inject.{Binder, Module} -import org.embulk.config.ConfigSource -import org.embulk.exec.PartialExecutionException -import org.embulk.plugin.InjectedPluginSource -import org.embulk.spi.InputPlugin -import org.embulk.{EmbulkEmbed, EmbulkTestRuntime} -import org.junit.Assert.assertEquals -import org.junit.{Before, Rule, Test} +class AwsCredentialsTest extends EmbulkTestBase { -class AwsCredentialsTest { - private var EMBULK_DYNAMODB_TEST_REGION: String = null - private var EMBULK_DYNAMODB_TEST_TABLE: String = null - private var EMBULK_DYNAMODB_TEST_ACCESS_KEY: String = null - private var EMBULK_DYNAMODB_TEST_SECRET_KEY: String = null - private var EMBULK_DYNAMODB_TEST_PROFILE_NAME: String = null + private val runAwsCredentialsTest: Boolean = Option( + System.getenv("RUN_AWS_CREDENTIALS_TEST") + ) match { + case Some(x) => + if (x == "false") false + else true + case None => true + } - private var embulk: EmbulkEmbed = null + private lazy val EMBULK_DYNAMODB_TEST_ACCESS_KEY = + getEnvironmentVariableOrShowErrorMessage("EMBULK_DYNAMODB_TEST_ACCESS_KEY") - @Rule - def runtime: EmbulkTestRuntime = new EmbulkTestRuntime + private lazy val EMBULK_DYNAMODB_TEST_SECRET_KEY = + getEnvironmentVariableOrShowErrorMessage("EMBULK_DYNAMODB_TEST_SECRET_KEY") - @Before - def createResources() { - // Get Environments - EMBULK_DYNAMODB_TEST_REGION = System.getenv("EMBULK_DYNAMODB_TEST_REGION") - EMBULK_DYNAMODB_TEST_TABLE = System.getenv("EMBULK_DYNAMODB_TEST_TABLE") - EMBULK_DYNAMODB_TEST_ACCESS_KEY = System.getenv("EMBULK_DYNAMODB_TEST_ACCESS_KEY") - EMBULK_DYNAMODB_TEST_SECRET_KEY = System.getenv("EMBULK_DYNAMODB_TEST_SECRET_KEY") - EMBULK_DYNAMODB_TEST_PROFILE_NAME = System.getenv("EMBULK_DYNAMODB_TEST_PROFILE_NAME") + private lazy val EMBULK_DYNAMODB_TEST_PROFILE_NAME = + getEnvironmentVariableOrShowErrorMessage( + "EMBULK_DYNAMODB_TEST_PROFILE_NAME" + ) - val bootstrap = new EmbulkEmbed.Bootstrap() - bootstrap.addModules(new Module { - def configure(binder: Binder): Unit = { - InjectedPluginSource.registerPluginTo(binder, - classOf[InputPlugin], - "dynamodb", - classOf[DynamodbInputPlugin]) - } - }) + private lazy val EMBULK_DYNAMODB_TEST_ASSUME_ROLE_ROLE_ARN = + getEnvironmentVariableOrShowErrorMessage( + "EMBULK_DYNAMODB_TEST_ASSUME_ROLE_ROLE_ARN" + ) - embulk = bootstrap.initializeCloseable() + def doTest(inConfig: ConfigSource): Unit = { + val task: PluginTask = inConfig.loadConfig(classOf[PluginTask]) + val provider = AwsCredentials(task).createAwsCredentialsProvider + val cred = provider.getCredentials + assertThat(cred.getAWSAccessKeyId, notNullValue()) + assertThat(cred.getAWSSecretKey, notNullValue()) } - def doTest(config: ConfigSource) { - embulk.run(config) + def defaultInConfig: ConfigSource = { + embulk.configLoader().fromYamlString(s""" + |type: dynamodb + |region: us-east-1 + |table: hoge + |operation: scan + |columns: + | - {name: key1, type: string} + | - {name: key2, type: long} + | - {name: value1, type: string} + |""".stripMargin) + } - val fs = FileSystems.getDefault - val lines = Files.readAllLines(fs.getPath("result000.00.tsv"), Charset.forName("UTF-8")) - assertEquals("KEY-1\t1\tHogeHoge", lines.get(0)) + @deprecated(since = "0.3.0") + @Test + def notSetAuthMethod_SetCredentials_deprecated(): Unit = { + Assume.assumeTrue(runAwsCredentialsTest) + val inConfig: ConfigSource = defaultInConfig + .set("access_key", EMBULK_DYNAMODB_TEST_ACCESS_KEY) + .set("secret_key", EMBULK_DYNAMODB_TEST_SECRET_KEY) + + doTest(inConfig) } @Test - def notSetAuthMethod_SetCredentials() { - val config = embulk.newConfigLoader().fromYamlFile( - new File("src/test/resources/yaml/notSetAuthMethod.yml")) + def notSetAuthMethod_SetCredentials(): Unit = { + Assume.assumeTrue(runAwsCredentialsTest) + val inConfig: ConfigSource = defaultInConfig + .set("access_key_id", EMBULK_DYNAMODB_TEST_ACCESS_KEY) + .set("secret_access_key", EMBULK_DYNAMODB_TEST_SECRET_KEY) - config.getNested("in") - .set("region", EMBULK_DYNAMODB_TEST_REGION) - .set("table", EMBULK_DYNAMODB_TEST_TABLE) + doTest(inConfig) + } + + @deprecated(since = "0.3.0") + @Test + def setAuthMethod_Basic_deprecated(): Unit = { + Assume.assumeTrue(runAwsCredentialsTest) + val inConfig: ConfigSource = defaultInConfig + .set("auth_method", "basic") .set("access_key", EMBULK_DYNAMODB_TEST_ACCESS_KEY) .set("secret_key", EMBULK_DYNAMODB_TEST_SECRET_KEY) - doTest(config) + doTest(inConfig) } @Test - def setAuthMethod_Basic() { - val config = embulk.newConfigLoader().fromYamlFile( - new File("src/test/resources/yaml/authMethodBasic.yml")) + def setAuthMethod_Basic(): Unit = { + Assume.assumeTrue(runAwsCredentialsTest) + val inConfig: ConfigSource = defaultInConfig + .set("auth_method", "basic") + .set("access_key_id", EMBULK_DYNAMODB_TEST_ACCESS_KEY) + .set("secret_access_key", EMBULK_DYNAMODB_TEST_SECRET_KEY) - config.getNested("in") - .set("region", EMBULK_DYNAMODB_TEST_REGION) - .set("table", EMBULK_DYNAMODB_TEST_TABLE) + doTest(inConfig) + } + + @deprecated(since = "0.3.0") + @Test(expected = classOf[ConfigException]) + def throwIfSetAccessKeyAndAccessKeyId(): Unit = { + Assume.assumeTrue(runAwsCredentialsTest) + val inConfig: ConfigSource = defaultInConfig + .set("auth_method", "basic") .set("access_key", EMBULK_DYNAMODB_TEST_ACCESS_KEY) + .set("access_key_id", EMBULK_DYNAMODB_TEST_ACCESS_KEY) .set("secret_key", EMBULK_DYNAMODB_TEST_SECRET_KEY) - doTest(config) + doTest(inConfig) } - @Test(expected = classOf[PartialExecutionException]) - def setAuthMethod_Basic_NotSet() { - val config = embulk.newConfigLoader().fromYamlFile( - new File("src/test/resources/yaml/authMethodBasic_Error.yml")) + @deprecated(since = "0.3.0") + @Test(expected = classOf[ConfigException]) + def throwIfSetSecretKeyAndSecretAccessKeyId(): Unit = { + Assume.assumeTrue(runAwsCredentialsTest) + val inConfig: ConfigSource = defaultInConfig + .set("auth_method", "basic") + .set("access_key", EMBULK_DYNAMODB_TEST_ACCESS_KEY) + .set("secret_key", EMBULK_DYNAMODB_TEST_SECRET_KEY) + .set("secret_access_key", EMBULK_DYNAMODB_TEST_SECRET_KEY) - config.getNested("in") - .set("region", EMBULK_DYNAMODB_TEST_REGION) - .set("table", EMBULK_DYNAMODB_TEST_TABLE) + doTest(inConfig) + } - doTest(config) + @Test(expected = classOf[ConfigException]) + def setAuthMethod_Basic_NotSet(): Unit = { + val inConfig: ConfigSource = defaultInConfig + .set("auth_method", "basic") + + doTest(inConfig) } @Test - def setAuthMethod_Env() { - val config = embulk.newConfigLoader().fromYamlFile( - new File("src/test/resources/yaml/authMethodEnv.yml")) + def setAuthMethod_Env(): Unit = { + Assume.assumeTrue(runAwsCredentialsTest) + // NOTE: Requires to set the env vars like 'AWS_ACCESS_KEY_ID' and so on when testing. + val inConfig: ConfigSource = defaultInConfig + .set("auth_method", "env") - config.getNested("in") - .set("region", EMBULK_DYNAMODB_TEST_REGION) - .set("table", EMBULK_DYNAMODB_TEST_TABLE) - - doTest(config) + doTest(inConfig) } @Test - def setAuthMethod_Profile() { - val config = embulk.newConfigLoader().fromYamlFile( - new File("src/test/resources/yaml/authMethodProfile.yml")) - - config.getNested("in") - .set("region", EMBULK_DYNAMODB_TEST_REGION) - .set("table", EMBULK_DYNAMODB_TEST_TABLE) + def setAuthMethod_Profile(): Unit = { + Assume.assumeTrue(runAwsCredentialsTest) + // NOTE: Requires to set credentials to '~/.aws' when testing. + val inConfig: ConfigSource = defaultInConfig + .set("auth_method", "profile") .set("profile_name", EMBULK_DYNAMODB_TEST_PROFILE_NAME) - doTest(config) + doTest(inConfig) } - @Test(expected = classOf[PartialExecutionException]) - def setAuthMethod_Profile_NotExistProfileName() { - val config = embulk.newConfigLoader().fromYamlFile( - new File("src/test/resources/yaml/authMethodProfile.yml")) + @Test(expected = classOf[IllegalArgumentException]) + def setAuthMethod_Profile_NotExistProfileName(): Unit = { + val inConfig: ConfigSource = defaultInConfig + .set("auth_method", "profile") + .set("profile_name", "DO_NOT_EXIST") - config.getNested("in") - .set("region", EMBULK_DYNAMODB_TEST_REGION) - .set("table", EMBULK_DYNAMODB_TEST_TABLE) - .set("profile_name", "NotExistName") + doTest(inConfig) + } - doTest(config) + @Test + def setAuthMethod_assume_role(): Unit = { + Assume.assumeTrue(runAwsCredentialsTest) + val inConfig: ConfigSource = defaultInConfig + .set("auth_method", "assume_role") + .set("role_arn", EMBULK_DYNAMODB_TEST_ASSUME_ROLE_ROLE_ARN) + .set("role_session_name", "dummy") + + doTest(inConfig) + } + + @Test(expected = classOf[AWSSecurityTokenServiceException]) + def setAuthMethod_assume_role_NotExistRoleArn(): Unit = { + Assume.assumeTrue(runAwsCredentialsTest) + val inConfig: ConfigSource = defaultInConfig + .set("auth_method", "assume_role") + .set("role_arn", "DO_NOT_EXIST") + .set("role_session_name", "dummy") + + doTest(inConfig) } }