diff --git a/.github/workflows/integ_test.yml b/.github/workflows/integ_test.yml index daf6be7467..e1e08c6b41 100644 --- a/.github/workflows/integ_test.yml +++ b/.github/workflows/integ_test.yml @@ -20,7 +20,7 @@ concurrency: jobs: prepare-for-test: - runs-on: macos-12 + runs-on: macos-13 environment: IntegrationTest steps: - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b diff --git a/.github/workflows/integ_test_api_functional.yml b/.github/workflows/integ_test_api_functional.yml index f68ef49b94..20485cfeda 100644 --- a/.github/workflows/integ_test_api_functional.yml +++ b/.github/workflows/integ_test_api_functional.yml @@ -32,7 +32,7 @@ jobs: with: project_path: ./AmplifyPlugins/API/Tests/APIHostApp scheme: AWSAPIPluginFunctionalTests - destination: 'platform=iOS Simulator,name=iPhone 14,OS=latest' + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' xcode_path: '/Applications/Xcode_14.3.app' api-functional-test-tvOS: diff --git a/.github/workflows/integ_test_api_graphql_auth_directive.yml b/.github/workflows/integ_test_api_graphql_auth_directive.yml index 0581ab1d7a..9fe9adf6e9 100644 --- a/.github/workflows/integ_test_api_graphql_auth_directive.yml +++ b/.github/workflows/integ_test_api_graphql_auth_directive.yml @@ -32,7 +32,7 @@ jobs: with: project_path: ./AmplifyPlugins/API/Tests/APIHostApp scheme: AWSAPIPluginGraphQLAuthDirectiveTests - destination: 'platform=iOS Simulator,name=iPhone 14,OS=latest' + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' xcode_path: '/Applications/Xcode_14.3.app' api-graphql-auth-directive-test-tvOS: diff --git a/.github/workflows/integ_test_api_graphql_iam.yml b/.github/workflows/integ_test_api_graphql_iam.yml index 1831e6398e..c394239186 100644 --- a/.github/workflows/integ_test_api_graphql_iam.yml +++ b/.github/workflows/integ_test_api_graphql_iam.yml @@ -32,7 +32,7 @@ jobs: with: project_path: ./AmplifyPlugins/API/Tests/APIHostApp scheme: AWSAPIPluginGraphQLIAMTests - destination: 'platform=iOS Simulator,name=iPhone 14,OS=latest' + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' xcode_path: '/Applications/Xcode_14.3.app' api-graphql-iam-test-tvOS: diff --git a/.github/workflows/integ_test_api_graphql_lambda_auth.yml b/.github/workflows/integ_test_api_graphql_lambda_auth.yml index c0fecd1ee7..01cf9ba807 100644 --- a/.github/workflows/integ_test_api_graphql_lambda_auth.yml +++ b/.github/workflows/integ_test_api_graphql_lambda_auth.yml @@ -32,7 +32,7 @@ jobs: with: project_path: ./AmplifyPlugins/API/Tests/APIHostApp scheme: AWSAPIPluginGraphQLLambdaAuthTests - destination: 'platform=iOS Simulator,name=iPhone 14,OS=latest' + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' xcode_path: '/Applications/Xcode_14.3.app' api-graphql-lambda-auth-test-tvOS: diff --git a/.github/workflows/integ_test_api_graphql_lazy_load.yml b/.github/workflows/integ_test_api_graphql_lazy_load.yml index 3c922c583b..171dfb0812 100644 --- a/.github/workflows/integ_test_api_graphql_lazy_load.yml +++ b/.github/workflows/integ_test_api_graphql_lazy_load.yml @@ -32,7 +32,7 @@ jobs: with: project_path: ./AmplifyPlugins/API/Tests/APIHostApp scheme: AWSAPIPluginLazyLoadTests - destination: 'platform=iOS Simulator,name=iPhone 14,OS=latest' + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' xcode_path: '/Applications/Xcode_14.3.app' api-lazy-load-test-tvOS: diff --git a/.github/workflows/integ_test_api_graphql_user_pool.yml b/.github/workflows/integ_test_api_graphql_user_pool.yml index d3f5ac4e72..8f06939378 100644 --- a/.github/workflows/integ_test_api_graphql_user_pool.yml +++ b/.github/workflows/integ_test_api_graphql_user_pool.yml @@ -32,7 +32,7 @@ jobs: with: project_path: ./AmplifyPlugins/API/Tests/APIHostApp scheme: AWSAPIPluginGraphQLUserPoolTests - destination: 'platform=iOS Simulator,name=iPhone 14,OS=latest' + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' xcode_path: '/Applications/Xcode_14.3.app' api-graphql-user-pool-test-tvOS: diff --git a/.github/workflows/integ_test_api_rest_iam.yml b/.github/workflows/integ_test_api_rest_iam.yml index 23d8765970..6b38cbc49d 100644 --- a/.github/workflows/integ_test_api_rest_iam.yml +++ b/.github/workflows/integ_test_api_rest_iam.yml @@ -32,7 +32,7 @@ jobs: with: project_path: ./AmplifyPlugins/API/Tests/APIHostApp scheme: AWSAPIPluginRESTIAMTests - destination: 'platform=iOS Simulator,name=iPhone 14,OS=latest' + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' xcode_path: '/Applications/Xcode_14.3.app' api-rest-iam-test-tvOS: diff --git a/.github/workflows/integ_test_api_rest_user_pool.yml b/.github/workflows/integ_test_api_rest_user_pool.yml index f8dc7d4fdc..8026949e30 100644 --- a/.github/workflows/integ_test_api_rest_user_pool.yml +++ b/.github/workflows/integ_test_api_rest_user_pool.yml @@ -32,7 +32,7 @@ jobs: with: project_path: ./AmplifyPlugins/API/Tests/APIHostApp scheme: AWSAPIPluginRESTUserPoolTests - destination: 'platform=iOS Simulator,name=iPhone 14,OS=latest' + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' xcode_path: '/Applications/Xcode_14.3.app' api-rest-user-pool-test-tvOS: diff --git a/.github/workflows/integ_test_auth.yml b/.github/workflows/integ_test_auth.yml index 70ef1dfec8..2ed5fff4ee 100644 --- a/.github/workflows/integ_test_auth.yml +++ b/.github/workflows/integ_test_auth.yml @@ -32,7 +32,7 @@ jobs: with: project_path: ./AmplifyPlugins/Auth/Tests/AuthHostApp/ scheme: AuthIntegrationTests - destination: 'platform=iOS Simulator,name=iPhone 14,OS=latest' + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' xcode_path: '/Applications/Xcode_14.3.app' auth-integration-test-tvOS: diff --git a/.github/workflows/integ_test_datastore.yml b/.github/workflows/integ_test_datastore.yml index 40c3584f4f..462f28e700 100644 --- a/.github/workflows/integ_test_datastore.yml +++ b/.github/workflows/integ_test_datastore.yml @@ -14,7 +14,7 @@ concurrency: jobs: prepare-for-test: - runs-on: macos-12 + runs-on: macos-13 environment: IntegrationTest steps: - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b diff --git a/.github/workflows/integ_test_datastore_auth_cognito.yml b/.github/workflows/integ_test_datastore_auth_cognito.yml index b776f69e5d..2bcabe1f1e 100644 --- a/.github/workflows/integ_test_datastore_auth_cognito.yml +++ b/.github/workflows/integ_test_datastore_auth_cognito.yml @@ -33,7 +33,7 @@ jobs: with: project_path: ./AmplifyPlugins/DataStore/Tests/DataStoreHostApp scheme: AWSDataStorePluginAuthCognitoTests - destination: 'platform=iOS Simulator,name=iPhone 14,OS=latest' + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' xcode_path: '/Applications/Xcode_14.3.app' datastore-integration-auth-cognito-test-tvOS: diff --git a/.github/workflows/integ_test_datastore_auth_iam.yml b/.github/workflows/integ_test_datastore_auth_iam.yml index b3dad109b2..25e7600163 100644 --- a/.github/workflows/integ_test_datastore_auth_iam.yml +++ b/.github/workflows/integ_test_datastore_auth_iam.yml @@ -33,7 +33,7 @@ jobs: with: project_path: ./AmplifyPlugins/DataStore/Tests/DataStoreHostApp scheme: AWSDataStorePluginAuthIAMTests - destination: 'platform=iOS Simulator,name=iPhone 14,OS=latest' + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' xcode_path: '/Applications/Xcode_14.3.app' datastore-integration-auth-iam-test-tvOS: diff --git a/.github/workflows/integ_test_datastore_base.yml b/.github/workflows/integ_test_datastore_base.yml index 7310532203..7b42357b6f 100644 --- a/.github/workflows/integ_test_datastore_base.yml +++ b/.github/workflows/integ_test_datastore_base.yml @@ -33,7 +33,7 @@ jobs: with: project_path: ./AmplifyPlugins/DataStore/Tests/DataStoreHostApp scheme: AWSDataStorePluginIntegrationTests - destination: 'platform=iOS Simulator,name=iPhone 14,OS=latest' + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' xcode_path: '/Applications/Xcode_14.3.app' datastore-integration-test-base-tvOS: diff --git a/.github/workflows/integ_test_datastore_cpk.yml b/.github/workflows/integ_test_datastore_cpk.yml index 41eb3051c1..9032d7dd86 100644 --- a/.github/workflows/integ_test_datastore_cpk.yml +++ b/.github/workflows/integ_test_datastore_cpk.yml @@ -33,7 +33,7 @@ jobs: with: project_path: ./AmplifyPlugins/DataStore/Tests/DataStoreHostApp scheme: AWSDataStorePluginCPKTests - destination: 'platform=iOS Simulator,name=iPhone 14,OS=latest' + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' xcode_path: '/Applications/Xcode_14.3.app' datastore-integration-cpk-test-tvOS: diff --git a/.github/workflows/integ_test_datastore_lazy_load.yml b/.github/workflows/integ_test_datastore_lazy_load.yml index bad115fd20..cc1481b00b 100644 --- a/.github/workflows/integ_test_datastore_lazy_load.yml +++ b/.github/workflows/integ_test_datastore_lazy_load.yml @@ -33,7 +33,7 @@ jobs: with: project_path: ./AmplifyPlugins/DataStore/Tests/DataStoreHostApp scheme: AWSDataStorePluginLazyLoadTests - destination: 'platform=iOS Simulator,name=iPhone 14,OS=latest' + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' xcode_path: '/Applications/Xcode_14.3.app' datastore-integration-lazy-load-test-tvOS: diff --git a/.github/workflows/integ_test_datastore_multi_auth.yml b/.github/workflows/integ_test_datastore_multi_auth.yml index bb9f03f275..232ba5a5a6 100644 --- a/.github/workflows/integ_test_datastore_multi_auth.yml +++ b/.github/workflows/integ_test_datastore_multi_auth.yml @@ -33,7 +33,7 @@ jobs: with: project_path: ./AmplifyPlugins/DataStore/Tests/DataStoreHostApp scheme: AWSDataStorePluginMultiAuthTests - destination: 'platform=iOS Simulator,name=iPhone 14,OS=latest' + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' xcode_path: '/Applications/Xcode_14.3.app' datastore-integration-multi-auth-test-tvOS: diff --git a/.github/workflows/integ_test_datastore_v2.yml b/.github/workflows/integ_test_datastore_v2.yml index 7c9fdd20eb..e24c75f9d4 100644 --- a/.github/workflows/integ_test_datastore_v2.yml +++ b/.github/workflows/integ_test_datastore_v2.yml @@ -33,7 +33,7 @@ jobs: with: project_path: ./AmplifyPlugins/DataStore/Tests/DataStoreHostApp scheme: AWSDataStorePluginV2Tests - destination: 'platform=iOS Simulator,name=iPhone 14,OS=latest' + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' xcode_path: '/Applications/Xcode_14.3.app' datastore-integration-v2-test-tvOS: diff --git a/.github/workflows/integ_test_geo.yml b/.github/workflows/integ_test_geo.yml index 14a84b9180..0debbec997 100644 --- a/.github/workflows/integ_test_geo.yml +++ b/.github/workflows/integ_test_geo.yml @@ -32,7 +32,7 @@ jobs: with: project_path: ./AmplifyPlugins/Geo/Tests/GeoHostApp/ scheme: AWSLocationGeoPluginIntegrationTests - destination: 'platform=iOS Simulator,name=iPhone 14,OS=latest' + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' xcode_path: '/Applications/Xcode_14.3.app' geo-integration-test-tvOS: diff --git a/.github/workflows/integ_test_logging.yml b/.github/workflows/integ_test_logging.yml index e02e4abfde..4084c4bbff 100644 --- a/.github/workflows/integ_test_logging.yml +++ b/.github/workflows/integ_test_logging.yml @@ -32,7 +32,7 @@ jobs: with: project_path: ./AmplifyPlugins/Logging/Tests/AWSCloudWatchLoggingPluginHostApp scheme: AWSCloudWatchLoggingPluginIntegrationTests - destination: 'platform=iOS Simulator,name=iPhone 14,OS=latest' + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' xcode_path: '/Applications/Xcode_14.3.app' logging-integration-test-tvOS: diff --git a/.github/workflows/integ_test_predictions.yml b/.github/workflows/integ_test_predictions.yml index 58be80d7e8..149648670b 100644 --- a/.github/workflows/integ_test_predictions.yml +++ b/.github/workflows/integ_test_predictions.yml @@ -37,7 +37,7 @@ jobs: with: project_path: ./AmplifyPlugins/Predictions/Tests/PredictionsHostApp scheme: AWSPredictionsPluginIntegrationTests - destination: 'platform=iOS Simulator,name=iPhone 14,OS=latest' + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' xcode_path: '/Applications/Xcode_14.3.app' predictions-integration-test-tvOS: diff --git a/.github/workflows/integ_test_storage.yml b/.github/workflows/integ_test_storage.yml index ba971a0b05..e190989139 100644 --- a/.github/workflows/integ_test_storage.yml +++ b/.github/workflows/integ_test_storage.yml @@ -32,7 +32,7 @@ jobs: with: project_path: ./AmplifyPlugins/Storage/Tests/StorageHostApp/ scheme: AWSS3StoragePluginIntegrationTests - destination: 'platform=iOS Simulator,name=iPhone 14,OS=latest' + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' xcode_path: '/Applications/Xcode_14.3.app' storage-integration-test-tvOS: diff --git a/.github/workflows/stress_test.yml b/.github/workflows/stress_test.yml index 39d6a0bc68..7988fb7123 100644 --- a/.github/workflows/stress_test.yml +++ b/.github/workflows/stress_test.yml @@ -14,7 +14,7 @@ concurrency: jobs: prepare-for-test: - runs-on: macos-12 + runs-on: macos-13 environment: IntegrationTest steps: - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b @@ -31,7 +31,7 @@ jobs: auth-stress-test: needs: prepare-for-test - runs-on: macos-12 + runs-on: macos-13 environment: IntegrationTest steps: - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b @@ -54,10 +54,12 @@ jobs: with: project_path: ./AmplifyPlugins/Auth/Tests/AuthHostApp/ scheme: AuthStressTests + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' + xcode_path: '/Applications/Xcode_14.3.app' geo-stress-test: needs: prepare-for-test - runs-on: macos-12 + runs-on: macos-13 environment: IntegrationTest steps: - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b @@ -80,11 +82,12 @@ jobs: with: project_path: ./AmplifyPlugins/Geo/Tests/GeoHostApp/ scheme: GeoStressTests - + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' + xcode_path: '/Applications/Xcode_14.3.app' storage-stress-test: needs: prepare-for-test - runs-on: macos-12 + runs-on: macos-13 environment: IntegrationTest steps: - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b @@ -107,10 +110,12 @@ jobs: with: project_path: ./AmplifyPlugins/Storage/Tests/StorageHostApp/ scheme: StorageStressTests + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' + xcode_path: '/Applications/Xcode_14.3.app' datastore-stress-test: needs: prepare-for-test - runs-on: macos-12 + runs-on: macos-13 environment: IntegrationTest steps: - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b @@ -133,10 +138,12 @@ jobs: with: project_path: ./AmplifyPlugins/DataStore/Tests/DataStoreHostApp scheme: DatastoreStressTests + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' + xcode_path: '/Applications/Xcode_14.3.app' graphql-api-stress-test: needs: prepare-for-test - runs-on: macos-12 + runs-on: macos-13 environment: IntegrationTest steps: - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b @@ -158,4 +165,6 @@ jobs: uses: ./.github/composite_actions/run_xcodebuild_test with: project_path: ./AmplifyPlugins/API/Tests/APIHostApp - scheme: GraphQLAPIStressTests \ No newline at end of file + scheme: GraphQLAPIStressTests + destination: 'platform=iOS Simulator,name=iPhone 14,OS=16.4' + xcode_path: '/Applications/Xcode_14.3.app' \ No newline at end of file diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+AsyncClientBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+AsyncClientBehavior.swift index 033af1a2e5..0bd830c3d9 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+AsyncClientBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+AsyncClientBehavior.swift @@ -35,6 +35,7 @@ extension AWSS3StoragePlugin { let result = try await storageService.getPreSignedURL( serviceKey: serviceKey, signingOperation: .getObject, + metadata: nil, accelerate: accelerate, expires: options.expires) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderAdapter.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderAdapter.swift index 5153e90c89..b935df2dd0 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderAdapter.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderAdapter.swift @@ -34,6 +34,7 @@ class AWSS3PreSignedURLBuilderAdapter: AWSS3PreSignedURLBuilderBehavior { /// - Returns: Pre-Signed URL func getPreSignedURL(key: String, signingOperation: AWSS3SigningOperation, + metadata: [String: String]? = nil, accelerate: Bool? = nil, expires: Int64? = nil) async throws -> URL { let expiresDate = Date(timeIntervalSinceNow: Double(expires ?? defaultExpiration)) @@ -47,7 +48,7 @@ class AWSS3PreSignedURLBuilderAdapter: AWSS3PreSignedURLBuilderBehavior { config: config, expiration: expiration) case .putObject: - let input = PutObjectInput(bucket: bucket, key: key) + let input = PutObjectInput(bucket: bucket, key: key, metadata: metadata) preSignedUrl = try await input.presignURL( config: config, expiration: expiration) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderBehavior.swift index dddc19ed44..7ca3f989cb 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderBehavior.swift @@ -41,6 +41,7 @@ protocol AWSS3PreSignedURLBuilderBehavior { /// - Tag: AWSS3PreSignedURLBuilderBehavior.getPreSignedURL func getPreSignedURL(key: String, signingOperation: AWSS3SigningOperation, + metadata: [String: String]?, accelerate: Bool?, expires: Int64?) async throws -> URL diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+DownloadBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+DownloadBehavior.swift index c4893c86c9..ab7c5849de 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+DownloadBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+DownloadBehavior.swift @@ -30,6 +30,7 @@ extension AWSS3StorageService { do { let preSignedURL = try await preSignedURLBuilder.getPreSignedURL(key: serviceKey, signingOperation: .getObject, + metadata: nil, accelerate: accelerate, expires: nil) startDownload(preSignedURL: preSignedURL, transferTask: transferTask) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+GetPreSignedURLBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+GetPreSignedURLBehavior.swift index b13c4a25f6..fc3eb40699 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+GetPreSignedURLBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+GetPreSignedURLBehavior.swift @@ -14,11 +14,13 @@ extension AWSS3StorageService { func getPreSignedURL(serviceKey: String, signingOperation: AWSS3SigningOperation, + metadata: [String: String]?, accelerate: Bool?, expires: Int) async throws -> URL { return try await preSignedURLBuilder.getPreSignedURL( key: serviceKey, signingOperation: signingOperation, + metadata: metadata, accelerate: nil, expires: Int64(expires) ) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+MultiPartUploadBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+MultiPartUploadBehavior.swift index 77d7e4efb7..41ee946407 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+MultiPartUploadBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+MultiPartUploadBehavior.swift @@ -32,7 +32,8 @@ extension AWSS3StorageService { let client = DefaultStorageMultipartUploadClient(serviceProxy: self, bucket: bucket, key: serviceKey, - uploadFile: uploadFile) + uploadFile: uploadFile, + metadata: metadata) let multipartUploadSession = StorageMultipartUploadSession(client: client, bucket: bucket, key: serviceKey, diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+UploadBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+UploadBehavior.swift index 7bff9e94ba..5349e4a6be 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+UploadBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+UploadBehavior.swift @@ -36,6 +36,7 @@ extension AWSS3StorageService { do { let preSignedURL = try await preSignedURLBuilder.getPreSignedURL(key: serviceKey, signingOperation: .putObject, + metadata: metadata, accelerate: accelerate, expires: nil) startUpload(preSignedURL: preSignedURL, diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageServiceBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageServiceBehavior.swift index 8226df07ff..21ae5df171 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageServiceBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageServiceBehavior.swift @@ -44,6 +44,7 @@ protocol AWSS3StorageServiceBehavior { func getPreSignedURL(serviceKey: String, signingOperation: AWSS3SigningOperation, + metadata: [String: String]?, accelerate: Bool?, expires: Int) async throws -> URL diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadClient.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadClient.swift index 7bedf97def..e25f486266 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadClient.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadClient.swift @@ -42,14 +42,17 @@ class DefaultStorageMultipartUploadClient: StorageMultipartUploadClient { let contentType: String? let requestHeaders: RequestHeaders? weak var session: StorageMultipartUploadSession? - + let metadata: [String: String]? + init(serviceProxy: StorageServiceProxy, fileSystem: FileSystem = .default, bucket: String, key: String, uploadFile: UploadFile, contentType: String? = nil, - requestHeaders: RequestHeaders? = nil) { + requestHeaders: RequestHeaders? = nil, + metadata: [String: String]? = nil + ) { self.serviceProxy = serviceProxy self.fileSystem = fileSystem self.bucket = bucket @@ -57,6 +60,7 @@ class DefaultStorageMultipartUploadClient: StorageMultipartUploadClient { self.uploadFile = uploadFile self.contentType = contentType self.requestHeaders = requestHeaders + self.metadata = metadata } func integrate(session: StorageMultipartUploadSession) { @@ -135,6 +139,7 @@ class DefaultStorageMultipartUploadClient: StorageMultipartUploadClient { let preSignedURL = try await serviceProxy.preSignedURLBuilder.getPreSignedURL( key: self.key, signingOperation: operation, + metadata: self.metadata, accelerate: nil, expires: nil ) diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginGetPresignedUrlTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginGetPresignedUrlTests.swift index 49a5734754..4dcf9c0108 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginGetPresignedUrlTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginGetPresignedUrlTests.swift @@ -65,7 +65,7 @@ final class AWSS3StoragePluginGetPresignedUrlTests: XCTestCase { ]) let expectedServiceKey = "public/" + testKey XCTAssertEqual(storageService.interactions, [ - "getPreSignedURL(serviceKey:signingOperation:accelerate:expires:) \(expectedServiceKey) getObject 18000" + "getPreSignedURL(serviceKey:signingOperation:metadata:accelerate:expires:) \(expectedServiceKey) getObject nil 18000" ]) } @@ -120,7 +120,7 @@ final class AWSS3StoragePluginGetPresignedUrlTests: XCTestCase { let expectedServiceKey = StorageAccessLevel.protected.rawValue + "/" + testIdentityId + "/" + testKey XCTAssertEqual(storageService.interactions, [ - "getPreSignedURL(serviceKey:signingOperation:accelerate:expires:) \(expectedServiceKey) getObject \(expectedExpires)" + "getPreSignedURL(serviceKey:signingOperation:metadata:accelerate:expires:) \(expectedServiceKey) getObject nil \(expectedExpires)" ]) } @@ -152,7 +152,7 @@ final class AWSS3StoragePluginGetPresignedUrlTests: XCTestCase { let expectedServiceKey = StorageAccessLevel.protected.rawValue + "/" + testIdentityId + "/" + testKey XCTAssertEqual(storageService.interactions, [ - "getPreSignedURL(serviceKey:signingOperation:accelerate:expires:) \(expectedServiceKey) getObject \(expectedExpires)" + "getPreSignedURL(serviceKey:signingOperation:metadata:accelerate:expires:) \(expectedServiceKey) getObject nil \(expectedExpires)" ]) } @@ -173,7 +173,7 @@ final class AWSS3StoragePluginGetPresignedUrlTests: XCTestCase { let expectedExpires = 18000 let expectedServiceKey = StorageAccessLevel.protected.rawValue + "/" + testIdentityId + "/" + testKey XCTAssertEqual(storageService.interactions, [ - "getPreSignedURL(serviceKey:signingOperation:accelerate:expires:) \(expectedServiceKey) getObject \(expectedExpires)" + "getPreSignedURL(serviceKey:signingOperation:metadata:accelerate:expires:) \(expectedServiceKey) getObject nil \(expectedExpires)" ]) } diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3PreSignedURLBuilder.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3PreSignedURLBuilder.swift index 0664ef453b..510e77bae0 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3PreSignedURLBuilder.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3PreSignedURLBuilder.swift @@ -22,9 +22,10 @@ extension MockAWSS3PreSignedURLBuilder: AWSS3PreSignedURLBuilderBehavior { func getPreSignedURL( key: String, signingOperation: AWSS3SigningOperation, + metadata: [String : String]?, accelerate: Bool?, expires: Int64?) async throws -> URL { - interactions.append("\(#function) \(key) \(signingOperation) \(String(describing: expires))") + interactions.append("\(#function) \(key) \(signingOperation) \(String(describing: metadata)) \(String(describing: expires))") return try await getPreSignedURLHandler(key, signingOperation, expires) } } diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3StorageService.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3StorageService.swift index d11d5bd499..2b70e3bc90 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3StorageService.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3StorageService.swift @@ -80,9 +80,10 @@ public class MockAWSS3StorageService: AWSS3StorageServiceBehavior { public func getPreSignedURL( serviceKey: String, signingOperation: AWSS3SigningOperation, + metadata: [String: String]?, accelerate: Bool?, expires: Int) async throws -> URL { - interactions.append("\(#function) \(serviceKey) \(signingOperation) \(expires)") + interactions.append("\(#function) \(serviceKey) \(signingOperation) \(String(describing: metadata)) \(expires)") return try await getPreSignedURLHandler(serviceKey, signingOperation, expires) } diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceGetPreSignedURLBehaviorTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceGetPreSignedURLBehaviorTests.swift index 787cd2ad3d..5e438e735f 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceGetPreSignedURLBehaviorTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceGetPreSignedURLBehaviorTests.swift @@ -68,11 +68,12 @@ class AWSS3StorageServiceGetPreSignedURLBehaviorTests: XCTestCase { func testForGetObject() async throws { let url = try await systemUnderTest.getPreSignedURL(serviceKey: serviceKey, signingOperation: .getObject, + metadata: nil, accelerate: nil, expires: expires) XCTAssertEqual(url, presignedURL) XCTAssertEqual(builder.interactions, [ - "getPreSignedURL(key:signingOperation:accelerate:expires:) \(serviceKey ?? "") \(AWSS3SigningOperation.getObject) \(String(describing: expires))" + "getPreSignedURL(key:signingOperation:metadata:accelerate:expires:) \(serviceKey ?? "") \(AWSS3SigningOperation.getObject) nil \(String(describing: expires))" ]) } @@ -82,11 +83,28 @@ class AWSS3StorageServiceGetPreSignedURLBehaviorTests: XCTestCase { func testForPutObject() async throws { let url = try await systemUnderTest.getPreSignedURL(serviceKey: serviceKey, signingOperation: .putObject, + metadata: nil, accelerate: nil, expires: expires) XCTAssertEqual(url, presignedURL) XCTAssertEqual(builder.interactions, [ - "getPreSignedURL(key:signingOperation:accelerate:expires:) \(serviceKey ?? "") \(AWSS3SigningOperation.putObject) \(String(describing: expires))" + "getPreSignedURL(key:signingOperation:metadata:accelerate:expires:) \(serviceKey ?? "") \(AWSS3SigningOperation.putObject) nil \(String(describing: expires))" + ]) + } + + /// - Given: A storage service configured to use a AWSS3PreSignedURLBuilder + /// - When: A presigned URL is requested for a **AWSS3SigningOperation.putObject** operation with metadata + /// - Then: A valid URL is returned + func testForPutObjectWithMetadata() async throws { + let metadata: [String: String]? = ["test": "value"] + let url = try await systemUnderTest.getPreSignedURL(serviceKey: serviceKey, + signingOperation: .putObject, + metadata: metadata, + accelerate: nil, + expires: expires) + XCTAssertEqual(url, presignedURL) + XCTAssertEqual(builder.interactions, [ + "getPreSignedURL(key:signingOperation:metadata:accelerate:expires:) \(serviceKey ?? "") \(AWSS3SigningOperation.putObject) \(String(describing: metadata)) \(String(describing: expires))" ]) } @@ -97,11 +115,12 @@ class AWSS3StorageServiceGetPreSignedURLBehaviorTests: XCTestCase { let operation = AWSS3SigningOperation.uploadPart(partNumber: 0, uploadId: UUID().uuidString) let url = try await systemUnderTest.getPreSignedURL(serviceKey: serviceKey, signingOperation: operation, + metadata: nil, accelerate: nil, expires: expires) XCTAssertEqual(url, presignedURL) XCTAssertEqual(builder.interactions, [ - "getPreSignedURL(key:signingOperation:accelerate:expires:) \(serviceKey ?? "") \(operation) \(String(describing: expires))" + "getPreSignedURL(key:signingOperation:metadata:accelerate:expires:) \(serviceKey ?? "") \(operation) nil \(String(describing: expires))" ]) } diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/StorageStressTests/StorageStressTests.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/StorageStressTests/StorageStressTests.swift index 74404ca437..ffc25e3d2c 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/StorageStressTests/StorageStressTests.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/StorageStressTests/StorageStressTests.swift @@ -173,7 +173,7 @@ final class StorageStressTests: XCTestCase { } catch { XCTFail("Error: \(error)") } - await fulfillment(of: [uploadExpectation, removeExpectation], timeout: 180) + await fulfillment(of: [downloadExpectation, uploadExpectation, removeExpectation], timeout: 180) }