diff --git a/.changelog/bugfix-aws-cpp-sdk-core.json b/.changelog/bugfix-aws-cpp-sdk-core.json new file mode 100644 index 000000000000..404d0ea82f47 --- /dev/null +++ b/.changelog/bugfix-aws-cpp-sdk-core.json @@ -0,0 +1,6 @@ +{ + "type": "bugfix", + "category": "aws-cpp-sdk-core", + "contributor": "sbiscigl", + "description": "Fix dropped endpoint built-in parameters and signer name" +} diff --git a/.changelog/bugfix-pr3908.json b/.changelog/bugfix-pr3908.json new file mode 100644 index 000000000000..6626197694e7 --- /dev/null +++ b/.changelog/bugfix-pr3908.json @@ -0,0 +1,6 @@ +{ + "type": "bugfix", + "category": "aws-cpp-sdk-core", + "contributor": "Renz456", + "description": "Pass service name to Smithy endpoint providers" +} diff --git a/cmake/sdksCommon.cmake b/cmake/sdksCommon.cmake index 26a2c119eb1d..01af661e9a24 100644 --- a/cmake/sdksCommon.cmake +++ b/cmake/sdksCommon.cmake @@ -99,6 +99,7 @@ list(APPEND SDK_TEST_PROJECT_LIST "ec2:tests/aws-cpp-sdk-ec2-integration-tests") list(APPEND SDK_TEST_PROJECT_LIST "elasticfilesystem:tests/aws-cpp-sdk-elasticfilesystem-integration-tests") list(APPEND SDK_TEST_PROJECT_LIST "identity-management:tests/aws-cpp-sdk-identity-management-tests") list(APPEND SDK_TEST_PROJECT_LIST "kinesis:tests/aws-cpp-sdk-kinesis-integration-tests") +list(APPEND SDK_TEST_PROJECT_LIST "kinesis:tests/aws-cpp-sdk-kinesis-unit-tests") list(APPEND SDK_TEST_PROJECT_LIST "lambda:tests/aws-cpp-sdk-lambda-integration-tests") list(APPEND SDK_TEST_PROJECT_LIST "logs:tests/aws-cpp-sdk-logs-integration-tests,tests/aws-cpp-sdk-logs-unit-tests") list(APPEND SDK_TEST_PROJECT_LIST "mediastore-data:tests/aws-cpp-sdk-mediastore-data-integration-tests") @@ -108,9 +109,11 @@ list(APPEND SDK_TEST_PROJECT_LIST "redshift:tests/aws-cpp-sdk-redshift-integrati list(APPEND SDK_TEST_PROJECT_LIST "s3:tests/aws-cpp-sdk-s3-integration-tests") list(APPEND SDK_TEST_PROJECT_LIST "s3:tests/aws-cpp-sdk-s3-unit-tests") list(APPEND SDK_TEST_PROJECT_LIST "s3-crt:tests/aws-cpp-sdk-s3-crt-integration-tests") +list(APPEND SDK_TEST_PROJECT_LIST "s3-crt:tests/aws-cpp-sdk-s3-crt-unit-tests") list(APPEND SDK_TEST_PROJECT_LIST "s3-transfer:tests/aws-cpp-sdk-s3-transfer-integration-tests") list(APPEND SDK_TEST_PROJECT_LIST "s3-encryption:tests/aws-cpp-sdk-s3-encryption-tests,tests/aws-cpp-sdk-s3-encryption-integration-tests") list(APPEND SDK_TEST_PROJECT_LIST "s3control:tests/aws-cpp-sdk-s3control-integration-tests") +list(APPEND SDK_TEST_PROJECT_LIST "s3control:tests/aws-cpp-sdk-s3control-unit-tests") list(APPEND SDK_TEST_PROJECT_LIST "sns:tests/aws-cpp-sdk-sns-integration-tests") list(APPEND SDK_TEST_PROJECT_LIST "sqs:tests/aws-cpp-sdk-sqs-integration-tests") list(APPEND SDK_TEST_PROJECT_LIST "sqs:tests/aws-cpp-sdk-sqs-unit-tests") @@ -150,7 +153,7 @@ list(APPEND TEST_DEPENDENCY_LIST "cognito-identity:access-management,iam,core") list(APPEND TEST_DEPENDENCY_LIST "identity-management:cognito-identity,sts,core") list(APPEND TEST_DEPENDENCY_LIST "lambda:access-management,cognito-identity,iam,kinesis,core") list(APPEND TEST_DEPENDENCY_LIST "s3-encryption:s3,kms,core") -list(APPEND TEST_DEPENDENCY_LIST "s3control:s3,access-management,cognito-identity,iam,core") +list(APPEND TEST_DEPENDENCY_LIST "s3control:s3,access-management,cognito-identity,iam,sts,core") list(APPEND TEST_DEPENDENCY_LIST "sqs:access-management,cognito-identity,iam,core") list(APPEND TEST_DEPENDENCY_LIST "text-to-speech:polly,core") list(APPEND TEST_DEPENDENCY_LIST "transfer:s3,core") diff --git a/generated/src/aws-cpp-sdk-bedrock-agent-runtime/include/aws/bedrock-agent-runtime/BedrockAgentRuntimeEndpointProvider.h b/generated/src/aws-cpp-sdk-bedrock-agent-runtime/include/aws/bedrock-agent-runtime/BedrockAgentRuntimeEndpointProvider.h index a7a2a29103d1..5bbfdfc7d21c 100644 --- a/generated/src/aws-cpp-sdk-bedrock-agent-runtime/include/aws/bedrock-agent-runtime/BedrockAgentRuntimeEndpointProvider.h +++ b/generated/src/aws-cpp-sdk-bedrock-agent-runtime/include/aws/bedrock-agent-runtime/BedrockAgentRuntimeEndpointProvider.h @@ -26,6 +26,7 @@ class AWS_BEDROCKAGENTRUNTIME_API BedrockAgentRuntimeBuiltInParameters : public virtual ~BedrockAgentRuntimeBuiltInParameters() {}; using Aws::Endpoint::BuiltInParameters::SetFromClientConfiguration; virtual void SetFromClientConfiguration(const BedrockAgentRuntimeClientConfiguration& config); + virtual void SetFromClientConfiguration(const BedrockAgentRuntimeClientConfiguration& config, const Aws::String& serviceName); }; /** diff --git a/generated/src/aws-cpp-sdk-bedrock-agent-runtime/source/BedrockAgentRuntimeEndpointProvider.cpp b/generated/src/aws-cpp-sdk-bedrock-agent-runtime/source/BedrockAgentRuntimeEndpointProvider.cpp index 02caf4f9931b..587b03e8e93d 100644 --- a/generated/src/aws-cpp-sdk-bedrock-agent-runtime/source/BedrockAgentRuntimeEndpointProvider.cpp +++ b/generated/src/aws-cpp-sdk-bedrock-agent-runtime/source/BedrockAgentRuntimeEndpointProvider.cpp @@ -32,6 +32,11 @@ void BedrockAgentRuntimeBuiltInParameters::SetFromClientConfiguration(const Bedr SetFromClientConfiguration(static_cast(config)); } +void BedrockAgentRuntimeBuiltInParameters::SetFromClientConfiguration(const BedrockAgentRuntimeClientConfiguration& config, + const Aws::String& serviceName) { + SetFromClientConfiguration(static_cast(config), serviceName); +} + } // namespace Endpoint } // namespace BedrockAgentRuntime } // namespace Aws diff --git a/generated/src/aws-cpp-sdk-bedrock-agent/include/aws/bedrock-agent/BedrockAgentEndpointProvider.h b/generated/src/aws-cpp-sdk-bedrock-agent/include/aws/bedrock-agent/BedrockAgentEndpointProvider.h index c15b9ecf85f7..78ddb9460e35 100644 --- a/generated/src/aws-cpp-sdk-bedrock-agent/include/aws/bedrock-agent/BedrockAgentEndpointProvider.h +++ b/generated/src/aws-cpp-sdk-bedrock-agent/include/aws/bedrock-agent/BedrockAgentEndpointProvider.h @@ -26,6 +26,7 @@ class AWS_BEDROCKAGENT_API BedrockAgentBuiltInParameters : public Aws::Endpoint: virtual ~BedrockAgentBuiltInParameters() {}; using Aws::Endpoint::BuiltInParameters::SetFromClientConfiguration; virtual void SetFromClientConfiguration(const BedrockAgentClientConfiguration& config); + virtual void SetFromClientConfiguration(const BedrockAgentClientConfiguration& config, const Aws::String& serviceName); }; /** diff --git a/generated/src/aws-cpp-sdk-bedrock-agent/source/BedrockAgentEndpointProvider.cpp b/generated/src/aws-cpp-sdk-bedrock-agent/source/BedrockAgentEndpointProvider.cpp index 89f9b4bf7228..d799b1bcb93b 100644 --- a/generated/src/aws-cpp-sdk-bedrock-agent/source/BedrockAgentEndpointProvider.cpp +++ b/generated/src/aws-cpp-sdk-bedrock-agent/source/BedrockAgentEndpointProvider.cpp @@ -32,6 +32,11 @@ void BedrockAgentBuiltInParameters::SetFromClientConfiguration(const BedrockAgen SetFromClientConfiguration(static_cast(config)); } +void BedrockAgentBuiltInParameters::SetFromClientConfiguration(const BedrockAgentClientConfiguration& config, + const Aws::String& serviceName) { + SetFromClientConfiguration(static_cast(config), serviceName); +} + } // namespace Endpoint } // namespace BedrockAgent } // namespace Aws diff --git a/generated/src/aws-cpp-sdk-bedrock-data-automation-runtime/include/aws/bedrock-data-automation-runtime/BedrockDataAutomationRuntimeEndpointProvider.h b/generated/src/aws-cpp-sdk-bedrock-data-automation-runtime/include/aws/bedrock-data-automation-runtime/BedrockDataAutomationRuntimeEndpointProvider.h index 0e832e374df6..79d4547657cf 100644 --- a/generated/src/aws-cpp-sdk-bedrock-data-automation-runtime/include/aws/bedrock-data-automation-runtime/BedrockDataAutomationRuntimeEndpointProvider.h +++ b/generated/src/aws-cpp-sdk-bedrock-data-automation-runtime/include/aws/bedrock-data-automation-runtime/BedrockDataAutomationRuntimeEndpointProvider.h @@ -26,6 +26,7 @@ class AWS_BEDROCKDATAAUTOMATIONRUNTIME_API BedrockDataAutomationRuntimeBuiltInPa virtual ~BedrockDataAutomationRuntimeBuiltInParameters() {}; using Aws::Endpoint::BuiltInParameters::SetFromClientConfiguration; virtual void SetFromClientConfiguration(const BedrockDataAutomationRuntimeClientConfiguration& config); + virtual void SetFromClientConfiguration(const BedrockDataAutomationRuntimeClientConfiguration& config, const Aws::String& serviceName); }; /** diff --git a/generated/src/aws-cpp-sdk-bedrock-data-automation-runtime/source/BedrockDataAutomationRuntimeEndpointProvider.cpp b/generated/src/aws-cpp-sdk-bedrock-data-automation-runtime/source/BedrockDataAutomationRuntimeEndpointProvider.cpp index c1f341be4a6d..736f74548fd1 100644 --- a/generated/src/aws-cpp-sdk-bedrock-data-automation-runtime/source/BedrockDataAutomationRuntimeEndpointProvider.cpp +++ b/generated/src/aws-cpp-sdk-bedrock-data-automation-runtime/source/BedrockDataAutomationRuntimeEndpointProvider.cpp @@ -36,6 +36,12 @@ void BedrockDataAutomationRuntimeBuiltInParameters::SetFromClientConfiguration( SetFromClientConfiguration(static_cast(config)); } +void BedrockDataAutomationRuntimeBuiltInParameters::SetFromClientConfiguration( + const BedrockDataAutomationRuntimeClientConfiguration& config, const Aws::String& serviceName) { + SetFromClientConfiguration(static_cast(config), + serviceName); +} + } // namespace Endpoint } // namespace BedrockDataAutomationRuntime } // namespace Aws diff --git a/generated/src/aws-cpp-sdk-bedrock-data-automation/include/aws/bedrock-data-automation/BedrockDataAutomationEndpointProvider.h b/generated/src/aws-cpp-sdk-bedrock-data-automation/include/aws/bedrock-data-automation/BedrockDataAutomationEndpointProvider.h index 9ae6d9267c75..8a0d6ac0768a 100644 --- a/generated/src/aws-cpp-sdk-bedrock-data-automation/include/aws/bedrock-data-automation/BedrockDataAutomationEndpointProvider.h +++ b/generated/src/aws-cpp-sdk-bedrock-data-automation/include/aws/bedrock-data-automation/BedrockDataAutomationEndpointProvider.h @@ -26,6 +26,7 @@ class AWS_BEDROCKDATAAUTOMATION_API BedrockDataAutomationBuiltInParameters : pub virtual ~BedrockDataAutomationBuiltInParameters() {}; using Aws::Endpoint::BuiltInParameters::SetFromClientConfiguration; virtual void SetFromClientConfiguration(const BedrockDataAutomationClientConfiguration& config); + virtual void SetFromClientConfiguration(const BedrockDataAutomationClientConfiguration& config, const Aws::String& serviceName); }; /** diff --git a/generated/src/aws-cpp-sdk-bedrock-data-automation/source/BedrockDataAutomationEndpointProvider.cpp b/generated/src/aws-cpp-sdk-bedrock-data-automation/source/BedrockDataAutomationEndpointProvider.cpp index 7bf469409686..2d0f0c43cb85 100644 --- a/generated/src/aws-cpp-sdk-bedrock-data-automation/source/BedrockDataAutomationEndpointProvider.cpp +++ b/generated/src/aws-cpp-sdk-bedrock-data-automation/source/BedrockDataAutomationEndpointProvider.cpp @@ -32,6 +32,11 @@ void BedrockDataAutomationBuiltInParameters::SetFromClientConfiguration(const Be SetFromClientConfiguration(static_cast(config)); } +void BedrockDataAutomationBuiltInParameters::SetFromClientConfiguration(const BedrockDataAutomationClientConfiguration& config, + const Aws::String& serviceName) { + SetFromClientConfiguration(static_cast(config), serviceName); +} + } // namespace Endpoint } // namespace BedrockDataAutomation } // namespace Aws diff --git a/generated/src/aws-cpp-sdk-bedrock-runtime/include/aws/bedrock-runtime/BedrockRuntimeEndpointProvider.h b/generated/src/aws-cpp-sdk-bedrock-runtime/include/aws/bedrock-runtime/BedrockRuntimeEndpointProvider.h index 406bad78295c..e4a68b91d684 100644 --- a/generated/src/aws-cpp-sdk-bedrock-runtime/include/aws/bedrock-runtime/BedrockRuntimeEndpointProvider.h +++ b/generated/src/aws-cpp-sdk-bedrock-runtime/include/aws/bedrock-runtime/BedrockRuntimeEndpointProvider.h @@ -26,6 +26,7 @@ class AWS_BEDROCKRUNTIME_API BedrockRuntimeBuiltInParameters : public Aws::Endpo virtual ~BedrockRuntimeBuiltInParameters() {}; using Aws::Endpoint::BuiltInParameters::SetFromClientConfiguration; virtual void SetFromClientConfiguration(const BedrockRuntimeClientConfiguration& config); + virtual void SetFromClientConfiguration(const BedrockRuntimeClientConfiguration& config, const Aws::String& serviceName); }; /** diff --git a/generated/src/aws-cpp-sdk-bedrock-runtime/source/BedrockRuntimeEndpointProvider.cpp b/generated/src/aws-cpp-sdk-bedrock-runtime/source/BedrockRuntimeEndpointProvider.cpp index 2eabfa16219f..bce5818450da 100644 --- a/generated/src/aws-cpp-sdk-bedrock-runtime/source/BedrockRuntimeEndpointProvider.cpp +++ b/generated/src/aws-cpp-sdk-bedrock-runtime/source/BedrockRuntimeEndpointProvider.cpp @@ -32,6 +32,11 @@ void BedrockRuntimeBuiltInParameters::SetFromClientConfiguration(const BedrockRu SetFromClientConfiguration(static_cast(config)); } +void BedrockRuntimeBuiltInParameters::SetFromClientConfiguration(const BedrockRuntimeClientConfiguration& config, + const Aws::String& serviceName) { + SetFromClientConfiguration(static_cast(config), serviceName); +} + } // namespace Endpoint } // namespace BedrockRuntime } // namespace Aws diff --git a/generated/src/aws-cpp-sdk-bedrock/include/aws/bedrock/BedrockEndpointProvider.h b/generated/src/aws-cpp-sdk-bedrock/include/aws/bedrock/BedrockEndpointProvider.h index aa735c9e5136..bb576b6bc7ff 100644 --- a/generated/src/aws-cpp-sdk-bedrock/include/aws/bedrock/BedrockEndpointProvider.h +++ b/generated/src/aws-cpp-sdk-bedrock/include/aws/bedrock/BedrockEndpointProvider.h @@ -26,6 +26,7 @@ class AWS_BEDROCK_API BedrockBuiltInParameters : public Aws::Endpoint::BuiltInPa virtual ~BedrockBuiltInParameters() {}; using Aws::Endpoint::BuiltInParameters::SetFromClientConfiguration; virtual void SetFromClientConfiguration(const BedrockClientConfiguration& config); + virtual void SetFromClientConfiguration(const BedrockClientConfiguration& config, const Aws::String& serviceName); }; /** diff --git a/generated/src/aws-cpp-sdk-bedrock/source/BedrockEndpointProvider.cpp b/generated/src/aws-cpp-sdk-bedrock/source/BedrockEndpointProvider.cpp index d6874533de00..263b3246b88b 100644 --- a/generated/src/aws-cpp-sdk-bedrock/source/BedrockEndpointProvider.cpp +++ b/generated/src/aws-cpp-sdk-bedrock/source/BedrockEndpointProvider.cpp @@ -31,6 +31,10 @@ void BedrockBuiltInParameters::SetFromClientConfiguration(const BedrockClientCon SetFromClientConfiguration(static_cast(config)); } +void BedrockBuiltInParameters::SetFromClientConfiguration(const BedrockClientConfiguration& config, const Aws::String& serviceName) { + SetFromClientConfiguration(static_cast(config), serviceName); +} + } // namespace Endpoint } // namespace Bedrock } // namespace Aws diff --git a/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBEndpointProvider.h b/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBEndpointProvider.h index 703ac192dc69..f00a04ab3e44 100644 --- a/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBEndpointProvider.h +++ b/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBEndpointProvider.h @@ -26,6 +26,10 @@ class AWS_DYNAMODB_API DynamoDBBuiltInParameters : public Aws::Endpoint::BuiltIn virtual ~DynamoDBBuiltInParameters() {}; using Aws::Endpoint::BuiltInParameters::SetFromClientConfiguration; virtual void SetFromClientConfiguration(const DynamoDBClientConfiguration& config); + virtual void SetFromClientConfiguration(const DynamoDBClientConfiguration& config, const Aws::String& serviceName); + + private: + void SetServiceSpecificParameters(const DynamoDBClientConfiguration& config); }; /** diff --git a/generated/src/aws-cpp-sdk-dynamodb/source/DynamoDBEndpointProvider.cpp b/generated/src/aws-cpp-sdk-dynamodb/source/DynamoDBEndpointProvider.cpp index f780225b619c..ac4c56557053 100644 --- a/generated/src/aws-cpp-sdk-dynamodb/source/DynamoDBEndpointProvider.cpp +++ b/generated/src/aws-cpp-sdk-dynamodb/source/DynamoDBEndpointProvider.cpp @@ -30,7 +30,15 @@ DynamoDBEndpointProvider::DynamoDBEndpointProvider() void DynamoDBBuiltInParameters::SetFromClientConfiguration(const DynamoDBClientConfiguration& config) { SetFromClientConfiguration(static_cast(config)); + SetServiceSpecificParameters(config); +} + +void DynamoDBBuiltInParameters::SetFromClientConfiguration(const DynamoDBClientConfiguration& config, const Aws::String& serviceName) { + SetFromClientConfiguration(static_cast(config), serviceName); + SetServiceSpecificParameters(config); +} +void DynamoDBBuiltInParameters::SetServiceSpecificParameters(const DynamoDBClientConfiguration& config) { if (!config.accountId.empty()) { SetStringParameter("AccountId", config.accountId); } @@ -38,7 +46,6 @@ void DynamoDBBuiltInParameters::SetFromClientConfiguration(const DynamoDBClientC SetStringParameter("AccountIdEndpointMode", config.accountIdEndpointMode); } } - } // namespace Endpoint } // namespace DynamoDB } // namespace Aws diff --git a/generated/src/aws-cpp-sdk-dynamodbstreams/include/aws/dynamodbstreams/DynamoDBStreamsEndpointProvider.h b/generated/src/aws-cpp-sdk-dynamodbstreams/include/aws/dynamodbstreams/DynamoDBStreamsEndpointProvider.h index be0f8d0f926b..92c8feee0478 100644 --- a/generated/src/aws-cpp-sdk-dynamodbstreams/include/aws/dynamodbstreams/DynamoDBStreamsEndpointProvider.h +++ b/generated/src/aws-cpp-sdk-dynamodbstreams/include/aws/dynamodbstreams/DynamoDBStreamsEndpointProvider.h @@ -26,6 +26,7 @@ class AWS_DYNAMODBSTREAMS_API DynamoDBStreamsBuiltInParameters : public Aws::End virtual ~DynamoDBStreamsBuiltInParameters() {}; using Aws::Endpoint::BuiltInParameters::SetFromClientConfiguration; virtual void SetFromClientConfiguration(const DynamoDBStreamsClientConfiguration& config); + virtual void SetFromClientConfiguration(const DynamoDBStreamsClientConfiguration& config, const Aws::String& serviceName); }; /** diff --git a/generated/src/aws-cpp-sdk-dynamodbstreams/source/DynamoDBStreamsEndpointProvider.cpp b/generated/src/aws-cpp-sdk-dynamodbstreams/source/DynamoDBStreamsEndpointProvider.cpp index df05e8e98d4a..f3f24145435d 100644 --- a/generated/src/aws-cpp-sdk-dynamodbstreams/source/DynamoDBStreamsEndpointProvider.cpp +++ b/generated/src/aws-cpp-sdk-dynamodbstreams/source/DynamoDBStreamsEndpointProvider.cpp @@ -32,6 +32,11 @@ void DynamoDBStreamsBuiltInParameters::SetFromClientConfiguration(const DynamoDB SetFromClientConfiguration(static_cast(config)); } +void DynamoDBStreamsBuiltInParameters::SetFromClientConfiguration(const DynamoDBStreamsClientConfiguration& config, + const Aws::String& serviceName) { + SetFromClientConfiguration(static_cast(config), serviceName); +} + } // namespace Endpoint } // namespace DynamoDBStreams } // namespace Aws diff --git a/generated/src/aws-cpp-sdk-kinesis/include/aws/kinesis/KinesisEndpointProvider.h b/generated/src/aws-cpp-sdk-kinesis/include/aws/kinesis/KinesisEndpointProvider.h index 42a43e10bf10..35d1d4a0959c 100644 --- a/generated/src/aws-cpp-sdk-kinesis/include/aws/kinesis/KinesisEndpointProvider.h +++ b/generated/src/aws-cpp-sdk-kinesis/include/aws/kinesis/KinesisEndpointProvider.h @@ -26,6 +26,10 @@ class AWS_KINESIS_API KinesisBuiltInParameters : public Aws::Endpoint::BuiltInPa virtual ~KinesisBuiltInParameters() {}; using Aws::Endpoint::BuiltInParameters::SetFromClientConfiguration; virtual void SetFromClientConfiguration(const KinesisClientConfiguration& config); + virtual void SetFromClientConfiguration(const KinesisClientConfiguration& config, const Aws::String& serviceName); + + private: + void SetServiceSpecificParameters(const KinesisClientConfiguration& config); }; /** diff --git a/generated/src/aws-cpp-sdk-kinesis/source/KinesisEndpointProvider.cpp b/generated/src/aws-cpp-sdk-kinesis/source/KinesisEndpointProvider.cpp index 4892dd7dcab8..4292ceb1a129 100644 --- a/generated/src/aws-cpp-sdk-kinesis/source/KinesisEndpointProvider.cpp +++ b/generated/src/aws-cpp-sdk-kinesis/source/KinesisEndpointProvider.cpp @@ -29,7 +29,15 @@ KinesisEndpointProvider::KinesisEndpointProvider() void KinesisBuiltInParameters::SetFromClientConfiguration(const KinesisClientConfiguration& config) { SetFromClientConfiguration(static_cast(config)); + SetServiceSpecificParameters(config); +} + +void KinesisBuiltInParameters::SetFromClientConfiguration(const KinesisClientConfiguration& config, const Aws::String& serviceName) { + SetFromClientConfiguration(static_cast(config), serviceName); + SetServiceSpecificParameters(config); +} +void KinesisBuiltInParameters::SetServiceSpecificParameters(const KinesisClientConfiguration& config) { if (!config.accountId.empty()) { SetStringParameter("AccountId", config.accountId); } @@ -37,7 +45,6 @@ void KinesisBuiltInParameters::SetFromClientConfiguration(const KinesisClientCon SetStringParameter("AccountIdEndpointMode", config.accountIdEndpointMode); } } - } // namespace Endpoint } // namespace Kinesis } // namespace Aws diff --git a/generated/src/aws-cpp-sdk-s3-crt/include/aws/s3-crt/S3CrtEndpointProvider.h b/generated/src/aws-cpp-sdk-s3-crt/include/aws/s3-crt/S3CrtEndpointProvider.h index 87d80066708d..7e58b102e583 100644 --- a/generated/src/aws-cpp-sdk-s3-crt/include/aws/s3-crt/S3CrtEndpointProvider.h +++ b/generated/src/aws-cpp-sdk-s3-crt/include/aws/s3-crt/S3CrtEndpointProvider.h @@ -63,7 +63,7 @@ class AWS_S3CRT_API S3CrtBuiltInParameters : public Aws::Endpoint::BuiltInParame virtual void SetFromClientConfiguration(const S3CrtClientConfiguration& config, const Aws::String& serviceName); private: - void SetS3SpecificParameters(const S3CrtClientConfiguration& config); + void SetServiceSpecificParameters(const S3CrtClientConfiguration& config); }; /** diff --git a/generated/src/aws-cpp-sdk-s3-crt/source/S3CrtClient.cpp b/generated/src/aws-cpp-sdk-s3-crt/source/S3CrtClient.cpp index 8dc7f6ff4e94..5186361b14ae 100644 --- a/generated/src/aws-cpp-sdk-s3-crt/source/S3CrtClient.cpp +++ b/generated/src/aws-cpp-sdk-s3-crt/source/S3CrtClient.cpp @@ -299,7 +299,7 @@ void S3CrtClient::init(const S3Crt::ClientConfiguration& config, } m_endpointProvider = Aws::MakeShared(ALLOCATION_TAG); AWS_CHECK_PTR(SERVICE_NAME, m_endpointProvider); - m_endpointProvider->InitBuiltInParameters(config); + m_endpointProvider->InitBuiltInParameters(config, "s3"); // initialize aws_s3_client; aws_s3_client_config s3CrtConfig; diff --git a/generated/src/aws-cpp-sdk-s3-crt/source/S3CrtEndpointProvider.cpp b/generated/src/aws-cpp-sdk-s3-crt/source/S3CrtEndpointProvider.cpp index bac68c2c56f8..41690b40b1e5 100644 --- a/generated/src/aws-cpp-sdk-s3-crt/source/S3CrtEndpointProvider.cpp +++ b/generated/src/aws-cpp-sdk-s3-crt/source/S3CrtEndpointProvider.cpp @@ -53,16 +53,15 @@ S3CrtClientContextParameters::GetDisableS3ExpressSessionAuth() const { } void S3CrtBuiltInParameters::SetFromClientConfiguration(const S3CrtClientConfiguration& config) { SetFromClientConfiguration(static_cast(config)); - - SetS3SpecificParameters(config); + SetServiceSpecificParameters(config); } void S3CrtBuiltInParameters::SetFromClientConfiguration(const S3CrtClientConfiguration& config, const Aws::String& serviceName) { SetFromClientConfiguration(static_cast(config), serviceName); - SetS3SpecificParameters(config); + SetServiceSpecificParameters(config); } -void S3CrtBuiltInParameters::SetS3SpecificParameters(const S3CrtClientConfiguration& config) { +void S3CrtBuiltInParameters::SetServiceSpecificParameters(const S3CrtClientConfiguration& config) { static const char* AWS_S3_USE_GLOBAL_ENDPOINT = "UseGlobalEndpoint"; if (config.useUSEast1RegionalEndPointOption == US_EAST_1_REGIONAL_ENDPOINT_OPTION::LEGACY) { SetBooleanParameter(AWS_S3_USE_GLOBAL_ENDPOINT, true); diff --git a/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3EndpointProvider.h b/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3EndpointProvider.h index c859f5ed81e8..28252f019860 100644 --- a/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3EndpointProvider.h +++ b/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3EndpointProvider.h @@ -63,7 +63,7 @@ class AWS_S3_API S3BuiltInParameters : public Aws::Endpoint::BuiltInParameters { virtual void SetFromClientConfiguration(const S3ClientConfiguration& config, const Aws::String& serviceName); private: - void SetS3SpecificParameters(const S3ClientConfiguration& config); + void SetServiceSpecificParameters(const S3ClientConfiguration& config); }; /** diff --git a/generated/src/aws-cpp-sdk-s3/source/S3EndpointProvider.cpp b/generated/src/aws-cpp-sdk-s3/source/S3EndpointProvider.cpp index 11428ccc1721..c2abebea3622 100644 --- a/generated/src/aws-cpp-sdk-s3/source/S3EndpointProvider.cpp +++ b/generated/src/aws-cpp-sdk-s3/source/S3EndpointProvider.cpp @@ -53,16 +53,15 @@ const S3ClientContextParameters::ClientContextParameters::EndpointParameter& S3C } void S3BuiltInParameters::SetFromClientConfiguration(const S3ClientConfiguration& config) { SetFromClientConfiguration(static_cast(config)); - - SetS3SpecificParameters(config); + SetServiceSpecificParameters(config); } void S3BuiltInParameters::SetFromClientConfiguration(const S3ClientConfiguration& config, const Aws::String& serviceName) { SetFromClientConfiguration(static_cast(config), serviceName); - SetS3SpecificParameters(config); + SetServiceSpecificParameters(config); } -void S3BuiltInParameters::SetS3SpecificParameters(const S3ClientConfiguration& config) { +void S3BuiltInParameters::SetServiceSpecificParameters(const S3ClientConfiguration& config) { static const char* AWS_S3_USE_GLOBAL_ENDPOINT = "UseGlobalEndpoint"; if (config.useUSEast1RegionalEndPointOption == US_EAST_1_REGIONAL_ENDPOINT_OPTION::LEGACY) { SetBooleanParameter(AWS_S3_USE_GLOBAL_ENDPOINT, true); diff --git a/generated/src/aws-cpp-sdk-s3control/include/aws/s3control/S3ControlEndpointProvider.h b/generated/src/aws-cpp-sdk-s3control/include/aws/s3control/S3ControlEndpointProvider.h index ef02bdc41bfa..398c486051f3 100644 --- a/generated/src/aws-cpp-sdk-s3control/include/aws/s3control/S3ControlEndpointProvider.h +++ b/generated/src/aws-cpp-sdk-s3control/include/aws/s3control/S3ControlEndpointProvider.h @@ -35,6 +35,10 @@ class AWS_S3CONTROL_API S3ControlBuiltInParameters : public Aws::Endpoint::Built virtual ~S3ControlBuiltInParameters() {}; using Aws::Endpoint::BuiltInParameters::SetFromClientConfiguration; virtual void SetFromClientConfiguration(const S3ControlClientConfiguration& config); + virtual void SetFromClientConfiguration(const S3ControlClientConfiguration& config, const Aws::String& serviceName); + + private: + void SetServiceSpecificParameters(const S3ControlClientConfiguration& config); }; /** diff --git a/generated/src/aws-cpp-sdk-s3control/source/S3ControlEndpointProvider.cpp b/generated/src/aws-cpp-sdk-s3control/source/S3ControlEndpointProvider.cpp index d9679c419469..b2969767dbbb 100644 --- a/generated/src/aws-cpp-sdk-s3control/source/S3ControlEndpointProvider.cpp +++ b/generated/src/aws-cpp-sdk-s3control/source/S3ControlEndpointProvider.cpp @@ -35,14 +35,21 @@ const S3ControlClientContextParameters::ClientContextParameters::EndpointParamet } void S3ControlBuiltInParameters::SetFromClientConfiguration(const S3ControlClientConfiguration& config) { SetFromClientConfiguration(static_cast(config)); + SetServiceSpecificParameters(config); +} + +void S3ControlBuiltInParameters::SetFromClientConfiguration(const S3ControlClientConfiguration& config, const Aws::String& serviceName) { + SetFromClientConfiguration(static_cast(config), serviceName); + SetServiceSpecificParameters(config); +} +void S3ControlBuiltInParameters::SetServiceSpecificParameters(const S3ControlClientConfiguration& config) { static const char* AWS_S3_USE_ARN_REGION = "UseArnRegion"; SetBooleanParameter(AWS_S3_USE_ARN_REGION, config.useArnRegion); if (!config.accountId.empty()) { SetStringParameter("AccountId", config.accountId); } } - } // namespace Endpoint } // namespace S3Control } // namespace Aws diff --git a/generated/src/aws-cpp-sdk-timestream-query/include/aws/timestream-query/TimestreamQueryEndpointProvider.h b/generated/src/aws-cpp-sdk-timestream-query/include/aws/timestream-query/TimestreamQueryEndpointProvider.h index df10fb58b719..9919022b06ec 100644 --- a/generated/src/aws-cpp-sdk-timestream-query/include/aws/timestream-query/TimestreamQueryEndpointProvider.h +++ b/generated/src/aws-cpp-sdk-timestream-query/include/aws/timestream-query/TimestreamQueryEndpointProvider.h @@ -26,6 +26,7 @@ class AWS_TIMESTREAMQUERY_API TimestreamQueryBuiltInParameters : public Aws::End virtual ~TimestreamQueryBuiltInParameters() {}; using Aws::Endpoint::BuiltInParameters::SetFromClientConfiguration; virtual void SetFromClientConfiguration(const TimestreamQueryClientConfiguration& config); + virtual void SetFromClientConfiguration(const TimestreamQueryClientConfiguration& config, const Aws::String& serviceName); }; /** diff --git a/generated/src/aws-cpp-sdk-timestream-query/source/TimestreamQueryEndpointProvider.cpp b/generated/src/aws-cpp-sdk-timestream-query/source/TimestreamQueryEndpointProvider.cpp index 4d0b47b88ca7..da181c60e4ea 100644 --- a/generated/src/aws-cpp-sdk-timestream-query/source/TimestreamQueryEndpointProvider.cpp +++ b/generated/src/aws-cpp-sdk-timestream-query/source/TimestreamQueryEndpointProvider.cpp @@ -32,6 +32,11 @@ void TimestreamQueryBuiltInParameters::SetFromClientConfiguration(const Timestre SetFromClientConfiguration(static_cast(config)); } +void TimestreamQueryBuiltInParameters::SetFromClientConfiguration(const TimestreamQueryClientConfiguration& config, + const Aws::String& serviceName) { + SetFromClientConfiguration(static_cast(config), serviceName); +} + } // namespace Endpoint } // namespace TimestreamQuery } // namespace Aws diff --git a/generated/src/aws-cpp-sdk-timestream-write/include/aws/timestream-write/TimestreamWriteEndpointProvider.h b/generated/src/aws-cpp-sdk-timestream-write/include/aws/timestream-write/TimestreamWriteEndpointProvider.h index 43660141c3ec..afbb43697642 100644 --- a/generated/src/aws-cpp-sdk-timestream-write/include/aws/timestream-write/TimestreamWriteEndpointProvider.h +++ b/generated/src/aws-cpp-sdk-timestream-write/include/aws/timestream-write/TimestreamWriteEndpointProvider.h @@ -26,6 +26,7 @@ class AWS_TIMESTREAMWRITE_API TimestreamWriteBuiltInParameters : public Aws::End virtual ~TimestreamWriteBuiltInParameters() {}; using Aws::Endpoint::BuiltInParameters::SetFromClientConfiguration; virtual void SetFromClientConfiguration(const TimestreamWriteClientConfiguration& config); + virtual void SetFromClientConfiguration(const TimestreamWriteClientConfiguration& config, const Aws::String& serviceName); }; /** diff --git a/generated/src/aws-cpp-sdk-timestream-write/source/TimestreamWriteEndpointProvider.cpp b/generated/src/aws-cpp-sdk-timestream-write/source/TimestreamWriteEndpointProvider.cpp index 6fa5acf54021..a9b7f026c9e8 100644 --- a/generated/src/aws-cpp-sdk-timestream-write/source/TimestreamWriteEndpointProvider.cpp +++ b/generated/src/aws-cpp-sdk-timestream-write/source/TimestreamWriteEndpointProvider.cpp @@ -32,6 +32,11 @@ void TimestreamWriteBuiltInParameters::SetFromClientConfiguration(const Timestre SetFromClientConfiguration(static_cast(config)); } +void TimestreamWriteBuiltInParameters::SetFromClientConfiguration(const TimestreamWriteClientConfiguration& config, + const Aws::String& serviceName) { + SetFromClientConfiguration(static_cast(config), serviceName); +} + } // namespace Endpoint } // namespace TimestreamWrite } // namespace Aws diff --git a/src/aws-cpp-sdk-core/include/aws/core/client/AWSProtocolClient.h b/src/aws-cpp-sdk-core/include/aws/core/client/AWSProtocolClient.h index bf095a609a7d..5066c2f9021e 100644 --- a/src/aws-cpp-sdk-core/include/aws/core/client/AWSProtocolClient.h +++ b/src/aws-cpp-sdk-core/include/aws/core/client/AWSProtocolClient.h @@ -175,7 +175,9 @@ namespace Aws const char*& signerServiceNameOverride) const { if (endpoint.GetAttributes()) { - signerName = endpoint.GetAttributes()->authScheme.GetName().c_str(); + if (!endpoint.GetAttributes()->authScheme.GetName().empty()) { + signerName = endpoint.GetAttributes()->authScheme.GetName().c_str(); + } if (endpoint.GetAttributes()->authScheme.GetSigningRegion()) { signerRegionOverride = endpoint.GetAttributes()->authScheme.GetSigningRegion()->c_str(); } diff --git a/src/aws-cpp-sdk-core/include/smithy/client/AwsSmithyClient.h b/src/aws-cpp-sdk-core/include/smithy/client/AwsSmithyClient.h index b5760248c530..61790f3ed289 100644 --- a/src/aws-cpp-sdk-core/include/smithy/client/AwsSmithyClient.h +++ b/src/aws-cpp-sdk-core/include/smithy/client/AwsSmithyClient.h @@ -147,7 +147,7 @@ namespace client void initClient() { if (m_endpointProvider && m_authSchemeResolver) { - m_endpointProvider->InitBuiltInParameters(m_clientConfiguration); + m_endpointProvider->InitBuiltInParameters(m_clientConfiguration, m_serviceName); m_authSchemeResolver->Init(m_clientConfiguration); } else { AWS_LOGSTREAM_FATAL(ServiceNameT, "Unable to init client: endpoint provider=" << m_endpointProvider diff --git a/tests/aws-cpp-sdk-core-tests/endpoint/SmithyClientEndpointProviderTest.cpp b/tests/aws-cpp-sdk-core-tests/endpoint/SmithyClientEndpointProviderTest.cpp new file mode 100644 index 000000000000..4bfdb14bb256 --- /dev/null +++ b/tests/aws-cpp-sdk-core-tests/endpoint/SmithyClientEndpointProviderTest.cpp @@ -0,0 +1,109 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace +{ + static constexpr char ALLOCATION_TAG[] = "SmithyClientEndpointProviderTest"; + static constexpr char SERVICE_NAME[] = "TestService"; + + struct TestClientConfiguration : public Aws::Client::ClientConfiguration + { + }; + + class RecordingEndpointProvider : public Aws::Endpoint::EndpointProviderBase<> + { + public: + void InitBuiltInParameters(const Aws::Client::GenericClientConfiguration& config) override + { + AWS_UNREFERENCED_PARAM(config); + ++m_genericInitCalls; + } + + void InitBuiltInParameters( + const Aws::Client::GenericClientConfiguration& config, const Aws::String& serviceName) override + { + AWS_UNREFERENCED_PARAM(config); + ++m_serviceInitCalls; + m_serviceName = serviceName; + } + + void OverrideEndpoint(const Aws::String& endpoint) override + { + AWS_UNREFERENCED_PARAM(endpoint); + } + + ClientContextParameters& AccessClientContextParameters() override + { + return m_clientContext; + } + + const ClientContextParameters& GetClientContextParameters() const override + { + return m_clientContext; + } + + Aws::Endpoint::ResolveEndpointOutcome ResolveEndpoint( + const Aws::Endpoint::EndpointParameters& endpointParameters) const override + { + AWS_UNREFERENCED_PARAM(endpointParameters); + return Aws::Endpoint::AWSEndpoint{}; + } + + size_t m_genericInitCalls{0}; + size_t m_serviceInitCalls{0}; + Aws::String m_serviceName; + + private: + ClientContextParameters m_clientContext; + }; + + using AuthSchemes = Aws::Crt::Variant; + using TestSmithyClient = smithy::client::AwsSmithyClientT< + SERVICE_NAME, + TestClientConfiguration, + smithy::GenericAuthSchemeResolver<>, + AuthSchemes, + RecordingEndpointProvider, + smithy::client::JsonOutcomeSerializer, + smithy::client::JsonOutcome, + Aws::Client::JsonErrorMarshaller>; + + class SmithyClientEndpointProviderTest : public Aws::Testing::AwsCppSdkGTestSuite + { + }; + + TEST_F(SmithyClientEndpointProviderTest, InitializesEndpointProviderWithServiceName) + { + const TestClientConfiguration config; + auto endpointProvider = Aws::MakeShared(ALLOCATION_TAG); + auto authSchemeResolver = Aws::MakeShared>(ALLOCATION_TAG); + auto httpClient = Aws::MakeShared(ALLOCATION_TAG); + auto errorMarshaller = Aws::MakeShared(ALLOCATION_TAG); + const Aws::UnorderedMap authSchemes; + + const TestSmithyClient client( + config, + SERVICE_NAME, + "TestServiceUserAgent", + httpClient, + errorMarshaller, + endpointProvider, + authSchemeResolver, + authSchemes); + + EXPECT_EQ(endpointProvider->m_serviceInitCalls, 1u); + EXPECT_EQ(endpointProvider->m_genericInitCalls, 0u); + EXPECT_EQ(endpointProvider->m_serviceName, SERVICE_NAME); + } +} // namespace diff --git a/tests/aws-cpp-sdk-kinesis-unit-tests/CMakeLists.txt b/tests/aws-cpp-sdk-kinesis-unit-tests/CMakeLists.txt new file mode 100644 index 000000000000..0a782b84745a --- /dev/null +++ b/tests/aws-cpp-sdk-kinesis-unit-tests/CMakeLists.txt @@ -0,0 +1,31 @@ +add_project(aws-cpp-sdk-kinesis-unit-tests + "Unit Tests for the Kinesis SDK Client" + aws-cpp-sdk-kinesis + testing-resources + aws_test_main + aws-cpp-sdk-core) + +if(MSVC AND BUILD_SHARED_LIBS) + add_definitions(-DGTEST_LINKED_AS_SHARED_LIBRARY=1) +endif() + +enable_testing() + +if(PLATFORM_ANDROID AND BUILD_SHARED_LIBS) + add_library(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/KinesisUnitTests.cpp) +else() + add_executable(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/KinesisUnitTests.cpp) +endif() + +set_compiler_flags(${PROJECT_NAME}) +set_compiler_warnings(${PROJECT_NAME}) + +target_link_libraries(${PROJECT_NAME} ${PROJECT_LIBS}) + +if(MSVC AND BUILD_SHARED_LIBS) + set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "/DELAYLOAD:aws-cpp-sdk-kinesis.dll /DELAYLOAD:aws-cpp-sdk-core.dll") + target_link_libraries(${PROJECT_NAME} delayimp.lib) +endif() + +include(GoogleTest) +gtest_add_tests(TARGET ${PROJECT_NAME}) diff --git a/tests/aws-cpp-sdk-kinesis-unit-tests/KinesisUnitTests.cpp b/tests/aws-cpp-sdk-kinesis-unit-tests/KinesisUnitTests.cpp new file mode 100644 index 000000000000..3e4e33e2fa89 --- /dev/null +++ b/tests/aws-cpp-sdk-kinesis-unit-tests/KinesisUnitTests.cpp @@ -0,0 +1,212 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace Aws; +using namespace Aws::Client; +using namespace Aws::Auth; +using namespace Aws::Http; +using namespace Aws::Http::Standard; +using namespace Aws::Kinesis; + +namespace { +const char* LOG_TAG = "KinesisUnitTest"; +} // namespace + +class KinesisUnitTest : public testing::Test { + protected: + static void SetUpTestSuite() { +#ifdef USE_AWS_MEMORY_MANAGEMENT + test_memory_system.reset(new ExactTestMemorySystem(1024, 128)); + options_.memoryManagementOptions.memoryManager = test_memory_system.get(); +#endif + InitAPI(options_); + mock_client_factory_ = Aws::MakeShared(LOG_TAG); + mock_http_client_ = Aws::MakeShared(LOG_TAG); + mock_client_factory_->SetClient(mock_http_client_); + SetHttpClientFactory(mock_client_factory_); + } + + static void TearDownTestSuite() { + mock_client_factory_.reset(); + mock_http_client_.reset(); + ShutdownAPI(options_); +#ifdef USE_AWS_MEMORY_MANAGEMENT + EXPECT_EQ(test_memory_system->GetCurrentOutstandingAllocations(), 0ULL); + EXPECT_EQ(test_memory_system->GetCurrentBytesAllocated(), 0ULL); + EXPECT_TRUE(test_memory_system->IsClean()); + if (test_memory_system->GetCurrentOutstandingAllocations() != 0ULL) FAIL(); + if (test_memory_system->GetCurrentBytesAllocated() != 0ULL) FAIL(); + if (!test_memory_system->IsClean()) FAIL(); + test_memory_system.reset(); +#endif + } + + void SetUp() override { mock_http_client_->Reset(); } + + static std::shared_ptr MakeClient(const KinesisClientConfiguration& configuration) { + const AWSCredentials credentials{"mal", "reynolds"}; + return Aws::MakeShared(LOG_TAG, credentials, Aws::MakeShared(LOG_TAG), configuration); + } + + static void QueueResponse(const char* body) { + auto responseStream = Aws::MakeShared(LOG_TAG, "serenity.firefly/streams", HttpMethod::HTTP_GET); + responseStream->SetResponseStreamFactory([body]() -> IOStream* { + return Aws::New(LOG_TAG, body, std::ios_base::in | std::ios_base::binary); + }); + auto response = Aws::MakeShared(LOG_TAG, responseStream); + response->SetResponseCode(HttpResponseCode::OK); + mock_http_client_->AddResponseToReturn(response); + } + + static SDKOptions options_; + static std::shared_ptr mock_http_client_; + static std::shared_ptr mock_client_factory_; +#ifdef USE_AWS_MEMORY_MANAGEMENT + static std::unique_ptr test_memory_system; +#endif + Environment::EnvironmentRAII m_unsetEnvVars{{ + {"AWS_SHARED_CREDENTIALS_FILE", ""}, + {"AWS_CONFIG_FILE", ""}, + {"AWS_DEFAULT_PROFILE", ""}, + {"AWS_PROFILE", ""}, + {"AWS_ACCESS_KEY_ID", ""}, + {"AWS_SECRET_ACCESS_KEY", ""}, + {"AWS_SESSION_TOKEN", ""}, + {"AWS_ACCOUNT_ID", ""}, + {"AWS_ACCOUNT_ID_ENDPOINT_MODE", ""}, + {"AWS_EC2_METADATA_DISABLED", ""}, + {"AWS_DEFAULT_REGION", ""}, + {"AWS_REGION", ""}, + {"AWS_ENDPOINT_URL", ""}, + {"AWS_ENDPOINT_URL_KINESIS", ""}, + }}; +}; + +SDKOptions KinesisUnitTest::options_; +std::shared_ptr KinesisUnitTest::mock_http_client_ = nullptr; +std::shared_ptr KinesisUnitTest::mock_client_factory_ = nullptr; +#ifdef USE_AWS_MEMORY_MANAGEMENT +std::unique_ptr KinesisUnitTest::test_memory_system = nullptr; +#endif + +namespace { +const char* LIST_STREAMS_RESPONSE = R"({"StreamNames": ["Serenity"], "HasMoreStreams": false})"; +const char* PUT_RECORD_RESPONSE = R"({"SequenceNumber": "49590338271490256608559692538361571095921575989136588898", "ShardId": "shardId-000000000000"})"; +} // namespace + +TEST_F(KinesisUnitTest, ShouldUseAccountIDEndpointSetOnConfiguration) { + KinesisClientConfiguration configuration; + configuration.region = "us-east-1"; + configuration.accountId = "serenity"; + + const auto accountIdClient = MakeClient(configuration); + QueueResponse(LIST_STREAMS_RESPONSE); + + const auto listStreamsOutcome = accountIdClient->ListStreams(); + EXPECT_TRUE(listStreamsOutcome.IsSuccess()); + const auto requestSeen = mock_http_client_->GetMostRecentHttpRequest(); + EXPECT_EQ("https://serenity.control-kinesis.us-east-1.amazonaws.com", requestSeen.GetUri().GetURIString()); + const auto features = GetFeaturesForRequest(requestSeen); + EXPECT_TRUE(!features.empty()); + EXPECT_TRUE(std::find(features.begin(), features.end(), "P") != features.end()); +} + +TEST_F(KinesisUnitTest, ShouldUseAccountIDEndpointForDataPlaneOperation) { + KinesisClientConfiguration configuration; + configuration.region = "us-east-1"; + configuration.accountId = "firefly"; + + const auto accountIdClient = MakeClient(configuration); + QueueResponse(PUT_RECORD_RESPONSE); + + Model::PutRecordRequest putRecordRequest; + putRecordRequest.SetStreamName("Serenity"); + putRecordRequest.SetPartitionKey("wash"); + Aws::Utils::ByteBuffer data{reinterpret_cast("shiny"), 5}; + putRecordRequest.SetData(data); + + const auto putRecordOutcome = accountIdClient->PutRecord(putRecordRequest); + EXPECT_TRUE(putRecordOutcome.IsSuccess()); + const auto requestSeen = mock_http_client_->GetMostRecentHttpRequest(); + EXPECT_EQ("https://firefly.data-kinesis.us-east-1.amazonaws.com", requestSeen.GetUri().GetURIString()); +} + +TEST_F(KinesisUnitTest, ShouldNotUseAccountIDEndpointWhenDisabled) { + KinesisClientConfiguration configuration; + configuration.region = "us-east-1"; + configuration.accountId = "jayne"; + configuration.accountIdEndpointMode = "disabled"; + + const auto accountIdClient = MakeClient(configuration); + QueueResponse(LIST_STREAMS_RESPONSE); + + const auto listStreamsOutcome = accountIdClient->ListStreams(); + EXPECT_TRUE(listStreamsOutcome.IsSuccess()); + const auto requestSeen = mock_http_client_->GetMostRecentHttpRequest(); + EXPECT_EQ("https://kinesis.us-east-1.amazonaws.com", requestSeen.GetUri().GetURIString()); + const auto features = GetFeaturesForRequest(requestSeen); + EXPECT_TRUE(!features.empty()); + EXPECT_TRUE(std::find(features.begin(), features.end(), "Q") != features.end()); +} + +TEST_F(KinesisUnitTest, ShouldFailWhenNoAccountIDAndRequired) { + KinesisClientConfiguration configuration; + configuration.region = "us-east-1"; + configuration.accountIdEndpointMode = "required"; + + const auto accountIdClient = MakeClient(configuration); + QueueResponse(LIST_STREAMS_RESPONSE); + + const auto listStreamsOutcome = accountIdClient->ListStreams(); + EXPECT_TRUE(!listStreamsOutcome.IsSuccess()); + EXPECT_EQ(listStreamsOutcome.GetError().GetMessage(), + "AccountIdEndpointMode is required but no AccountID was provided or able to be loaded"); +} + +TEST_F(KinesisUnitTest, ShouldWorkWhenAccountIDPresentAndRequired) { + KinesisClientConfiguration configuration; + configuration.region = "us-east-1"; + configuration.accountId = "kaylee"; + configuration.accountIdEndpointMode = "required"; + + const auto accountIdClient = MakeClient(configuration); + QueueResponse(LIST_STREAMS_RESPONSE); + + const auto listStreamsOutcome = accountIdClient->ListStreams(); + EXPECT_TRUE(listStreamsOutcome.IsSuccess()); + const auto requestSeen = mock_http_client_->GetMostRecentHttpRequest(); + EXPECT_EQ("https://kaylee.control-kinesis.us-east-1.amazonaws.com", requestSeen.GetUri().GetURIString()); + const auto features = GetFeaturesForRequest(requestSeen); + EXPECT_TRUE(!features.empty()); + EXPECT_TRUE(std::find(features.begin(), features.end(), "R") != features.end()); +} + +TEST_F(KinesisUnitTest, AccountIdBuiltInParametersReachTheEndpointProvider) { + KinesisClientConfiguration configuration; + configuration.region = "us-east-1"; + configuration.accountId = "inara"; + configuration.accountIdEndpointMode = "required"; + + const auto accountIdClient = MakeClient(configuration); + const auto provider = std::static_pointer_cast(accountIdClient->accessEndpointProvider()); + ASSERT_TRUE(provider != nullptr); + + const auto& builtIns = provider->GetBuiltInParameters(); + EXPECT_EQ("inara", builtIns.GetParameter("AccountId").GetStrValueNoCheck()); + EXPECT_EQ("required", builtIns.GetParameter("AccountIdEndpointMode").GetStrValueNoCheck()); +} diff --git a/tests/aws-cpp-sdk-s3-crt-unit-tests/CMakeLists.txt b/tests/aws-cpp-sdk-s3-crt-unit-tests/CMakeLists.txt new file mode 100644 index 000000000000..ea0a6211e832 --- /dev/null +++ b/tests/aws-cpp-sdk-s3-crt-unit-tests/CMakeLists.txt @@ -0,0 +1,31 @@ +add_project(aws-cpp-sdk-s3-crt-unit-tests + "Unit Tests for the S3 CRT SDK Client" + aws-cpp-sdk-s3-crt + testing-resources + aws_test_main + aws-cpp-sdk-core) + +if(MSVC AND BUILD_SHARED_LIBS) + add_definitions(-DGTEST_LINKED_AS_SHARED_LIBRARY=1) +endif() + +enable_testing() + +if(PLATFORM_ANDROID AND BUILD_SHARED_LIBS) + add_library(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/S3CrtUnitTests.cpp) +else() + add_executable(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/S3CrtUnitTests.cpp) +endif() + +set_compiler_flags(${PROJECT_NAME}) +set_compiler_warnings(${PROJECT_NAME}) + +target_link_libraries(${PROJECT_NAME} ${PROJECT_LIBS}) + +if(MSVC AND BUILD_SHARED_LIBS) + set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "/DELAYLOAD:aws-cpp-sdk-s3-crt.dll /DELAYLOAD:aws-cpp-sdk-core.dll") + target_link_libraries(${PROJECT_NAME} delayimp.lib) +endif() + +include(GoogleTest) +gtest_add_tests(TARGET ${PROJECT_NAME}) diff --git a/tests/aws-cpp-sdk-s3-crt-unit-tests/S3CrtUnitTests.cpp b/tests/aws-cpp-sdk-s3-crt-unit-tests/S3CrtUnitTests.cpp new file mode 100644 index 000000000000..bd690a3b4a7e --- /dev/null +++ b/tests/aws-cpp-sdk-s3-crt-unit-tests/S3CrtUnitTests.cpp @@ -0,0 +1,157 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace Aws; +using namespace Aws::Client; +using namespace Aws::Auth; +using namespace Aws::S3Crt; + +namespace { +const char* LOG_TAG = "S3CrtUnitTest"; +const char* MRAP_BUCKET_ARN = "arn:aws:s3::123456789012:accesspoint:mfzwi23gnjvgw.mrap"; +} // namespace + +class S3CrtUnitTest : public testing::Test { + protected: + static void SetUpTestSuite() { +#ifdef USE_AWS_MEMORY_MANAGEMENT + test_memory_system.reset(new ExactTestMemorySystem(1024, 128)); + options_.memoryManagementOptions.memoryManager = test_memory_system.get(); +#endif + InitAPI(options_); + } + + static void TearDownTestSuite() { + ShutdownAPI(options_); +#ifdef USE_AWS_MEMORY_MANAGEMENT + EXPECT_EQ(test_memory_system->GetCurrentOutstandingAllocations(), 0ULL); + EXPECT_EQ(test_memory_system->GetCurrentBytesAllocated(), 0ULL); + EXPECT_TRUE(test_memory_system->IsClean()); + if (test_memory_system->GetCurrentOutstandingAllocations() != 0ULL) FAIL(); + if (test_memory_system->GetCurrentBytesAllocated() != 0ULL) FAIL(); + if (!test_memory_system->IsClean()) FAIL(); + test_memory_system.reset(); +#endif + } + + static std::shared_ptr MakeProvider(const S3CrtClientConfiguration& configuration) { + auto provider = Aws::MakeShared(LOG_TAG); + provider->InitBuiltInParameters(configuration, "s3"); + return provider; + } + + static SDKOptions options_; +#ifdef USE_AWS_MEMORY_MANAGEMENT + static std::unique_ptr test_memory_system; +#endif + Environment::EnvironmentRAII m_unsetEnvVars{{ + {"AWS_SHARED_CREDENTIALS_FILE", ""}, + {"AWS_CONFIG_FILE", ""}, + {"AWS_DEFAULT_PROFILE", ""}, + {"AWS_PROFILE", ""}, + {"AWS_ACCESS_KEY_ID", ""}, + {"AWS_SECRET_ACCESS_KEY", ""}, + {"AWS_SESSION_TOKEN", ""}, + {"AWS_S3_USE_ARN_REGION", ""}, + {"AWS_EC2_METADATA_DISABLED", ""}, + {"AWS_DEFAULT_REGION", ""}, + {"AWS_REGION", ""}, + {"AWS_ENDPOINT_URL", ""}, + {"AWS_ENDPOINT_URL_S3", ""}, + }}; +}; + +SDKOptions S3CrtUnitTest::options_; +#ifdef USE_AWS_MEMORY_MANAGEMENT +std::unique_ptr S3CrtUnitTest::test_memory_system = nullptr; +#endif + +TEST_F(S3CrtUnitTest, ServiceSpecificBuiltInParametersSurviveServiceNameInit) { + S3CrtClientConfiguration configuration; + configuration.region = "us-east-1"; + configuration.useVirtualAddressing = false; + configuration.useArnRegion = true; + configuration.disableMultiRegionAccessPoints = true; + configuration.disableS3ExpressAuth = true; + configuration.useUSEast1RegionalEndPointOption = US_EAST_1_REGIONAL_ENDPOINT_OPTION::LEGACY; + + const auto provider = MakeProvider(configuration); + const auto& builtIns = provider->GetBuiltInParameters(); + + EXPECT_TRUE(builtIns.GetParameter("ForcePathStyle").GetBoolValueNoCheck()); + EXPECT_TRUE(builtIns.GetParameter("UseArnRegion").GetBoolValueNoCheck()); + EXPECT_TRUE(builtIns.GetParameter("DisableMultiRegionAccessPoints").GetBoolValueNoCheck()); + EXPECT_TRUE(builtIns.GetParameter("DisableS3ExpressSessionAuth").GetBoolValueNoCheck()); + EXPECT_TRUE(builtIns.GetParameter("UseGlobalEndpoint").GetBoolValueNoCheck()); +} + +TEST_F(S3CrtUnitTest, ClientPropagatesServiceSpecificBuiltInParameters) { + S3CrtClientConfiguration configuration; + configuration.region = "us-east-1"; + configuration.useVirtualAddressing = false; + configuration.useArnRegion = true; + + const AWSCredentials credentials{"mal", "reynolds"}; + S3CrtClient client{credentials, configuration}; + + const auto provider = std::static_pointer_cast(client.accessEndpointProvider()); + ASSERT_TRUE(provider != nullptr); + + const auto& builtIns = provider->GetBuiltInParameters(); + EXPECT_TRUE(builtIns.GetParameter("ForcePathStyle").GetBoolValueNoCheck()); + EXPECT_TRUE(builtIns.GetParameter("UseArnRegion").GetBoolValueNoCheck()); +} + +TEST_F(S3CrtUnitTest, ForcePathStyleResolvesPathStyleEndpoint) { + S3CrtClientConfiguration configuration; + configuration.region = "us-east-1"; + configuration.useVirtualAddressing = false; + + const auto provider = MakeProvider(configuration); + const Aws::Endpoint::EndpointParameters requestParameters{ + {"Bucket", Aws::String{"serenity"}, Aws::Endpoint::EndpointParameter::ParameterOrigin::OPERATION_CONTEXT}}; + + const auto outcome = provider->ResolveEndpoint(requestParameters); + ASSERT_TRUE(outcome.IsSuccess()); + EXPECT_EQ("https://s3.us-east-1.amazonaws.com/serenity", outcome.GetResult().GetURI().GetURIString()); +} + +TEST_F(S3CrtUnitTest, LegacyUsEast1OptionResolvesGlobalEndpoint) { + S3CrtClientConfiguration configuration; + configuration.region = "us-east-1"; + configuration.useUSEast1RegionalEndPointOption = US_EAST_1_REGIONAL_ENDPOINT_OPTION::LEGACY; + + const auto provider = MakeProvider(configuration); + const Aws::Endpoint::EndpointParameters requestParameters{ + {"Bucket", Aws::String{"serenity"}, Aws::Endpoint::EndpointParameter::ParameterOrigin::OPERATION_CONTEXT}}; + + const auto outcome = provider->ResolveEndpoint(requestParameters); + ASSERT_TRUE(outcome.IsSuccess()); + EXPECT_EQ("https://serenity.s3.amazonaws.com", outcome.GetResult().GetURI().GetURIString()); +} + +TEST_F(S3CrtUnitTest, DisabledMultiRegionAccessPointsRejectsMrapArn) { + S3CrtClientConfiguration configuration; + configuration.region = "us-east-1"; + configuration.disableMultiRegionAccessPoints = true; + + const auto provider = MakeProvider(configuration); + const Aws::Endpoint::EndpointParameters requestParameters{ + {"Bucket", Aws::String{MRAP_BUCKET_ARN}, Aws::Endpoint::EndpointParameter::ParameterOrigin::OPERATION_CONTEXT}}; + + const auto outcome = provider->ResolveEndpoint(requestParameters); + EXPECT_TRUE(!outcome.IsSuccess()); + EXPECT_EQ("Invalid configuration: Multi-Region Access Point ARNs are disabled.", outcome.GetError().GetMessage()); +} diff --git a/tests/aws-cpp-sdk-s3-unit-tests/S3UnitTests.cpp b/tests/aws-cpp-sdk-s3-unit-tests/S3UnitTests.cpp index dd748b0d9ee5..ee0e051c3d97 100644 --- a/tests/aws-cpp-sdk-s3-unit-tests/S3UnitTests.cpp +++ b/tests/aws-cpp-sdk-s3-unit-tests/S3UnitTests.cpp @@ -856,3 +856,110 @@ TEST_F(S3UnitTest, PutObjectWithDisableExpectHeaderDoesNotSendExpect) { const auto seenRequest = _mockHttpClient->GetMostRecentHttpRequest(); EXPECT_FALSE(seenRequest.HasHeader("expect")); } + +namespace { +const char* ACCESS_POINT_ARN_US_EAST_1 = "arn:aws:s3:us-east-1:123456789012:accesspoint:myendpoint"; +const char* MRAP_BUCKET_ARN = "arn:aws:s3::123456789012:accesspoint:mfzwi23gnjvgw.mrap"; + +std::shared_ptr MakeS3Client(const S3ClientConfiguration& s3Config) { + const AWSCredentials credentials{"mal", "reynolds"}; + return Aws::MakeShared(ALLOCATION_TAG, credentials, Aws::MakeShared(ALLOCATION_TAG), s3Config); +} + +void QueueEmptyOkResponse(const std::shared_ptr& mockHttpClient) { + auto mockRequest = Aws::MakeShared(ALLOCATION_TAG, "serenity.firefly/objects", HttpMethod::HTTP_GET); + mockRequest->SetResponseStreamFactory([]() -> IOStream* { + return Aws::New(ALLOCATION_TAG, "", std::ios_base::in | std::ios_base::binary); + }); + auto mockResponse = Aws::MakeShared(ALLOCATION_TAG, mockRequest); + mockResponse->SetResponseCode(HttpResponseCode::OK); + mockHttpClient->AddResponseToReturn(mockResponse); +} +} // namespace + +TEST_F(S3UnitTest, ForcePathStyleResolvesPathStyleEndpoint) { + S3ClientConfiguration s3Config; + s3Config.region = "us-east-1"; + s3Config.useVirtualAddressing = false; + + const auto client = MakeS3Client(s3Config); + QueueEmptyOkResponse(_mockHttpClient); + + const auto response = client->HeadBucket(HeadBucketRequest().WithBucket("serenity")); + AWS_EXPECT_SUCCESS(response); + const auto seenRequest = _mockHttpClient->GetMostRecentHttpRequest(); + EXPECT_EQ("https://s3.us-east-1.amazonaws.com/serenity", seenRequest.GetUri().GetURIString()); +} + +TEST_F(S3UnitTest, LegacyUsEast1OptionResolvesGlobalEndpoint) { + S3ClientConfiguration s3Config; + s3Config.region = "us-east-1"; + s3Config.useUSEast1RegionalEndPointOption = US_EAST_1_REGIONAL_ENDPOINT_OPTION::LEGACY; + + const auto client = MakeS3Client(s3Config); + QueueEmptyOkResponse(_mockHttpClient); + + const auto response = client->HeadBucket(HeadBucketRequest().WithBucket("serenity")); + AWS_EXPECT_SUCCESS(response); + const auto seenRequest = _mockHttpClient->GetMostRecentHttpRequest(); + EXPECT_EQ("serenity.s3.amazonaws.com", seenRequest.GetUri().GetAuthority()); +} + +TEST_F(S3UnitTest, ShouldFailWhenArnRegionMismatchesAndUseArnRegionIsFalse) { + S3ClientConfiguration s3Config; + s3Config.region = "us-west-2"; + + const auto client = MakeS3Client(s3Config); + + const auto response = client->HeadBucket(HeadBucketRequest().WithBucket(ACCESS_POINT_ARN_US_EAST_1)); + EXPECT_FALSE(response.IsSuccess()); + EXPECT_EQ(response.GetError().GetMessage(), + "Invalid configuration: region from ARN `us-east-1` does not match client region `us-west-2` and UseArnRegion is `false`"); +} + +TEST_F(S3UnitTest, ShouldUseArnRegionWhenEnabled) { + S3ClientConfiguration s3Config; + s3Config.region = "us-west-2"; + s3Config.useArnRegion = true; + + const auto client = MakeS3Client(s3Config); + QueueEmptyOkResponse(_mockHttpClient); + + const auto response = client->HeadBucket(HeadBucketRequest().WithBucket(ACCESS_POINT_ARN_US_EAST_1)); + AWS_EXPECT_SUCCESS(response); + const auto seenRequest = _mockHttpClient->GetMostRecentHttpRequest(); + EXPECT_EQ("myendpoint-123456789012.s3-accesspoint.us-east-1.amazonaws.com", seenRequest.GetUri().GetAuthority()); +} + +TEST_F(S3UnitTest, DisabledMultiRegionAccessPointsRejectsMrapArn) { + S3ClientConfiguration s3Config; + s3Config.region = "us-east-1"; + s3Config.disableMultiRegionAccessPoints = true; + + const auto client = MakeS3Client(s3Config); + + const auto response = client->HeadBucket(HeadBucketRequest().WithBucket(MRAP_BUCKET_ARN)); + EXPECT_FALSE(response.IsSuccess()); + EXPECT_EQ(response.GetError().GetMessage(), "Invalid configuration: Multi-Region Access Point ARNs are disabled."); +} + +TEST_F(S3UnitTest, ServiceSpecificBuiltInParametersReachTheEndpointProvider) { + S3ClientConfiguration s3Config; + s3Config.region = "us-east-1"; + s3Config.useVirtualAddressing = false; + s3Config.useArnRegion = true; + s3Config.disableMultiRegionAccessPoints = true; + s3Config.disableS3ExpressAuth = true; + s3Config.useUSEast1RegionalEndPointOption = US_EAST_1_REGIONAL_ENDPOINT_OPTION::LEGACY; + + const auto client = MakeS3Client(s3Config); + const auto provider = std::static_pointer_cast(client->accessEndpointProvider()); + ASSERT_TRUE(provider != nullptr); + + const auto& builtIns = provider->GetBuiltInParameters(); + EXPECT_TRUE(builtIns.GetParameter("ForcePathStyle").GetBoolValueNoCheck()); + EXPECT_TRUE(builtIns.GetParameter("UseArnRegion").GetBoolValueNoCheck()); + EXPECT_TRUE(builtIns.GetParameter("DisableMultiRegionAccessPoints").GetBoolValueNoCheck()); + EXPECT_TRUE(builtIns.GetParameter("DisableS3ExpressSessionAuth").GetBoolValueNoCheck()); + EXPECT_TRUE(builtIns.GetParameter("UseGlobalEndpoint").GetBoolValueNoCheck()); +} diff --git a/tests/aws-cpp-sdk-s3control-unit-tests/CMakeLists.txt b/tests/aws-cpp-sdk-s3control-unit-tests/CMakeLists.txt new file mode 100644 index 000000000000..d68a8827b710 --- /dev/null +++ b/tests/aws-cpp-sdk-s3control-unit-tests/CMakeLists.txt @@ -0,0 +1,31 @@ +add_project(aws-cpp-sdk-s3control-unit-tests + "Unit Tests for the S3 Control SDK Client" + aws-cpp-sdk-s3control + testing-resources + aws_test_main + aws-cpp-sdk-core) + +if(MSVC AND BUILD_SHARED_LIBS) + add_definitions(-DGTEST_LINKED_AS_SHARED_LIBRARY=1) +endif() + +enable_testing() + +if(PLATFORM_ANDROID AND BUILD_SHARED_LIBS) + add_library(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/S3ControlUnitTests.cpp) +else() + add_executable(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/S3ControlUnitTests.cpp) +endif() + +set_compiler_flags(${PROJECT_NAME}) +set_compiler_warnings(${PROJECT_NAME}) + +target_link_libraries(${PROJECT_NAME} ${PROJECT_LIBS}) + +if(MSVC AND BUILD_SHARED_LIBS) + set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "/DELAYLOAD:aws-cpp-sdk-s3control.dll /DELAYLOAD:aws-cpp-sdk-core.dll") + target_link_libraries(${PROJECT_NAME} delayimp.lib) +endif() + +include(GoogleTest) +gtest_add_tests(TARGET ${PROJECT_NAME}) diff --git a/tests/aws-cpp-sdk-s3control-unit-tests/S3ControlUnitTests.cpp b/tests/aws-cpp-sdk-s3control-unit-tests/S3ControlUnitTests.cpp new file mode 100644 index 000000000000..803834d685a9 --- /dev/null +++ b/tests/aws-cpp-sdk-s3control-unit-tests/S3ControlUnitTests.cpp @@ -0,0 +1,181 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace Aws; +using namespace Aws::Client; +using namespace Aws::Auth; +using namespace Aws::Http; +using namespace Aws::Http::Standard; +using namespace Aws::S3Control; + +namespace { +const char* LOG_TAG = "S3ControlUnitTest"; +const char* OUTPOST_ACCESS_POINT_ARN = "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint"; +const char* ARN_ACCOUNT_ID = "123456789012"; +} // namespace + +class S3ControlUnitTest : public testing::Test { + protected: + static void SetUpTestSuite() { +#ifdef USE_AWS_MEMORY_MANAGEMENT + test_memory_system.reset(new ExactTestMemorySystem(1024, 128)); + options_.memoryManagementOptions.memoryManager = test_memory_system.get(); +#endif + InitAPI(options_); + mock_client_factory_ = Aws::MakeShared(LOG_TAG); + mock_http_client_ = Aws::MakeShared(LOG_TAG); + mock_client_factory_->SetClient(mock_http_client_); + SetHttpClientFactory(mock_client_factory_); + } + + static void TearDownTestSuite() { + mock_client_factory_.reset(); + mock_http_client_.reset(); + ShutdownAPI(options_); +#ifdef USE_AWS_MEMORY_MANAGEMENT + EXPECT_EQ(test_memory_system->GetCurrentOutstandingAllocations(), 0ULL); + EXPECT_EQ(test_memory_system->GetCurrentBytesAllocated(), 0ULL); + EXPECT_TRUE(test_memory_system->IsClean()); + if (test_memory_system->GetCurrentOutstandingAllocations() != 0ULL) FAIL(); + if (test_memory_system->GetCurrentBytesAllocated() != 0ULL) FAIL(); + if (!test_memory_system->IsClean()) FAIL(); + test_memory_system.reset(); +#endif + } + + void SetUp() override { mock_http_client_->Reset(); } + + static std::shared_ptr MakeClient(const S3ControlClientConfiguration& configuration) { + const AWSCredentials credentials{"zoe", "washburne"}; + return Aws::MakeShared(LOG_TAG, credentials, Aws::MakeShared(LOG_TAG), configuration); + } + + static void QueueResponse(const char* body) { + auto responseStream = Aws::MakeShared(LOG_TAG, "serenity.firefly/accesspoints", HttpMethod::HTTP_GET); + responseStream->SetResponseStreamFactory([body]() -> IOStream* { + return Aws::New(LOG_TAG, body, std::ios_base::in | std::ios_base::binary); + }); + auto response = Aws::MakeShared(LOG_TAG, responseStream); + response->SetResponseCode(HttpResponseCode::OK); + mock_http_client_->AddResponseToReturn(response); + } + + static SDKOptions options_; + static std::shared_ptr mock_http_client_; + static std::shared_ptr mock_client_factory_; +#ifdef USE_AWS_MEMORY_MANAGEMENT + static std::unique_ptr test_memory_system; +#endif + Environment::EnvironmentRAII m_unsetEnvVars{{ + {"AWS_SHARED_CREDENTIALS_FILE", ""}, + {"AWS_CONFIG_FILE", ""}, + {"AWS_DEFAULT_PROFILE", ""}, + {"AWS_PROFILE", ""}, + {"AWS_ACCESS_KEY_ID", ""}, + {"AWS_SECRET_ACCESS_KEY", ""}, + {"AWS_SESSION_TOKEN", ""}, + {"AWS_ACCOUNT_ID", ""}, + {"AWS_ACCOUNT_ID_ENDPOINT_MODE", ""}, + {"AWS_S3_USE_ARN_REGION", ""}, + {"AWS_EC2_METADATA_DISABLED", ""}, + {"AWS_DEFAULT_REGION", ""}, + {"AWS_REGION", ""}, + {"AWS_ENDPOINT_URL", ""}, + {"AWS_ENDPOINT_URL_S3_CONTROL", ""}, + }}; +}; + +SDKOptions S3ControlUnitTest::options_; +std::shared_ptr S3ControlUnitTest::mock_http_client_ = nullptr; +std::shared_ptr S3ControlUnitTest::mock_client_factory_ = nullptr; +#ifdef USE_AWS_MEMORY_MANAGEMENT +std::unique_ptr S3ControlUnitTest::test_memory_system = nullptr; +#endif + +namespace { +const char* LIST_ACCESS_POINTS_RESPONSE = + R"()"; +const char* GET_ACCESS_POINT_RESPONSE = + R"(myaccesspoint)"; +} // namespace + +TEST_F(S3ControlUnitTest, ShouldFailWhenArnRegionMismatchesAndUseArnRegionIsFalse) { + S3ControlClientConfiguration configuration; + configuration.region = "us-west-2"; + + const auto client = MakeClient(configuration); + QueueResponse(GET_ACCESS_POINT_RESPONSE); + + Model::GetAccessPointRequest request; + request.SetAccountId(ARN_ACCOUNT_ID); + request.SetName(OUTPOST_ACCESS_POINT_ARN); + + const auto outcome = client->GetAccessPoint(request); + EXPECT_TRUE(!outcome.IsSuccess()); + EXPECT_EQ(outcome.GetError().GetMessage(), + "Invalid configuration: region from ARN `us-east-1` does not match client region `us-west-2` and UseArnRegion is `false`"); +} + +TEST_F(S3ControlUnitTest, ShouldUseArnRegionWhenEnabled) { + S3ControlClientConfiguration configuration; + configuration.region = "us-west-2"; + configuration.useArnRegion = true; + + const auto client = MakeClient(configuration); + QueueResponse(GET_ACCESS_POINT_RESPONSE); + + Model::GetAccessPointRequest request; + request.SetAccountId(ARN_ACCOUNT_ID); + request.SetName(OUTPOST_ACCESS_POINT_ARN); + + const auto outcome = client->GetAccessPoint(request); + EXPECT_TRUE(outcome.IsSuccess()); + const auto requestSeen = mock_http_client_->GetMostRecentHttpRequest(); + EXPECT_EQ("s3-outposts.us-east-1.amazonaws.com", requestSeen.GetUri().GetAuthority()); +} + +TEST_F(S3ControlUnitTest, ShouldUseAccountIdFromConfigurationInEndpoint) { + S3ControlClientConfiguration configuration; + configuration.region = "us-east-1"; + configuration.accountId = "serenity"; + + const auto client = MakeClient(configuration); + QueueResponse(LIST_ACCESS_POINTS_RESPONSE); + + const Model::ListAccessPointsRequest request; + + const auto outcome = client->ListAccessPoints(request); + EXPECT_TRUE(outcome.IsSuccess()); + const auto requestSeen = mock_http_client_->GetMostRecentHttpRequest(); + EXPECT_EQ("serenity.s3-control.us-east-1.amazonaws.com", requestSeen.GetUri().GetAuthority()); +} + +TEST_F(S3ControlUnitTest, ServiceSpecificBuiltInParametersReachTheEndpointProvider) { + S3ControlClientConfiguration configuration; + configuration.region = "us-east-1"; + configuration.accountId = "kaylee"; + configuration.useArnRegion = true; + + const auto client = MakeClient(configuration); + const auto provider = std::static_pointer_cast(client->accessEndpointProvider()); + ASSERT_TRUE(provider != nullptr); + + const auto& builtIns = provider->GetBuiltInParameters(); + EXPECT_EQ("kaylee", builtIns.GetParameter("AccountId").GetStrValueNoCheck()); + EXPECT_TRUE(builtIns.GetParameter("UseArnRegion").GetBoolValueNoCheck()); +} diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/endpoint/EndpointProviderHeader.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/endpoint/EndpointProviderHeader.vm index 92eb290f1663..1e9723a0921f 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/endpoint/EndpointProviderHeader.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/endpoint/EndpointProviderHeader.vm @@ -13,6 +13,16 @@ #else #set($epProviderType = "DefaultEndpointProvider") #end +#set($hasServiceSpecificEpParams = false) +#if($serviceModel.metadata.serviceId == "S3" || $serviceModel.metadata.serviceId == "S3 Control") +#set($hasServiceSpecificEpParams = true) +#end +#if($serviceModel.endpointRuleSetModel.parameters.containsKey("AccountId")) +#set($hasServiceSpecificEpParams = true) +#end +#if($serviceModel.endpointRuleSetModel.parameters.containsKey("AccountIdEndpointMode")) +#set($hasServiceSpecificEpParams = true) +#end #pragma once \#include #if($serviceModel.hasServiceSpecificClientConfig()) @@ -77,11 +87,11 @@ public: virtual ~${epBuiltInClassName}(){}; using Aws::Endpoint::BuiltInParameters::SetFromClientConfiguration; virtual void SetFromClientConfiguration(const ${metadata.classNamePrefix}ClientConfiguration& config); -#if($serviceModel.metadata.serviceId == "S3") virtual void SetFromClientConfiguration(const ${metadata.classNamePrefix}ClientConfiguration& config, const Aws::String& serviceName); +#if($hasServiceSpecificEpParams) private: - void SetS3SpecificParameters(const ${metadata.classNamePrefix}ClientConfiguration& config); + void SetServiceSpecificParameters(const ${metadata.classNamePrefix}ClientConfiguration& config); #end }; #else diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/endpoint/EndpointProviderSource.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/endpoint/EndpointProviderSource.vm index da352420e8f4..d57aca5e100b 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/endpoint/EndpointProviderSource.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/endpoint/EndpointProviderSource.vm @@ -11,6 +11,16 @@ #else #set($epProviderType = "DefaultEndpointProvider") #end +#set($hasServiceSpecificEpParams = false) +#if($serviceModel.metadata.serviceId == "S3" || $serviceModel.metadata.serviceId == "S3 Control") +#set($hasServiceSpecificEpParams = true) +#end +#if($serviceModel.endpointRuleSetModel.parameters.containsKey("AccountId")) +#set($hasServiceSpecificEpParams = true) +#end +#if($serviceModel.endpointRuleSetModel.parameters.containsKey("AccountIdEndpointMode")) +#set($hasServiceSpecificEpParams = true) +#end \#include #if ($serviceModel.endpointRules) \#include @@ -74,10 +84,22 @@ ${metadata.classNamePrefix}EndpointProvider::${metadata.classNamePrefix}Endpoint void ${epBuiltInClassName}::SetFromClientConfiguration(const ${metadata.classNamePrefix}ClientConfiguration& config) { SetFromClientConfiguration(static_cast(config)); +#if($hasServiceSpecificEpParams) + SetServiceSpecificParameters(config); +#end + } -#if($serviceModel.metadata.serviceId == "S3") - SetS3SpecificParameters(config); + void ${epBuiltInClassName}::SetFromClientConfiguration(const ${metadata.classNamePrefix}ClientConfiguration& config, const Aws::String& serviceName) + { + SetFromClientConfiguration(static_cast(config), serviceName); +#if($hasServiceSpecificEpParams) + SetServiceSpecificParameters(config); #end + } + +#if($hasServiceSpecificEpParams) + void ${epBuiltInClassName}::SetServiceSpecificParameters(const ${metadata.classNamePrefix}ClientConfiguration& config) + { #if($serviceModel.metadata.serviceId == "S3 Control") static const char* AWS_S3_USE_ARN_REGION = "UseArnRegion"; SetBooleanParameter(AWS_S3_USE_ARN_REGION, config.useArnRegion); @@ -92,17 +114,7 @@ ${metadata.classNamePrefix}EndpointProvider::${metadata.classNamePrefix}Endpoint SetStringParameter("AccountIdEndpointMode", config.accountIdEndpointMode); } #end - } - #if($serviceModel.metadata.serviceId == "S3") - void ${epBuiltInClassName}::SetFromClientConfiguration(const ${metadata.classNamePrefix}ClientConfiguration& config, const Aws::String& serviceName) - { - SetFromClientConfiguration(static_cast(config), serviceName); - SetS3SpecificParameters(config); - } - - void ${epBuiltInClassName}::SetS3SpecificParameters(const ${metadata.classNamePrefix}ClientConfiguration& config) - { static const char* AWS_S3_USE_GLOBAL_ENDPOINT = "UseGlobalEndpoint"; if (config.useUSEast1RegionalEndPointOption == US_EAST_1_REGIONAL_ENDPOINT_OPTION::LEGACY) { SetBooleanParameter(AWS_S3_USE_GLOBAL_ENDPOINT, true); @@ -127,6 +139,7 @@ ${metadata.classNamePrefix}EndpointProvider::${metadata.classNamePrefix}Endpoint if(config.disableS3ExpressAuth) { SetBooleanParameter(AWS_S3_DISABLE_EXPRESS_AUTH, true); } +#end } #end #end diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/s3-crt/S3CrtServiceClientSourceInit.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/s3-crt/S3CrtServiceClientSourceInit.vm index 584a224e857e..1b86cb9a0472 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/s3-crt/S3CrtServiceClientSourceInit.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/s3-crt/S3CrtServiceClientSourceInit.vm @@ -299,7 +299,7 @@ void ${className}::init(const ${clientConfigurationNamespace}::ClientConfigurati #if($serviceModel.endpointRules) m_endpointProvider = Aws::MakeShared(ALLOCATION_TAG); AWS_CHECK_PTR(SERVICE_NAME, m_endpointProvider); - m_endpointProvider->InitBuiltInParameters(config); + m_endpointProvider->InitBuiltInParameters(config, "${metadata.signingName}"); #end #if(!$serviceModel.endpointRules) #if($AdditionalServiceSpecificConfigLoadString) diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/s3-crt/SmithyS3CrtServiceClientSourceInit.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/s3-crt/SmithyS3CrtServiceClientSourceInit.vm index 9a624da7f957..ee7d50a904ff 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/s3-crt/SmithyS3CrtServiceClientSourceInit.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/s3-crt/SmithyS3CrtServiceClientSourceInit.vm @@ -241,7 +241,7 @@ void ${className}::init(const ${clientConfigurationNamespace}::ClientConfigurati #if($serviceModel.endpointRules) m_endpointProvider = Aws::MakeShared(ALLOCATION_TAG); AWS_CHECK_PTR(SERVICE_NAME, m_endpointProvider); - m_endpointProvider->InitBuiltInParameters(config); + m_endpointProvider->InitBuiltInParameters(config, "${metadata.signingName}"); #end #if(!$serviceModel.endpointRules) #if($AdditionalServiceSpecificConfigLoadString) diff --git a/tools/scripts/run_integration_tests.py b/tools/scripts/run_integration_tests.py index cb46a95463fb..a9fd85b7ba8e 100644 --- a/tools/scripts/run_integration_tests.py +++ b/tools/scripts/run_integration_tests.py @@ -48,12 +48,15 @@ def main(): "aws-cpp-sdk-s3-integration-tests", "aws-cpp-sdk-s3-unit-tests", "aws-cpp-sdk-s3-crt-integration-tests", + "aws-cpp-sdk-s3-crt-unit-tests", #"aws-cpp-sdk-s3control-integration-tests", + "aws-cpp-sdk-s3control-unit-tests", "aws-cpp-sdk-lambda-integration-tests", "aws-cpp-sdk-cognitoidentity-integration-tests", #"aws-cpp-sdk-transfer-tests", "aws-cpp-sdk-s3-encryption-integration-tests", "aws-cpp-sdk-kinesis-integration-tests", + "aws-cpp-sdk-kinesis-unit-tests", "aws-cpp-sdk-logs-integration-tests", "aws-cpp-sdk-monitoring-integration-tests", "aws-cpp-sdk-elasticfilesystem-integration-tests",