From b69b17e9838b38a602cd4ae3104ec5b10bc46406 Mon Sep 17 00:00:00 2001 From: Tuan Pham Date: Tue, 3 Sep 2024 13:08:52 -0500 Subject: [PATCH 1/3] chore(storage): resolve swiftformat errors and warnings --- ...SS3StoragePlugin+AsyncClientBehavior.swift | 34 +-- .../AWSS3StoragePlugin+ClientBehavior.swift | 6 +- .../AWSS3StoragePlugin+Configure.swift | 9 +- .../AWSS3StoragePlugin+Reset.swift | 6 +- .../AWSS3StoragePlugin.swift | 11 +- .../Configuration/AWSS3PluginOptions.swift | 2 +- .../AWSS3PluginPrefixResolver.swift | 8 +- .../AWSS3StoragePluginConfiguration.swift | 3 +- .../Dependency/AWSS3Adapter.swift | 2 +- .../Dependency/AWSS3Behavior.swift | 2 +- .../AWSS3ListObjectsV2Request.swift | 5 +- ...3MultipartUploadRequestCompletedPart.swift | 5 +- .../AWSS3PreSignedURLBuilderAdapter.swift | 9 +- .../AWSS3PreSignedURLBuilderBehavior.swift | 2 +- ...S3ClientConfiguration+withAccelerate.swift | 2 +- ...ClientConfigurationProtocol+Endpoint.swift | 4 +- .../Dependency/SdkTypealiases.swift | 2 +- .../UploadPartInput+presignURL.swift | 7 +- .../Error/AWSS3+StorageErrorConvertible.swift | 13 +- .../Error/StorageErrorConvertible.swift | 2 +- .../AWSS3StorageDownloadDataOperation.swift | 5 +- .../AWSS3StorageDownloadFileOperation.swift | 2 +- .../AWSS3StorageRemoveOperation.swift | 5 +- .../AWSS3StorageUploadDataOperation.swift | 8 +- .../AWSS3StorageUploadFileOperation.swift | 8 +- .../StorageGetURLRequest+Validate.swift | 5 +- .../StorageDownloadDataRequest+Validate.swift | 5 +- .../StorageDownloadFileRequest+Validate.swift | 5 +- .../Request/StorageListRequest+Validate.swift | 5 +- .../StorageRemoveRequest+Validate.swift | 2 +- .../StorageUploadDataRequest+Validate.swift | 4 +- .../StorageUploadFileRequest+Validate.swift | 4 +- .../AWSS3StorageService+DeleteBehavior.swift | 2 +- ...AWSS3StorageService+DownloadBehavior.swift | 12 +- ...S3StorageService+EscapeHatchBehavior.swift | 2 +- ...orageService+GetPreSignedURLBehavior.swift | 9 +- .../AWSS3StorageService+ListBehavior.swift | 17 +- ...orageService+MultiPartUploadBehavior.swift | 9 +- .../AWSS3StorageService+UploadBehavior.swift | 14 +- .../Service/Storage/AWSS3StorageService.swift | 33 +-- .../Storage/AWSS3StorageServiceBehavior.swift | 2 +- .../Support/Constants/PluginConstants.swift | 3 +- .../Constants/PluginErrorConstants.swift | 4 +- .../Constants/StorageErrorConstants.swift | 4 +- .../Support/Internal/Attempt.swift | 6 +- .../CreateMultipartUploadRequest.swift | 3 +- .../DefaultStorageTransferDatabase.swift | 54 +++-- .../Support/Internal/FileSystem.swift | 13 +- .../StorageBackgroundEventsRegistry.swift | 2 +- .../Internal/StorageConfiguration.swift | 9 +- .../Support/Internal/StorageEvent.swift | 2 +- .../Support/Internal/StorageLogger.swift | 2 +- .../Internal/StorageMultipartUpload.swift | 30 ++- .../StorageMultipartUploadClient.swift | 24 +- .../StorageMultipartUploadSession.swift | 30 ++- .../Internal/StoragePath+Extensions.swift | 2 +- .../StoragePersistableTransferTask.swift | 15 +- .../Internal/StorageServiceProxy.swift | 2 +- .../StorageServiceSessionDelegate.swift | 15 +- .../Internal/StorageTransferDatabase.swift | 5 +- .../Internal/StorageTransferResponse.swift | 29 +-- .../Internal/StorageTransferTask.swift | 64 ++--- .../Internal/StorageTransferTaskPair.swift | 6 +- .../Internal/StorageTransferType.swift | 24 +- .../Support/Internal/StorageUploadPart.swift | 54 ++--- .../Internal/StorageUploadPartEvent.swift | 21 +- .../Internal/SubpathStategy+Delimiter.swift | 2 +- .../Internal/URLSessionTask+eTag.swift | 7 +- .../Support/Utils/HttpClientEngineProxy.swift | 2 +- .../Support/Utils/SdkError+Properties.swift | 2 +- .../Utils/StorageRequestUtils+Getter.swift | 9 +- .../Utils/StorageRequestUtils+Validator.swift | 13 +- .../Support/Utils/StorageRequestUtils.swift | 2 +- .../Tasks/AWSS3StorageListObjectsTask.swift | 9 +- .../Tasks/AWSS3StorageRemoveTask.swift | 9 +- .../Tasks/AWSS3torageGetURLTask.swift | 9 +- ...StoragePluginAmplifyVersionableTests.swift | 2 +- ...AWSS3StoragePluginAsyncBehaviorTests.swift | 10 +- .../AWSS3StoragePluginBaseConfigTests.swift | 2 +- .../AWSS3StoragePluginConfigureTests.swift | 5 +- ...SS3StoragePluginGetPresignedUrlTests.swift | 16 +- .../AWSS3StoragePluginTestBase.swift | 4 +- .../AWSS3PluginPrefixResolverTests.swift | 9 +- ...AWSS3StoragePluginConfigurationTests.swift | 5 +- .../S3ClientConfigurationProxyTests.swift | 2 +- .../Dependency/AWSS3AdapterTests.swift | 223 +++++++++--------- .../Mocks/MockAWSS3PreSignedURLBuilder.swift | 10 +- .../Mocks/MockAWSS3StorageService.swift | 26 +- .../Mocks/MockOperationQueue.swift | 1 + .../Mocks/MockS3Client.swift | 4 +- ...SS3StorageDownloadFileOperationTests.swift | 26 +- .../AWSS3StorageGetDataOperationTests.swift | 15 +- .../AWSS3StorageOperationTestBase.swift | 16 +- .../AWSS3StoragePutDataOperationTests.swift | 10 +- .../AWSS3StorageRemoveOperationTests.swift | 17 +- ...AWSS3StorageUploadFileOperationTests.swift | 23 +- ...WSS3StorageUploadFileOperationTests2.swift | 8 +- .../AWSS3StorageGetURLRequestTests.swift | 2 +- .../AWSS3StorageListRequestTests.swift | 6 +- .../AWSS3StorageRemoveRequestTests.swift | 2 +- ...ipartUploadRequestCompletedPartTests.swift | 2 +- ...eServiceGetPreSignedURLBehaviorTests.swift | 22 +- .../AWSS3StorageServiceListTests.swift | 16 +- .../Storage/AWSS3StorageServiceTests.swift | 99 ++++---- .../Support/Internal/AttemptTests.swift | 14 +- .../Support/Internal/BytesTests.swift | 2 +- ...ultStorageMultipartUploadClientTests.swift | 10 +- .../DefaultStorageTransferDatabaseTests.swift | 12 +- .../Support/Internal/FatalTests.swift | 2 +- .../Support/Internal/FileHandleTests.swift | 12 +- .../Support/Internal/FileSystemTests.swift | 10 +- .../Internal/MockMultipartUploadClient.swift | 17 +- .../MockStorageTransferDatabase.swift | 16 +- ...StorageBackgroundEventsRegistryTests.swift | 2 +- .../StorageMultipartUploadSessionTests.swift | 6 +- .../StoragePersistableTransferTaskTests.swift | 5 +- .../StorageServiceSessionDelegateTests.swift | 96 ++++---- .../StorageTransferDatabaseTests.swift | 15 +- .../Internal/StorageTransferTaskTests.swift | 88 +++---- .../Internal/StorageUploadPartSizeTests.swift | 26 +- .../Internal/StorageUploadPartTests.swift | 2 +- .../Support/Internal/UploadFileTests.swift | 2 +- .../Support/Internal/UploadSourceTests.swift | 2 +- .../StorageRequestUtilsGetterTests.swift | 5 +- .../StorageRequestUtilsValidatorTests.swift | 2 +- .../Tasks/AWSS3StorageGetURLTaskTests.swift | 22 +- .../AWSS3StorageListObjectsTaskTests.swift | 24 +- .../Tasks/AWSS3StorageRemoveTaskTests.swift | 22 +- ...ragePluginAccelerateIntegrationTests.swift | 20 +- .../AWSS3StoragePluginAccessLevelTests.swift | 4 +- ...S3StoragePluginBasicIntegrationTests.swift | 64 ++--- ...AWSS3StoragePluginConfigurationTests.swift | 5 +- ...3StoragePluginGetURLIntegrationTests.swift | 12 +- ...agePluginListObjectsIntegrationTests.swift | 50 ++-- .../AWSS3StoragePluginNegativeTests.swift | 2 +- ...S3StoragePluginOptionsUsabilityTests.swift | 20 +- ...3StoragePluginPrefixKeyResolverTests.swift | 6 +- .../AWSS3StoragePluginProgressTests.swift | 4 +- ...3StoragePluginRemoveIntegrationTests.swift | 32 ++- .../AWSS3StoragePluginRequestRecorder.swift | 7 +- .../AWSS3StoragePluginTestBase.swift | 13 +- ...3StoragePluginUploadIntegrationTests.swift | 14 +- ...3StoragePluginUploadMetadataTestCase.swift | 13 +- .../Helpers/AuthSignInHelper.swift | 7 +- ...ePluginDownloadFileResumabilityTests.swift | 4 +- ...toragePluginGetDataResumabilityTests.swift | 4 +- ...toragePluginPutDataResumabilityTests.swift | 4 +- ...agePluginUploadFileResumabilityTests.swift | 4 +- .../StorageStressTests.swift | 41 ++-- 149 files changed, 1106 insertions(+), 1000 deletions(-) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+AsyncClientBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+AsyncClientBehavior.swift index a960ec1e07..f6510aa195 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+AsyncClientBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+AsyncClientBehavior.swift @@ -7,14 +7,14 @@ import Foundation -import AWSS3 import Amplify import AWSPluginsCore +import AWSS3 -extension AWSS3StoragePlugin { +public extension AWSS3StoragePlugin { @discardableResult - public func getURL( + func getURL( key: String, options: StorageGetURLOperation.Request.Options? = nil ) async throws -> URL { @@ -45,7 +45,7 @@ extension AWSS3StoragePlugin { return result } - public func getURL( + func getURL( path: any StoragePath, options: StorageGetURLOperation.Request.Options? = nil ) async throws -> URL { @@ -57,7 +57,7 @@ extension AWSS3StoragePlugin { return try await task.value } - public func downloadData( + func downloadData( path: any StoragePath, options: StorageDownloadDataOperation.Request.Options? = nil ) -> StorageDownloadDataTask { @@ -74,7 +74,7 @@ extension AWSS3StoragePlugin { } @discardableResult - public func downloadData( + func downloadData( key: String, options: StorageDownloadDataOperation.Request.Options? = nil ) -> StorageDownloadDataTask { @@ -91,7 +91,7 @@ extension AWSS3StoragePlugin { } @discardableResult - public func downloadFile( + func downloadFile( key: String, local: URL, options: StorageDownloadFileOperation.Request.Options? = nil @@ -109,7 +109,7 @@ extension AWSS3StoragePlugin { } @discardableResult - public func downloadFile( + func downloadFile( path: any StoragePath, local: URL, options: StorageDownloadFileOperation.Request.Options? = nil @@ -127,7 +127,7 @@ extension AWSS3StoragePlugin { } @discardableResult - public func uploadData( + func uploadData( key: String, data: Data, options: StorageUploadDataOperation.Request.Options? = nil @@ -145,7 +145,7 @@ extension AWSS3StoragePlugin { } @discardableResult - public func uploadData( + func uploadData( path: any StoragePath, data: Data, options: StorageUploadDataOperation.Request.Options? = nil @@ -163,7 +163,7 @@ extension AWSS3StoragePlugin { } @discardableResult - public func uploadFile( + func uploadFile( key: String, local: URL, options: StorageUploadFileOperation.Request.Options? = nil @@ -181,7 +181,7 @@ extension AWSS3StoragePlugin { } @discardableResult - public func uploadFile( + func uploadFile( path: any StoragePath, local: URL, options: StorageUploadFileOperation.Request.Options? = nil @@ -199,7 +199,7 @@ extension AWSS3StoragePlugin { } @discardableResult - public func remove( + func remove( key: String, options: StorageRemoveOperation.Request.Options? = nil ) async throws -> String { @@ -216,7 +216,7 @@ extension AWSS3StoragePlugin { } @discardableResult - public func remove( + func remove( path: any StoragePath, options: StorageRemoveOperation.Request.Options? = nil ) async throws -> String { @@ -229,7 +229,7 @@ extension AWSS3StoragePlugin { return try await task.value } - public func list( + func list( options: StorageListRequest.Options? = nil ) async throws -> StorageListResult { let options = options ?? StorageListRequest.Options() @@ -244,7 +244,7 @@ extension AWSS3StoragePlugin { return result } - public func list( + func list( path: any StoragePath, options: StorageListRequest.Options? = nil ) async throws -> StorageListResult { @@ -257,7 +257,7 @@ extension AWSS3StoragePlugin { return try await task.value } - public func handleBackgroundEvents(identifier: String) async -> Bool { + func handleBackgroundEvents(identifier: String) async -> Bool { await withCheckedContinuation { (continuation: CheckedContinuation) in StorageBackgroundEventsRegistry.handleBackgroundEvents(identifier: identifier, continuation: continuation) } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+ClientBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+ClientBehavior.swift index 9778b9cab0..e0c89c78b0 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+ClientBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+ClientBehavior.swift @@ -7,18 +7,18 @@ import Foundation -import AWSS3 import Amplify import AWSPluginsCore +import AWSS3 -extension AWSS3StoragePlugin { +public extension AWSS3StoragePlugin { /// Retrieve the escape hatch to perform low level operations on S3. /// /// - Returns: S3 client /// /// - Tag: AWSS3StoragePlugin.getEscapeHatch - public func getEscapeHatch() -> S3Client { + func getEscapeHatch() -> S3Client { return storageService.getEscapeHatch() } } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+Configure.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+Configure.swift index 9b40e63906..6bc82747f2 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+Configure.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+Configure.swift @@ -41,10 +41,10 @@ extension AWSS3StoragePlugin { let storageService = try AWSS3StorageService(authService: authService, region: configClosures.retrieveRegion(), bucket: configClosures.retrieveBucket(), - httpClientEngineProxy: self.httpClientEngineProxy) - storageService.urlRequestDelegate = self.urlRequestDelegate + httpClientEngineProxy: httpClientEngineProxy) + storageService.urlRequestDelegate = urlRequestDelegate - configure(storageService: storageService, + configure(storageService: storageService, authService: authService, defaultAccessLevel: defaultAccessLevel) } catch let storageError as StorageError { @@ -74,7 +74,8 @@ extension AWSS3StoragePlugin { func configure(storageService: AWSS3StorageServiceBehavior, authService: AWSAuthServiceBehavior, defaultAccessLevel: StorageAccessLevel, - queue: OperationQueue = OperationQueue()) { + queue: OperationQueue = OperationQueue()) + { self.storageService = storageService self.authService = authService self.queue = queue diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+Reset.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+Reset.swift index 5bbceb00b9..431d34f5f0 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+Reset.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+Reset.swift @@ -5,11 +5,11 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify import AWSPluginsCore +import Foundation -extension AWSS3StoragePlugin { +public extension AWSS3StoragePlugin { /// Resets the state of the plugin. /// @@ -17,7 +17,7 @@ extension AWSS3StoragePlugin { /// storage service, authentication service, and queue to nil to allow deallocation. /// /// - Tag: AWSS3StoragePlugin.reset - public func reset() async { + func reset() async { if storageService != nil { storageService.reset() storageService = nil diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin.swift index dc4bbe3f09..32b1409114 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin.swift @@ -6,14 +6,14 @@ // import Amplify -import Foundation import AWSPluginsCore +import Foundation /// The AWSS3StoragePlugin which conforms to the Amplify plugin protocols and implements the Storage /// Plugin APIs for AWS S3. /// /// - Tag: AWSS3StoragePlugin -final public class AWSS3StoragePlugin: StorageCategoryPlugin { +public final class AWSS3StoragePlugin: StorageCategoryPlugin { /// An instance of the S3 storage service. var storageService: AWSS3StorageServiceBehavior! @@ -39,16 +39,17 @@ final public class AWSS3StoragePlugin: StorageCategoryPlugin { let storageConfiguration: AWSS3StoragePluginConfiguration /// See [HttpClientEngineProxy](x-source-tag://HttpClientEngineProxy) - internal var httpClientEngineProxy: HttpClientEngineProxy? + var httpClientEngineProxy: HttpClientEngineProxy? /// See [URLRequestDelegate](x-source-tag://URLRequestDelegate) - internal weak var urlRequestDelegate: URLRequestDelegate? + weak var urlRequestDelegate: URLRequestDelegate? /// Instantiates an instance of the AWSS3StoragePlugin. /// /// - Tag: AWSS3StoragePlugin.init public init(configuration - storageConfiguration: AWSS3StoragePluginConfiguration = AWSS3StoragePluginConfiguration()) { + storageConfiguration: AWSS3StoragePluginConfiguration = AWSS3StoragePluginConfiguration()) + { self.storageConfiguration = storageConfiguration } } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3PluginOptions.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3PluginOptions.swift index dcbd174b70..dfe446cacf 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3PluginOptions.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3PluginOptions.swift @@ -9,7 +9,7 @@ import Amplify import Foundation /// - Tag: AWSS3PluginOptions -struct AWSS3PluginOptions { +enum AWSS3PluginOptions { /// - Tag: AWSS3PluginOptionsCodingKeys enum CodingKeys: String, CodingKey { diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3PluginPrefixResolver.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3PluginPrefixResolver.swift index d7c970f15c..0ebd0b332a 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3PluginPrefixResolver.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3PluginPrefixResolver.swift @@ -5,9 +5,9 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify import AWSPluginsCore +import Foundation /// Resolves the final prefix prepended to the S3 key for a given request. /// @@ -25,7 +25,8 @@ public protocol AWSS3PluginPrefixResolver { @available(*, deprecated) public struct PassThroughPrefixResolver: AWSS3PluginPrefixResolver { public func resolvePrefix(for accessLevel: StorageAccessLevel, - targetIdentityId: String?) async throws -> String { + targetIdentityId: String?) async throws -> String + { "" } } @@ -45,7 +46,8 @@ struct StorageAccessLevelAwarePrefixResolver { extension StorageAccessLevelAwarePrefixResolver: AWSS3PluginPrefixResolver { func resolvePrefix(for accessLevel: StorageAccessLevel, - targetIdentityId: String?) async throws -> String { + targetIdentityId: String?) async throws -> String + { do { let identityId = try await authService.getIdentityID() let prefix = StorageRequestUtils.getAccessLevelPrefix(accessLevel: accessLevel, diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3StoragePluginConfiguration.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3StoragePluginConfiguration.swift index 63ec95ba5e..e5d73628c1 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3StoragePluginConfiguration.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3StoragePluginConfiguration.swift @@ -24,7 +24,8 @@ public struct AWSS3StoragePluginConfiguration { /// - Tag: AWSS3StoragePluginConfiguration.prefixResolverFunc @available(*, deprecated, message: "Use `StoragePath` instead") public static func prefixResolver( - _ prefixResolver: AWSS3PluginPrefixResolver) -> AWSS3StoragePluginConfiguration { + _ prefixResolver: AWSS3PluginPrefixResolver) -> AWSS3StoragePluginConfiguration + { .init(prefixResolver: prefixResolver) } } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3Adapter.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3Adapter.swift index 5d8f64e0e1..cd829d5bab 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3Adapter.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3Adapter.swift @@ -9,9 +9,9 @@ import Foundation import Amplify +import AWSClientRuntime import AWSS3 import ClientRuntime -import AWSClientRuntime /// The class conforming to AWSS3Behavior which uses an instance of the AWSS3 to perform its methods. /// This class acts as a wrapper to expose AWSS3 functionality through an instance over a singleton, diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3Behavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3Behavior.swift index 805d40addf..7c579a2e76 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3Behavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3Behavior.swift @@ -9,9 +9,9 @@ import Foundation import Amplify +import AWSClientRuntime import AWSS3 import ClientRuntime -import AWSClientRuntime // Behavior that the implemenation class for AWSS3 will use. protocol AWSS3Behavior { diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3ListObjectsV2Request.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3ListObjectsV2Request.swift index 83cc5fdc6d..18476e2e06 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3ListObjectsV2Request.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3ListObjectsV2Request.swift @@ -9,9 +9,9 @@ import Foundation import Amplify +import AWSClientRuntime import AWSS3 import ClientRuntime -import AWSClientRuntime struct AWSS3ListObjectsV2Request { let bucket: String @@ -28,7 +28,8 @@ struct AWSS3ListObjectsV2Request { continuationToken: String? = nil, delimiter: String? = nil, maxKeys: Int = 1_000, - startAfter: String? = nil) { + startAfter: String? = nil) + { self.bucket = bucket self.prefix = prefix self.path = path diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3MultipartUploadRequestCompletedPart.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3MultipartUploadRequestCompletedPart.swift index cf260ba53a..bd48a73a85 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3MultipartUploadRequestCompletedPart.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3MultipartUploadRequestCompletedPart.swift @@ -19,7 +19,7 @@ typealias AWSS3MultipartUploadRequestCompletedParts = [AWSS3MultipartUploadReque extension AWSS3MultipartUploadRequestCompletedParts { init(completedParts: StorageUploadParts) { - let eTags = completedParts.map { $0.eTag } + let eTags = completedParts.map(\.eTag) let parts = eTags.indices.map { index in AWSS3MultipartUploadRequestCompletedPart(partNumber: index + 1, eTag: eTags[index] ?? "") } @@ -29,7 +29,8 @@ extension AWSS3MultipartUploadRequestCompletedParts { init(parts: [S3ClientTypes.Part]) { self = parts.compactMap { guard let eTag = $0.eTag, - let partNumber = $0.partNumber else { + let partNumber = $0.partNumber + else { return nil } return AWSS3MultipartUploadRequestCompletedPart(partNumber: partNumber, eTag: eTag) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderAdapter.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderAdapter.swift index b935df2dd0..86ae3fc1d5 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderAdapter.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderAdapter.swift @@ -8,10 +8,10 @@ import Foundation import Amplify -import AWSS3 +import AWSClientRuntime import AWSPluginsCore +import AWSS3 import ClientRuntime -import AWSClientRuntime /// The class confirming to AWSS3PreSignedURLBuilderBehavior which uses GetObjectInput to /// create a pre-signed URL. @@ -36,7 +36,8 @@ class AWSS3PreSignedURLBuilderAdapter: AWSS3PreSignedURLBuilderBehavior { signingOperation: AWSS3SigningOperation, metadata: [String: String]? = nil, accelerate: Bool? = nil, - expires: Int64? = nil) async throws -> URL { + expires: Int64? = nil) async throws -> URL + { let expiresDate = Date(timeIntervalSinceNow: Double(expires ?? defaultExpiration)) let expiration = expiresDate.timeIntervalSinceNow let config = try config.withAccelerate(accelerate) @@ -65,7 +66,7 @@ class AWSS3PreSignedURLBuilderAdapter: AWSS3PreSignedURLBuilderBehavior { } private func urlWithEscapedToken(_ url: URL?) -> URL? { - guard let url = url, + guard let url, var components = URLComponents(string: url.absoluteString), var token = components.queryItems?.first(where: { $0.name == "X-Amz-Security-Token" }) else { return nil diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderBehavior.swift index 7ca3f989cb..32fb00174d 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderBehavior.swift @@ -8,9 +8,9 @@ import Foundation import Amplify +import AWSClientRuntime import AWSS3 import ClientRuntime -import AWSClientRuntime /// - Tag: AWSS3PreSignedURLBuilderError enum AWSS3PreSignedURLBuilderError: Error { diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/S3ClientConfiguration+withAccelerate.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/S3ClientConfiguration+withAccelerate.swift index 526b90b1fe..3c2a3bfd70 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/S3ClientConfiguration+withAccelerate.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/S3ClientConfiguration+withAccelerate.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import AWSS3 +import Foundation extension S3Client.S3ClientConfiguration { func withAccelerate(_ shouldAccelerate: Bool?) throws -> S3Client.S3ClientConfiguration { diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/S3ClientConfigurationProtocol+Endpoint.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/S3ClientConfigurationProtocol+Endpoint.swift index 5eac989093..b04a82a1e6 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/S3ClientConfigurationProtocol+Endpoint.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/S3ClientConfigurationProtocol+Endpoint.swift @@ -1,10 +1,12 @@ +// // Copyright Amazon.com Inc. or its affiliates. // All Rights Reserved. // // SPDX-License-Identifier: Apache-2.0 +// -import Foundation import AWSS3 +import Foundation extension S3Client.S3ClientConfiguration { func endpointParams(withBucket bucket: String?) -> EndpointParams { diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/SdkTypealiases.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/SdkTypealiases.swift index d0cdf91669..2ca1109611 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/SdkTypealiases.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/SdkTypealiases.swift @@ -5,9 +5,9 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import AWSClientRuntime import ClientRuntime +import Foundation /// - Tag: NetworkResult public typealias NetworkResult = (Result) -> Void diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/UploadPartInput+presignURL.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/UploadPartInput+presignURL.swift index 6584e766f0..60603efd93 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/UploadPartInput+presignURL.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/UploadPartInput+presignURL.swift @@ -3,11 +3,12 @@ // All Rights Reserved. // // SPDX-License-Identifier: Apache-2.0 +// -import Foundation +import AWSClientRuntime import AWSS3 import ClientRuntime -import AWSClientRuntime +import Foundation extension UploadPartInput { func customPresignURL(config: S3Client.S3ClientConfiguration, expiration: TimeInterval) async throws -> ClientRuntime.URL? { @@ -39,7 +40,7 @@ extension UploadPartInput { operation.serializeStep.intercept( position: .after, middleware: ClientRuntime.QueryItemMiddleware(UploadPartInput.queryItemProvider(_:))) operation.finalizeStep.intercept( - position: .after, + position: .after, middleware: ClientRuntime.RetryMiddleware( options: config.retryStrategyOptions)) let sigv4Config = AWSClientRuntime.SigV4Config( diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Error/AWSS3+StorageErrorConvertible.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Error/AWSS3+StorageErrorConvertible.swift index 8b1e7e316e..a0a7f299c0 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Error/AWSS3+StorageErrorConvertible.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Error/AWSS3+StorageErrorConvertible.swift @@ -5,10 +5,10 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify -import AWSS3 import AWSClientRuntime +import AWSS3 +import Foundation extension AWSS3.NoSuchBucket: StorageErrorConvertible { var storageError: StorageError { @@ -22,23 +22,22 @@ extension AWSS3.NoSuchBucket: StorageErrorConvertible { extension AWSClientRuntime.UnknownAWSHTTPServiceError: StorageErrorConvertible { var storageError: StorageError { - let error: StorageError - switch httpResponse.statusCode { + let error: StorageError = switch httpResponse.statusCode { case .unauthorized, .forbidden: - error = .accessDenied( + .accessDenied( StorageErrorConstants.accessDenied.errorDescription, StorageErrorConstants.accessDenied.recoverySuggestion, self ) case .notFound: - error = .keyNotFound( + .keyNotFound( StorageError.serviceKey, "Received HTTP Response status code 404 NotFound", "Make sure the key exists before trying to download it.", self ) default: - error = .unknown( + .unknown( """ Unknown service error occured with: - status: \(httpResponse.statusCode) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Error/StorageErrorConvertible.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Error/StorageErrorConvertible.swift index 9f9e55c5a6..e22164cc5b 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Error/StorageErrorConvertible.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Error/StorageErrorConvertible.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation protocol StorageErrorConvertible { var storageError: StorageError { get } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageDownloadDataOperation.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageDownloadDataOperation.swift index 2e56183048..b1767631d2 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageDownloadDataOperation.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageDownloadDataOperation.swift @@ -5,9 +5,9 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify import AWSPluginsCore +import Foundation /// Storage Download Data Operation. /// @@ -35,7 +35,8 @@ class AWSS3StorageDownloadDataOperation: AmplifyInProcessReportingOperation< storageService: AWSS3StorageServiceBehavior, authService: AWSAuthServiceBehavior, progressListener: InProcessListener? = nil, - resultListener: ResultListener? = nil) { + resultListener: ResultListener? = nil) + { self.storageConfiguration = storageConfiguration self.storageService = storageService diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageDownloadFileOperation.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageDownloadFileOperation.swift index 86d75956b6..28e4aae652 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageDownloadFileOperation.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageDownloadFileOperation.swift @@ -5,9 +5,9 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify import AWSPluginsCore +import Foundation // TODO: thread safety: everything has to be locked down // TODO verify no retain cycle diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageRemoveOperation.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageRemoveOperation.swift index 12602853f3..763f639a04 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageRemoveOperation.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageRemoveOperation.swift @@ -5,9 +5,9 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify import AWSPluginsCore +import Foundation /// Storage Remove Operation. /// @@ -28,7 +28,8 @@ class AWSS3StorageRemoveOperation: AmplifyOperation< storageConfiguration: AWSS3StoragePluginConfiguration, storageService: AWSS3StorageServiceBehavior, authService: AWSAuthServiceBehavior, - resultListener: ResultListener? = nil) { + resultListener: ResultListener? = nil) + { self.storageConfiguration = storageConfiguration self.storageService = storageService diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageUploadDataOperation.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageUploadDataOperation.swift index 7dd70d4f28..5aa81db86d 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageUploadDataOperation.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageUploadDataOperation.swift @@ -5,9 +5,9 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify import AWSPluginsCore +import Foundation /// Upload Data Operation. /// @@ -35,7 +35,8 @@ class AWSS3StorageUploadDataOperation: AmplifyInProcessReportingOperation< storageService: AWSS3StorageServiceBehavior, authService: AWSAuthServiceBehavior, progressListener: InProcessListener? = nil, - resultListener: ResultListener? = nil) { + resultListener: ResultListener? = nil) + { self.storageConfiguration = storageConfiguration self.storageService = storageService @@ -130,7 +131,8 @@ class AWSS3StorageUploadDataOperation: AmplifyInProcessReportingOperation< } private func onServiceEvent( - event: StorageEvent) { + event: StorageEvent) + { switch event { case .initiated(let reference): storageTaskActionQueue.async { diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageUploadFileOperation.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageUploadFileOperation.swift index db8ced505c..8144cb1901 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageUploadFileOperation.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageUploadFileOperation.swift @@ -5,9 +5,9 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify import AWSPluginsCore +import Foundation /// Storage Upload File Operation. /// @@ -35,7 +35,8 @@ class AWSS3StorageUploadFileOperation: AmplifyInProcessReportingOperation< storageService: AWSS3StorageServiceBehavior, authService: AWSAuthServiceBehavior, progressListener: InProcessListener? = nil, - resultListener: ResultListener? = nil) { + resultListener: ResultListener? = nil) + { self.storageConfiguration = storageConfiguration self.storageService = storageService @@ -153,7 +154,8 @@ class AWSS3StorageUploadFileOperation: AmplifyInProcessReportingOperation< } private func onServiceEvent( - event: StorageEvent) { + event: StorageEvent) + { switch event { case .initiated(let reference): storageTaskActionQueue.async { diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/GetURL/StorageGetURLRequest+Validate.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/GetURL/StorageGetURLRequest+Validate.swift index 78fe1b883b..076d09cd8d 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/GetURL/StorageGetURLRequest+Validate.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/GetURL/StorageGetURLRequest+Validate.swift @@ -5,14 +5,15 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation extension StorageGetURLRequest { /// Performs client side validation and returns a `StorageError` for any validation failures. func validate() -> StorageError? { if let error = StorageRequestUtils.validateTargetIdentityId(options.targetIdentityId, - accessLevel: options.accessLevel) { + accessLevel: options.accessLevel) + { return error } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageDownloadDataRequest+Validate.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageDownloadDataRequest+Validate.swift index 61a8861712..2b362a9478 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageDownloadDataRequest+Validate.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageDownloadDataRequest+Validate.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation extension StorageDownloadDataRequest { /// Performs client side validation and returns a `StorageError` for any validation failures. @@ -17,7 +17,8 @@ extension StorageDownloadDataRequest { return nil } if let error = StorageRequestUtils.validateTargetIdentityId(options.targetIdentityId, - accessLevel: options.accessLevel) { + accessLevel: options.accessLevel) + { return error } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageDownloadFileRequest+Validate.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageDownloadFileRequest+Validate.swift index a6174b8521..0945e28414 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageDownloadFileRequest+Validate.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageDownloadFileRequest+Validate.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation extension StorageDownloadFileRequest { /// Performs client side validation and returns a `StorageError` for any validation failures. @@ -17,7 +17,8 @@ extension StorageDownloadFileRequest { return nil } if let error = StorageRequestUtils.validateTargetIdentityId(options.targetIdentityId, - accessLevel: options.accessLevel) { + accessLevel: options.accessLevel) + { return error } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageListRequest+Validate.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageListRequest+Validate.swift index 3320e45248..028f37917e 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageListRequest+Validate.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageListRequest+Validate.swift @@ -5,14 +5,15 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation extension StorageListRequest { /// Performs client side validation and returns a `StorageError` for any validation failures. func validate() -> StorageError? { if let error = StorageRequestUtils.validateTargetIdentityId(options.targetIdentityId, - accessLevel: options.accessLevel) { + accessLevel: options.accessLevel) + { return error } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageRemoveRequest+Validate.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageRemoveRequest+Validate.swift index 375dad55d1..7f0a3b98a2 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageRemoveRequest+Validate.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageRemoveRequest+Validate.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation extension StorageRemoveRequest { /// Performs client side validation and returns a `StorageError` for any validation failures. diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageUploadDataRequest+Validate.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageUploadDataRequest+Validate.swift index 28eb48093f..6834d7a2f8 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageUploadDataRequest+Validate.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageUploadDataRequest+Validate.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation extension StorageUploadDataRequest { /// Performs client side validation and returns a `StorageError` for any validation failures. @@ -16,7 +16,7 @@ extension StorageUploadDataRequest { // at during execution of request operation where the path is resolved return nil } - + if let error = StorageRequestUtils.validateKey(key) { return error } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageUploadFileRequest+Validate.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageUploadFileRequest+Validate.swift index 04185a8472..cb4bac1630 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageUploadFileRequest+Validate.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageUploadFileRequest+Validate.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation extension StorageUploadFileRequest { /// Performs client side validation and returns a `StorageError` for any validation failures. @@ -16,7 +16,7 @@ extension StorageUploadFileRequest { // at during execution of request operation where the path is resolved return nil } - + if let error = StorageRequestUtils.validateKey(key) { return error } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+DeleteBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+DeleteBehavior.swift index 371526d0f4..5ae2585ca6 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+DeleteBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+DeleteBehavior.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation extension AWSS3StorageService { diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+DownloadBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+DownloadBehavior.swift index 63d30facaf..6a6c3f84f2 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+DownloadBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+DownloadBehavior.swift @@ -5,21 +5,22 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation extension AWSS3StorageService { func download(serviceKey: String, fileURL: URL?, accelerate: Bool?, - onEvent: @escaping StorageServiceDownloadEventHandler) { + onEvent: @escaping StorageServiceDownloadEventHandler) + { let fail: (Error) -> Void = { error in let storageError = StorageError(error: error) onEvent(.failed(storageError)) } - guard attempt(try validateParameters(bucket: bucket, key: serviceKey, accelerationModeEnabled: false), fail: fail) else { return } + guard try attempt(validateParameters(bucket: bucket, key: serviceKey, accelerationModeEnabled: false), fail: fail) else { return } let transferTask = createTransferTask(transferType: .download(onEvent: onEvent), bucket: bucket, @@ -42,14 +43,15 @@ extension AWSS3StorageService { private func startDownload(preSignedURL: URL, transferTask: StorageTransferTask, - startTransfer: Bool = true) async { + startTransfer: Bool = true) async + { guard case .download = transferTask.transferType else { fatalError("Transfer type must be download") } var request = URLRequest(url: preSignedURL) request.cachePolicy = .reloadIgnoringLocalCacheData request.httpMethod = "GET" - request.setValue(await userAgent, forHTTPHeaderField: "User-Agent") + await request.setValue(userAgent, forHTTPHeaderField: "User-Agent") request.setHTTPRequestHeaders(transferTask: transferTask) urlRequestDelegate?.willSend(request: request) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+EscapeHatchBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+EscapeHatchBehavior.swift index 4aff98c0f7..88dd9b763e 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+EscapeHatchBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+EscapeHatchBehavior.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import AWSS3 +import Foundation extension AWSS3StorageService { diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+GetPreSignedURLBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+GetPreSignedURLBehavior.swift index 755b2416cf..c7981e8461 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+GetPreSignedURLBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+GetPreSignedURLBehavior.swift @@ -5,10 +5,10 @@ // SPDX-License-Identifier: Apache-2.0 // +import Amplify import AWSS3 import ClientRuntime import Foundation -import Amplify extension AWSS3StorageService { @@ -16,7 +16,8 @@ extension AWSS3StorageService { signingOperation: AWSS3SigningOperation, metadata: [String: String]?, accelerate: Bool?, - expires: Int) async throws -> URL { + expires: Int) async throws -> URL + { return try await preSignedURLBuilder.getPreSignedURL( key: serviceKey, signingOperation: signingOperation, @@ -28,8 +29,8 @@ extension AWSS3StorageService { func validateObjectExistence(serviceKey: String) async throws { do { - _ = try await self.client.headObject(input: .init( - bucket: self.bucket, + _ = try await client.headObject(input: .init( + bucket: bucket, key: serviceKey )) } catch is AWSS3.NotFound { diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+ListBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+ListBehavior.swift index 4498b5867f..0c938e5043 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+ListBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+ListBehavior.swift @@ -5,29 +5,30 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import AWSClientRuntime import AWSS3 import ClientRuntime -import AWSClientRuntime +import Foundation extension AWSS3StorageService { func list(prefix: String, - options: StorageListRequest.Options) async throws -> StorageListResult { + options: StorageListRequest.Options) async throws -> StorageListResult + { if let error = StorageRequestUtils.validateTargetIdentityId(options.targetIdentityId, - accessLevel: options.accessLevel) { + accessLevel: options.accessLevel) + { throw error } if let error = StorageRequestUtils.validatePath(options.path) { throw error } - let finalPrefix: String - if let path = options.path { - finalPrefix = prefix + path + let finalPrefix: String = if let path = options.path { + prefix + path } else { - finalPrefix = prefix + prefix } let input = ListObjectsV2Input(bucket: bucket, continuationToken: options.nextToken, diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+MultiPartUploadBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+MultiPartUploadBehavior.swift index 41ee946407..0c8c1e2c35 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+MultiPartUploadBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+MultiPartUploadBehavior.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation extension AWSS3StorageService { @@ -15,19 +15,20 @@ extension AWSS3StorageService { contentType: String?, metadata: [String: String]?, accelerate: Bool?, - onEvent: @escaping StorageServiceMultiPartUploadEventHandler) { + onEvent: @escaping StorageServiceMultiPartUploadEventHandler) + { let fail: (Error) -> Void = { error in let storageError = StorageError(error: error) onEvent(.failed(storageError)) } // Validate parameters - guard attempt(try validateParameters(bucket: bucket, key: serviceKey, accelerationModeEnabled: false), fail: fail) else { return } + guard try attempt(validateParameters(bucket: bucket, key: serviceKey, accelerationModeEnabled: false), fail: fail) else { return } let requestHeaders: [String: String] = [:] // Get file using upload source - guard let uploadFile = attempt(try uploadSource.getFile(), fail: fail) else { return } + guard let uploadFile = try attempt(uploadSource.getFile(), fail: fail) else { return } let client = DefaultStorageMultipartUploadClient(serviceProxy: self, bucket: bucket, diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+UploadBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+UploadBehavior.swift index bd619202a0..48c382a8b8 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+UploadBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+UploadBehavior.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation extension AWSS3StorageService { @@ -15,20 +15,21 @@ extension AWSS3StorageService { contentType: String?, metadata: [String: String]?, accelerate: Bool?, - onEvent: @escaping StorageServiceUploadEventHandler) { + onEvent: @escaping StorageServiceUploadEventHandler) + { let fail: (Error) -> Void = { error in let storageError = StorageError(error: error) onEvent(.failed(storageError)) } - guard attempt(try validateParameters(bucket: bucket, key: serviceKey, accelerationModeEnabled: false), fail: fail) else { return } + guard try attempt(validateParameters(bucket: bucket, key: serviceKey, accelerationModeEnabled: false), fail: fail) else { return } Task { let transferTask = createTransferTask(transferType: .upload(onEvent: onEvent), bucket: bucket, key: serviceKey) let uploadFileURL: URL - guard let uploadFile = attempt(try uploadSource.getFile(), fail: fail) else { return } + guard let uploadFile = try attempt(uploadSource.getFile(), fail: fail) else { return } uploadFileURL = uploadFile.fileURL let contentType = contentType ?? "application/octet-stream" @@ -53,7 +54,8 @@ extension AWSS3StorageService { fileURL: URL, contentType: String, transferTask: StorageTransferTask, - startTransfer: Bool = true) async { + startTransfer: Bool = true) async + { guard case .upload = transferTask.transferType else { fatalError("Transfer type must be upload") } @@ -63,7 +65,7 @@ extension AWSS3StorageService { request.networkServiceType = .responsiveData request.setValue(contentType, forHTTPHeaderField: "Content-Type") - request.setValue(await userAgent, forHTTPHeaderField: "User-Agent") + await request.setValue(userAgent, forHTTPHeaderField: "User-Agent") request.setHTTPRequestHeaders(transferTask: transferTask) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService.swift index c311eaaeb8..e105405bdc 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService.swift @@ -5,11 +5,11 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation -import AWSS3 import Amplify import AWSPluginsCore +import AWSS3 import ClientRuntime +import Foundation @_spi(PluginHTTPClientEngine) import InternalAmplifyCredentials /// - Tag: AWSS3StorageService @@ -33,10 +33,10 @@ class AWSS3StorageService: AWSS3StorageServiceBehavior, StorageServiceProxy { var userAgent: String { get async { - "\(AmplifyAWSServiceConfiguration.userAgentLib) \(await AmplifyAWSServiceConfiguration.userAgentOS)" + await "\(AmplifyAWSServiceConfiguration.userAgentLib) \(AmplifyAWSServiceConfiguration.userAgentOS)" } } - + let storageConfiguration: StorageConfiguration let sessionConfiguration: URLSessionConfiguration var delegateQueue: OperationQueue? @@ -62,7 +62,8 @@ class AWSS3StorageService: AWSS3StorageServiceBehavior, StorageServiceProxy { fileSystem: FileSystem = .default, sessionConfiguration: URLSessionConfiguration? = nil, delegateQueue: OperationQueue? = nil, - logger: Logger = storageLogger) throws { + logger: Logger = storageLogger) throws + { let credentialsProvider = authService.getCredentialsProvider() let clientConfig = try S3Client.S3ClientConfiguration( region: region, @@ -70,7 +71,7 @@ class AWSS3StorageService: AWSS3StorageServiceBehavior, StorageServiceProxy { signingRegion: region ) - if var httpClientEngineProxy = httpClientEngineProxy { + if var httpClientEngineProxy { httpClientEngineProxy.target = baseClientEngine(for: clientConfig) clientConfig.httpClientEngine = UserAgentSettingClientEngine( target: httpClientEngineProxy @@ -84,7 +85,7 @@ class AWSS3StorageService: AWSS3StorageServiceBehavior, StorageServiceProxy { let preSignedURLBuilder = AWSS3PreSignedURLBuilderAdapter(config: clientConfig, bucket: bucket) var sessionConfig: URLSessionConfiguration - if let sessionConfiguration = sessionConfiguration { + if let sessionConfiguration { sessionConfig = sessionConfiguration } else { #if os(macOS) @@ -122,7 +123,8 @@ class AWSS3StorageService: AWSS3StorageServiceBehavior, StorageServiceProxy { s3Client: S3Client, preSignedURLBuilder: AWSS3PreSignedURLBuilderBehavior, awsS3: AWSS3Behavior, - bucket: String) { + bucket: String) + { self.storageConfiguration = storageConfiguration self.storageTransferDatabase = storageTransferDatabase self.fileSystem = fileSystem @@ -144,11 +146,11 @@ class AWSS3StorageService: AWSS3StorageServiceBehavior, StorageServiceProxy { delegate.storageService = self storageTransferDatabase.recover(urlSession: urlSession) { [weak self] result in - guard let self = self else { fatalError() } + guard let self else { fatalError() } switch result { case .success(let pairs): logger.info("Recovery completed: [pairs = \(pairs.count)]") - self.processTransferTaskPairs(pairs: pairs) + processTransferTaskPairs(pairs: pairs) case .failure(let error): logger.error(error: error) } @@ -171,12 +173,13 @@ class AWSS3StorageService: AWSS3StorageServiceBehavior, StorageServiceProxy { func resetURLSession() { let delegate = StorageServiceSessionDelegate(identifier: storageConfiguration.sessionIdentifier, logger: logger) - self.urlSession = URLSession(configuration: sessionConfiguration, delegate: delegate, delegateQueue: delegateQueue) + urlSession = URLSession(configuration: sessionConfiguration, delegate: delegate, delegateQueue: delegateQueue) } func attachEventHandlers(onUpload: AWSS3StorageServiceBehavior.StorageServiceUploadEventHandler? = nil, onDownload: AWSS3StorageServiceBehavior.StorageServiceDownloadEventHandler? = nil, - onMultipartUpload: AWSS3StorageServiceBehavior.StorageServiceMultiPartUploadEventHandler? = nil) { + onMultipartUpload: AWSS3StorageServiceBehavior.StorageServiceMultiPartUploadEventHandler? = nil) + { storageTransferDatabase.attachEventHandlers(onUpload: onUpload, onDownload: onDownload, onMultipartUpload: onMultipartUpload) } @@ -184,7 +187,8 @@ class AWSS3StorageService: AWSS3StorageServiceBehavior, StorageServiceProxy { for pair in pairs { register(task: pair.transferTask) if let multipartUpload = pair.multipartUpload, - let uploadFile = multipartUpload.uploadFile { + let uploadFile = multipartUpload.uploadFile + { let client = DefaultStorageMultipartUploadClient(serviceProxy: self, bucket: pair.transferTask.bucket, key: pair.transferTask.key, @@ -267,7 +271,8 @@ class AWSS3StorageService: AWSS3StorageServiceBehavior, StorageServiceProxy { bucket: String, key: String, location: URL? = nil, - requestHeaders: [String: String]? = nil) -> StorageTransferTask { + requestHeaders: [String: String]? = nil) -> StorageTransferTask + { let transferTask = StorageTransferTask(transferType: transferType, bucket: bucket, key: key, diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageServiceBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageServiceBehavior.swift index 6491546d8d..ae3c74818c 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageServiceBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageServiceBehavior.swift @@ -5,9 +5,9 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify import AWSS3 +import Foundation protocol AWSS3StorageServiceBehavior { typealias StorageServiceDownloadEventHandler = (StorageServiceDownloadEvent) -> Void diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Constants/PluginConstants.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Constants/PluginConstants.swift index 248e87c5df..5d9e63fbf6 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Constants/PluginConstants.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Constants/PluginConstants.swift @@ -6,7 +6,8 @@ // import Foundation -struct PluginConstants { + +enum PluginConstants { static let awsS3StoragePluginKey = "awsS3StoragePlugin" static let bucket = "bucket" static let region = "region" diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Constants/PluginErrorConstants.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Constants/PluginErrorConstants.swift index 24f3224916..b6b9be0c17 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Constants/PluginErrorConstants.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Constants/PluginErrorConstants.swift @@ -5,12 +5,12 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation typealias PluginErrorString = (errorDescription: ErrorDescription, recoverySuggestion: RecoverySuggestion) -struct PluginErrorConstants { +enum PluginErrorConstants { static let decodeConfigurationError: PluginErrorString = ( "Unable to decode configuration", "Make sure the plugin configuration is JSONValue") diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Constants/StorageErrorConstants.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Constants/StorageErrorConstants.swift index 2bf8695e71..bb97a21811 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Constants/StorageErrorConstants.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Constants/StorageErrorConstants.swift @@ -5,15 +5,15 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation typealias StorageValidationErrorString = (field: Field, errorDescription: ErrorDescription, recoverySuggestion: RecoverySuggestion) typealias StorageServiceErrorString = (errorDescription: ErrorDescription, recoverySuggestion: RecoverySuggestion) -struct StorageErrorConstants { +enum StorageErrorConstants { static let identityIdIsEmpty: StorageValidationErrorString = ( "targetIdentityId", diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/Attempt.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/Attempt.swift index d78be86492..6f855375f1 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/Attempt.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/Attempt.swift @@ -13,7 +13,8 @@ import Foundation /// - fail: error handler /// - Returns: optional result func attempt(_ expression: @autoclosure () throws -> T, - fail: @autoclosure () -> ((Swift.Error) -> Void)) -> T? { + fail: @autoclosure () -> ((Swift.Error) -> Void)) -> T? +{ do { return try expression() } catch { @@ -29,7 +30,8 @@ func attempt(_ expression: @autoclosure () throws -> T, /// - Returns: success @discardableResult func attempt(_ expression: @autoclosure () throws -> Void, - fail: @autoclosure () -> ((Swift.Error) -> Void)) -> Bool { + fail: @autoclosure () -> ((Swift.Error) -> Void)) -> Bool +{ do { try expression() return true diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/CreateMultipartUploadRequest.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/CreateMultipartUploadRequest.swift index 922acf13f1..e5f30beff7 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/CreateMultipartUploadRequest.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/CreateMultipartUploadRequest.swift @@ -26,7 +26,8 @@ struct CreateMultipartUploadRequest { contentEncoding: String? = nil, contentLanguage: String? = nil, contentType: String? = nil, - metadata: [String: String]? = nil) { + metadata: [String: String]? = nil) + { self.bucket = bucket self.key = key diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/DefaultStorageTransferDatabase.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/DefaultStorageTransferDatabase.swift index 5ed8018f53..c5078000db 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/DefaultStorageTransferDatabase.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/DefaultStorageTransferDatabase.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation // swiftlint:disable line_length @@ -39,9 +39,7 @@ class DefaultStorageTransferDatabase { private var downloadEventHandler: AWSS3StorageServiceBehavior.StorageServiceDownloadEventHandler? private var multipartUploadEventHandler: AWSS3StorageServiceBehavior.StorageServiceMultiPartUploadEventHandler? - static let `default`: StorageTransferDatabase = { - DefaultStorageTransferDatabase() - }() + static let `default`: StorageTransferDatabase = DefaultStorageTransferDatabase() init(databaseDirectoryURL: URL? = nil, fileSystem: FileSystem = .default, logger: Logger = storageLogger) { self.fileSystem = fileSystem @@ -60,21 +58,24 @@ class DefaultStorageTransferDatabase { } func recover(urlSession: StorageURLSession = URLSession.shared, - completionHandler: @escaping (Result) -> Void) { + completionHandler: @escaping (Result) -> Void) + { queue.async { [weak self] in - guard let self = self else { fatalError("self cannot be weak") } - self.loadTasksAndLinkSessions(urlSession: urlSession, completionHandler: completionHandler) + guard let self else { fatalError("self cannot be weak") } + loadTasksAndLinkSessions(urlSession: urlSession, completionHandler: completionHandler) } } func linkTasksWithSessions(persistableTransferTasks: [TransferID: StoragePersistableTransferTask], - sessionTasks: StorageSessionTasks) -> StorageTransferTaskPairs { + sessionTasks: StorageSessionTasks) -> StorageTransferTaskPairs + { let transferTasks: [StorageTransferTask] = persistableTransferTasks.reduce(into: []) { tasks, pair in // match sessionTask to persistableTransferTask with taskIdentifier let persistableTransferTask = pair.value if let taskIdentifier = persistableTransferTask.taskIdentifier, let transferType = defaultTransferType(persistableTransferTask: persistableTransferTask), - let sessionTask = sessionTasks.first(where: { $0.taskIdentifier == taskIdentifier}) { + let sessionTask = sessionTasks.first(where: { $0.taskIdentifier == taskIdentifier}) + { let transferTask = StorageTransferTask(persistableTransferTask: persistableTransferTask, transferType: transferType, sessionTask: sessionTask, @@ -82,7 +83,8 @@ class DefaultStorageTransferDatabase { logger: logger) tasks.append(transferTask) } else if persistableTransferTask.transferTypeRawValue == StorageTransferType.RawValues.multiPartUpload.rawValue, - let transferType = defaultTransferType(persistableTransferTask: persistableTransferTask) { + let transferType = defaultTransferType(persistableTransferTask: persistableTransferTask) + { let transferTask = StorageTransferTask(persistableTransferTask: persistableTransferTask, transferType: transferType, storageTransferDatabase: self, @@ -113,9 +115,7 @@ class DefaultStorageTransferDatabase { let uploadId = pair.key let uploadFile = UploadFile(multipartUpload: multipartUpload) - let subTasks = pair.value.filter { $0.partNumber != nil }.compactMap { - $0.subTask - } + let subTasks = pair.value.filter { $0.partNumber != nil }.compactMap(\.subTask) // all parts are defaulted to pending subTasks.enumerated().forEach { index, subTask in @@ -150,7 +150,8 @@ class DefaultStorageTransferDatabase { } private func loadTasksAndLinkSessions(urlSession: StorageURLSession = URLSession.shared, - completionHandler: @escaping (Result) -> Void) { + completionHandler: @escaping (Result) -> Void) + { dispatchPrecondition(condition: .notOnQueue(.main)) dispatchPrecondition(condition: .onQueue(queue)) @@ -171,11 +172,11 @@ class DefaultStorageTransferDatabase { // the lifecycle so that the process can be completed. let sessionTaskHandler: (StorageSessionTasks) -> Void = { [weak self] sessionTasks in - guard let self = self else { fatalError("self cannot be weak") } + guard let self else { fatalError("self cannot be weak") } - let pairs = self.linkTasksWithSessions(persistableTransferTasks: persistableTransferTasks, sessionTasks: sessionTasks) + let pairs = linkTasksWithSessions(persistableTransferTasks: persistableTransferTasks, sessionTasks: sessionTasks) completionHandler(.success(pairs)) - self.queue.async { + queue.async { self.recoveryState = .completed } } @@ -257,7 +258,7 @@ class DefaultStorageTransferDatabase { return instance } - private func store(fileURL: URL, value: T) throws where T: Encodable { + private func store(fileURL: URL, value: some Encodable) throws { if Thread.isMainThread { logger.warn("Storing on main thread") } @@ -300,11 +301,11 @@ extension DefaultStorageTransferDatabase: StorageTransferDatabase { func prepareForBackground(completion: (() -> Void)? = nil) { dispatchPrecondition(condition: .notOnQueue(queue)) queue.async { [weak self] in - guard let self = self else { fatalError("self cannot be weak") } + guard let self else { fatalError("self cannot be weak") } do { - try self.storeTasks() + try storeTasks() } catch { - self.logger.error(error: error) + logger.error(error: error) } completion?() } @@ -343,12 +344,13 @@ extension DefaultStorageTransferDatabase: StorageTransferDatabase { func attachEventHandlers(onUpload: AWSS3StorageServiceBehavior.StorageServiceUploadEventHandler?, onDownload: AWSS3StorageServiceBehavior.StorageServiceDownloadEventHandler?, - onMultipartUpload: AWSS3StorageServiceBehavior.StorageServiceMultiPartUploadEventHandler?) { + onMultipartUpload: AWSS3StorageServiceBehavior.StorageServiceMultiPartUploadEventHandler?) + { queue.async { [weak self] in - guard let self = self else { fatalError("self cannot be weak") } - self.uploadEventHandler = onUpload - self.downloadEventHandler = onDownload - self.multipartUploadEventHandler = onMultipartUpload + guard let self else { fatalError("self cannot be weak") } + uploadEventHandler = onUpload + downloadEventHandler = onDownload + multipartUploadEventHandler = onMultipartUpload } } } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/FileSystem.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/FileSystem.swift index fd7c103414..127019565e 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/FileSystem.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/FileSystem.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation // swiftlint:disable line_length /// File System implementation which wraps FileManager. @@ -33,9 +33,7 @@ class FileSystem { /// Caches directory for files which can be recreated and can be cleared when app is not running. let cachesURL: URL - static let `default`: FileSystem = { - FileSystem() - }() + static let `default`: FileSystem = .init() init() { // Note: This API supports many values for directories. The ones used here will always be available to an app. @@ -168,7 +166,8 @@ class FileSystem { /// - Returns: size of file in bytes func getFileSize(fileURL: URL) -> UInt64 { guard let attributes = try? FileManager.default.attributesOfItem(atPath: fileURL.path), - let size = attributes[.size] as? UInt64 else { + let size = attributes[.size] as? UInt64 + else { Fatal.require("File size should always be accessible") } return size @@ -191,7 +190,7 @@ class FileSystem { // Move work off current context DispatchQueue.global().async { [weak self] in - guard let self = self else { return } + guard let self else { return } // seek to the offset, read bytes and write data to a file do { let fileHandle = try FileHandle(forReadingFrom: fileURL) @@ -200,7 +199,7 @@ class FileSystem { } try fileHandle.seek(toOffset: offset) let data = try fileHandle.read(bytes: length) - let fileURL = try self.createTemporaryFile(data: data) + let fileURL = try createTemporaryFile(data: data) completionHandler(.success(fileURL)) } catch { completionHandler(.failure(error)) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageBackgroundEventsRegistry.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageBackgroundEventsRegistry.swift index 01f8126261..472061af02 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageBackgroundEventsRegistry.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageBackgroundEventsRegistry.swift @@ -52,7 +52,7 @@ class StorageBackgroundEventsRegistry { // Once the background event completion handler is used it can be cleared. static func removeContinuation(for identifier: String) { if self.identifier == identifier { - self.continuation = nil + continuation = nil } } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageConfiguration.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageConfiguration.swift index 71e9bcfd06..b0d854b6b2 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageConfiguration.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageConfiguration.swift @@ -8,7 +8,7 @@ import Foundation struct StorageConfiguration { - struct Defaults { + enum Defaults { static let sessionIdentifier = "com.amazon.aws.default.identifier" static let sharedContainerIdentifier = "com.amazon.aws.default.identifier-shared" static let allowsCellularAccess = true @@ -20,14 +20,13 @@ struct StorageConfiguration { let allowsCellularAccess: Bool let timeoutIntervalForResource: TimeInterval - static let `default`: StorageConfiguration = { - StorageConfiguration() - }() + static let `default`: StorageConfiguration = .init() init(sessionIdentifier: String = Defaults.sessionIdentifier, sharedContainerIdentifier: String = Defaults.sharedContainerIdentifier, allowsCellularAccess: Bool = Defaults.allowsCellularAccess, - timeoutIntervalForResource: TimeInterval = Defaults.timeoutIntervalForResource) { + timeoutIntervalForResource: TimeInterval = Defaults.timeoutIntervalForResource) + { self.sessionIdentifier = sessionIdentifier self.sharedContainerIdentifier = sharedContainerIdentifier self.allowsCellularAccess = allowsCellularAccess diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageEvent.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageEvent.swift index 480d1dabcf..6319dfbd50 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageEvent.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageEvent.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation /// The high-level status of an StorageEvent enum StorageEvent { diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageLogger.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageLogger.swift index 04b04e86c8..e5ec78d73b 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageLogger.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageLogger.swift @@ -5,7 +5,7 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation let storageLogger = Amplify.Logging.logger(forCategory: .storage) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUpload.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUpload.swift index 5a2f1a1b6e..d2c6431fa2 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUpload.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUpload.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation enum StorageMultipartUpload { enum Failure: Error { @@ -57,24 +57,22 @@ enum StorageMultipartUpload { } var partSize: StorageUploadPartSize? { - let result: StorageUploadPartSize? - switch self { + let result: StorageUploadPartSize? = switch self { case .parts(_, _, let partSize, _), .paused(_, _, let partSize, _): - result = partSize + partSize default: - result = nil + nil } return result } var taskIdentifier: TaskIdentifier? { - let result: Int? - switch self { + let result: Int? = switch self { case .completing(let taskIdentifier): - result = taskIdentifier + taskIdentifier default: - result = nil + nil } return result } @@ -153,7 +151,7 @@ enum StorageMultipartUpload { } var pendingPartNumbers: [Int] { - guard let parts = parts else { + guard let parts else { return [] } let allNumbers = Array(1 ... parts.count) @@ -166,7 +164,7 @@ enum StorageMultipartUpload { } var partsCompleted: Bool { - guard let parts = parts else { + guard let parts else { return false } let result = parts.completed.count == parts.count @@ -174,7 +172,7 @@ enum StorageMultipartUpload { } var partsFailed: Bool { - guard let parts = parts else { + guard let parts else { return false } let result = !parts.failed.isEmpty @@ -182,7 +180,7 @@ enum StorageMultipartUpload { } func part(for number: PartNumber) -> StorageUploadPart? { - guard let parts = parts, + guard let parts, parts.count >= number else { return nil } let part = parts[number - 1] return part @@ -238,7 +236,6 @@ enum StorageMultipartUpload { default: throw Failure.invalidStateTransition(reason: "Cannot resume from current state: \(self)") } - break case .completing(let taskIdentifier): self = .completing(taskIdentifier: taskIdentifier) case .completed(let uploadId): @@ -249,7 +246,7 @@ enum StorageMultipartUpload { throw Failure.invalidStateTransition(reason: "Cannot complete from current state: \(self)") } case .aborting(let error): - if let uploadId = uploadId { + if let uploadId { self = .aborting(uploadId: uploadId, error: error) } else { throw Failure.invalidStateTransition(reason: "Cannot abort from current state: \(self)") @@ -318,7 +315,8 @@ enum StorageMultipartUpload { private mutating func createParts(uploadFile: UploadFile, uploadId: UploadID, - logger: Logger = storageLogger) throws { + logger: Logger = storageLogger) throws + { let partSize = try StorageUploadPartSize(fileSize: uploadFile.size) let parts = try StorageUploadParts(fileSize: uploadFile.size, partSize: partSize, logger: logger) self = .parts(uploadId: uploadId, uploadFile: uploadFile, partSize: partSize, parts: parts) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadClient.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadClient.swift index ac1baacaa6..29977d67f3 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadClient.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadClient.swift @@ -69,8 +69,8 @@ class DefaultStorageMultipartUploadClient: StorageMultipartUploadClient { // https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html func createMultipartUpload() throws { - guard let serviceProxy = serviceProxy, - let session = session else { fatalError() } + guard let serviceProxy, + let session else { fatalError() } // The AWS S3 SDK handles the request so there will be not taskIdentifier session.handle(multipartUploadEvent: .creating) @@ -89,11 +89,11 @@ class DefaultStorageMultipartUploadClient: StorageMultipartUploadClient { metadata: metadata ) serviceProxy.awsS3.createMultipartUpload(request) { [weak self] result in - guard let self = self else { return } + guard let self else { return } switch result { case .success(let response): serviceProxy.register(multipartUploadSession: session) - session.handle(multipartUploadEvent: .created(uploadFile: self.uploadFile, uploadId: response.uploadId)) + session.handle(multipartUploadEvent: .created(uploadFile: uploadFile, uploadId: response.uploadId)) case .failure(let error): session.fail(error: error) } @@ -102,7 +102,7 @@ class DefaultStorageMultipartUploadClient: StorageMultipartUploadClient { // https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html func uploadPart(partNumber: PartNumber, multipartUpload: StorageMultipartUpload, subTask: StorageTransferTask) throws { - guard let serviceProxy = serviceProxy else { fatalError("Service Proxy is required") } + guard let serviceProxy else { fatalError("Service Proxy is required") } guard let uploadId = multipartUpload.uploadId, let uploadFile = multipartUpload.uploadFile, @@ -112,7 +112,7 @@ class DefaultStorageMultipartUploadClient: StorageMultipartUploadClient { } let startUploadPart: (URL, URL) async -> Void = { [weak self] partialFileURL, preSignedURL in - guard let self = self else { return } + guard let self else { return } var request = URLRequest(url: preSignedURL) request.cachePolicy = .reloadIgnoringLocalCacheData request.httpMethod = "PUT" @@ -136,13 +136,13 @@ class DefaultStorageMultipartUploadClient: StorageMultipartUploadClient { self.serviceProxy?.register(task: subTask) // tell the session the upload part has started - self.session?.handle(uploadPartEvent: .started(partNumber: partNumber, taskIdentifier: uploadTask.taskIdentifier)) + session?.handle(uploadPartEvent: .started(partNumber: partNumber, taskIdentifier: uploadTask.taskIdentifier)) uploadTask.resume() } let partialFileResultHandler: (Result) -> Void = { [weak self] result in - guard let self = self else { return } + guard let self else { return } Task { do { let partialFileURL = try result.get() @@ -170,8 +170,8 @@ class DefaultStorageMultipartUploadClient: StorageMultipartUploadClient { // https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html func completeMultipartUpload(uploadId: UploadID) { - guard let serviceProxy = serviceProxy, - let session = session else { fatalError() } + guard let serviceProxy, + let session else { fatalError() } let completedParts = session.completedParts ?? [] let parts = AWSS3MultipartUploadRequestCompletedParts(completedParts: completedParts) @@ -190,8 +190,8 @@ class DefaultStorageMultipartUploadClient: StorageMultipartUploadClient { // https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html func abortMultipartUpload(uploadId: UploadID, error: Error? = nil) { - guard let serviceProxy = serviceProxy, - let session = session else { fatalError() } + guard let serviceProxy, + let session else { fatalError() } serviceProxy.awsS3.abortMultipartUpload(.init(bucket: bucket, key: key, uploadId: uploadId)) { result in switch result { diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadSession.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadSession.swift index de59ecc9bb..ce344d607a 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadSession.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadSession.swift @@ -8,8 +8,8 @@ // Docs: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html // https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html -import Foundation import Amplify +import Foundation typealias RequestHeaders = [String: String] typealias RequestParameters = [String: String] @@ -52,7 +52,8 @@ class StorageMultipartUploadSession { onEvent: @escaping AWSS3StorageServiceBehavior.StorageServiceMultiPartUploadEventHandler, behavior: StorageMultipartUploadBehavior = .progressive, fileSystem: FileSystem = .default, - logger: Logger = storageLogger) { + logger: Logger = storageLogger) + { self.client = client let transferType: StorageTransferType = .multiPartUpload(onEvent: onEvent) @@ -68,13 +69,13 @@ class StorageMultipartUploadSession { self.fileSystem = fileSystem self.logger = logger - multipartUpload = .none + self.multipartUpload = .none self.client.integrate(session: self) // attach session to transferTask transferTask.proxyStorageTask = self - logger.info("Concurrency Limit is \(self.concurrentLimit) [based on active processors]") + logger.info("Concurrency Limit is \(concurrentLimit) [based on active processors]") } init?(client: StorageMultipartUploadClient, @@ -82,7 +83,8 @@ class StorageMultipartUploadSession { multipartUpload: StorageMultipartUpload, behavior: StorageMultipartUploadBehavior = .progressive, fileSystem: FileSystem = .default, - logger: Logger = storageLogger) { + logger: Logger = storageLogger) + { guard case let .multiPartUpload(onEvent) = transferTask.transferType else { return nil } @@ -101,7 +103,8 @@ class StorageMultipartUploadSession { guard let uploadFile = multipartUpload.uploadFile, let uploadId = multipartUpload.uploadId, let partSize = multipartUpload.partSize, - let parts = multipartUpload.parts else { + let parts = multipartUpload.parts + else { return } uploadParts(uploadFile: uploadFile, uploadId: uploadId, partSize: partSize, parts: parts) @@ -355,21 +358,22 @@ class StorageMultipartUploadSession { serialQueue.sync { guard let uploadId = multipartUpload.uploadId, let uploadFile = multipartUpload.uploadFile, - let partSize = multipartUpload.partSize else { + let partSize = multipartUpload.partSize + else { logger.warn("Unable to get required values to cancel in progress parts: \(multipartUpload)") return } // collect TaskIdentifier from each part that is in progress - let cancellingParts: [TaskIdentifier?] = parts.reduce(into: [], { result, part in + let cancellingParts: [TaskIdentifier?] = parts.reduce(into: []) { result, part in if case .inProgress(_, _, let taskIdentifier) = part { result.append(taskIdentifier) } else { result.append(nil) } - }) + } - for index in 0.. 0 { let end = min(maxPartsCount, pendingPartNumbers.count) - let numbers = pendingPartNumbers[0.. String { diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StoragePersistableTransferTask.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StoragePersistableTransferTask.swift index 708dc4d93a..ffd96df45f 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StoragePersistableTransferTask.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StoragePersistableTransferTask.swift @@ -5,9 +5,9 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify import AWSPluginsCore +import Foundation /* Note: Multipart Uploads will have a request for the creation request, each part upload and the complete or abort @@ -47,7 +47,7 @@ struct StoragePersistableTransferTask: Codable { } var uploadFile: UploadFile? { - guard let multipartUpload = multipartUpload else { + guard let multipartUpload else { return nil } @@ -68,13 +68,15 @@ struct StoragePersistableTransferTask: Codable { self.location = task.location if case .multiPartUpload = task.transferType, - let multipartUpload = task.multipartUpload { + let multipartUpload = task.multipartUpload + { self.multipartUpload = StoragePersistableMultipartUpload(multipartUpload: multipartUpload) - subTask = nil + self.subTask = nil } else if case .multiPartUploadPart = task.transferType, let uploadId = task.uploadId, let partNumber = task.partNumber, - let part = task.uploadPart { + let part = task.uploadPart + { self.multipartUpload = nil self.subTask = StoragePersistableSubTask(uploadId: uploadId, partNumber: partNumber, part: part) } else { @@ -95,7 +97,8 @@ struct StoragePersistableMultipartUpload: Codable { guard let uploadId = multipartUpload.uploadId, let fileURL = multipartUpload.uploadFile?.fileURL, let temporaryFileCreated = multipartUpload.uploadFile?.temporaryFileCreated, - let size = multipartUpload.uploadFile?.size else { + let size = multipartUpload.uploadFile?.size + else { return nil } self.uploadId = uploadId diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageServiceProxy.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageServiceProxy.swift index 285edcb436..386191f452 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageServiceProxy.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageServiceProxy.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation protocol StorageServiceProxy: AnyObject { var preSignedURLBuilder: AWSS3PreSignedURLBuilderBehavior! { get } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageServiceSessionDelegate.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageServiceSessionDelegate.swift index 1b83d5e17f..710540b2a1 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageServiceSessionDelegate.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageServiceSessionDelegate.swift @@ -32,7 +32,7 @@ class StorageServiceSessionDelegate: NSObject { } private func findTransferTask(for taskIdentifier: TaskIdentifier) -> StorageTransferTask? { - guard let storageService = storageService, + guard let storageService, let transferTask = storageService.findTask(taskIdentifier: taskIdentifier) else { logger.debug("Did not find transfer task: \(taskIdentifier)") return nil @@ -54,7 +54,8 @@ extension StorageServiceSessionDelegate: URLSessionDelegate { logURLSessionActivity("Session did finish background events") if let identifier = storageService?.identifier, - let continuation = StorageBackgroundEventsRegistry.getContinuation(for: identifier) { + let continuation = StorageBackgroundEventsRegistry.getContinuation(for: identifier) + { // Must be run on main thread as covered by Apple Developer docs. Task { @MainActor in continuation.resume(returning: true) @@ -64,7 +65,7 @@ extension StorageServiceSessionDelegate: URLSessionDelegate { } func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) { - if let error = error { + if let error { logURLSessionActivity("Session did become invalid: \(identifier) [\(error)]", warning: true) } else { logURLSessionActivity("Session did become invalid: \(identifier)") @@ -83,7 +84,7 @@ extension StorageServiceSessionDelegate: URLSessionDelegate { extension StorageServiceSessionDelegate: URLSessionTaskDelegate { func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { - if let error = error { + if let error { let nsError = error as NSError if nsError.domain == NSURLErrorDomain, nsError.code == NSURLErrorCancelled { logURLSessionActivity("Session task cancelled: \(task.taskIdentifier)") @@ -106,7 +107,7 @@ extension StorageServiceSessionDelegate: URLSessionTaskDelegate { logURLSessionActivity("Session task did complete: \(task.taskIdentifier)") } - guard let storageService = storageService, + guard let storageService, let transferTask = findTransferTask(for: task.taskIdentifier) else { logURLSessionActivity("Session task not handled: \(task.taskIdentifier)") return @@ -164,7 +165,7 @@ extension StorageServiceSessionDelegate: URLSessionTaskDelegate { """ ) - guard let storageService = storageService, + guard let storageService, let transferTask = findTransferTask(for: task.taskIdentifier) else { return } switch transferTask.transferType { @@ -215,7 +216,7 @@ extension StorageServiceSessionDelegate: URLSessionDownloadDelegate { func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { logURLSessionActivity("Session download task [\(downloadTask.taskIdentifier)] did finish downloading to \(location.path)") - guard let storageService = storageService, + guard let storageService, let transferTask = findTransferTask(for: downloadTask.taskIdentifier) else { return } let response = StorageTransferResponse(task: downloadTask, error: nil, transferTask: transferTask) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferDatabase.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferDatabase.swift index 3c17ec4fb9..6ffa0ca312 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferDatabase.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferDatabase.swift @@ -5,9 +5,9 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify import AWSPluginsCore +import Foundation // The recovery process must load active tasks with URLSession and match them using taskIdentifier to a persisted task. // Once the task can be "hydrated" the Event Handler can handle events from URLSession delegate methods. Tasks which @@ -41,7 +41,8 @@ extension StorageTransferDatabase { func attachEventHandlers(onUpload: AWSS3StorageServiceBehavior.StorageServiceUploadEventHandler? = nil, onDownload: AWSS3StorageServiceBehavior.StorageServiceDownloadEventHandler? = nil, - onMultipartUpload: AWSS3StorageServiceBehavior.StorageServiceMultiPartUploadEventHandler? = nil ) { + onMultipartUpload: AWSS3StorageServiceBehavior.StorageServiceMultiPartUploadEventHandler? = nil ) + { attachEventHandlers(onUpload: onUpload, onDownload: onDownload, onMultipartUpload: onMultipartUpload) } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferResponse.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferResponse.swift index 56d42506b0..eb5419fa47 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferResponse.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferResponse.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation class StorageTransferResponse { let task: URLSessionTask @@ -15,7 +15,7 @@ class StorageTransferResponse { let transferTask: StorageTransferTask var userInfo: [AnyHashable: Any]? { - guard let httpResponse = httpResponse else { + guard let httpResponse else { return nil } return httpResponse.allHeaderFields @@ -23,7 +23,7 @@ class StorageTransferResponse { var responseError: StorageError? { let error: StorageError? - if let httpResponse = httpResponse { + if let httpResponse { let statusCode = httpResponse.statusCode if statusCode / 100 == 3, statusCode != 304 { // 300 range: Redirection @@ -35,7 +35,7 @@ class StorageTransferResponse { error = .accessDenied(description, "Make sure the user has access to the key before trying to download/upload it.", self.error) - } else if 404 == statusCode { + } else if statusCode == 404 { error = .keyNotFound(transferTask.key, description, "Make sure the key exists before trying to download it.", @@ -58,8 +58,9 @@ class StorageTransferResponse { var isErrorRetriable: Bool { // See https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html for S3 error responses - guard let httpResponse = httpResponse, - transferTask.retryCount < transferTask.retryLimit else { + guard let httpResponse, + transferTask.retryCount < transferTask.retryLimit + else { return false } @@ -69,14 +70,15 @@ class StorageTransferResponse { if [500, 503].contains(statusCode) { // 500 and 503 are retriable. result = true - } else if 400 == statusCode { + } else if statusCode == 400 { // 400 is a bad request result = false } else if (transferTask.responseText ?? "").isEmpty { // If we didn't get any more info from the server, error is retriable result = true } else if let responseText = transferTask.responseText, - ["RequestTimeout", "ExpiredToken", "TokenRefreshRequired"].contains(responseText) { + ["RequestTimeout", "ExpiredToken", "TokenRefreshRequired"].contains(responseText) + { result = true } else { result = false @@ -93,16 +95,15 @@ class StorageTransferResponse { } private func errorDescription(forStatusCode statusCode: Int) -> ErrorDescription { - let description: String - switch statusCode { + let description = switch statusCode { case 401: - description = "Unauthorized" + "Unauthorized" case 403: - description = "Forbidden" + "Forbidden" case 404: - description = "NotFound" + "NotFound" default: - description = "" + "" } return "Received HTTP Response status code \(statusCode) \(description)" diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferTask.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferTask.swift index 1ecf8894db..e794ec0ba2 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferTask.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferTask.swift @@ -5,9 +5,9 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify import AWSPluginsCore +import Foundation class StorageTransferTask { typealias Action = () -> Void @@ -20,7 +20,7 @@ class StorageTransferTask { let storageTransferDatabase: StorageTransferDatabase let logger: Logger - internal var sessionTask: StorageSessionTask? { + var sessionTask: StorageSessionTask? { didSet { if sessionTask?.state == .suspended { status = .paused @@ -29,7 +29,7 @@ class StorageTransferTask { } private let taskQueue = DispatchQueue(label: "com.amazon.aws.amplify.storage-transfer-task", target: .global()) private var _status: StorageTransferStatus = .unknown - internal private(set) var status: StorageTransferStatus { + private(set) var status: StorageTransferStatus { get { dispatchPrecondition(condition: .notOnQueue(taskQueue)) return taskQueue.sync { @@ -44,14 +44,14 @@ class StorageTransferTask { } } - internal var location: URL? - internal var error: Error? + var location: URL? + var error: Error? // support for multipart uploads - internal var uploadId: UploadID? - internal var multipartUpload: StorageMultipartUpload? { + var uploadId: UploadID? + var multipartUpload: StorageMultipartUpload? { didSet { - if let multipartUpload = multipartUpload { + if let multipartUpload { if multipartUpload.inProgress { if status != .paused { status = .inProgress @@ -68,12 +68,12 @@ class StorageTransferTask { } } } - internal var uploadPart: StorageUploadPart? + var uploadPart: StorageUploadPart? // proxy for StorageMultipartUploadSession - internal var proxyStorageTask: StorageTask? + var proxyStorageTask: StorageTask? - internal var partNumber: PartNumber? { + var partNumber: PartNumber? { switch transferType { case .multiPartUploadPart(_, let partNumber): return partNumber @@ -82,17 +82,18 @@ class StorageTransferTask { } } - internal private(set) var contentType: String? - internal private(set) var requestHeaders: [String: String]? + private(set) var contentType: String? + private(set) var requestHeaders: [String: String]? - internal private(set) var file: String? - internal private(set) var retryCount: Int = 0 - internal private(set) var retryLimit: Int = 3 + private(set) var file: String? + private(set) var retryCount: Int = 0 + private(set) var retryLimit: Int = 3 - internal var responseData: Data? - internal var responseText: String? { + var responseData: Data? + var responseText: String? { guard let data = responseData, data.count < 5_120, - let text = String(bytes: data, encoding: .utf8) else { + let text = String(bytes: data, encoding: .utf8) + else { return nil } return text @@ -106,7 +107,8 @@ class StorageTransferTask { contentType: String? = nil, requestHeaders: [String: String]? = nil, storageTransferDatabase: StorageTransferDatabase = .default, - logger: Logger = storageLogger) { + logger: Logger = storageLogger) + { self.transferID = transferID self.transferType = transferType self.bucket = bucket @@ -124,7 +126,8 @@ class StorageTransferTask { transferType: StorageTransferType, sessionTask: StorageSessionTask? = nil, storageTransferDatabase: StorageTransferDatabase = .default, - logger: Logger = storageLogger) { + logger: Logger = storageLogger) + { // swiftlint:disable line_length guard let rawValue = StorageTransferType.RawValues(rawValue: persistableTransferTask.transferTypeRawValue) else { @@ -146,7 +149,8 @@ class StorageTransferTask { // set multiPartUpload with default value which can resume upload process if rawValue == .multiPartUpload, let uploadId = persistableTransferTask.uploadId, - let uploadFile = persistableTransferTask.uploadFile { + let uploadFile = persistableTransferTask.uploadFile + { let multipartUpload = StorageMultipartUpload.created(uploadId: uploadId, uploadFile: uploadFile) self.uploadId = persistableTransferTask.uploadId self.multipartUpload = multipartUpload @@ -213,13 +217,13 @@ class StorageTransferTask { return nil } - if let sessionTask = sessionTask { + if let sessionTask { logger.debug("Cancelling storage transfer task: \(sessionTask.taskIdentifier)") action = { sessionTask.cancel() } _status = .cancelled - } else if let proxyStorageTask = proxyStorageTask { + } else if let proxyStorageTask { logger.debug("Cancelling multipart upload: \(uploadId ?? "-")") action = { proxyStorageTask.cancel() @@ -246,13 +250,13 @@ class StorageTransferTask { return nil } - if let sessionTask = sessionTask { + if let sessionTask { logger.debug("Resuming storage transfer task: \(sessionTask.taskIdentifier)") action = { sessionTask.resume() } _status = .inProgress - } else if let proxyStorageTask = proxyStorageTask { + } else if let proxyStorageTask { logger.debug("Resuming multipart upload: \(uploadId ?? "-")") action = { proxyStorageTask.resume() @@ -290,13 +294,13 @@ class StorageTransferTask { return nil } - if let sessionTask = sessionTask { + if let sessionTask { logger.debug("Suspending storage transfer task: \(sessionTask.taskIdentifier)") action = { sessionTask.suspend() } _status = .paused - } else if let proxyStorageTask = proxyStorageTask { + } else if let proxyStorageTask { logger.debug("Pausing multipart upload: \(uploadId ?? "-")") action = { proxyStorageTask.pause() @@ -325,7 +329,7 @@ class StorageTransferTask { return } - if let sessionTask = sessionTask { + if let sessionTask { logger.debug("Completing storage transfer task: \(sessionTask.taskIdentifier)") } @@ -348,7 +352,7 @@ extension URLRequest { return } - requestHeaders.forEach { key, value in + for (key, value) in requestHeaders { setValue(value, forHTTPHeaderField: key) } } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferTaskPair.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferTaskPair.swift index ee1d800dfd..82ae55f1e7 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferTaskPair.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferTaskPair.swift @@ -14,13 +14,15 @@ struct StorageTransferTaskPair { let multipartUpload: StorageMultipartUpload? init(transferTask: StorageTransferTask, - multipartUploads: [StorageMultipartUpload]) { + multipartUploads: [StorageMultipartUpload]) + { self.transferTask = transferTask if let uploadId = transferTask.uploadId, let multipartUpload = multipartUploads.first(where: { $0.uploadId == uploadId - }) { + }) + { self.multipartUpload = multipartUpload } else { self.multipartUpload = nil diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferType.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferType.swift index 4b53147466..6936bfb35a 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferType.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferType.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation // swiftlint:disable line_length @@ -65,22 +65,21 @@ enum StorageTransferType { } var rawValue: Int { - let result: Int - switch self { + let result: Int = switch self { case .getPreSignedURL: - result = StorageTransferType.RawValues.getPreSignedURL.rawValue + StorageTransferType.RawValues.getPreSignedURL.rawValue case .download: - result = StorageTransferType.RawValues.download.rawValue + StorageTransferType.RawValues.download.rawValue case .upload: - result = StorageTransferType.RawValues.upload.rawValue + StorageTransferType.RawValues.upload.rawValue case .multiPartUpload: - result = StorageTransferType.RawValues.multiPartUpload.rawValue + StorageTransferType.RawValues.multiPartUpload.rawValue case .multiPartUploadPart: - result = StorageTransferType.RawValues.multiPartUploadPart.rawValue + StorageTransferType.RawValues.multiPartUploadPart.rawValue case .list: - result = StorageTransferType.RawValues.list.rawValue + StorageTransferType.RawValues.list.rawValue case .remove: - result = StorageTransferType.RawValues.remove.rawValue + StorageTransferType.RawValues.remove.rawValue } return result } @@ -119,7 +118,7 @@ enum StorageTransferType { } } - struct Defaults { + enum Defaults { static func createDefaultTransferType(persistableTransferTask: StoragePersistableTransferTask) -> StorageTransferType? { let result: StorageTransferType @@ -138,7 +137,8 @@ enum StorageTransferType { result = .multiPartUpload(onEvent: defaultMultiPartUploadEvent) case .multiPartUploadPart: guard let uploadId = persistableTransferTask.uploadId, - let partNumber = persistableTransferTask.partNumber else { + let partNumber = persistableTransferTask.partNumber + else { return nil } result = .multiPartUploadPart(uploadId: uploadId, partNumber: partNumber) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageUploadPart.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageUploadPart.swift index 4e5627e20d..8bcb65c816 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageUploadPart.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageUploadPart.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation // Each part must be at least 5 MB in size, except the last part. // https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html @@ -75,57 +75,53 @@ enum StorageUploadPart { } var progress: Double { - let result: Double - switch self { + let result: Double = switch self { case .pending, .queued: - result = 0.0 + 0.0 case .inProgress(let bytes, let bytesTransferred, _): - result = bytes > 0 ? Double(bytesTransferred) / Double(bytes) : 0.0 + bytes > 0 ? Double(bytesTransferred) / Double(bytes) : 0.0 case .failed: - result = 0.0 + 0.0 case .completed: - result = 1.0 + 1.0 } return result } var bytes: UInt64 { - let result: UInt64 - switch self { + let result: UInt64 = switch self { case .pending(let bytes), .queued(let bytes): - result = bytes + bytes case .inProgress(let bytes, _, _): - result = bytes + bytes case .failed(let bytes, _, _): - result = bytes + bytes case .completed(let bytes, _): - result = bytes + bytes } return result } var bytesTransferred: UInt64 { - let result: UInt64 - switch self { + let result: UInt64 = switch self { case .pending, .queued, .failed: - result = 0 + 0 case .inProgress(_, let bytesTransferred, _): - result = bytesTransferred + bytesTransferred case .completed(let bytes, _): - result = bytes + bytes } return result } var eTag: String? { - let result: String? - if case .completed(_, let eTag) = self { - result = eTag + let result: String? = if case .completed(_, let eTag) = self { + eTag } else { - result = nil + nil } return result } @@ -159,7 +155,7 @@ struct StorageUploadPartSize { } let size: UInt64 - static let `default`: StorageUploadPartSize = StorageUploadPartSize() + static let `default`: StorageUploadPartSize = .init() private init() { self.size = minimumPartSize @@ -222,7 +218,7 @@ struct StorageUploadPartSize { } -extension Array where Element == StorageUploadPart { +extension [StorageUploadPart] { enum Failure: Error { case invalidPartNumber case partNotFound @@ -262,7 +258,7 @@ extension Array where Element == StorageUploadPart { } } -extension Sequence where Element == StorageUploadPart { +extension Sequence { /// Indicates that no parts are pending or in progress, but could also be failed. var isDone: Bool { @@ -283,19 +279,19 @@ extension Sequence where Element == StorageUploadPart { } var pending: StorageUploadParts { - filter { $0.isPending } + filter(\.isPending) } var inProgress: StorageUploadParts { - filter { $0.inProgress } + filter(\.inProgress) } var failed: StorageUploadParts { - filter { $0.failed } + filter(\.failed) } var completed: StorageUploadParts { - filter { $0.completed } + filter(\.completed) } var totalBytes: UInt64 { diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageUploadPartEvent.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageUploadPartEvent.swift index 7e0981bf59..85f8844fd0 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageUploadPartEvent.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageUploadPartEvent.swift @@ -26,34 +26,31 @@ enum StorageUploadPartEvent { } var taskIdentifier: TaskIdentifier? { - let result: Int? - switch self { + let result: Int? = switch self { case .started(_, let taskIdentifier), .progressUpdated(_, _, let taskIdentifier), .completed(_, _, let taskIdentifier): - result = taskIdentifier + taskIdentifier default: - result = nil + nil } return result } var isCompleted: Bool { - let result: Bool - if case .completed = self { - result = true + let result = if case .completed = self { + true } else { - result = false + false } return result } var error: Error? { - let result: Error? - if case .failed(_, let error) = self { - result = error + let result: Error? = if case .failed(_, let error) = self { + error } else { - result = nil + nil } return result } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/SubpathStategy+Delimiter.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/SubpathStategy+Delimiter.swift index 5dbf3c27a6..fda56c2a50 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/SubpathStategy+Delimiter.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/SubpathStategy+Delimiter.swift @@ -8,7 +8,7 @@ import Amplify extension StorageListRequest.Options.SubpathStrategy { - /// The delimiter for this strategy + /// The delimiter for this strategy var delimiter: String? { switch self { case .exclude(let delimiter): diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/URLSessionTask+eTag.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/URLSessionTask+eTag.swift index 4f4a97107a..5efdeccbce 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/URLSessionTask+eTag.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/URLSessionTask+eTag.swift @@ -10,13 +10,14 @@ import Foundation extension URLSessionTask { var eTag: String? { guard let httpResponse = response as? HTTPURLResponse, - httpResponse.statusCode == 200 else { + httpResponse.statusCode == 200 + else { return nil } let keys = httpResponse.allHeaderFields.keys - .compactMap({ $0 as? String }) - .filter({ $0.uppercased() == "ETAG" }) + .compactMap { $0 as? String } + .filter { $0.uppercased() == "ETAG" } guard let key = keys.first, let quotedValue = httpResponse.allHeaderFields[key] as? String else { diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/HttpClientEngineProxy.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/HttpClientEngineProxy.swift index 407dc79756..0bb8ad299a 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/HttpClientEngineProxy.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/HttpClientEngineProxy.swift @@ -16,7 +16,7 @@ import Foundation /// the AWSS3StoragePlugin is necessary so this protocol is not exposed via the SPI. /// /// See: -/// +/// /// * [URLRequestDelegate](x-source-tag://URLRequestDelegate) /// * [CommonRuntime.HttpClientEngine](x-source-tag://HttpClientEngine) /// diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/SdkError+Properties.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/SdkError+Properties.swift index b4b240df18..4f36d534fa 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/SdkError+Properties.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/SdkError+Properties.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation extension StorageError { static var serviceKey: String { diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/StorageRequestUtils+Getter.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/StorageRequestUtils+Getter.swift index ac610b39fb..ea2990c32c 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/StorageRequestUtils+Getter.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/StorageRequestUtils+Getter.swift @@ -5,15 +5,16 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation extension StorageRequestUtils { // MARK: Getter methods static func getAccessLevelPrefix(accessLevel: StorageAccessLevel, identityId: String, - targetIdentityId: String?) -> String { + targetIdentityId: String?) -> String + { let targetIdentityId = targetIdentityId ?? identityId @@ -43,9 +44,9 @@ extension StorageRequestUtils { } } -extension StorageAccessLevel { +public extension StorageAccessLevel { /// Service Access Prefix. - public var serviceAccessPrefix: String { + var serviceAccessPrefix: String { switch self { case .guest: return "public" diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/StorageRequestUtils+Validator.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/StorageRequestUtils+Validator.swift index eb471ec5f9..d9ebd107b0 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/StorageRequestUtils+Validator.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/StorageRequestUtils+Validator.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation extension StorageRequestUtils { @@ -14,8 +14,9 @@ extension StorageRequestUtils { /// Validate `targetIdentityId` is specified only for `protected` accessLevel. static func validateTargetIdentityId(_ targetIdentityId: String?, - accessLevel: StorageAccessLevel) -> StorageError? { - if let targetIdentityId = targetIdentityId { + accessLevel: StorageAccessLevel) -> StorageError? + { + if let targetIdentityId { if targetIdentityId.isEmpty { return StorageError.validation(StorageErrorConstants.identityIdIsEmpty.field, StorageErrorConstants.identityIdIsEmpty.errorDescription, @@ -56,7 +57,7 @@ extension StorageRequestUtils { /// Validate `path` is non-empty, if specified. static func validatePath(_ path: String?) -> StorageError? { - if let path = path { + if let path { if path.isEmpty { return StorageError.validation(StorageErrorConstants.pathIsEmpty.field, StorageErrorConstants.pathIsEmpty.errorDescription, @@ -69,7 +70,7 @@ extension StorageRequestUtils { // Validate `contentType` is non-empty string static func validateContentType(_ contentType: String?) -> StorageError? { - if let contentType = contentType { + if let contentType { if contentType.isEmpty { return StorageError.validation(StorageErrorConstants.contentTypeIsEmpty.field, StorageErrorConstants.contentTypeIsEmpty.errorDescription, @@ -82,7 +83,7 @@ extension StorageRequestUtils { // Validate `metadata` dictionary contains lowercased keys static func validateMetadata(_ metadata: [String: String]?) -> StorageError? { - if let metadata = metadata { + if let metadata { for (key, _) in metadata { if key != key.lowercased() { return StorageError.validation(StorageErrorConstants.metadataKeysInvalid.field, diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/StorageRequestUtils.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/StorageRequestUtils.swift index 178f7d7974..364f36ac62 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/StorageRequestUtils.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/StorageRequestUtils.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import Foundation import Amplify +import Foundation class StorageRequestUtils { static let metadataKeyPrefix = "x-amz-meta-" diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3StorageListObjectsTask.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3StorageListObjectsTask.swift index ed01a7a1bb..5f2101b63c 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3StorageListObjectsTask.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3StorageListObjectsTask.swift @@ -6,9 +6,9 @@ // import Amplify -import Foundation -import AWSS3 import AWSPluginsCore +import AWSS3 +import Foundation protocol StorageListObjectsTask: AmplifyTaskExecution where Request == StorageListRequest, Success == StorageListResult, Failure == StorageError {} @@ -20,7 +20,8 @@ class AWSS3StorageListObjectsTask: StorageListObjectsTask, DefaultLogger { init(_ request: StorageListRequest, storageConfiguration: AWSS3StoragePluginConfiguration, - storageBehaviour: AWSS3StorageServiceBehavior) { + storageBehaviour: AWSS3StorageServiceBehavior) + { self.request = request self.storageConfiguration = storageConfiguration self.storageBehaviour = storageBehaviour @@ -63,7 +64,7 @@ class AWSS3StorageListObjectsTask: StorageListObjectsTask, DefaultLogger { let commonPrefixes = response.commonPrefixes ?? [] return StorageListResult( items: items, - excludedSubpaths: commonPrefixes.compactMap { $0.prefix }, + excludedSubpaths: commonPrefixes.compactMap(\.prefix), nextToken: response.nextContinuationToken ) } catch let error as StorageErrorConvertible { diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3StorageRemoveTask.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3StorageRemoveTask.swift index 33b4319db3..056a2ebf8d 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3StorageRemoveTask.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3StorageRemoveTask.swift @@ -6,9 +6,9 @@ // import Amplify -import Foundation -import AWSS3 import AWSPluginsCore +import AWSS3 +import Foundation protocol StorageRemoveTask: AmplifyTaskExecution where Request == AWSS3DeleteObjectRequest, Success == String, Failure == StorageError {} @@ -20,7 +20,8 @@ class AWSS3StorageRemoveTask: StorageRemoveTask, DefaultLogger { init(_ request: StorageRemoveRequest, storageConfiguration: AWSS3StoragePluginConfiguration, - storageBehaviour: AWSS3StorageServiceBehavior) { + storageBehaviour: AWSS3StorageServiceBehavior) + { self.request = request self.storageConfiguration = storageConfiguration self.storageBehaviour = storageBehaviour @@ -48,7 +49,7 @@ class AWSS3StorageRemoveTask: StorageRemoveTask, DefaultLogger { _ = try await storageBehaviour.client.deleteObject(input: input) } catch let error as StorageErrorConvertible { throw error.storageError - } catch let error { + } catch { throw StorageError.service( "Service error occurred.", "Please inspect the underlying error for more details.", diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3torageGetURLTask.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3torageGetURLTask.swift index df803a3b71..944d2f2d01 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3torageGetURLTask.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3torageGetURLTask.swift @@ -6,9 +6,9 @@ // import Amplify -import Foundation -import AWSS3 import AWSPluginsCore +import AWSS3 +import Foundation protocol StorageGetURLTask: AmplifyTaskExecution where Request == StorageGetURLRequest, Success == URL, Failure == StorageError {} @@ -18,7 +18,8 @@ class AWSS3StorageGetURLTask: StorageGetURLTask, DefaultLogger { let storageBehaviour: AWSS3StorageServiceBehavior init(_ request: StorageGetURLRequest, - storageBehaviour: AWSS3StorageServiceBehavior) { + storageBehaviour: AWSS3StorageServiceBehavior) + { self.request = request self.storageBehaviour = storageBehaviour } @@ -57,7 +58,7 @@ class AWSS3StorageGetURLTask: StorageGetURLTask, DefaultLogger { ) } catch let error as StorageErrorConvertible { throw error.storageError - } catch let error { + } catch { throw StorageError.service( "Service error occurred.", "Please inspect the underlying error for more details.", diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginAmplifyVersionableTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginAmplifyVersionableTests.swift index dedb85de38..a115dd415f 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginAmplifyVersionableTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginAmplifyVersionableTests.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import XCTest import AWSS3StoragePlugin +import XCTest // swiftlint:disable:next type_name class AWSS3StoragePluginAmplifyVersionableTests: XCTestCase { diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginAsyncBehaviorTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginAsyncBehaviorTests.swift index 6edc1cce12..bd1d2b03d5 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginAsyncBehaviorTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginAsyncBehaviorTests.swift @@ -5,11 +5,11 @@ // SPDX-License-Identifier: Apache-2.0 // -import XCTest import Amplify -@testable import AWSS3StoragePlugin +import XCTest @testable import AmplifyTestCommon @testable import AWSPluginsTestCommon +@testable import AWSS3StoragePlugin class AWSS3StoragePluginAsyncBehaviorTests: XCTestCase { @@ -59,7 +59,7 @@ class AWSS3StoragePluginAsyncBehaviorTests: XCTestCase { func testPluginDownloadFileAsync() async throws { storageService.storageServiceDownloadEvents = [.completed(nil)] - + let task = storagePlugin.downloadFile(key: testKey, local: testURL, options: nil) @@ -105,7 +105,7 @@ class AWSS3StoragePluginAsyncBehaviorTests: XCTestCase { func testPluginListAsync() async throws { let testKey = UUID().uuidString let item = StorageListResult.Item(key: testKey) - storageService.listHandler = { (_, _) in + storageService.listHandler = { _, _ in return .init(items: [item]) } let output = try await storagePlugin.list(options: nil) @@ -118,7 +118,7 @@ class AWSS3StoragePluginAsyncBehaviorTests: XCTestCase { /// - When: The list API is invoked with subpathStrategy set to .exclude /// - Then: The list of excluded subpaths and the list of items should be populated func testPluginListWithCommonPrefixesAsync() async throws { - storageService.listHandler = { (_, _) in + storageService.listHandler = { _, _ in return .init( items: [.init(path: "path")], excludedSubpaths: ["subpath1", "subpath2"] diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginBaseConfigTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginBaseConfigTests.swift index 0900d740e4..39f8a28428 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginBaseConfigTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginBaseConfigTests.swift @@ -5,9 +5,9 @@ // SPDX-License-Identifier: Apache-2.0 // +import AWSS3StoragePlugin import XCTest @testable import Amplify -import AWSS3StoragePlugin class AWSS3StoragePluginBaseConfigTests: XCTestCase { diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginConfigureTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginConfigureTests.swift index 0d8fa75662..6b385b5684 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginConfigureTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginConfigureTests.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import XCTest import Amplify +import XCTest @testable import AWSS3StoragePlugin class AWSS3StoragePluginConfigureTests: AWSS3StoragePluginTests { @@ -78,7 +78,8 @@ class AWSS3StoragePluginConfigureTests: AWSS3StoragePluginTests { XCTFail("Storage configuration should not succeed") } catch { guard let pluginError = error as? PluginError, - case .pluginConfigurationError = pluginError else { + case .pluginConfigurationError = pluginError + else { XCTFail("Should throw invalidConfiguration exception. But received \(error) ") return } diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginGetPresignedUrlTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginGetPresignedUrlTests.swift index 4dcf9c0108..5987d8601c 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginGetPresignedUrlTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginGetPresignedUrlTests.swift @@ -1,13 +1,13 @@ -//// +// // Copyright Amazon.com Inc. or its affiliates. // All Rights Reserved. // // SPDX-License-Identifier: Apache-2.0 // -@testable import AWSS3StoragePlugin @testable import AmplifyTestCommon @testable import AWSPluginsTestCommon +@testable import AWSS3StoragePlugin import Amplify import XCTest @@ -37,7 +37,7 @@ final class AWSS3StoragePluginGetPresignedUrlTests: XCTestCase { defaultAccessLevel: defaultAccessLevel, queue: queue) let url = try XCTUnwrap(testURL) - storageService.getPreSignedURLHandler = { (_, _, _) in + storageService.getPreSignedURLHandler = { _, _, _ in return url } } @@ -68,7 +68,7 @@ final class AWSS3StoragePluginGetPresignedUrlTests: XCTestCase { "getPreSignedURL(serviceKey:signingOperation:metadata:accelerate:expires:) \(expectedServiceKey) getObject nil 18000" ]) } - + /// - Given: An empty string as an object key /// - When: An attempt to generate a pre-signed URL for it is performed /// - Then: A StorageError.validation is thrown @@ -77,7 +77,7 @@ final class AWSS3StoragePluginGetPresignedUrlTests: XCTestCase { do { _ = try await systemUnderTest.getURL(key: "", options: options) XCTFail("Expecting error") - } catch StorageError.validation(let field, let description, let recovery, _){ + } catch StorageError.validation(let field, let description, let recovery, _) { XCTAssertEqual(field, "key") XCTAssertEqual(recovery, "Specify a non-empty key.") XCTAssertEqual(description, "The `key` is specified but is empty.") @@ -108,7 +108,7 @@ final class AWSS3StoragePluginGetPresignedUrlTests: XCTestCase { func testGetOperationGetPresignedURL() async throws { let testIdentityId = UUID().uuidString authService.identityId = testIdentityId - let expectedExpires = Int.random(in: 100..<200) + let expectedExpires = Int.random(in: 100 ..< 200) let options = StorageGetURLRequest.Options(accessLevel: .protected, expires: expectedExpires) let output = try await systemUnderTest.getURL(key: testKey, options: options) @@ -132,7 +132,7 @@ final class AWSS3StoragePluginGetPresignedUrlTests: XCTestCase { authService.identityId = testIdentityId let error = StorageError.service(UUID().uuidString, UUID().uuidString) - storageService.getPreSignedURLHandler = { (_,_,_) in + storageService.getPreSignedURLHandler = { _, _, _ in throw error } @@ -170,7 +170,7 @@ final class AWSS3StoragePluginGetPresignedUrlTests: XCTestCase { "getIdentityID()" ]) - let expectedExpires = 18000 + let expectedExpires = 18_000 let expectedServiceKey = StorageAccessLevel.protected.rawValue + "/" + testIdentityId + "/" + testKey XCTAssertEqual(storageService.interactions, [ "getPreSignedURL(serviceKey:signingOperation:metadata:accelerate:expires:) \(expectedServiceKey) getObject nil \(expectedExpires)" diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginTestBase.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginTestBase.swift index 5ed47beb9e..bdc4a9438e 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginTestBase.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginTestBase.swift @@ -5,11 +5,11 @@ // SPDX-License-Identifier: Apache-2.0 // -import XCTest import Amplify -@testable import AWSS3StoragePlugin +import XCTest @testable import AmplifyTestCommon @testable import AWSPluginsTestCommon +@testable import AWSS3StoragePlugin class AWSS3StoragePluginTests: XCTestCase { var storagePlugin: AWSS3StoragePlugin! diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Configuration/AWSS3PluginPrefixResolverTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Configuration/AWSS3PluginPrefixResolverTests.swift index 5880cf935a..831a74c6da 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Configuration/AWSS3PluginPrefixResolverTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Configuration/AWSS3PluginPrefixResolverTests.swift @@ -5,13 +5,13 @@ // SPDX-License-Identifier: Apache-2.0 // -import XCTest import Amplify +import XCTest @testable import AmplifyTestCommon -@testable import AWSS3StoragePlugin @testable import AWSPluginsTestCommon +@testable import AWSS3StoragePlugin -extension Sequence where Element == PrefixTestData { +extension Sequence { /// Convert to asynchronous sequence. var async: AmplifyAsyncSequence { let sequence = AmplifyAsyncSequence() @@ -30,7 +30,8 @@ struct PrefixTestData { let line: UInt init(_ accessLevel: StorageAccessLevel, _ targetIdentityId: String?, _ expectedPrefix: String, - file: StaticString = #filePath, line: UInt = #line) { + file: StaticString = #filePath, line: UInt = #line) + { self.accessLevel = accessLevel self.targetIdentityId = targetIdentityId self.expectedPrefix = expectedPrefix diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Configuration/AWSS3StoragePluginConfigurationTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Configuration/AWSS3StoragePluginConfigurationTests.swift index d2b2b47e2b..70cdd4b024 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Configuration/AWSS3StoragePluginConfigurationTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Configuration/AWSS3StoragePluginConfigurationTests.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import XCTest import Amplify +import XCTest @testable import AmplifyTestCommon @testable import AWSS3StoragePlugin @@ -19,7 +19,8 @@ class AWSS3StoragePluginConfigurationTests: XCTestCase { struct MockPrefixResolver: AWSS3PluginPrefixResolver { func resolvePrefix(for accessLevel: StorageAccessLevel, - targetIdentityId: String?) async throws -> String { + targetIdentityId: String?) async throws -> String + { "" } } diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Configuration/S3ClientConfigurationProxyTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Configuration/S3ClientConfigurationProxyTests.swift index 5ac3ba6a9a..5a7fd07ebf 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Configuration/S3ClientConfigurationProxyTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Configuration/S3ClientConfigurationProxyTests.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import AWSS3 import AWSClientRuntime +import AWSS3 import ClientRuntime import Foundation import XCTest diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Dependency/AWSS3AdapterTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Dependency/AWSS3AdapterTests.swift index 937c59fedb..15c2672780 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Dependency/AWSS3AdapterTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Dependency/AWSS3AdapterTests.swift @@ -5,10 +5,10 @@ // SPDX-License-Identifier: Apache-2.0 // -@testable import Amplify -@testable import AWSS3StoragePlugin import AWSS3 import XCTest +@testable import Amplify +@testable import AWSS3StoragePlugin class AWSS3AdapterTests: XCTestCase { private var adapter: AWSS3Adapter! @@ -55,7 +55,8 @@ class AWSS3AdapterTests: XCTestCase { adapter.deleteObject(.init(bucket: "bucket", key: "key")) { result in XCTAssertEqual(self.awsS3.deleteObjectCount, 1) guard case .failure(let error) = result, - case .keyNotFound(let key, _, _, _) = error else { + case .keyNotFound(let key, _, _, _) = error + else { XCTFail("Expected StorageError.keyNotFound") return } @@ -107,7 +108,8 @@ class AWSS3AdapterTests: XCTestCase { )) { result in XCTAssertEqual(self.awsS3.listObjectsV2Count, 1) guard case .failure(let error) = result, - case .accessDenied(let description, _, _) = error else { + case .accessDenied(let description, _, _) = error + else { XCTFail("Expected StorageError.accessDenied") return } @@ -117,7 +119,7 @@ class AWSS3AdapterTests: XCTestCase { await fulfillment(of: [listExpectation], timeout: 1) } - + /// Given: An AWSS3Adapter /// When: createMultipartUpload is invoked and the s3 client returns a valid response /// Then: A .success result is returned containing the corresponding parsed response @@ -151,7 +153,8 @@ class AWSS3AdapterTests: XCTestCase { adapter.createMultipartUpload(.init(bucket: "bucket", key: "key")) { result in XCTAssertEqual(self.awsS3.createMultipartUploadCount, 1) guard case .failure(let error) = result, - case .unknown(let description, _) = error else { + case .unknown(let description, _) = error + else { XCTFail("Expected StorageError.unknown") return } @@ -171,7 +174,8 @@ class AWSS3AdapterTests: XCTestCase { adapter.createMultipartUpload(.init(bucket: "bucket", key: "key")) { result in XCTAssertEqual(self.awsS3.createMultipartUploadCount, 1) guard case .failure(let error) = result, - case .accessDenied(let description, _, _) = error else { + case .accessDenied(let description, _, _) = error + else { XCTFail("Expected StorageError.accessDenied") return } @@ -219,7 +223,8 @@ class AWSS3AdapterTests: XCTestCase { adapter.listParts(bucket: "bucket", key: "key", uploadId: "uploadId") { result in XCTAssertEqual(self.awsS3.listPartsCount, 1) guard case .failure(let error) = result, - case .unknown(let description, _) = error else { + case .unknown(let description, _) = error + else { XCTFail("Expected StorageError.unknown") return } @@ -239,7 +244,8 @@ class AWSS3AdapterTests: XCTestCase { adapter.listParts(bucket: "bucket", key: "key", uploadId: "uploadId") { result in XCTAssertEqual(self.awsS3.listPartsCount, 1) guard case .failure(let error) = result, - case .authError(let description, _, _) = error else { + case .authError(let description, _, _) = error + else { XCTFail("Expected StorageError.authError") return } @@ -249,7 +255,7 @@ class AWSS3AdapterTests: XCTestCase { await fulfillment(of: [listPartsExpectation], timeout: 1) } - + /// Given: An AWSS3Adapter /// When: completeMultipartUpload is invoked and the s3 client returns a valid response /// Then: A .success result is returned containing the corresponding parsed response @@ -286,7 +292,8 @@ class AWSS3AdapterTests: XCTestCase { adapter.completeMultipartUpload(.init(bucket: "bucket", key: "key", uploadId: "uploadId", parts: [])) { result in XCTAssertEqual(self.awsS3.completeMultipartUploadCount, 1) guard case .failure(let error) = result, - case .unknown(let description, _) = error else { + case .unknown(let description, _) = error + else { XCTFail("Expected StorageError.unknown") return } @@ -306,7 +313,8 @@ class AWSS3AdapterTests: XCTestCase { adapter.completeMultipartUpload(.init(bucket: "bucket", key: "key", uploadId: "uploadId", parts: [])) { result in XCTAssertEqual(self.awsS3.completeMultipartUploadCount, 1) guard case .failure(let error) = result, - case .authError(let description, _, _) = error else { + case .authError(let description, _, _) = error + else { XCTFail("Expected StorageError.authError") return } @@ -316,7 +324,7 @@ class AWSS3AdapterTests: XCTestCase { await fulfillment(of: [completeMultipartUploadExpectation], timeout: 1) } - + /// Given: An AWSS3Adapter /// When: abortMultipartUpload is invoked and the s3 client returns a valid response /// Then: A .success result is returned @@ -343,7 +351,8 @@ class AWSS3AdapterTests: XCTestCase { adapter.abortMultipartUpload(.init(bucket: "bucket", key: "key", uploadId: "uploadId")) { result in XCTAssertEqual(self.awsS3.abortMultipartUploadCount, 1) guard case .failure(let error) = result, - case .keyNotFound(let key, _, _, _) = error else { + case .keyNotFound(let key, _, _, _) = error + else { XCTFail("Expected StorageError.keyNotFound") return } @@ -352,7 +361,7 @@ class AWSS3AdapterTests: XCTestCase { } await fulfillment(of: [abortExpectation], timeout: 1) } - + /// Given: An AWSS3Adapter /// When: getS3 is invoked /// Then: The underlying S3ClientProtocol instance is returned @@ -368,386 +377,386 @@ private class S3ClientMock: S3ClientProtocol { deleteObjectCount += 1 return try deleteObjectResult.get() } - + var listObjectsV2Count = 0 var listObjectsV2Result: Result = .success(.init()) func listObjectsV2(input: AWSS3.ListObjectsV2Input) async throws -> AWSS3.ListObjectsV2Output { listObjectsV2Count += 1 return try listObjectsV2Result.get() } - + var createMultipartUploadCount = 0 var createMultipartUploadResult: Result = .success(.init()) func createMultipartUpload(input: AWSS3.CreateMultipartUploadInput) async throws -> AWSS3.CreateMultipartUploadOutput { createMultipartUploadCount += 1 return try createMultipartUploadResult.get() } - + var listPartsCount = 0 var listPartsResult: Result = .success(.init()) func listParts(input: AWSS3.ListPartsInput) async throws -> AWSS3.ListPartsOutput { listPartsCount += 1 return try listPartsResult.get() } - + var completeMultipartUploadCount = 0 var completeMultipartUploadResult: Result = .success(.init()) func completeMultipartUpload(input: AWSS3.CompleteMultipartUploadInput) async throws -> AWSS3.CompleteMultipartUploadOutput { completeMultipartUploadCount += 1 return try completeMultipartUploadResult.get() } - + var abortMultipartUploadCount = 0 var abortMultipartUploadResult: Result = .success(.init()) func abortMultipartUpload(input: AWSS3.AbortMultipartUploadInput) async throws -> AWSS3.AbortMultipartUploadOutput { abortMultipartUploadCount += 1 return try abortMultipartUploadResult.get() } - + func copyObject(input: AWSS3.CopyObjectInput) async throws -> AWSS3.CopyObjectOutput { fatalError("Not Implemented") } - + func createBucket(input: AWSS3.CreateBucketInput) async throws -> AWSS3.CreateBucketOutput { fatalError("Not Implemented") } - + func deleteBucket(input: AWSS3.DeleteBucketInput) async throws -> AWSS3.DeleteBucketOutput { fatalError("Not Implemented") } - + func deleteBucketAnalyticsConfiguration(input: AWSS3.DeleteBucketAnalyticsConfigurationInput) async throws -> AWSS3.DeleteBucketAnalyticsConfigurationOutput { fatalError("Not Implemented") } - + func deleteBucketCors(input: AWSS3.DeleteBucketCorsInput) async throws -> AWSS3.DeleteBucketCorsOutput { fatalError("Not Implemented") } - + func deleteBucketEncryption(input: AWSS3.DeleteBucketEncryptionInput) async throws -> AWSS3.DeleteBucketEncryptionOutput { fatalError("Not Implemented") } - + func deleteBucketIntelligentTieringConfiguration(input: AWSS3.DeleteBucketIntelligentTieringConfigurationInput) async throws -> AWSS3.DeleteBucketIntelligentTieringConfigurationOutput { fatalError("Not Implemented") } - + func deleteBucketInventoryConfiguration(input: AWSS3.DeleteBucketInventoryConfigurationInput) async throws -> AWSS3.DeleteBucketInventoryConfigurationOutput { fatalError("Not Implemented") } - + func deleteBucketLifecycle(input: AWSS3.DeleteBucketLifecycleInput) async throws -> AWSS3.DeleteBucketLifecycleOutput { fatalError("Not Implemented") } - + func deleteBucketMetricsConfiguration(input: AWSS3.DeleteBucketMetricsConfigurationInput) async throws -> AWSS3.DeleteBucketMetricsConfigurationOutput { fatalError("Not Implemented") } - + func deleteBucketOwnershipControls(input: AWSS3.DeleteBucketOwnershipControlsInput) async throws -> AWSS3.DeleteBucketOwnershipControlsOutput { fatalError("Not Implemented") } - + func deleteBucketPolicy(input: AWSS3.DeleteBucketPolicyInput) async throws -> AWSS3.DeleteBucketPolicyOutput { fatalError("Not Implemented") } - + func deleteBucketReplication(input: AWSS3.DeleteBucketReplicationInput) async throws -> AWSS3.DeleteBucketReplicationOutput { fatalError("Not Implemented") } - + func deleteBucketTagging(input: AWSS3.DeleteBucketTaggingInput) async throws -> AWSS3.DeleteBucketTaggingOutput { fatalError("Not Implemented") } - + func deleteBucketWebsite(input: AWSS3.DeleteBucketWebsiteInput) async throws -> AWSS3.DeleteBucketWebsiteOutput { fatalError("Not Implemented") } - + func deleteObjects(input: AWSS3.DeleteObjectsInput) async throws -> AWSS3.DeleteObjectsOutput { fatalError("Not Implemented") } - + func deleteObjectTagging(input: AWSS3.DeleteObjectTaggingInput) async throws -> AWSS3.DeleteObjectTaggingOutput { fatalError("Not Implemented") } - + func deletePublicAccessBlock(input: AWSS3.DeletePublicAccessBlockInput) async throws -> AWSS3.DeletePublicAccessBlockOutput { fatalError("Not Implemented") } - + func getBucketAccelerateConfiguration(input: AWSS3.GetBucketAccelerateConfigurationInput) async throws -> AWSS3.GetBucketAccelerateConfigurationOutput { fatalError("Not Implemented") } - + func getBucketAcl(input: AWSS3.GetBucketAclInput) async throws -> AWSS3.GetBucketAclOutput { fatalError("Not Implemented") } - + func getBucketAnalyticsConfiguration(input: AWSS3.GetBucketAnalyticsConfigurationInput) async throws -> AWSS3.GetBucketAnalyticsConfigurationOutput { fatalError("Not Implemented") } - + func getBucketCors(input: AWSS3.GetBucketCorsInput) async throws -> AWSS3.GetBucketCorsOutput { fatalError("Not Implemented") } - + func getBucketEncryption(input: AWSS3.GetBucketEncryptionInput) async throws -> AWSS3.GetBucketEncryptionOutput { fatalError("Not Implemented") } - + func getBucketIntelligentTieringConfiguration(input: AWSS3.GetBucketIntelligentTieringConfigurationInput) async throws -> AWSS3.GetBucketIntelligentTieringConfigurationOutput { fatalError("Not Implemented") } - + func getBucketInventoryConfiguration(input: AWSS3.GetBucketInventoryConfigurationInput) async throws -> AWSS3.GetBucketInventoryConfigurationOutput { fatalError("Not Implemented") } - + func getBucketLifecycleConfiguration(input: AWSS3.GetBucketLifecycleConfigurationInput) async throws -> AWSS3.GetBucketLifecycleConfigurationOutput { fatalError("Not Implemented") } - + func getBucketLocation(input: AWSS3.GetBucketLocationInput) async throws -> AWSS3.GetBucketLocationOutput { fatalError("Not Implemented") } - + func getBucketLogging(input: AWSS3.GetBucketLoggingInput) async throws -> AWSS3.GetBucketLoggingOutput { fatalError("Not Implemented") } - + func getBucketMetricsConfiguration(input: AWSS3.GetBucketMetricsConfigurationInput) async throws -> AWSS3.GetBucketMetricsConfigurationOutput { fatalError("Not Implemented") } - + func getBucketNotificationConfiguration(input: AWSS3.GetBucketNotificationConfigurationInput) async throws -> AWSS3.GetBucketNotificationConfigurationOutput { fatalError("Not Implemented") } - + func getBucketOwnershipControls(input: AWSS3.GetBucketOwnershipControlsInput) async throws -> AWSS3.GetBucketOwnershipControlsOutput { fatalError("Not Implemented") } - + func getBucketPolicy(input: AWSS3.GetBucketPolicyInput) async throws -> AWSS3.GetBucketPolicyOutput { fatalError("Not Implemented") } - + func getBucketPolicyStatus(input: AWSS3.GetBucketPolicyStatusInput) async throws -> AWSS3.GetBucketPolicyStatusOutput { fatalError("Not Implemented") } - + func getBucketReplication(input: AWSS3.GetBucketReplicationInput) async throws -> AWSS3.GetBucketReplicationOutput { fatalError("Not Implemented") } - + func getBucketRequestPayment(input: AWSS3.GetBucketRequestPaymentInput) async throws -> AWSS3.GetBucketRequestPaymentOutput { fatalError("Not Implemented") } - + func getBucketTagging(input: AWSS3.GetBucketTaggingInput) async throws -> AWSS3.GetBucketTaggingOutput { fatalError("Not Implemented") } - + func getBucketVersioning(input: AWSS3.GetBucketVersioningInput) async throws -> AWSS3.GetBucketVersioningOutput { fatalError("Not Implemented") } - + func getBucketWebsite(input: AWSS3.GetBucketWebsiteInput) async throws -> AWSS3.GetBucketWebsiteOutput { fatalError("Not Implemented") } - + func getObject(input: AWSS3.GetObjectInput) async throws -> AWSS3.GetObjectOutput { fatalError("Not Implemented") } - + func getObjectAcl(input: AWSS3.GetObjectAclInput) async throws -> AWSS3.GetObjectAclOutput { fatalError("Not Implemented") } - + func getObjectAttributes(input: AWSS3.GetObjectAttributesInput) async throws -> AWSS3.GetObjectAttributesOutput { fatalError("Not Implemented") } - + func getObjectLegalHold(input: AWSS3.GetObjectLegalHoldInput) async throws -> AWSS3.GetObjectLegalHoldOutput { fatalError("Not Implemented") } - + func getObjectLockConfiguration(input: AWSS3.GetObjectLockConfigurationInput) async throws -> AWSS3.GetObjectLockConfigurationOutput { fatalError("Not Implemented") } - + func getObjectRetention(input: AWSS3.GetObjectRetentionInput) async throws -> AWSS3.GetObjectRetentionOutput { fatalError("Not Implemented") } - + func getObjectTagging(input: AWSS3.GetObjectTaggingInput) async throws -> AWSS3.GetObjectTaggingOutput { fatalError("Not Implemented") } - + func getObjectTorrent(input: AWSS3.GetObjectTorrentInput) async throws -> AWSS3.GetObjectTorrentOutput { fatalError("Not Implemented") } - + func getPublicAccessBlock(input: AWSS3.GetPublicAccessBlockInput) async throws -> AWSS3.GetPublicAccessBlockOutput { fatalError("Not Implemented") } - + func headBucket(input: AWSS3.HeadBucketInput) async throws -> AWSS3.HeadBucketOutput { fatalError("Not Implemented") } - + func headObject(input: AWSS3.HeadObjectInput) async throws -> AWSS3.HeadObjectOutput { fatalError("Not Implemented") } - + func listBucketAnalyticsConfigurations(input: AWSS3.ListBucketAnalyticsConfigurationsInput) async throws -> AWSS3.ListBucketAnalyticsConfigurationsOutput { fatalError("Not Implemented") } - + func listBucketIntelligentTieringConfigurations(input: AWSS3.ListBucketIntelligentTieringConfigurationsInput) async throws -> AWSS3.ListBucketIntelligentTieringConfigurationsOutput { fatalError("Not Implemented") } - + func listBucketInventoryConfigurations(input: AWSS3.ListBucketInventoryConfigurationsInput) async throws -> AWSS3.ListBucketInventoryConfigurationsOutput { fatalError("Not Implemented") } - + func listBucketMetricsConfigurations(input: AWSS3.ListBucketMetricsConfigurationsInput) async throws -> AWSS3.ListBucketMetricsConfigurationsOutput { fatalError("Not Implemented") } - + func listBuckets(input: AWSS3.ListBucketsInput) async throws -> AWSS3.ListBucketsOutput { fatalError("Not Implemented") } - + func listMultipartUploads(input: AWSS3.ListMultipartUploadsInput) async throws -> AWSS3.ListMultipartUploadsOutput { fatalError("Not Implemented") } - + func listObjects(input: AWSS3.ListObjectsInput) async throws -> AWSS3.ListObjectsOutput { fatalError("Not Implemented") } - + func listObjectVersions(input: AWSS3.ListObjectVersionsInput) async throws -> AWSS3.ListObjectVersionsOutput { fatalError("Not Implemented") } - + func putBucketAccelerateConfiguration(input: AWSS3.PutBucketAccelerateConfigurationInput) async throws -> AWSS3.PutBucketAccelerateConfigurationOutput { fatalError("Not Implemented") } - + func putBucketAcl(input: AWSS3.PutBucketAclInput) async throws -> AWSS3.PutBucketAclOutput { fatalError("Not Implemented") } - + func putBucketAnalyticsConfiguration(input: AWSS3.PutBucketAnalyticsConfigurationInput) async throws -> AWSS3.PutBucketAnalyticsConfigurationOutput { fatalError("Not Implemented") } - + func putBucketCors(input: AWSS3.PutBucketCorsInput) async throws -> AWSS3.PutBucketCorsOutput { fatalError("Not Implemented") } - + func putBucketEncryption(input: AWSS3.PutBucketEncryptionInput) async throws -> AWSS3.PutBucketEncryptionOutput { fatalError("Not Implemented") } - + func putBucketIntelligentTieringConfiguration(input: AWSS3.PutBucketIntelligentTieringConfigurationInput) async throws -> AWSS3.PutBucketIntelligentTieringConfigurationOutput { fatalError("Not Implemented") } - + func putBucketInventoryConfiguration(input: AWSS3.PutBucketInventoryConfigurationInput) async throws -> AWSS3.PutBucketInventoryConfigurationOutput { fatalError("Not Implemented") } - + func putBucketLifecycleConfiguration(input: AWSS3.PutBucketLifecycleConfigurationInput) async throws -> AWSS3.PutBucketLifecycleConfigurationOutput { fatalError("Not Implemented") } - + func putBucketLogging(input: AWSS3.PutBucketLoggingInput) async throws -> AWSS3.PutBucketLoggingOutput { fatalError("Not Implemented") } - + func putBucketMetricsConfiguration(input: AWSS3.PutBucketMetricsConfigurationInput) async throws -> AWSS3.PutBucketMetricsConfigurationOutput { fatalError("Not Implemented") } - + func putBucketNotificationConfiguration(input: AWSS3.PutBucketNotificationConfigurationInput) async throws -> AWSS3.PutBucketNotificationConfigurationOutput { fatalError("Not Implemented") } - + func putBucketOwnershipControls(input: AWSS3.PutBucketOwnershipControlsInput) async throws -> AWSS3.PutBucketOwnershipControlsOutput { fatalError("Not Implemented") } - + func putBucketPolicy(input: AWSS3.PutBucketPolicyInput) async throws -> AWSS3.PutBucketPolicyOutput { fatalError("Not Implemented") } - + func putBucketReplication(input: AWSS3.PutBucketReplicationInput) async throws -> AWSS3.PutBucketReplicationOutput { fatalError("Not Implemented") } - + func putBucketRequestPayment(input: AWSS3.PutBucketRequestPaymentInput) async throws -> AWSS3.PutBucketRequestPaymentOutput { fatalError("Not Implemented") } - + func putBucketTagging(input: AWSS3.PutBucketTaggingInput) async throws -> AWSS3.PutBucketTaggingOutput { fatalError("Not Implemented") } - + func putBucketVersioning(input: AWSS3.PutBucketVersioningInput) async throws -> AWSS3.PutBucketVersioningOutput { fatalError("Not Implemented") } - + func putBucketWebsite(input: AWSS3.PutBucketWebsiteInput) async throws -> AWSS3.PutBucketWebsiteOutput { fatalError("Not Implemented") } - + func putObject(input: AWSS3.PutObjectInput) async throws -> AWSS3.PutObjectOutput { fatalError("Not Implemented") } - + func putObjectAcl(input: AWSS3.PutObjectAclInput) async throws -> AWSS3.PutObjectAclOutput { fatalError("Not Implemented") } - + func putObjectLegalHold(input: AWSS3.PutObjectLegalHoldInput) async throws -> AWSS3.PutObjectLegalHoldOutput { fatalError("Not Implemented") } - + func putObjectLockConfiguration(input: AWSS3.PutObjectLockConfigurationInput) async throws -> AWSS3.PutObjectLockConfigurationOutput { fatalError("Not Implemented") } - + func putObjectRetention(input: AWSS3.PutObjectRetentionInput) async throws -> AWSS3.PutObjectRetentionOutput { fatalError("Not Implemented") } - + func putObjectTagging(input: AWSS3.PutObjectTaggingInput) async throws -> AWSS3.PutObjectTaggingOutput { fatalError("Not Implemented") } - + func putPublicAccessBlock(input: AWSS3.PutPublicAccessBlockInput) async throws -> AWSS3.PutPublicAccessBlockOutput { fatalError("Not Implemented") } - + func restoreObject(input: AWSS3.RestoreObjectInput) async throws -> AWSS3.RestoreObjectOutput { fatalError("Not Implemented") } - + func selectObjectContent(input: AWSS3.SelectObjectContentInput) async throws -> AWSS3.SelectObjectContentOutput { fatalError("Not Implemented") } - + func uploadPart(input: AWSS3.UploadPartInput) async throws -> AWSS3.UploadPartOutput { fatalError("Not Implemented") } - + func uploadPartCopy(input: AWSS3.UploadPartCopyInput) async throws -> AWSS3.UploadPartCopyOutput { fatalError("Not Implemented") } - + func writeGetObjectResponse(input: AWSS3.WriteGetObjectResponseInput) async throws -> AWSS3.WriteGetObjectResponseOutput { fatalError("Not Implemented") } diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3PreSignedURLBuilder.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3PreSignedURLBuilder.swift index 510e77bae0..2b506e8cc5 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3PreSignedURLBuilder.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3PreSignedURLBuilder.swift @@ -5,15 +5,15 @@ // SPDX-License-Identifier: Apache-2.0 // +import AWSS3 import Foundation @testable import AWSS3StoragePlugin -import AWSS3 final class MockAWSS3PreSignedURLBuilder { - + var interactions: [String] = [] - - var getPreSignedURLHandler: (String, AWSS3SigningOperation, Int64?) async throws -> URL = { (_,_,_) in + + var getPreSignedURLHandler: (String, AWSS3SigningOperation, Int64?) async throws -> URL = { _, _, _ in return URL(fileURLWithPath: NSTemporaryDirectory()) } } @@ -22,7 +22,7 @@ extension MockAWSS3PreSignedURLBuilder: AWSS3PreSignedURLBuilderBehavior { func getPreSignedURL( key: String, signingOperation: AWSS3SigningOperation, - metadata: [String : String]?, + metadata: [String: String]?, accelerate: Bool?, expires: Int64?) async throws -> URL { interactions.append("\(#function) \(key) \(signingOperation) \(String(describing: metadata)) \(String(describing: expires))") diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3StorageService.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3StorageService.swift index 9249596f04..da18b84e78 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3StorageService.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3StorageService.swift @@ -5,10 +5,10 @@ // SPDX-License-Identifier: Apache-2.0 // -import XCTest -import Foundation import Amplify import AWSS3 +import Foundation +import XCTest @testable import AWSS3StoragePlugin public class MockAWSS3StorageService: AWSS3StorageServiceBehavior { @@ -63,7 +63,7 @@ public class MockAWSS3StorageService: AWSS3StorageServiceBehavior { interactions.append(#function) } - + public func download(serviceKey: String, fileURL: URL?, accelerate: Bool?, onEvent: @escaping StorageServiceDownloadEventHandler) { interactions.append(#function) @@ -77,7 +77,7 @@ public class MockAWSS3StorageService: AWSS3StorageServiceBehavior { } } - var getPreSignedURLHandler: (String, AWSS3SigningOperation, Int) async throws -> URL = { (_, _, _) in + var getPreSignedURLHandler: (String, AWSS3SigningOperation, Int) async throws -> URL = { _, _, _ in return URL(fileURLWithPath: NSTemporaryDirectory()) } @@ -103,7 +103,8 @@ public class MockAWSS3StorageService: AWSS3StorageServiceBehavior { contentType: String?, metadata: [String: String]?, accelerate: Bool?, - onEvent: @escaping StorageServiceUploadEventHandler) { + onEvent: @escaping StorageServiceUploadEventHandler) + { interactions.append(#function) uploadCalled += 1 @@ -122,7 +123,8 @@ public class MockAWSS3StorageService: AWSS3StorageServiceBehavior { contentType: String?, metadata: [String: String]?, accelerate: Bool?, - onEvent: @escaping StorageServiceMultiPartUploadEventHandler) { + onEvent: @escaping StorageServiceMultiPartUploadEventHandler) + { interactions.append(#function) multiPartUploadCalled += 1 @@ -140,7 +142,7 @@ public class MockAWSS3StorageService: AWSS3StorageServiceBehavior { case unimplemented } - var listHandler: (String, StorageListRequest.Options) async throws -> StorageListResult = { (_, _) in + var listHandler: (String, StorageListRequest.Options) async throws -> StorageListResult = { _, _ in throw ListError.unimplemented } @@ -176,10 +178,11 @@ public class MockAWSS3StorageService: AWSS3StorageServiceBehavior { key: String, uploadSource: UploadSource, contentType: String?, - metadata: [String: String]?) { + metadata: [String: String]?) + { XCTAssertEqual(uploadCalled, 1) XCTAssertEqual(uploadServiceKey, serviceKey) - if let uploadUploadSource = uploadUploadSource { + if let uploadUploadSource { var uploadSourceEqual = false if case .data = uploadSource, case .data = uploadUploadSource { uploadSourceEqual = true @@ -200,11 +203,12 @@ public class MockAWSS3StorageService: AWSS3StorageServiceBehavior { key: String, uploadSource: UploadSource, contentType: String?, - metadata: [String: String]?) { + metadata: [String: String]?) + { XCTAssertEqual(multiPartUploadCalled, 1) XCTAssertEqual(multiPartUploadServiceKey, serviceKey) - if let multiPartUploadUploadSource = multiPartUploadUploadSource { + if let multiPartUploadUploadSource { var uploadSourceEqual = false if case .data = uploadSource, case .data = multiPartUploadUploadSource { uploadSourceEqual = true diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockOperationQueue.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockOperationQueue.swift index 54635fe020..de6fc30667 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockOperationQueue.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockOperationQueue.swift @@ -6,6 +6,7 @@ // import Foundation + public class MockOperationQueue: OperationQueue { public var size = 0 diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockS3Client.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockS3Client.swift index 5fb4f71451..821ff47e8d 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockS3Client.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockS3Client.swift @@ -29,7 +29,7 @@ final class MockS3Client { var headObjectHandler: (HeadObjectInput) async throws -> HeadObjectOutput = { _ in return HeadObjectOutput() } - var deleteObjectHandler: ((DeleteObjectInput) async throws -> DeleteObjectOutput)? = nil + var deleteObjectHandler: ((DeleteObjectInput) async throws -> DeleteObjectOutput)? } extension MockS3Client: S3ClientProtocol { @@ -113,7 +113,7 @@ extension MockS3Client: S3ClientProtocol { } func deleteObject(input: AWSS3.DeleteObjectInput) async throws -> AWSS3.DeleteObjectOutput { - guard let deleteObjectHandler = deleteObjectHandler else { + guard let deleteObjectHandler else { throw ClientError.missingImplementation } return try await deleteObjectHandler(input) diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageDownloadFileOperationTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageDownloadFileOperationTests.swift index ca5bfec81c..5ed450396f 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageDownloadFileOperationTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageDownloadFileOperationTests.swift @@ -8,9 +8,9 @@ import XCTest @testable import Amplify @testable import AmplifyTestCommon -@testable import AWSS3StoragePlugin @testable import AWSPluginsCore @testable import AWSPluginsTestCommon +@testable import AWSS3StoragePlugin import AWSS3 @@ -30,7 +30,8 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { storageConfiguration: testStorageConfiguration, storageService: mockStorageService, authService: mockAuthService, - progressListener: nil) { result in + progressListener: nil) + { result in switch result { case .failure(let error): guard case .validation = error else { @@ -58,7 +59,8 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { storageConfiguration: testStorageConfiguration, storageService: mockStorageService, authService: mockAuthService, - progressListener: nil) { result in + progressListener: nil) + { result in switch result { case .failure(let error): guard case .authError = error else { @@ -72,7 +74,7 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { } operation.start() - + await fulfillment(of: [failedInvoked], timeout: 1) XCTAssertTrue(operation.isFinished) } @@ -201,7 +203,8 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { storageConfiguration: testStorageConfiguration, storageService: mockStorageService, authService: mockAuthService, - progressListener: nil) { result in + progressListener: nil) + { result in switch result { case .failure(let error): guard case .validation = error else { @@ -233,7 +236,8 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { storageConfiguration: testStorageConfiguration, storageService: mockStorageService, authService: mockAuthService, - progressListener: nil) { result in + progressListener: nil) + { result in switch result { case .failure(let error): guard case .validation = error else { @@ -265,7 +269,8 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { storageConfiguration: testStorageConfiguration, storageService: mockStorageService, authService: mockAuthService, - progressListener: nil) { result in + progressListener: nil) + { result in switch result { case .failure(let error): guard case .validation = error else { @@ -297,7 +302,8 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { storageConfiguration: testStorageConfiguration, storageService: mockStorageService, authService: mockAuthService, - progressListener: nil) { result in + progressListener: nil) + { result in switch result { case .failure(let error): guard case .validation = error else { @@ -351,7 +357,7 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { await fulfillment(of: [completeInvoked, inProcessInvoked], timeout: 1) XCTAssertTrue(operation.isFinished) - mockStorageService.verifyDownload(serviceKey: "public/\(self.testKey)", fileURL: url) + mockStorageService.verifyDownload(serviceKey: "public/\(testKey)", fileURL: url) } /// Given: Storage Download File Operation @@ -391,7 +397,7 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { await fulfillment(of: [completeInvoked, inProcessInvoked], timeout: 1) XCTAssertTrue(operation.isFinished) - mockStorageService.verifyDownload(serviceKey: "public/\(testIdentityId)/\(self.testKey)", fileURL: url) + mockStorageService.verifyDownload(serviceKey: "public/\(testIdentityId)/\(testKey)", fileURL: url) } // TODO: missing unit tests for pause resume and cancel. do we create a mock of the StorageTaskReference? diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageGetDataOperationTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageGetDataOperationTests.swift index 3a687b774f..f3bdbebab1 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageGetDataOperationTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageGetDataOperationTests.swift @@ -8,9 +8,9 @@ import XCTest @testable import Amplify @testable import AmplifyTestCommon -@testable import AWSS3StoragePlugin @testable import AWSPluginsCore @testable import AWSPluginsTestCommon +@testable import AWSS3StoragePlugin import AWSS3 @@ -23,7 +23,8 @@ class AWSS3StorageDownloadDataOperationTests: AWSS3StorageOperationTestBase { storageConfiguration: testStorageConfiguration, storageService: mockStorageService, authService: mockAuthService, - progressListener: nil) { event in + progressListener: nil) + { event in switch event { case .failure(let error): guard case .validation = error else { @@ -245,7 +246,8 @@ class AWSS3StorageDownloadDataOperationTests: AWSS3StorageOperationTestBase { storageConfiguration: testStorageConfiguration, storageService: mockStorageService, authService: mockAuthService, - progressListener: nil) { event in + progressListener: nil) + { event in switch event { case .failure(let error): guard case .validation = error else { @@ -274,7 +276,8 @@ class AWSS3StorageDownloadDataOperationTests: AWSS3StorageOperationTestBase { storageConfiguration: testStorageConfiguration, storageService: mockStorageService, authService: mockAuthService, - progressListener: nil) { event in + progressListener: nil) + { event in switch event { case .failure(let error): guard case .validation = error else { @@ -326,7 +329,7 @@ class AWSS3StorageDownloadDataOperationTests: AWSS3StorageOperationTestBase { await fulfillment(of: [inProcessInvoked, completeInvoked], timeout: 1) XCTAssertTrue(operation.isFinished) - mockStorageService.verifyDownload(serviceKey: "public/\(self.testKey)", fileURL: nil) + mockStorageService.verifyDownload(serviceKey: "public/\(testKey)", fileURL: nil) } /// Given: Storage Download Data Operation @@ -364,7 +367,7 @@ class AWSS3StorageDownloadDataOperationTests: AWSS3StorageOperationTestBase { await fulfillment(of: [inProcessInvoked, completeInvoked], timeout: 1) XCTAssertTrue(operation.isFinished) - mockStorageService.verifyDownload(serviceKey: "public/\(testIdentityId)/\(self.testKey)", fileURL: nil) + mockStorageService.verifyDownload(serviceKey: "public/\(testIdentityId)/\(testKey)", fileURL: nil) } // TODO: missing unit tets for pause resume and cancel. do we create a mock of the StorageTaskReference? diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageOperationTestBase.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageOperationTestBase.swift index c4710bfcf4..7a178ece11 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageOperationTestBase.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageOperationTestBase.swift @@ -5,19 +5,19 @@ // SPDX-License-Identifier: Apache-2.0 // +import AWSS3 import XCTest @testable import Amplify @testable import AmplifyTestCommon -@testable import AWSS3StoragePlugin @testable import AWSPluginsTestCommon -import AWSS3 +@testable import AWSS3StoragePlugin class AWSS3StorageOperationTestBase: XCTestCase { - + var hubPlugin: MockHubCategoryPlugin! var mockStorageService: MockAWSS3StorageService! var mockAuthService: MockAWSAuthService! - + let testKey = "TestKey" let testTargetIdentityId = "TestTargetIdentityId" let testIdentityId = "TestIdentityId" @@ -27,10 +27,10 @@ class AWSS3StorageOperationTestBase: XCTestCase { let testExpires = 10 let testURL = URL(fileURLWithPath: "path") let testStorageConfiguration = AWSS3StoragePluginConfiguration() - + override func setUp() { let mockAmplifyConfig = AmplifyConfiguration() - + do { try Amplify.configure(mockAmplifyConfig) } catch let error as AmplifyError { @@ -38,11 +38,11 @@ class AWSS3StorageOperationTestBase: XCTestCase { } catch { XCTFail("setup failed with unknown error") } - + mockStorageService = MockAWSS3StorageService() mockAuthService = MockAWSAuthService() } - + override func tearDown() async throws { await Amplify.reset() } diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StoragePutDataOperationTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StoragePutDataOperationTests.swift index 44eb8e29f1..92bb1234ea 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StoragePutDataOperationTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StoragePutDataOperationTests.swift @@ -8,9 +8,9 @@ import XCTest @testable import Amplify @testable import AmplifyTestCommon -@testable import AWSS3StoragePlugin @testable import AWSPluginsCore @testable import AWSPluginsTestCommon +@testable import AWSS3StoragePlugin import AWSS3 @@ -25,7 +25,8 @@ class AWSS3StorageUploadDataOperationTests: AWSS3StorageOperationTestBase { storageConfiguration: testStorageConfiguration, storageService: mockStorageService, authService: mockAuthService, - progressListener: nil) { result in + progressListener: nil) + { result in switch result { case .failure(let error): guard case .validation = error else { @@ -55,7 +56,8 @@ class AWSS3StorageUploadDataOperationTests: AWSS3StorageOperationTestBase { storageConfiguration: testStorageConfiguration, storageService: mockStorageService, authService: mockAuthService, - progressListener: nil) { result in + progressListener: nil) + { result in switch result { case .failure(let error): guard case .authError = error else { @@ -385,7 +387,7 @@ class AWSS3StorageUploadDataOperationTests: AWSS3StorageOperationTestBase { await fulfillment(of: [completeInvoked, inProcessInvoked], timeout: 1) XCTAssertTrue(operation.isFinished) XCTAssertEqual(mockStorageService.uploadCalled, 1) - mockStorageService.verifyUpload(serviceKey: "public/\(self.testKey)", + mockStorageService.verifyUpload(serviceKey: "public/\(testKey)", key: testKey, uploadSource: expectedUploadSource, contentType: testContentType, diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageRemoveOperationTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageRemoveOperationTests.swift index c36e1b0710..2e24943c00 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageRemoveOperationTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageRemoveOperationTests.swift @@ -9,8 +9,8 @@ import XCTest @testable import Amplify @testable import AmplifyTestCommon @testable import AWSPluginsCore -@testable import AWSS3StoragePlugin @testable import AWSPluginsTestCommon +@testable import AWSS3StoragePlugin class AWSS3StorageRemoveOperationTests: AWSS3StorageOperationTestBase { @@ -22,7 +22,8 @@ class AWSS3StorageRemoveOperationTests: AWSS3StorageOperationTestBase { let operation = AWSS3StorageRemoveOperation(request, storageConfiguration: testStorageConfiguration, storageService: mockStorageService, - authService: mockAuthService) { result in + authService: mockAuthService) + { result in switch result { case .failure(let error): guard case .validation = error else { @@ -50,7 +51,8 @@ class AWSS3StorageRemoveOperationTests: AWSS3StorageOperationTestBase { let operation = AWSS3StorageRemoveOperation(request, storageConfiguration: testStorageConfiguration, storageService: mockStorageService, - authService: mockAuthService) { result in + authService: mockAuthService) + { result in switch result { case .failure(let error): guard case .authError = error else { @@ -78,7 +80,8 @@ class AWSS3StorageRemoveOperationTests: AWSS3StorageOperationTestBase { let operation = AWSS3StorageRemoveOperation(request, storageConfiguration: testStorageConfiguration, storageService: mockStorageService, - authService: mockAuthService) { result in + authService: mockAuthService) + { result in switch result { case .success: completeInvoked.fulfill() @@ -104,7 +107,8 @@ class AWSS3StorageRemoveOperationTests: AWSS3StorageOperationTestBase { let operation = AWSS3StorageRemoveOperation(request, storageConfiguration: testStorageConfiguration, storageService: mockStorageService, - authService: mockAuthService) { result in + authService: mockAuthService) + { result in switch result { case .failure: failedInvoked.fulfill() @@ -131,7 +135,8 @@ class AWSS3StorageRemoveOperationTests: AWSS3StorageOperationTestBase { let operation = AWSS3StorageRemoveOperation(request, storageConfiguration: testStorageConfiguration, storageService: mockStorageService, - authService: mockAuthService) { result in + authService: mockAuthService) + { result in switch result { case .success: completeInvoked.fulfill() diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageUploadFileOperationTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageUploadFileOperationTests.swift index 971ad72d80..adb545b76c 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageUploadFileOperationTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageUploadFileOperationTests.swift @@ -8,9 +8,9 @@ import XCTest @testable import Amplify @testable import AmplifyTestCommon -@testable import AWSS3StoragePlugin @testable import AWSPluginsCore @testable import AWSPluginsTestCommon +@testable import AWSS3StoragePlugin import AWSS3 @@ -25,7 +25,8 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { storageConfiguration: testStorageConfiguration, storageService: mockStorageService, authService: mockAuthService, - progressListener: nil) { result in + progressListener: nil) + { result in switch result { case .failure(let error): guard case .validation = error else { @@ -57,7 +58,8 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { storageConfiguration: testStorageConfiguration, storageService: mockStorageService, authService: mockAuthService, - progressListener: nil) { result in + progressListener: nil) + { result in switch result { case .failure(let error): guard case .authError = error else { @@ -86,7 +88,8 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { storageConfiguration: testStorageConfiguration, storageService: mockStorageService, authService: mockAuthService, - progressListener: nil) { event in + progressListener: nil) + { event in switch event { case .failure(let error): guard case .localFileNotFound = error else { @@ -283,7 +286,8 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { storageConfiguration: testStorageConfiguration, storageService: mockStorageService, authService: mockAuthService, - progressListener: nil) { result in + progressListener: nil) + { result in switch result { case .failure(let error): guard case .validation = error else { @@ -329,7 +333,8 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { storageConfiguration: testStorageConfiguration, storageService: mockStorageService, authService: mockAuthService, - progressListener: nil) { result in + progressListener: nil) + { result in switch result { case .failure(let error): guard case .validation = error else { @@ -375,7 +380,8 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { storageConfiguration: testStorageConfiguration, storageService: mockStorageService, authService: mockAuthService, - progressListener: nil) { result in + progressListener: nil) + { result in switch result { case .failure(let error): guard case .validation = error else { @@ -421,7 +427,8 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { storageConfiguration: testStorageConfiguration, storageService: mockStorageService, authService: mockAuthService, - progressListener: nil) { result in + progressListener: nil) + { result in switch result { case .failure(let error): guard case .validation = error else { diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageUploadFileOperationTests2.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageUploadFileOperationTests2.swift index b78a527e21..d282616c0c 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageUploadFileOperationTests2.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageUploadFileOperationTests2.swift @@ -1,4 +1,4 @@ -//// +// // Copyright Amazon.com Inc. or its affiliates. // All Rights Reserved. // @@ -7,18 +7,18 @@ @testable import Amplify @testable import AmplifyTestCommon +@testable import AWSPluginsCore @testable import AWSPluginsTestCommon @testable import AWSS3StoragePlugin -@testable import AWSPluginsCore import AWSS3 import XCTest final class AWSS3StorageUploadFileOperationTests2: AWSS3StorageOperationTestBase { - + override func setUp() { super.setUp() - self.continueAfterFailure = false + continueAfterFailure = false } /// - Given: A file with no read permissions from the user diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageGetURLRequestTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageGetURLRequestTests.swift index 7359b4c020..5d05ebb82c 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageGetURLRequestTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageGetURLRequestTests.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import XCTest import Amplify +import XCTest @testable import AWSS3StoragePlugin class StorageGetURLRequestTests: XCTestCase { diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageListRequestTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageListRequestTests.swift index 3def6e2090..09d0807ab3 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageListRequestTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageListRequestTests.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import XCTest import Amplify +import XCTest @testable import AWSS3StoragePlugin class StorageListRequestTests: XCTestCase { @@ -31,14 +31,14 @@ class StorageListRequestTests: XCTestCase { /// - When: The containing request is validated /// - Then: No errors are raised func testValidateWithPaginationOptions() { - let pageSizeOnly = StorageListRequest(options: StorageListRequest.Options(pageSize: UInt.random(in: 1..<1_000))) + let pageSizeOnly = StorageListRequest(options: StorageListRequest.Options(pageSize: UInt.random(in: 1 ..< 1_000))) XCTAssertNil(pageSizeOnly.validate()) let nextTokenOnly = StorageListRequest(options: StorageListRequest.Options(nextToken: UUID().uuidString)) XCTAssertNil(nextTokenOnly.validate()) let pageSizeAndNextToken = StorageListRequest(options: StorageListRequest.Options( - pageSize: UInt.random(in: 1..<1_000), + pageSize: UInt.random(in: 1 ..< 1_000), nextToken: UUID().uuidString )) XCTAssertNil(pageSizeAndNextToken.validate()) diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageRemoveRequestTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageRemoveRequestTests.swift index 76d7cfbff9..ae1756745a 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageRemoveRequestTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageRemoveRequestTests.swift @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -import XCTest import Amplify +import XCTest @testable import AWSS3StoragePlugin class AWSS3StorageRemoveRequestTests: XCTestCase { diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3MultipartUploadRequestCompletedPartTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3MultipartUploadRequestCompletedPartTests.swift index 3e01dcdc1b..23a07d9ae9 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3MultipartUploadRequestCompletedPartTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3MultipartUploadRequestCompletedPartTests.swift @@ -7,8 +7,8 @@ import XCTest -@testable import AWSS3StoragePlugin @testable import Amplify +@testable import AWSS3StoragePlugin class AWSS3MultipartUploadRequestCompletedPartTests: XCTestCase { diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceGetPreSignedURLBehaviorTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceGetPreSignedURLBehaviorTests.swift index fc65aa9322..1b4cb4fbf9 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceGetPreSignedURLBehaviorTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceGetPreSignedURLBehaviorTests.swift @@ -5,9 +5,9 @@ // SPDX-License-Identifier: Apache-2.0 // -@testable import AWSS3StoragePlugin -@testable import AWSPluginsTestCommon @testable import AmplifyTestCommon +@testable import AWSPluginsTestCommon +@testable import AWSS3StoragePlugin import Amplify import AWSS3 @@ -16,7 +16,7 @@ import XCTest // swiftlint:disable:next type_name class AWSS3StorageServiceGetPreSignedURLBehaviorTests: XCTestCase { - + var systemUnderTest: AWSS3StorageService! var authService: MockAWSAuthService! var database: MockStorageTransferDatabase! @@ -27,7 +27,7 @@ class AWSS3StorageServiceGetPreSignedURLBehaviorTests: XCTestCase { var serviceKey: String! var presignedURL: URL! var expires: Int! - + override func setUpWithError() throws { authService = MockAWSAuthService() database = MockStorageTransferDatabase() @@ -44,13 +44,13 @@ class AWSS3StorageServiceGetPreSignedURLBehaviorTests: XCTestCase { storageTransferDatabase: database) systemUnderTest.preSignedURLBuilder = builder systemUnderTest.client = client - + let url = try XCTUnwrap(presignedURL) - builder.getPreSignedURLHandler = { (_,_,_) in + builder.getPreSignedURLHandler = { _, _, _ in return url } } - + override func tearDownWithError() throws { authService = nil builder = nil @@ -61,7 +61,7 @@ class AWSS3StorageServiceGetPreSignedURLBehaviorTests: XCTestCase { expires = nil systemUnderTest = nil } - + /// - Given: A storage service configured to use a AWSS3PreSignedURLBuilder /// - When: A presigned URL is requested for a **AWSS3SigningOperation.getObject** operation /// - Then: A valid URL is returned @@ -76,7 +76,7 @@ class AWSS3StorageServiceGetPreSignedURLBehaviorTests: XCTestCase { "getPreSignedURL(key:signingOperation:metadata:accelerate:expires:) \(serviceKey ?? "") \(AWSS3SigningOperation.getObject) nil \(String(describing: expires))" ]) } - + /// - Given: A storage service configured to use a AWSS3PreSignedURLBuilder /// - When: A presigned URL is requested for a **AWSS3SigningOperation.putObject** operation /// - Then: A valid URL is returned @@ -91,7 +91,7 @@ class AWSS3StorageServiceGetPreSignedURLBehaviorTests: XCTestCase { "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 @@ -107,7 +107,7 @@ class AWSS3StorageServiceGetPreSignedURLBehaviorTests: XCTestCase { "getPreSignedURL(key:signingOperation:metadata:accelerate:expires:) \(serviceKey ?? "") \(AWSS3SigningOperation.putObject) \(String(describing: metadata)) \(String(describing: expires))" ]) } - + /// - Given: A storage service configured to use a AWSS3PreSignedURLBuilder /// - When: A presigned URL is requested for a **AWSS3SigningOperation.uploadPart** operation /// - Then: A valid URL is returned diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceListTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceListTests.swift index 5a4f5dc878..65475f9bc8 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceListTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceListTests.swift @@ -5,12 +5,12 @@ // SPDX-License-Identifier: Apache-2.0 // +import Amplify +import AWSClientRuntime import AWSClientRuntime import AWSS3 -import Amplify import ClientRuntime import XCTest -import AWSClientRuntime @testable import AWSPluginsTestCommon @testable import AWSS3StoragePlugin @@ -59,14 +59,14 @@ final class AWSS3StorageServiceListTests: XCTestCase { inputs.append(input) return .init(contents: []) } - let pageSize: UInt = UInt.random(in: 1..<1_000) + let pageSize = UInt.random(in: 1 ..< 1_000) let nextToken = UUID().uuidString let options = StorageListRequest.Options(pageSize: pageSize, nextToken: nextToken) let listing = try await systemUnderTest.list(prefix: prefix, options: options) - XCTAssertEqual(listing.items.map { $0.key }, []) - XCTAssertEqual(inputs.map { $0.continuationToken }, [nextToken]) - XCTAssertEqual(inputs.map { $0.maxKeys }, [Int(pageSize)]) + XCTAssertEqual(listing.items.map(\.key), []) + XCTAssertEqual(inputs.map(\.continuationToken), [nextToken]) + XCTAssertEqual(inputs.map(\.maxKeys), [Int(pageSize)]) } /// Given: A empty S3 bucket (client) @@ -78,7 +78,7 @@ final class AWSS3StorageServiceListTests: XCTestCase { } let options = StorageListRequest.Options(accessLevel: .protected, targetIdentityId: targetIdentityId, path: path) let listing = try await systemUnderTest.list(prefix: prefix, options: options) - XCTAssertEqual(listing.items.map { $0.key }, []) + XCTAssertEqual(listing.items.map(\.key), []) } /// Given: A empty S3 bucket (client) @@ -90,7 +90,7 @@ final class AWSS3StorageServiceListTests: XCTestCase { } let options = StorageListRequest.Options(accessLevel: .protected, targetIdentityId: targetIdentityId, path: nil) let listing = try await systemUnderTest.list(prefix: prefix, options: options) - XCTAssertEqual(listing.items.map { $0.key }, []) + XCTAssertEqual(listing.items.map(\.key), []) } /// Given: A misconfigured or S3 bucket with restricted permissions diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceTests.swift index a829dce219..80c5640039 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceTests.swift @@ -5,12 +5,12 @@ // SPDX-License-Identifier: Apache-2.0 // +import AWSS3 +import ClientRuntime +import XCTest @testable import Amplify @testable import AWSPluginsTestCommon @testable import AWSS3StoragePlugin -import ClientRuntime -import AWSS3 -import XCTest class AWSS3StorageServiceTests: XCTestCase { private var service: AWSS3StorageService! @@ -18,7 +18,7 @@ class AWSS3StorageServiceTests: XCTestCase { private var database: StorageTransferDatabaseMock! private var task: StorageTransferTask! private var fileSystem: MockFileSystem! - + override func setUp() async throws { authService = MockAWSAuthService() database = StorageTransferDatabaseMock() @@ -35,7 +35,7 @@ class AWSS3StorageServiceTests: XCTestCase { multipartUploads: [ .created( uploadId: "uploadId", - uploadFile:UploadFile( + uploadFile: UploadFile( fileURL: FileSystem.default.createTemporaryFileURL(), temporaryFileCreated: true, size: UInt64(Bytes.megabytes(12).bytes) @@ -54,7 +54,7 @@ class AWSS3StorageServiceTests: XCTestCase { logger: MockLogger() ) } - + override func tearDown() { authService = nil service = nil @@ -62,7 +62,7 @@ class AWSS3StorageServiceTests: XCTestCase { task = nil fileSystem = nil } - + /// Given: An AWSS3StorageService /// When: it's deallocated /// Then: StorageBackgroundEventsRegistry.identifier should be set to nil @@ -71,7 +71,7 @@ class AWSS3StorageServiceTests: XCTestCase { service = nil XCTAssertNil(StorageBackgroundEventsRegistry.identifier) } - + /// Given: An AWSS3StorageService /// When: reset is invoked /// Then: Its members should be set to nil @@ -84,12 +84,12 @@ class AWSS3StorageServiceTests: XCTestCase { XCTAssertTrue(service.tasks.isEmpty) XCTAssertTrue(service.multipartUploadSessions.isEmpty) } - + /// Given: An AWSS3StorageService /// When: attachEventHandlers is invoked and a .completed event is sent /// Then: A .completed event is dispatched to the event handler func testAttachEventHandlers() async { - let expectation = self.expectation(description: "Attach Event Handlers") + let expectation = expectation(description: "Attach Event Handlers") service.attachEventHandlers( onUpload: { event in guard case .completed(_) = event else { @@ -103,7 +103,7 @@ class AWSS3StorageServiceTests: XCTestCase { database.onUploadHandler?(.completed(())) await fulfillment(of: [expectation], timeout: 1) } - + /// Given: An AWSS3StorageService /// When: register is invoked with a task /// Then: The task should be added to its map of tasks @@ -112,7 +112,7 @@ class AWSS3StorageServiceTests: XCTestCase { XCTAssertEqual(service.tasks.count, 1) XCTAssertNotNil(service.tasks[1]) } - + /// Given: An AWSS3StorageService with a task in its map of tasks /// When: unregister is invoked with said task /// Then: The task should be removed from the map of tasks @@ -124,7 +124,7 @@ class AWSS3StorageServiceTests: XCTestCase { XCTAssertTrue(service.tasks.isEmpty) XCTAssertNil(service.tasks[1]) } - + /// Given: An AWSS3StorageService with some tasks in its map of tasks /// When: unregister is invoked with an identifier that is known to be mapped to a task. /// Then: The task corresponding to the given identifier should be removed from the map of tasks @@ -138,7 +138,7 @@ class AWSS3StorageServiceTests: XCTestCase { XCTAssertNotNil(service.tasks[2]) XCTAssertNil(service.tasks[1]) } - + /// Given: An AWSS3StorageService with a task in its map of tasks /// When: findTask is invoked with the identifier known to be mapped to a task /// Then: The task corresponding to the given identifier is returned @@ -148,7 +148,7 @@ class AWSS3StorageServiceTests: XCTestCase { ] XCTAssertNotNil(service.findTask(taskIdentifier: 1)) } - + /// Given: An AWSS3StorageService /// When: validateParameters is invoked with an empty bucket parameter /// Then: A .validation error is thrown @@ -166,7 +166,7 @@ class AWSS3StorageServiceTests: XCTestCase { XCTAssertEqual(recovery, "Please specify a bucket name or configure the bucket property.") } } - + /// Given: An AWSS3StorageService /// When: validateParameters is invoked with an empty key parameter /// Then: A .validation error is thrown @@ -184,7 +184,7 @@ class AWSS3StorageServiceTests: XCTestCase { XCTAssertEqual(recovery, "Please specify a key.") } } - + /// Given: An AWSS3StorageService /// When: validateParameters is invoked with valid bucket and key parameters /// Then: No error is thrown @@ -195,7 +195,7 @@ class AWSS3StorageServiceTests: XCTestCase { XCTFail("Expected success, got \(error)") } } - + /// Given: An AWSS3StorageService /// When: createTransferTask is invoked with valid parameters /// Then: A task is returned with attributes matching the ones provided @@ -217,17 +217,18 @@ class AWSS3StorageServiceTests: XCTestCase { return } } - + /// Given: An AWSS3StorageService with a non-completed download task /// When: completeDownload is invoked for the identifier matching the task /// Then: The task is marked as completed and a .completed event is dispatched func testCompleteDownload_shouldReturnData() async { - let expectation = self.expectation(description: "Complete Download") - + let expectation = expectation(description: "Complete Download") + let downloadTask = StorageTransferTask( transferType: .download(onEvent: { event in guard case .completed(let data) = event, - let data = data else { + let data + else { XCTFail("Expected .completed event with data") return } @@ -249,14 +250,14 @@ class AWSS3StorageServiceTests: XCTestCase { XCTAssertEqual(downloadTask.status, .completed) await fulfillment(of: [expectation], timeout: 1) } - + /// Given: An AWSS3StorageService with a non-completed download task that sets a location /// When: completeDownload is invoked for the identifier matching the task /// Then: The task is marked as completed and the file is moved to the expected location func testCompleteDownload_withLocation_shouldMoveFileToLocation() { let temporaryDirectory = FileManager.default.temporaryDirectory let location = temporaryDirectory.appendingPathComponent("\(UUID().uuidString)-newFile.txt") - + let downloadTask = StorageTransferTask( transferType: .download(onEvent: { _ in }), bucket: "bucket", @@ -276,14 +277,14 @@ class AWSS3StorageServiceTests: XCTestCase { XCTAssertFalse(FileManager.default.fileExists(atPath: sourceUrl.path)) XCTAssertEqual(downloadTask.status, .completed) } - + /// Given: An AWSS3StorageService with a non-completed download task that sets a location /// When: completeDownload is invoked for the identifier matching the task, but the file system fails to move the file /// Then: The task is marked as error and the file is not moved to the expected location func testCompleteDownload_withLocation_andError_shouldFailTask() { let temporaryDirectory = FileManager.default.temporaryDirectory let location = temporaryDirectory.appendingPathComponent("\(UUID().uuidString)-newFile.txt") - + let downloadTask = StorageTransferTask( transferType: .download(onEvent: { _ in }), bucket: "bucket", @@ -304,14 +305,14 @@ class AWSS3StorageServiceTests: XCTestCase { XCTAssertTrue(FileManager.default.fileExists(atPath: sourceUrl.path)) XCTAssertEqual(downloadTask.status, .error) } - + /// Given: An AWSS3StorageService with a non-completed upload task that sets a location /// When: completeDownload is invoked for the identifier matching the task /// Then: The task status is not updated and an .upload event is not dispatched func testCompleteDownload_withNoDownload_shouldDoNothing() async { - let expectation = self.expectation(description: "Complete Download") + let expectation = expectation(description: "Complete Download") expectation.isInverted = true - + let uploadTask = StorageTransferTask( transferType: .upload(onEvent: { event in XCTFail("Should not report event") @@ -333,13 +334,13 @@ class AWSS3StorageServiceTests: XCTestCase { XCTAssertNotEqual(uploadTask.status, .error) await fulfillment(of: [expectation], timeout: 1) } - + /// Given: An AWSS3StorageService that cannot create a pre signed url /// When: upload is invoked /// Then: A .failed event is dispatched with an .unknown error func testUpload_withoutPreSignedURL_shouldSendFailEvent() async { let data = Data("someData".utf8) - let expectation = self.expectation(description: "Upload") + let expectation = expectation(description: "Upload") service.upload( serviceKey: "key", uploadSource: .data(data), @@ -348,7 +349,8 @@ class AWSS3StorageServiceTests: XCTestCase { accelerate: true, onEvent: { event in guard case .failed(let error) = event, - case .unknown(let description, _) = error else { + case .unknown(let description, _) = error + else { XCTFail("Expected .failed event with .unknown error, got \(event)") return } @@ -356,16 +358,16 @@ class AWSS3StorageServiceTests: XCTestCase { expectation.fulfill() } ) - + await fulfillment(of: [expectation], timeout: 1) } - + /// Given: An AWSS3StorageService that can create a pre signed url /// When: upload is invoked /// Then: An .initiated event is dispatched func testUpload_withPreSignedURL_shouldSendInitiatedEvent() async { let data = Data("someData".utf8) - let expectation = self.expectation(description: "Upload") + let expectation = expectation(description: "Upload") service.preSignedURLBuilder = MockAWSS3PreSignedURLBuilder() service.upload( serviceKey: "key", @@ -379,7 +381,7 @@ class AWSS3StorageServiceTests: XCTestCase { } } ) - + await fulfillment(of: [expectation], timeout: 1) } } @@ -397,35 +399,36 @@ private class MockHttpClientEngineProxy: HttpClientEngineProxy { } private class StorageTransferDatabaseMock: StorageTransferDatabase { - + func prepareForBackground(completion: (() -> Void)?) { completion?() } - + func insertTransferRequest(task: StorageTransferTask) { - + } - + func updateTransferRequest(task: StorageTransferTask) { - + } - + func removeTransferRequest(task: StorageTransferTask) { - + } - + func defaultTransferType(persistableTransferTask: StoragePersistableTransferTask) -> StorageTransferType? { return nil } - + var recoverCount = 0 var recoverResult: Result = .failure(StorageError.unknown("Result not set", nil)) func recover(urlSession: StorageURLSession, - completionHandler: @escaping (Result) -> Void) { + completionHandler: @escaping (Result) -> Void) + { recoverCount += 1 completionHandler(recoverResult) } - + var attachEventHandlersCount = 0 var onUploadHandler: AWSS3StorageServiceBehavior.StorageServiceUploadEventHandler? = nil var onDownloadHandler: AWSS3StorageServiceBehavior.StorageServiceDownloadEventHandler? = nil @@ -445,7 +448,7 @@ private class StorageTransferDatabaseMock: StorageTransferDatabase { private class MockFileSystem: FileSystem { var moveFileError: Error? = nil override func moveFile(from sourceFileURL: URL, to destinationURL: URL) throws { - if let moveFileError = moveFileError { + if let moveFileError { throw moveFileError } try super.moveFile(from: sourceFileURL, to: destinationURL) diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/AttemptTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/AttemptTests.swift index 5dd37e47ed..a1e9c62401 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/AttemptTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/AttemptTests.swift @@ -8,8 +8,8 @@ import XCTest import AmplifyTestCommon -@testable import AWSS3StoragePlugin @testable import Amplify +@testable import AWSS3StoragePlugin class AttemptTests: XCTestCase { let goodNumber = 42 @@ -17,7 +17,7 @@ class AttemptTests: XCTestCase { func testAttemptWithReturnSomething() throws { var error: Error? - let result = attempt(try work1(number: goodNumber)) { + let result = try attempt(work1(number: goodNumber)) { error = $0 } XCTAssertNil(error) @@ -26,7 +26,7 @@ class AttemptTests: XCTestCase { func testAttemptWithReturnNothing() throws { var error: Error? - let result = attempt(try work1(number: badNumber)) { + let result = try attempt(work1(number: badNumber)) { error = $0 } XCTAssertNotNil(error) @@ -34,27 +34,27 @@ class AttemptTests: XCTestCase { } func testAttemptNoThrow() throws { - let result = attempt(try work2(number: goodNumber)) { + let result = try attempt(work2(number: goodNumber)) { XCTFail("Error: \($0)") } XCTAssertEqual(true, result) } func testAttemptThrow() throws { - let result = attempt(try work2(number: badNumber)) { + let result = try attempt(work2(number: badNumber)) { print("Error: \($0)") } XCTAssertEqual(false, result) } func testAttemptNoFailClosureNoThrow() throws { - let result = attempt(try work1(number: badNumber), + let result = try attempt(work1(number: badNumber), fail: { error in }) XCTAssertNil(result) } func testAttemptNoFailClosureThrow() throws { - let result = attempt(try work2(number: badNumber), + let result = try attempt(work2(number: badNumber), fail: { error in }) XCTAssertEqual(false, result) } diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/BytesTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/BytesTests.swift index 1f08407cd3..4151bf40b3 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/BytesTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/BytesTests.swift @@ -7,8 +7,8 @@ import XCTest -@testable import AWSS3StoragePlugin @testable import Amplify +@testable import AWSS3StoragePlugin class BytesTests: XCTestCase { diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/DefaultStorageMultipartUploadClientTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/DefaultStorageMultipartUploadClientTests.swift index e1d31fcbea..ad7816367a 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/DefaultStorageMultipartUploadClientTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/DefaultStorageMultipartUploadClientTests.swift @@ -5,11 +5,11 @@ // SPDX-License-Identifier: Apache-2.0 // +import AWSS3 +import XCTest @testable import Amplify @testable import func AmplifyTestCommon.XCTAssertThrowFatalError @testable import AWSS3StoragePlugin -import AWSS3 -import XCTest class DefaultStorageMultipartUploadClientTests: XCTestCase { private var defaultClient: DefaultStorageMultipartUploadClient! @@ -155,7 +155,7 @@ class DefaultStorageMultipartUploadClientTests: XCTestCase { uploadFile: .init( fileURL: FileManager.default.temporaryDirectory.appendingPathComponent("noFile.txt"), temporaryFileCreated: false, - size: 1024), + size: 1_024), partSize: .default, parts: [ .pending(bytes: 10), @@ -180,7 +180,7 @@ class DefaultStorageMultipartUploadClientTests: XCTestCase { /// When: serviceProxy is set to nil and uploadPart is invoked /// Then: A fatal error is thrown func testUploadPart_withoutServiceProxy_shouldThrowFatalError() throws { - self.serviceProxy = nil + serviceProxy = nil try XCTAssertThrowFatalError { try? self.client.uploadPart( partNumber: 1, @@ -324,7 +324,7 @@ class DefaultStorageMultipartUploadClientTests: XCTestCase { /// Then: The tasks are unregistered func testCancelUploadTasks_shouldSucceed() async throws { let cancelExpectation = expectation(description: "Cancel Upload Tasks") - client.cancelUploadTasks(taskIdentifiers: [0, 1,2], done: { + client.cancelUploadTasks(taskIdentifiers: [0, 1, 2], done: { cancelExpectation.fulfill() }) diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/DefaultStorageTransferDatabaseTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/DefaultStorageTransferDatabaseTests.swift index d317df8ea8..8ac205b94b 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/DefaultStorageTransferDatabaseTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/DefaultStorageTransferDatabaseTests.swift @@ -5,9 +5,9 @@ // SPDX-License-Identifier: Apache-2.0 // +import XCTest @testable import Amplify @testable import AWSS3StoragePlugin -import XCTest class DefaultStorageTransferDatabaseTests: XCTestCase { private var database: DefaultStorageTransferDatabase! @@ -150,8 +150,8 @@ class DefaultStorageTransferDatabaseTests: XCTestCase { ), .completed( bytes: Bytes.megabytes(6).bytes, - eTag: "eTag") - , + eTag: "eTag"), + .pending(bytes: Bytes.megabytes(6).bytes) ] ) @@ -209,7 +209,7 @@ class DefaultStorageTransferDatabaseTests: XCTestCase { sessionTasks: [ session ]) - let expectation = self.expectation(description: "Recover") + let expectation = expectation(description: "Recover") database.recover(urlSession: urlSession) { result in guard case .success(_) = result else { XCTFail("Expected success") @@ -224,8 +224,8 @@ class DefaultStorageTransferDatabaseTests: XCTestCase { /// When: prepareForBackground is invoked /// Then: A callback is invoked func testPrepareForBackground() async { - let expectation = self.expectation(description: "Prepare for Background") - database.prepareForBackground() { + let expectation = expectation(description: "Prepare for Background") + database.prepareForBackground { expectation.fulfill() } await fulfillment(of: [expectation], timeout: 5) diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/FatalTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/FatalTests.swift index 27f05c3e64..1806f97061 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/FatalTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/FatalTests.swift @@ -8,8 +8,8 @@ import XCTest import AmplifyTestCommon -@testable import AWSS3StoragePlugin @testable import Amplify +@testable import AWSS3StoragePlugin class FatalTests: XCTestCase { diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/FileHandleTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/FileHandleTests.swift index f623af2a51..fc3242ab42 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/FileHandleTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/FileHandleTests.swift @@ -9,7 +9,7 @@ import XCTest @testable import AWSS3StoragePlugin class FileHandleTests: XCTestCase { - + /// Given: A FileHandle and a file /// When: `read(bytes:bytesReadLimit)` is invoked with `bytesReadLimit` being lower than `bytes` /// Then: Only `bytesReadLimit` bytes will be read at a time, but all `bytes` will be read and returned @@ -18,23 +18,23 @@ class FileHandleTests: XCTestCase { let sourceData = Data(sourceString.utf8) let sourceFile = try createFile(from: sourceData) XCTAssertEqual(try StorageRequestUtils.getSize(sourceFile), UInt64(sourceString.count)) - + let fileSystem = FileSystem() let bytesReadLimit = 2 - + let fileHandle = try FileHandle(forReadingFrom: sourceFile) let firstPartData = try fileHandle.read(bytes: 5, bytesReadLimit: bytesReadLimit) let firstPartString = String(decoding: firstPartData, as: UTF8.self) XCTAssertEqual(firstPartString, "01234") // i.e. the first 5 bytes - + let secondPartData = try fileHandle.read(bytes: 5, bytesReadLimit: bytesReadLimit) let secondPartString = String(decoding: secondPartData, as: UTF8.self) XCTAssertEqual(secondPartString, "56789") // i.e. the second 5 bytes - + let thirdPartData = try fileHandle.read(bytes: 5, bytesReadLimit: bytesReadLimit) let thirdPartString = String(decoding: thirdPartData, as: UTF8.self) XCTAssertEqual(thirdPartString, "10") // i.e. the remaining bytes - + try FileManager.default.removeItem(at: sourceFile) } diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/FileSystemTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/FileSystemTests.swift index af1ea79b90..594ad63f83 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/FileSystemTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/FileSystemTests.swift @@ -9,8 +9,8 @@ import XCTest -@testable import AWSS3StoragePlugin @testable import Amplify +@testable import AWSS3StoragePlugin extension FileSystem { @@ -60,7 +60,7 @@ class FileSystemTests: XCTestCase { fs.removeDirectoryIfExists(directoryURL: sourceFileUrl) fs.removeDirectoryIfExists(directoryURL: destinationUrl) } - + func testMoveFile_Succeeds_WhenFileAlreadyExists() throws { let fs = FileSystem() let directoryURL = fs.createTemporaryDirectoryURL() @@ -78,7 +78,7 @@ class FileSystemTests: XCTestCase { fs.removeDirectoryIfExists(directoryURL: sourceFileUrl) fs.removeDirectoryIfExists(directoryURL: destinationUrl) } - + func testFileExists() throws { let fs = FileSystem() let directoryURL = fs.createTemporaryDirectoryURL() @@ -142,9 +142,7 @@ class FileSystemTests: XCTestCase { _ = try fs.createFile(baseURL: directoryURL, filename: name, data: data) } let contents = try fs.directoryContents(directoryURL: directoryURL, matching: { $0.hasSuffix(".dat") }) - .map { - $0.lastPathComponent - } + .map(\.lastPathComponent) XCTAssertEqual(names.count, contents.count) for name in names { XCTAssertTrue(contents.contains(name)) diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/MockMultipartUploadClient.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/MockMultipartUploadClient.swift index 49a4bb3265..b3a910f6c7 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/MockMultipartUploadClient.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/MockMultipartUploadClient.swift @@ -1,7 +1,14 @@ +// +// Copyright Amazon.com Inc. or its affiliates. +// All Rights Reserved. +// +// SPDX-License-Identifier: Apache-2.0 +// + import XCTest -@testable import AWSS3StoragePlugin @testable import Amplify +@testable import AWSS3StoragePlugin class MockMultipartUploadClient: StorageMultipartUploadClient { @@ -37,7 +44,7 @@ class MockMultipartUploadClient: StorageMultipartUploadClient { } func createMultipartUpload() throws { - guard let session = session else { throw Failure.sessionNotIntegrated } + guard let session else { throw Failure.sessionNotIntegrated } let uploadId = UUID().uuidString session.handle(multipartUploadEvent: .created(uploadFile: uploadFile, uploadId: uploadId)) @@ -52,7 +59,7 @@ class MockMultipartUploadClient: StorageMultipartUploadClient { fatalError() } print("Upload Part \(partNumber)") - guard let session = session else { throw Failure.sessionNotIntegrated } + guard let session else { throw Failure.sessionNotIntegrated } uploadPartCount += 1 @@ -83,7 +90,7 @@ class MockMultipartUploadClient: StorageMultipartUploadClient { } func completeMultipartUpload(uploadId: UploadID) throws { - guard let session = session else { throw Failure.sessionNotIntegrated } + guard let session else { throw Failure.sessionNotIntegrated } completeMultipartUploadCount += 1 @@ -92,7 +99,7 @@ class MockMultipartUploadClient: StorageMultipartUploadClient { } func abortMultipartUpload(uploadId: UploadID, error: Error?) throws { - guard let session = session else { throw Failure.sessionNotIntegrated } + guard let session else { throw Failure.sessionNotIntegrated } abortMultipartUploadCount += 1 diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/MockStorageTransferDatabase.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/MockStorageTransferDatabase.swift index 76ea10bc03..0ea4b4a665 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/MockStorageTransferDatabase.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/MockStorageTransferDatabase.swift @@ -6,8 +6,8 @@ // import Foundation -@testable import AWSS3StoragePlugin @testable import Amplify +@testable import AWSS3StoragePlugin class MockStorageTransferDatabase: StorageTransferDatabase { @@ -47,7 +47,8 @@ class MockStorageTransferDatabase: StorageTransferDatabase { } func recover(urlSession: StorageURLSession, - completionHandler: @escaping (Result) -> Void) { + completionHandler: @escaping (Result) -> Void) + { // do nothing } @@ -81,12 +82,13 @@ class MockStorageTransferDatabase: StorageTransferDatabase { // swiftlint:disable line_length func attachEventHandlers(onUpload: AWSS3StorageServiceBehavior.StorageServiceUploadEventHandler? = nil, onDownload: AWSS3StorageServiceBehavior.StorageServiceDownloadEventHandler? = nil, - onMultipartUpload: AWSS3StorageServiceBehavior.StorageServiceMultiPartUploadEventHandler? = nil) { + onMultipartUpload: AWSS3StorageServiceBehavior.StorageServiceMultiPartUploadEventHandler? = nil) + { queue.async { [weak self] in - guard let self = self else { fatalError("self cannot be weak") } - self.uploadEventHandler = onUpload - self.downloadEventHandler = onDownload - self.multipartUploadEventHandler = onMultipartUpload + guard let self else { fatalError("self cannot be weak") } + uploadEventHandler = onUpload + downloadEventHandler = onDownload + multipartUploadEventHandler = onMultipartUpload } } // swiftlint:enable line_length diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageBackgroundEventsRegistryTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageBackgroundEventsRegistryTests.swift index 6b1f696261..b5bc3b1c0d 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageBackgroundEventsRegistryTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageBackgroundEventsRegistryTests.swift @@ -8,8 +8,8 @@ import Foundation import XCTest -@testable import AWSS3StoragePlugin @testable import Amplify +@testable import AWSS3StoragePlugin class StorageBackgroundEventsRegistryTests: XCTestCase { diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageMultipartUploadSessionTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageMultipartUploadSessionTests.swift index f51f974e34..71e582a99d 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageMultipartUploadSessionTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageMultipartUploadSessionTests.swift @@ -7,8 +7,8 @@ import XCTest -@testable import AWSS3StoragePlugin @testable import Amplify +@testable import AWSS3StoragePlugin class StorageMultipartUploadSessionTests: XCTestCase { enum Failure: Error { @@ -141,7 +141,7 @@ class StorageMultipartUploadSessionTests: XCTestCase { } let client = MockMultipartUploadClient() // creates an UploadFile for the mock process - client.didCompletePartUpload = { (_, partNumber, _, _) in + client.didCompletePartUpload = { _, partNumber, _, _ in if partNumber == 5 { closureSession?.cancel() XCTAssertTrue(closureSession?.isAborted ?? false) @@ -190,7 +190,7 @@ class StorageMultipartUploadSessionTests: XCTestCase { } let client = MockMultipartUploadClient() // creates an UploadFile for the mock process - client.didTransferBytesForPartUpload = { (_, partNumber, bytesTransferred) in + client.didTransferBytesForPartUpload = { _, partNumber, bytesTransferred in if pauseCount == 0, partNumber > 5, bytesTransferred > 0 { print("pausing on \(partNumber)") pauseCount += 1 diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StoragePersistableTransferTaskTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StoragePersistableTransferTaskTests.swift index 3ae05634fb..994ccc08ba 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StoragePersistableTransferTaskTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StoragePersistableTransferTaskTests.swift @@ -7,8 +7,8 @@ import XCTest -@testable import AWSS3StoragePlugin @testable import Amplify +@testable import AWSS3StoragePlugin class StoragePersistableTransferTaskTests: XCTestCase { var database: StorageTransferDatabase! @@ -224,7 +224,8 @@ class StoragePersistableTransferTaskTests: XCTestCase { // MARK: - Private - private func createTask(transferType: StorageTransferType, - sessionTask: StorageSessionTask? = nil) -> StorageTransferTask { + sessionTask: StorageSessionTask? = nil) -> StorageTransferTask + { let transferID = UUID().uuidString let bucket = "BUCKET" let key = UUID().uuidString diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageServiceSessionDelegateTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageServiceSessionDelegateTests.swift index 700ffb8f98..7d65b716b7 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageServiceSessionDelegateTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageServiceSessionDelegateTests.swift @@ -5,18 +5,18 @@ // SPDX-License-Identifier: Apache-2.0 // +import AWSS3 +import ClientRuntime +import XCTest @testable import Amplify @testable import AWSPluginsTestCommon @testable import AWSS3StoragePlugin -import ClientRuntime -import AWSS3 -import XCTest class StorageServiceSessionDelegateTests: XCTestCase { private var delegate: StorageServiceSessionDelegate! private var service: AWSS3StorageServiceMock! private var logger: MockLogger! - + override func setUp() { service = try! AWSS3StorageServiceMock() logger = MockLogger() @@ -26,13 +26,13 @@ class StorageServiceSessionDelegateTests: XCTestCase { ) delegate.storageService = service } - + override func tearDown() { logger = nil service = nil delegate = nil } - + /// Given: A StorageServiceSessionDelegate /// When: logURLSessionActivity is invoked with warning set to true /// Then: A warn message is logged @@ -41,7 +41,7 @@ class StorageServiceSessionDelegateTests: XCTestCase { XCTAssertEqual(logger.warnCount, 1) XCTAssertEqual(logger.infoCount, 0) } - + /// Given: A StorageServiceSessionDelegate /// When: logURLSessionActivity is invoked without setting warning /// Then: An info message is logged @@ -55,8 +55,8 @@ class StorageServiceSessionDelegateTests: XCTestCase { /// When: the registry's handleBackgroundEvents is invoked with a matching identifier and then urlSessionDidFinishEvents is invoked /// Then: The registry's continuation is triggered with true func testDidFinishEvents_withMatchingIdentifiers_shouldTriggerContinuationWithTrue() async { - let handleEventsExpectation = self.expectation(description: "Handle Background Events") - let finishEventsExpectation = self.expectation(description: "Did Finish Events") + let handleEventsExpectation = expectation(description: "Handle Background Events") + let finishEventsExpectation = expectation(description: "Did Finish Events") StorageBackgroundEventsRegistry.register(identifier: "identifier") Task { let result = await withCheckedContinuation { continuation in @@ -69,20 +69,20 @@ class StorageServiceSessionDelegateTests: XCTestCase { XCTAssertTrue(result) finishEventsExpectation.fulfill() } - + await fulfillment(of: [handleEventsExpectation], timeout: 1) XCTAssertNotNil(StorageBackgroundEventsRegistry.continuation) delegate.urlSessionDidFinishEvents(forBackgroundURLSession: .shared) await fulfillment(of: [finishEventsExpectation], timeout: 1) XCTAssertNil(StorageBackgroundEventsRegistry.continuation) } - + /// Given: A StorageServiceSessionDelegate and an identifier registered in the registry /// When: the registry's handleBackgroundEvents is invoked first with a matching identifier and then with a non-matching one, and after that urlSessionDidFinishEvents is invoked /// Then: The registry's continuation for the non-matching identifier is triggered immediately with false, while the one for the matching identifier is triggered with true only after urlSessionDidFinishEvents is invoked func testDidFinishEvents_withNonMatchingIdentifiers_shouldTriggerContinuationWithFalse() async { - let handleEventsMatchingExpectation = self.expectation(description: "Handle Background Events with Matching Identifiers") - let finishEventsExpectation = self.expectation(description: "Did Finish Events") + let handleEventsMatchingExpectation = expectation(description: "Handle Background Events with Matching Identifiers") + let finishEventsExpectation = expectation(description: "Did Finish Events") StorageBackgroundEventsRegistry.register(identifier: "identifier") Task { let result = await withCheckedContinuation { continuation in @@ -95,11 +95,11 @@ class StorageServiceSessionDelegateTests: XCTestCase { XCTAssertTrue(result) finishEventsExpectation.fulfill() } - + await fulfillment(of: [handleEventsMatchingExpectation], timeout: 1) XCTAssertNotNil(StorageBackgroundEventsRegistry.continuation) - - let handleEventsNonMatchingExpectation = self.expectation(description: "Handle Background Events with Matching Identifiers") + + let handleEventsNonMatchingExpectation = expectation(description: "Handle Background Events with Matching Identifiers") Task { let result = await withCheckedContinuation { continuation in StorageBackgroundEventsRegistry.handleBackgroundEvents( @@ -115,7 +115,7 @@ class StorageServiceSessionDelegateTests: XCTestCase { await fulfillment(of: [finishEventsExpectation], timeout: 1) XCTAssertNil(StorageBackgroundEventsRegistry.continuation) } - + /// Given: A StorageServiceSessionDelegate /// When: didBecomeInvalidWithError is invoked with a StorageError /// Then: The service's resetURLSession is invoked @@ -123,7 +123,7 @@ class StorageServiceSessionDelegateTests: XCTestCase { delegate.urlSession(.shared, didBecomeInvalidWithError: StorageError.accessDenied("", "", nil)) XCTAssertEqual(service.resetURLSessionCount, 1) } - + /// Given: A StorageServiceSessionDelegate /// When: didBecomeInvalidWithError is invoked with a nil error /// Then: The service's resetURLSession is invoked @@ -131,7 +131,7 @@ class StorageServiceSessionDelegateTests: XCTestCase { delegate.urlSession(.shared, didBecomeInvalidWithError: nil) XCTAssertEqual(service.resetURLSessionCount, 1) } - + /// Given: A StorageServiceSessionDelegate and a StorageTransferTask with a NSError with a NSURLErrorCancelled reason /// When: didComplete is invoked /// Then: The task is not unregistered @@ -143,9 +143,9 @@ class StorageServiceSessionDelegateTests: XCTestCase { NSURLErrorCancelledReasonUserForceQuitApplication, NSURLErrorCancelled ] - + for reason in reasons { - let expectation = self.expectation(description: "Did Complete With Error Reason \(reason)") + let expectation = expectation(description: "Did Complete With Error Reason \(reason)") expectation.isInverted = true let storageTask = StorageTransferTask( transferType: .upload(onEvent: { _ in @@ -162,22 +162,22 @@ class StorageServiceSessionDelegateTests: XCTestCase { NSURLErrorBackgroundTaskCancelledReasonKey: reason ] ) - + delegate.urlSession(.shared, task: task, didCompleteWithError: error) - + await fulfillment(of: [expectation], timeout: 5) - + XCTAssertEqual(storageTask.status, .unknown) XCTAssertEqual(service.unregisterCount, 0) } } - + /// Given: A StorageServiceSessionDelegate and a StorageTransferTask with a StorageError /// When: didComplete is invoked /// Then: The task status is set to error and it's unregistered func testDidComplete_withError_shouldFailTask() async { let task = URLSession.shared.dataTask(with: FileManager.default.temporaryDirectory) - let expectation = self.expectation(description: "Did Complete With Error") + let expectation = expectation(description: "Did Complete With Error") let storageTask = StorageTransferTask( transferType: .upload(onEvent: { _ in expectation.fulfill() @@ -186,19 +186,19 @@ class StorageServiceSessionDelegateTests: XCTestCase { key: "key" ) service.mockedTask = storageTask - + delegate.urlSession(.shared, task: task, didCompleteWithError: StorageError.accessDenied("", "", nil)) await fulfillment(of: [expectation], timeout: 1) XCTAssertEqual(storageTask.status, .error) XCTAssertEqual(service.unregisterCount, 1) } - + /// Given: A StorageServiceSessionDelegate and a StorageTransferTask of type .upload /// When: didSendBodyData is invoked /// Then: An .inProcess event is reported, with the corresponding values func testDidSendBodyData_upload_shouldSendInProcessEvent() async { let task = URLSession.shared.dataTask(with: FileManager.default.temporaryDirectory) - let expectation = self.expectation(description: "Did Send Body Data") + let expectation = expectation(description: "Did Send Body Data") let storageTask = StorageTransferTask( transferType: .upload(onEvent: { event in guard case .inProcess(let progress) = event else { @@ -213,7 +213,7 @@ class StorageServiceSessionDelegateTests: XCTestCase { key: "key" ) service.mockedTask = storageTask - + delegate.urlSession( .shared, task: task, @@ -221,10 +221,10 @@ class StorageServiceSessionDelegateTests: XCTestCase { totalBytesSent: 100, totalBytesExpectedToSend: 120 ) - + await fulfillment(of: [expectation], timeout: 1) } - + /// Given: A StorageServiceSessionDelegate and a StorageTransferTask of type .multiPartUploadPart /// When: didSendBodyData is invoked /// Then: A .progressUpdated event is reported to the session @@ -246,7 +246,7 @@ class StorageServiceSessionDelegateTests: XCTestCase { onEvent: { event in } ) service.mockedMultipartUploadSession = multipartSession - + delegate.urlSession( .shared, task: task, @@ -259,18 +259,18 @@ class StorageServiceSessionDelegateTests: XCTestCase { XCTFail("Expected .progressUpdated event") return } - + XCTAssertEqual(partNumber, 3) XCTAssertEqual(bytesTransferred, 10) XCTAssertEqual(taskIdentifier, task.taskIdentifier) } - + /// Given: A StorageServiceSessionDelegate and a StorageTransferTask of type .download /// When: didWriteData is invoked /// Then: An .inProcess event is reported, with the corresponding values func testDidWriteData_shouldNotifyProgress() async { let task = URLSession.shared.downloadTask(with: FileManager.default.temporaryDirectory) - let expectation = self.expectation(description: "Did Write Data") + let expectation = expectation(description: "Did Write Data") let storageTask = StorageTransferTask( transferType: .download(onEvent: { event in guard case .inProcess(let progress) = event else { @@ -285,7 +285,7 @@ class StorageServiceSessionDelegateTests: XCTestCase { key: "key" ) service.mockedTask = storageTask - + delegate.urlSession( .shared, downloadTask: task, @@ -293,16 +293,16 @@ class StorageServiceSessionDelegateTests: XCTestCase { totalBytesWritten: 200, totalBytesExpectedToWrite: 300 ) - + await fulfillment(of: [expectation], timeout: 1) } - + /// Given: A StorageServiceSessionDelegate and a URLSessionDownloadTask without a httpResponse /// When: didFinishDownloadingTo is invoked /// Then: No event is reported and the task is not completed func testDiFinishDownloading_withError_shouldNotCompleteDownload() async { let task = URLSession.shared.downloadTask(with: FileManager.default.temporaryDirectory) - let expectation = self.expectation(description: "Did Finish Downloading") + let expectation = expectation(description: "Did Finish Downloading") expectation.isInverted = true let storageTask = StorageTransferTask( transferType: .download(onEvent: { _ in @@ -312,13 +312,13 @@ class StorageServiceSessionDelegateTests: XCTestCase { key: "key" ) service.mockedTask = storageTask - + delegate.urlSession( .shared, downloadTask: task, didFinishDownloadingTo: FileManager.default.temporaryDirectory ) - + await fulfillment(of: [expectation], timeout: 1) XCTAssertEqual(service.completeDownloadCount, 0) } @@ -333,31 +333,31 @@ private class AWSS3StorageServiceMock: AWSS3StorageService { storageTransferDatabase: MockStorageTransferDatabase() ) } - + override var identifier: String { return "identifier" } - + var mockedTask: StorageTransferTask? = nil override func findTask(taskIdentifier: TaskIdentifier) -> StorageTransferTask? { return mockedTask } - + var resetURLSessionCount = 0 override func resetURLSession() { resetURLSessionCount += 1 } - + var unregisterCount = 0 override func unregister(task: StorageTransferTask) { unregisterCount += 1 } - + var mockedMultipartUploadSession: StorageMultipartUploadSession? = nil override func findMultipartUploadSession(uploadId: UploadID) -> StorageMultipartUploadSession? { return mockedMultipartUploadSession } - + var completeDownloadCount = 0 override func completeDownload(taskIdentifier: TaskIdentifier, sourceURL: URL) { completeDownloadCount += 1 diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageTransferDatabaseTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageTransferDatabaseTests.swift index 884d4741c1..1048bf7999 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageTransferDatabaseTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageTransferDatabaseTests.swift @@ -7,10 +7,10 @@ import XCTest -@testable import AWSS3StoragePlugin -@testable import Amplify -import AmplifyTestCommon @_implementationOnly import AmplifyAsyncTesting +import AmplifyTestCommon +@testable import Amplify +@testable import AWSS3StoragePlugin // swiftlint:disable line_length @@ -67,7 +67,7 @@ class StorageTransferDatabaseTests: XCTestCase { // set the session task and taskIdentifier var taskIdentifier = 0 - [downloadTask, uploadTask, multipartUploadTask].forEach { task in + for task in [downloadTask, uploadTask, multipartUploadTask] { taskIdentifier += 1 task.sessionTask = MockStorageSessionTask(taskIdentifier: taskIdentifier) } @@ -127,7 +127,7 @@ class StorageTransferDatabaseTests: XCTestCase { let originalTask = createTask(transferType: .multiPartUpload(onEvent: mockMultiPartUploadEvent)) originalTask.uploadId = uploadId - let fileSize: UInt64 = UInt64(Bytes.megabytes(12).bytes) + let fileSize = UInt64(Bytes.megabytes(12).bytes) let uploadFile = UploadFile(fileURL: fileSystem.createTemporaryFileURL(), temporaryFileCreated: true, size: fileSize) let partSize = try StorageUploadPartSize(fileSize: uploadFile.size) let parts = try StorageUploadParts(fileSize: uploadFile.size, partSize: partSize, logger: logger) @@ -172,7 +172,7 @@ class StorageTransferDatabaseTests: XCTestCase { let originalTask = createTask(transferType: .multiPartUpload(onEvent: mockMultiPartUploadEvent)) originalTask.uploadId = uploadId - let fileSize: UInt64 = UInt64(Bytes.megabytes(12).bytes) + let fileSize = UInt64(Bytes.megabytes(12).bytes) let uploadFile = UploadFile(fileURL: fileSystem.createTemporaryFileURL(), temporaryFileCreated: true, size: fileSize) let partSize = try StorageUploadPartSize(fileSize: uploadFile.size) var parts = try StorageUploadParts(fileSize: uploadFile.size, partSize: partSize, logger: logger) @@ -280,7 +280,8 @@ class StorageTransferDatabaseTests: XCTestCase { private func createSubTask(createMultipartUploadTask: StorageTransferTask, uploadId: UploadID, - partNumber: PartNumber) -> StorageTransferTask { + partNumber: PartNumber) -> StorageTransferTask + { let transferType: StorageTransferType = .multiPartUploadPart(uploadId: uploadId, partNumber: partNumber) let subTask = StorageTransferTask(transferType: transferType, bucket: createMultipartUploadTask.bucket, diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageTransferTaskTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageTransferTaskTests.swift index 2a2ab197e0..455577789c 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageTransferTaskTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageTransferTaskTests.swift @@ -6,8 +6,8 @@ // import Amplify -@testable import AWSS3StoragePlugin import XCTest +@testable import AWSS3StoragePlugin class StorageTransferTaskTests: XCTestCase { @@ -30,7 +30,7 @@ class StorageTransferTaskTests: XCTestCase { proxyStorageTask: nil ) XCTAssertEqual(task.status, .paused) - + task.resume() await fulfillment(of: [expectation], timeout: 0.5) @@ -58,7 +58,7 @@ class StorageTransferTaskTests: XCTestCase { ) task.sessionTask = nil // Remove the session task XCTAssertEqual(task.status, .paused) - + task.resume() await fulfillment(of: [expectation], timeout: 0.5) @@ -86,7 +86,7 @@ class StorageTransferTaskTests: XCTestCase { proxyStorageTask: storageTask ) XCTAssertEqual(task.status, .paused) - + task.resume() await fulfillment(of: [expectation], timeout: 0.5) @@ -112,14 +112,14 @@ class StorageTransferTaskTests: XCTestCase { ) task.sessionTask = nil // Remove the sessionTask XCTAssertEqual(task.status, .paused) - + task.resume() await fulfillment(of: [expectation], timeout: 0.5) XCTAssertEqual(sessionTask.resumeCount, 0) XCTAssertEqual(task.status, .paused) } - + /// Given: A StorageTransferTask with status not being paused /// When: resume is invoked /// Then: No event is reported and the task is not set to .inProgress @@ -135,10 +135,10 @@ class StorageTransferTaskTests: XCTestCase { proxyStorageTask: nil ) XCTAssertEqual(task.status, .unknown) - + task.resume() await fulfillment(of: [expectation], timeout: 0.5) - + XCTAssertEqual(task.status, .unknown) } @@ -204,7 +204,7 @@ class StorageTransferTaskTests: XCTestCase { XCTAssertEqual(storageTask.pauseCount, 0) XCTAssertEqual(task.status, .paused) } - + /// Given: A StorageTransferTask without a sessionTask and without a proxyStorageTask /// When: suspend is invoked /// Then: The task remains .inProgress @@ -222,7 +222,7 @@ class StorageTransferTaskTests: XCTestCase { XCTAssertEqual(task.status, .inProgress) } - + /// Given: A StorageTransferTask with status completed /// When: suspend is invoked /// Then: The task remains completed @@ -242,7 +242,7 @@ class StorageTransferTaskTests: XCTestCase { XCTAssertEqual(sessionTask.suspendCount, 0) XCTAssertEqual(task.status, .completed) } - + /// Given: A StorageTransferTask /// When: pause is invoked /// Then: The task is set to .paused @@ -274,17 +274,17 @@ class StorageTransferTaskTests: XCTestCase { sessionTask: sessionTask, proxyStorageTask: MockStorageTask() ) - + // Set the task to completed by setting a multiPartUpload.completed XCTAssertNotEqual(task.status, .completed) - + task.cancel() XCTAssertEqual(task.status, .cancelled) XCTAssertEqual(sessionTask.cancelCount, 1) XCTAssertNil(task.proxyStorageTask) } - + /// Given: A StorageTransferTask with a proxyStorageTask /// When: cancel is invoked /// Then: The task is set to .cancelled @@ -295,7 +295,7 @@ class StorageTransferTaskTests: XCTestCase { sessionTask: nil, proxyStorageTask: storageTask ) - + task.cancel() XCTAssertEqual(task.status, .cancelled) XCTAssertEqual(storageTask.cancelCount, 1) @@ -311,7 +311,7 @@ class StorageTransferTaskTests: XCTestCase { sessionTask: nil, proxyStorageTask: nil ) - + task.cancel() XCTAssertNotEqual(task.status, .cancelled) } @@ -329,7 +329,7 @@ class StorageTransferTaskTests: XCTestCase { // Set the task to completed by setting a multiPartUpload.completed task.multipartUpload = .completed(uploadId: "") XCTAssertEqual(task.status, .completed) - + task.cancel() XCTAssertNotEqual(task.status, .cancelled) XCTAssertEqual(sessionTask.cancelCount, 0) @@ -347,7 +347,7 @@ class StorageTransferTaskTests: XCTestCase { sessionTask: sessionTask, proxyStorageTask: MockStorageTask() ) - + task.complete() XCTAssertEqual(task.status, .completed) XCTAssertNil(task.proxyStorageTask) @@ -365,11 +365,11 @@ class StorageTransferTaskTests: XCTestCase { ) task.cancel() XCTAssertEqual(task.status, .cancelled) - + task.complete() XCTAssertEqual(task.status, .cancelled) } - + /// Given: A StorageTransferTask with status completed /// When: complete is invoked /// Then: The task is remains .completed @@ -383,12 +383,12 @@ class StorageTransferTaskTests: XCTestCase { // Set the task to completed by setting a multiPartUpload.completed task.multipartUpload = .completed(uploadId: "") XCTAssertEqual(task.status, .completed) - + task.complete() XCTAssertNotNil(task.proxyStorageTask) } - + // MARK: - Fail Tests /// Given: A StorageTransferTask /// When: fail is invoked @@ -413,7 +413,7 @@ class StorageTransferTaskTests: XCTestCase { XCTAssertTrue(task.isFailed) XCTAssertNil(task.proxyStorageTask) } - + /// Given: A StorageTransferTask with status .failed /// When: fail is invoked /// Then: No event is reported @@ -428,7 +428,7 @@ class StorageTransferTaskTests: XCTestCase { sessionTask: MockSessionTask(), proxyStorageTask: MockStorageTask() ) - + // Set the task to error by setting a multiPartUpload.failed task.multipartUpload = .failed(uploadId: "", parts: nil, error: CancellationError()) XCTAssertEqual(task.status, .error) @@ -437,7 +437,7 @@ class StorageTransferTaskTests: XCTestCase { await fulfillment(of: [expectation], timeout: 0.5) XCTAssertNotNil(task.proxyStorageTask) } - + // MARK: - Response Tests /// Given: A StorageTransferTask with a valid responseData /// When: responseText is invoked @@ -452,7 +452,7 @@ class StorageTransferTaskTests: XCTestCase { XCTAssertEqual(task.responseText, "Test") } - + /// Given: A StorageTransferTask with an invalid responseData /// When: responseText is invoked /// Then: nil is returned @@ -462,11 +462,11 @@ class StorageTransferTaskTests: XCTestCase { sessionTask: nil, proxyStorageTask: nil ) - task.responseData = Data(count: 9999) + task.responseData = Data(count: 9_999) XCTAssertNil(task.responseText) } - + /// Given: A StorageTransferTask with a nil responseData /// When: responseText is invoked /// Then: nil is returned @@ -480,7 +480,7 @@ class StorageTransferTaskTests: XCTestCase { XCTAssertNil(task.responseText) } - + // MARK: - PartNumber Tests /// Given: A StorageTransferTask of type .multiPartUploadPart /// When: partNumber is invoked @@ -495,7 +495,7 @@ class StorageTransferTaskTests: XCTestCase { XCTAssertEqual(task.partNumber, partNumber) } - + /// Given: A StorageTransferTask of type .upload /// When: partNumber is invoked /// Then: nil is returned @@ -526,13 +526,13 @@ class StorageTransferTaskTests: XCTestCase { var request = URLRequest(url: FileManager.default.temporaryDirectory) XCTAssertNil(request.allHTTPHeaderFields) - + request.setHTTPRequestHeaders(transferTask: task) XCTAssertEqual(request.allHTTPHeaderFields?.count, 2) XCTAssertEqual(request.allHTTPHeaderFields?["header1"], "value1") XCTAssertEqual(request.allHTTPHeaderFields?["header2"], "value2") } - + /// Given: A StorageTransferTask with nil requestHeaders /// When: URLRequest.setHTTPRequestHeaders is invoked with said task /// Then: The request does not adds headers @@ -546,7 +546,7 @@ class StorageTransferTaskTests: XCTestCase { var request = URLRequest(url: FileManager.default.temporaryDirectory) XCTAssertNil(request.allHTTPHeaderFields) - + request.setHTTPRequestHeaders(transferTask: task) XCTAssertNil(request.allHTTPHeaderFields) } @@ -585,12 +585,12 @@ private class MockStorageTask: StorageTask { func pause() { pauseCount += 1 } - + var resumeCount = 0 func resume() { resumeCount += 1 } - + var cancelCount = 0 func cancel() { cancelCount += 1 @@ -608,17 +608,17 @@ private class MockSessionTask: StorageSessionTask { self.taskIdentifier = taskIdentifier self.state = state } - + var resumeCount = 0 func resume() { resumeCount += 1 } - + var suspendCount = 0 func suspend() { suspendCount += 1 } - + var cancelCount = 0 func cancel() { cancelCount += 1 @@ -627,31 +627,31 @@ private class MockSessionTask: StorageSessionTask { class MockLogger: Logger { var logLevel: LogLevel = .verbose - + func error(_ message: @autoclosure () -> String) { print(message()) } - + func error(error: Error) { print(error) } - + var warnCount = 0 func warn(_ message: @autoclosure () -> String) { print(message()) warnCount += 1 } - + var infoCount = 0 func info(_ message: @autoclosure () -> String) { print(message()) infoCount += 1 } - + func debug(_ message: @autoclosure () -> String) { print(message()) } - + func verbose(_ message: @autoclosure () -> String) { print(message()) } diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageUploadPartSizeTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageUploadPartSizeTests.swift index 2fb9d9429a..17f8b256a2 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageUploadPartSizeTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageUploadPartSizeTests.swift @@ -7,8 +7,8 @@ import XCTest -@testable import AWSS3StoragePlugin @testable import Amplify +@testable import AWSS3StoragePlugin class StorageUploadPartSizeTests: XCTestCase { @@ -49,10 +49,11 @@ class StorageUploadPartSizeTests: XCTestCase { func testUploadPartSizeForLargeValidFile() throws { // use a file size which requires increasing from minimum part size let fileSize = minimumPartSize * UInt64(maximumPartCount) * 10 - let partSize = assertNoThrow(try StorageUploadPartSize(fileSize: fileSize)) + let partSize = try assertNoThrow(StorageUploadPartSize(fileSize: fileSize)) XCTAssertNotNil(partSize) - if let partSize = partSize, - let parts = try? StorageUploadParts(fileSize: fileSize, partSize: partSize) { + if let partSize, + let parts = try? StorageUploadParts(fileSize: fileSize, partSize: partSize) + { print("Part Size: \(partSize.size)") print("Parts Count: \(parts.count)") XCTAssertGreaterThan(partSize.size, minimumPartSize) @@ -63,10 +64,11 @@ class StorageUploadPartSizeTests: XCTestCase { func testUploadPartSizeForSuperCrazyBigFile() throws { // use the maximum object size / max part count let fileSize = maximumObjectSize / UInt64(maximumPartCount) - let partSize = assertNoThrow(try StorageUploadPartSize(fileSize: fileSize)) + let partSize = try assertNoThrow(StorageUploadPartSize(fileSize: fileSize)) XCTAssertNotNil(partSize) - if let partSize = partSize, - let parts = try? StorageUploadParts(fileSize: fileSize, partSize: partSize) { + if let partSize, + let parts = try? StorageUploadParts(fileSize: fileSize, partSize: partSize) + { print("Part Size: \(partSize.size)") print("Parts Count: \(parts.count)") print("Max Part Size: \(maximumPartSize)") @@ -81,10 +83,11 @@ class StorageUploadPartSizeTests: XCTestCase { let fileSize = UInt64(Bytes.gigabytes(50).bytes) print(" File Size: \(fileSize)") print("Max Object Size: \(maximumObjectSize)") - let partSize = assertNoThrow(try StorageUploadPartSize(fileSize: fileSize)) + let partSize = try assertNoThrow(StorageUploadPartSize(fileSize: fileSize)) XCTAssertNotNil(partSize) - if let partSize = partSize, - let parts = try? StorageUploadParts(fileSize: fileSize, partSize: partSize) { + if let partSize, + let parts = try? StorageUploadParts(fileSize: fileSize, partSize: partSize) + { print(" Part Size: \(partSize.size)") print(" Parts Count: \(parts.count)") print(" Min Part Size: \(minimumPartSize)") @@ -101,7 +104,8 @@ class StorageUploadPartSizeTests: XCTestCase { _ expression: @autoclosure () throws -> T, _ message: @autoclosure () -> String = "", file: StaticString = #filePath, - line: UInt = #line) -> T? { + line: UInt = #line) -> T? + { var result: T? XCTAssertNoThrow( try { result = try expression() }(), message(), file: file, line: line) diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageUploadPartTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageUploadPartTests.swift index 73bad639ca..6e37945e2a 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageUploadPartTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageUploadPartTests.swift @@ -7,8 +7,8 @@ import XCTest -@testable import AWSS3StoragePlugin @testable import Amplify +@testable import AWSS3StoragePlugin class StorageUploadPartTests: XCTestCase { diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/UploadFileTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/UploadFileTests.swift index 34986e75b4..154a191730 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/UploadFileTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/UploadFileTests.swift @@ -9,8 +9,8 @@ import XCTest -@testable import AWSS3StoragePlugin @testable import Amplify +@testable import AWSS3StoragePlugin class UploadFileTests: XCTestCase { diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/UploadSourceTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/UploadSourceTests.swift index 0aeff603d8..75271ceac9 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/UploadSourceTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/UploadSourceTests.swift @@ -9,8 +9,8 @@ import XCTest -@testable import AWSS3StoragePlugin @testable import Amplify +@testable import AWSS3StoragePlugin class UploadSourceTests: XCTestCase { diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Utils/StorageRequestUtilsGetterTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Utils/StorageRequestUtilsGetterTests.swift index 4e0e7c3122..a9bc475f2c 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Utils/StorageRequestUtilsGetterTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Utils/StorageRequestUtilsGetterTests.swift @@ -5,9 +5,9 @@ // SPDX-License-Identifier: Apache-2.0 // +import Amplify import XCTest @testable import AWSS3StoragePlugin -import Amplify class StorageRequestUtilsGetterTests: XCTestCase { @@ -82,7 +82,8 @@ class StorageRequestUtilsGetterTests: XCTestCase { let fileURL = URL(fileURLWithPath: "path") XCTAssertThrowsError(try StorageRequestUtils.getSize(fileURL), - "GetSize for missing file should throw") { error in + "GetSize for missing file should throw") + { error in guard case StorageError.localFileNotFound = error else { XCTFail("Expected StorageError.StorageError") return diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Utils/StorageRequestUtilsValidatorTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Utils/StorageRequestUtilsValidatorTests.swift index b72f197724..100c75493b 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Utils/StorageRequestUtilsValidatorTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Utils/StorageRequestUtilsValidatorTests.swift @@ -5,9 +5,9 @@ // SPDX-License-Identifier: Apache-2.0 // +import Amplify import XCTest @testable import AWSS3StoragePlugin -import Amplify class StorageRequestUtilsValidatorTests: XCTestCase { diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageGetURLTaskTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageGetURLTaskTests.swift index 71f5ea6ea1..63df26201f 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageGetURLTaskTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageGetURLTaskTests.swift @@ -5,13 +5,13 @@ // SPDX-License-Identifier: Apache-2.0 // +import AWSS3 import XCTest @testable import Amplify @testable import AmplifyTestCommon @testable import AWSPluginsCore -@testable import AWSS3StoragePlugin @testable import AWSPluginsTestCommon -import AWSS3 +@testable import AWSS3StoragePlugin class AWSS3StorageGetURLTaskTests: XCTestCase { @@ -58,10 +58,10 @@ class AWSS3StorageGetURLTaskTests: XCTestCase { do { _ = try await task.value XCTFail("Task should throw an exception") - } - catch { + } catch { guard let storageError = error as? StorageError, - case .service(_, _, let underlyingError) = storageError else { + case .service(_, _, let underlyingError) = storageError + else { XCTFail("Should throw a Storage service error, instead threw \(error)") return } @@ -91,10 +91,10 @@ class AWSS3StorageGetURLTaskTests: XCTestCase { do { _ = try await task.value XCTFail("Task should throw an exception") - } - catch { + } catch { guard let storageError = error as? StorageError, - case .validation(let field, _, _, _) = storageError else { + case .validation(let field, _, _, _) = storageError + else { XCTFail("Should throw a storage validation error, instead threw \(error)") return } @@ -124,10 +124,10 @@ class AWSS3StorageGetURLTaskTests: XCTestCase { do { _ = try await task.value XCTFail("Task should throw an exception") - } - catch { + } catch { guard let storageError = error as? StorageError, - case .validation(let field, _, _, _) = storageError else { + case .validation(let field, _, _, _) = storageError + else { XCTFail("Should throw a storage validation error, instead threw \(error)") return } diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageListObjectsTaskTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageListObjectsTaskTests.swift index 10d059d368..e0d577ff19 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageListObjectsTaskTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageListObjectsTaskTests.swift @@ -5,13 +5,13 @@ // SPDX-License-Identifier: Apache-2.0 // +import AWSS3 import XCTest @testable import Amplify @testable import AmplifyTestCommon @testable import AWSPluginsCore -@testable import AWSS3StoragePlugin @testable import AWSPluginsTestCommon -import AWSS3 +@testable import AWSS3StoragePlugin class AWSS3StorageListObjectsTaskTests: XCTestCase { @@ -66,10 +66,10 @@ class AWSS3StorageListObjectsTaskTests: XCTestCase { do { _ = try await task.value XCTFail("Task should throw an exception") - } - catch { + } catch { guard let storageError = error as? StorageError, - case .service(_, _, let underlyingError) = storageError else { + case .service(_, _, let underlyingError) = storageError + else { XCTFail("Should throw a Storage service error, instead threw \(error)") return } @@ -93,10 +93,10 @@ class AWSS3StorageListObjectsTaskTests: XCTestCase { do { _ = try await task.value XCTFail("Task should throw an exception") - } - catch { + } catch { guard let storageError = error as? StorageError, - case .validation(let field, _, _, _) = storageError else { + case .validation(let field, _, _, _) = storageError + else { XCTFail("Should throw a storage validation error, instead threw \(error)") return } @@ -120,10 +120,10 @@ class AWSS3StorageListObjectsTaskTests: XCTestCase { do { _ = try await task.value XCTFail("Task should throw an exception") - } - catch { + } catch { guard let storageError = error as? StorageError, - case .validation(let field, _, _, _) = storageError else { + case .validation(let field, _, _, _) = storageError + else { XCTFail("Should throw a storage validation error, instead threw \(error)") return } @@ -191,7 +191,7 @@ class AWSS3StorageListObjectsTaskTests: XCTestCase { } let request = StorageListRequest( - path: StringStoragePath.fromString("path"), + path: StringStoragePath.fromString("path"), options: .init( subpathStrategy: .include ) diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageRemoveTaskTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageRemoveTaskTests.swift index 06f4ecf809..21133dc4ee 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageRemoveTaskTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageRemoveTaskTests.swift @@ -5,13 +5,13 @@ // SPDX-License-Identifier: Apache-2.0 // +import AWSS3 import XCTest @testable import Amplify @testable import AmplifyTestCommon @testable import AWSPluginsCore -@testable import AWSS3StoragePlugin @testable import AWSPluginsTestCommon -import AWSS3 +@testable import AWSS3StoragePlugin class AWSS3StorageRemoveTaskTests: XCTestCase { @@ -55,10 +55,10 @@ class AWSS3StorageRemoveTaskTests: XCTestCase { do { _ = try await task.value XCTFail("Task should throw an exception") - } - catch { + } catch { guard let storageError = error as? StorageError, - case .service(_, _, let underlyingError) = storageError else { + case .service(_, _, let underlyingError) = storageError + else { XCTFail("Should throw a Storage service error, instead threw \(error)") return } @@ -82,10 +82,10 @@ class AWSS3StorageRemoveTaskTests: XCTestCase { do { _ = try await task.value XCTFail("Task should throw an exception") - } - catch { + } catch { guard let storageError = error as? StorageError, - case .validation(let field, _, _, _) = storageError else { + case .validation(let field, _, _, _) = storageError + else { XCTFail("Should throw a storage validation error, instead threw \(error)") return } @@ -109,10 +109,10 @@ class AWSS3StorageRemoveTaskTests: XCTestCase { do { _ = try await task.value XCTFail("Task should throw an exception") - } - catch { + } catch { guard let storageError = error as? StorageError, - case .validation(let field, _, _, _) = storageError else { + case .validation(let field, _, _, _) = storageError + else { XCTFail("Should throw a storage validation error, instead threw \(error)") return } diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginAccelerateIntegrationTests.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginAccelerateIntegrationTests.swift index 937a239daf..eb1f956879 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginAccelerateIntegrationTests.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginAccelerateIntegrationTests.swift @@ -5,12 +5,12 @@ // SPDX-License-Identifier: Apache-2.0 // -import XCTest -@testable import Amplify import AWSS3StoragePlugin -import var CommonCrypto.CC_MD5_DIGEST_LENGTH -import func CommonCrypto.CC_MD5 import typealias CommonCrypto.CC_LONG +import func CommonCrypto.CC_MD5 +import var CommonCrypto.CC_MD5_DIGEST_LENGTH +import XCTest +@testable import Amplify class AWSS3StoragePluginAccelerateIntegrationTests: AWSS3StoragePluginTestBase { @@ -24,7 +24,7 @@ class AWSS3StoragePluginAccelerateIntegrationTests: AWSS3StoragePluginTestBase { let data = Data(key.utf8) let task = Amplify.Storage.uploadData(key: key, data: data, - options: .init(pluginOptions:["useAccelerateEndpoint": useAccelerateEndpoint])) + options: .init(pluginOptions: ["useAccelerateEndpoint": useAccelerateEndpoint])) _ = try await task.value try await Amplify.Storage.remove(key: key) } @@ -38,7 +38,7 @@ class AWSS3StoragePluginAccelerateIntegrationTests: AWSS3StoragePluginTestBase { do { let task = Amplify.Storage.uploadData(key: key, data: data, - options: .init(pluginOptions:["useAccelerateEndpoint": "false"])) + options: .init(pluginOptions: ["useAccelerateEndpoint": "false"])) _ = try await task.value XCTFail("Expecting error from bogus useAccelerateEndpoint value type (String)") try await Amplify.Storage.remove(key: key) @@ -62,7 +62,7 @@ class AWSS3StoragePluginAccelerateIntegrationTests: AWSS3StoragePluginTestBase { let task = Amplify.Storage.uploadFile(key: key, local: fileURL, - options: .init(pluginOptions:["useAccelerateEndpoint": useAccelerateEndpoint])) + options: .init(pluginOptions: ["useAccelerateEndpoint": useAccelerateEndpoint])) _ = try await task.value try await Amplify.Storage.remove(key: key) } @@ -74,7 +74,7 @@ class AWSS3StoragePluginAccelerateIntegrationTests: AWSS3StoragePluginTestBase { let key = UUID().uuidString let task = Amplify.Storage.uploadData(key: key, data: AWSS3StoragePluginTestBase.largeDataObject, - options: .init(pluginOptions:["useAccelerateEndpoint": useAccelerateEndpoint])) + options: .init(pluginOptions: ["useAccelerateEndpoint": useAccelerateEndpoint])) _ = try await task.value try await Amplify.Storage.remove(key: key) } @@ -87,11 +87,11 @@ class AWSS3StoragePluginAccelerateIntegrationTests: AWSS3StoragePluginTestBase { let data = Data(key.utf8) let uploadTask = Amplify.Storage.uploadData(key: key, data: data, - options: .init(pluginOptions:["useAccelerateEndpoint": useAccelerateEndpoint])) + options: .init(pluginOptions: ["useAccelerateEndpoint": useAccelerateEndpoint])) _ = try await uploadTask.value let downloadTask = Amplify.Storage.downloadData(key: key, - options: .init(pluginOptions:["useAccelerateEndpoint": useAccelerateEndpoint])) + options: .init(pluginOptions: ["useAccelerateEndpoint": useAccelerateEndpoint])) let downloadedData = try await downloadTask.value XCTAssertEqual(downloadedData, data) diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginAccessLevelTests.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginAccessLevelTests.swift index 5a0da31147..7e60eaef58 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginAccessLevelTests.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginAccessLevelTests.swift @@ -5,9 +5,9 @@ // SPDX-License-Identifier: Apache-2.0 // -import XCTest import Amplify import AWSPluginsCore +import XCTest @testable import AWSS3StoragePlugin class AWSS3StoragePluginAccessLevelTests: AWSS3StoragePluginTestBase { @@ -39,7 +39,7 @@ class AWSS3StoragePluginAccessLevelTests: AWSS3StoragePluginTestBase { path: key) _ = try await Amplify.Storage.list(options: options).items XCTFail("Expecting failure") - } catch StorageError.accessDenied(let description, _, _){ + } catch StorageError.accessDenied(let description, _, _) { XCTAssertEqual(description, StorageErrorConstants.accessDenied.errorDescription) } catch { XCTFail(String(describing: error)) diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginBasicIntegrationTests.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginBasicIntegrationTests.swift index 8aadc25de6..a75cbfb2d8 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginBasicIntegrationTests.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginBasicIntegrationTests.swift @@ -67,10 +67,10 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { _ = try await Amplify.Storage.remove(key: key) // Only the remove operation results in an SDK request - XCTAssertEqual(requestRecorder.sdkRequests.map { $0.method } , [.delete]) + XCTAssertEqual(requestRecorder.sdkRequests.map(\.method), [.delete]) try assertUserAgentComponents(sdkRequests: requestRecorder.sdkRequests) - XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, ["PUT"]) + XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), ["PUT"]) try assertUserAgentComponents(urlRequests: requestRecorder.urlRequests) } @@ -83,7 +83,7 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { _ = try await Amplify.Storage.uploadData(key: key, data: data, options: nil).value _ = try await Amplify.Storage.remove(key: key) - XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, ["PUT"]) + XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), ["PUT"]) try assertUserAgentComponents(urlRequests: requestRecorder.urlRequests) } @@ -101,10 +101,10 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { _ = try await Amplify.Storage.remove(key: key) // Only the remove operation results in an SDK request - XCTAssertEqual(requestRecorder.sdkRequests.map { $0.method} , [.delete]) + XCTAssertEqual(requestRecorder.sdkRequests.map(\.method), [.delete]) try assertUserAgentComponents(sdkRequests: requestRecorder.sdkRequests) - XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, ["PUT"]) + XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), ["PUT"]) try assertUserAgentComponents(urlRequests: requestRecorder.urlRequests) } @@ -120,7 +120,7 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { _ = try await Amplify.Storage.uploadFile(key: key, local: fileURL, options: nil).value _ = try await Amplify.Storage.remove(key: key) - XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, ["PUT"]) + XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), ["PUT"]) try assertUserAgentComponents(urlRequests: requestRecorder.urlRequests) } @@ -214,7 +214,7 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { let remoteURL = try await Amplify.Storage.getURL(key: key) // The presigned URL generation does not result in an SDK or HTTP call. - XCTAssertEqual(requestRecorder.sdkRequests.map { $0.method} , []) + XCTAssertEqual(requestRecorder.sdkRequests.map(\.method), []) let (data, response) = try await URLSession.shared.data(from: remoteURL) let httpResponse = try XCTUnwrap(response as? HTTPURLResponse) @@ -247,7 +247,7 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { XCTAssert(requestRecorder.sdkRequests.map(\.method).allSatisfy { $0 == .head }) try assertUserAgentComponents(sdkRequests: requestRecorder.sdkRequests) - XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, []) + XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), []) } /// - Given: A key for a non-existent S3 object @@ -264,8 +264,8 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { XCTAssertNotNil(url) // No SDK or URLRequest calls expected - XCTAssertEqual(requestRecorder.sdkRequests.map { $0.method} , []) - XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, []) + XCTAssertEqual(requestRecorder.sdkRequests.map(\.method), []) + XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), []) } /// Given: An object in storage @@ -292,11 +292,11 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { _ = try await Amplify.Storage.remove(key: key) // S3 GetObjectList and DeleteObject calls are expected - XCTAssertEqual(requestRecorder.sdkRequests.map { $0.method}, [.get, .delete]) + XCTAssertEqual(requestRecorder.sdkRequests.map(\.method), [.get, .delete]) try assertUserAgentComponents(sdkRequests: requestRecorder.sdkRequests) // A single URLRequest call is expected - XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, ["PUT"]) + XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), ["PUT"]) } /// Given: A collection of objects in storage numbering `objectCount`. @@ -304,11 +304,11 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { /// corresponding token options. /// Then: All objects are listed. func testListTwoPages() async throws { - let objectCount = UInt.random(in: 16..<32) + let objectCount = UInt.random(in: 16 ..< 32) // One more than half in order to ensure there are only two pages - let pageSize = UInt(objectCount/2) + 1 + let pageSize = UInt(objectCount / 2) + 1 let path = "pagination-\(UUID().uuidString)" - for i in 0.. HttpResponse { - guard let target = target else { + func send(request: SdkHttpRequest) async throws -> HttpResponse + { + guard let target else { throw ClientError.unknownError("HttpClientEngine is not set") } sdkRequests.append(request) diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginTestBase.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginTestBase.swift index 35e4721be2..e145059ed0 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginTestBase.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginTestBase.swift @@ -37,7 +37,7 @@ class AWSS3StoragePluginTestBase: XCTestCase { override func setUp() async throws { Self.logger.debug("setUp") - self.requestRecorder = AWSS3StoragePluginRequestRecorder() + requestRecorder = AWSS3StoragePluginRequestRecorder() do { await Amplify.reset() @@ -52,7 +52,7 @@ class AWSS3StoragePluginTestBase: XCTestCase { } else { try Amplify.configure() } - if (try? await Amplify.Auth.getCurrentUser()) != nil { + if await (try? Amplify.Auth.getCurrentUser()) != nil { await signOut() } await signUp() @@ -65,7 +65,7 @@ class AWSS3StoragePluginTestBase: XCTestCase { Self.logger.debug("tearDown") invalidateCurrentSession() await Amplify.reset() - self.requestRecorder = nil + requestRecorder = nil // `sleep` has been added here to get more consistent test runs. // The plugin will always create a URLSession with the same key, so we need to invalidate it first. // However, it needs some time to properly clean up before creating and using a new session. @@ -102,10 +102,10 @@ class AWSS3StoragePluginTestBase: XCTestCase { await fulfillment(of: [completeInvoked], timeout: 60) } - + func remove(key: String, accessLevel: StorageAccessLevel? = nil) async { var removeOptions: StorageRemoveRequest.Options? = nil - if let accessLevel = accessLevel { + if let accessLevel { removeOptions = .init(accessLevel: accessLevel) } @@ -197,7 +197,8 @@ class AWSS3StoragePluginTestBase: XCTestCase { private func invalidateCurrentSession() { Self.logger.debug("Invalidating URLSession") guard let plugin = try? Amplify.Storage.getPlugin(for: "awsS3StoragePlugin") as? AWSS3StoragePlugin, - let service = plugin.storageService as? AWSS3StorageService else { + let service = plugin.storageService as? AWSS3StorageService + else { print("Unable to to cast to AWSS3StorageService") return } diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginUploadIntegrationTests.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginUploadIntegrationTests.swift index 565bee8746..950387f41b 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginUploadIntegrationTests.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginUploadIntegrationTests.swift @@ -67,10 +67,10 @@ class AWSS3StoragePluginUploadIntegrationTests: AWSS3StoragePluginTestBase { _ = try await Amplify.Storage.remove(path: .fromString("public/\(key)")) // Only the remove operation results in an SDK request - XCTAssertEqual(requestRecorder.sdkRequests.map { $0.method } , [.delete]) + XCTAssertEqual(requestRecorder.sdkRequests.map(\.method), [.delete]) try assertUserAgentComponents(sdkRequests: requestRecorder.sdkRequests) - XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, ["PUT"]) + XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), ["PUT"]) try assertUserAgentComponents(urlRequests: requestRecorder.urlRequests) } @@ -83,7 +83,7 @@ class AWSS3StoragePluginUploadIntegrationTests: AWSS3StoragePluginTestBase { _ = try await Amplify.Storage.uploadData(path: .fromString("public/\(key)"), data: data, options: nil).value _ = try await Amplify.Storage.remove(path: .fromString("public/\(key)")) - XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, ["PUT"]) + XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), ["PUT"]) try assertUserAgentComponents(urlRequests: requestRecorder.urlRequests) } @@ -101,10 +101,10 @@ class AWSS3StoragePluginUploadIntegrationTests: AWSS3StoragePluginTestBase { _ = try await Amplify.Storage.remove(path: .fromString("public/\(key)")) // Only the remove operation results in an SDK request - XCTAssertEqual(requestRecorder.sdkRequests.map { $0.method} , [.delete]) + XCTAssertEqual(requestRecorder.sdkRequests.map(\.method), [.delete]) try assertUserAgentComponents(sdkRequests: requestRecorder.sdkRequests) - XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, ["PUT"]) + XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), ["PUT"]) try assertUserAgentComponents(urlRequests: requestRecorder.urlRequests) } @@ -120,7 +120,7 @@ class AWSS3StoragePluginUploadIntegrationTests: AWSS3StoragePluginTestBase { _ = try await Amplify.Storage.uploadFile(path: .fromString("public/\(key)"), local: fileURL, options: nil).value _ = try await Amplify.Storage.remove(path: .fromString("public/\(key)")) - XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, ["PUT"]) + XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), ["PUT"]) try assertUserAgentComponents(urlRequests: requestRecorder.urlRequests) } @@ -182,7 +182,7 @@ class AWSS3StoragePluginUploadIntegrationTests: AWSS3StoragePluginTestBase { private func assertUserAgentComponents(sdkRequests: [SdkHttpRequest], file: StaticString = #filePath, line: UInt = #line) throws { for request in sdkRequests { let headers = request.headers.dictionary - let userAgent = try XCTUnwrap(headers["User-Agent"]?.joined(separator:",")) + let userAgent = try XCTUnwrap(headers["User-Agent"]?.joined(separator: ",")) for component in SdkUserAgentComponent.allCases { XCTAssertTrue(userAgent.contains(component.rawValue), "\(userAgent.description) does not contain \(component)", file: file, line: line) } diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginUploadMetadataTestCase.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginUploadMetadataTestCase.swift index 92d6ec8a7a..0e18a197af 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginUploadMetadataTestCase.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginUploadMetadataTestCase.swift @@ -5,11 +5,11 @@ // SPDX-License-Identifier: Apache-2.0 // -import XCTest import Amplify import AWSPluginsCore -import AWSS3StoragePlugin import AWSS3 +import AWSS3StoragePlugin +import XCTest class AWSS3StoragePluginUploadMetadataTestCase: AWSS3StoragePluginTestBase { // MARK: - Tests @@ -171,7 +171,7 @@ class AWSS3StoragePluginUploadMetadataTestCase: AWSS3StoragePluginTestBase { /// all key-value pairs`metadata` func test_uploadWithMultipleMetadataPairs() async throws { // Include metadata in upload file request - let range = (1...11) + let range = (1 ... 11) let metadata = zip(range, range.dropFirst()) .map { tuple -> (String, String) in (.init(tuple.0), .init(tuple.0)) @@ -238,13 +238,12 @@ class AWSS3StoragePluginUploadMetadataTestCase: AWSS3StoragePluginTestBase { "Cast to `AWSS3StoragePlugin` failed" ) let s3Client = storagePlugin.getEscapeHatch() - let bucket: String - if useGen2Configuration { - bucket = try getBucketFromAmplifyOutputs( + let bucket: String = if useGen2Configuration { + try getBucketFromAmplifyOutputs( forResource: "amplify_outputs" ) } else { - bucket = try getBucketFromConfig( + try getBucketFromConfig( forResource: "amplifyconfiguration" ) } diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/Helpers/AuthSignInHelper.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/Helpers/AuthSignInHelper.swift index f20cfffcc9..91426f32a4 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/Helpers/AuthSignInHelper.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/Helpers/AuthSignInHelper.swift @@ -9,7 +9,7 @@ import Amplify typealias CompletionType = (Bool, AuthError?) -> Void -struct AuthSignInHelper { +enum AuthSignInHelper { @discardableResult static func signUpUser(username: String, password: String, email: String) async throws -> AuthSignUpResult { @@ -24,8 +24,9 @@ struct AuthSignInHelper { static func registerAndSignInUser(username: String, password: String, - email: String) async throws -> Bool { - try await Self.signUpUser(username: username, password: password, email: email) + email: String) async throws -> Bool + { + try await signUpUser(username: username, password: password, email: email) let result = try await Self.signInUser(username: username, password: password) return result.isSignedIn } diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/ResumabilityTests/AWSS3StoragePluginDownloadFileResumabilityTests.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/ResumabilityTests/AWSS3StoragePluginDownloadFileResumabilityTests.swift index 48b56b7d52..5e87373680 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/ResumabilityTests/AWSS3StoragePluginDownloadFileResumabilityTests.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/ResumabilityTests/AWSS3StoragePluginDownloadFileResumabilityTests.swift @@ -5,10 +5,10 @@ // SPDX-License-Identifier: Apache-2.0 // -import XCTest import Amplify -import AWSS3StoragePlugin import AWSS3 +import AWSS3StoragePlugin +import XCTest // swiftlint:disable:next type_name class AWSS3StoragePluginDownloadFileResumabilityTests: AWSS3StoragePluginTestBase { diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/ResumabilityTests/AWSS3StoragePluginGetDataResumabilityTests.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/ResumabilityTests/AWSS3StoragePluginGetDataResumabilityTests.swift index 40f9e863b9..7f0ce8054b 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/ResumabilityTests/AWSS3StoragePluginGetDataResumabilityTests.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/ResumabilityTests/AWSS3StoragePluginGetDataResumabilityTests.swift @@ -5,11 +5,11 @@ // SPDX-License-Identifier: Apache-2.0 // -import XCTest import Amplify -import AWSS3StoragePlugin import AWSS3 +import AWSS3StoragePlugin import Combine +import XCTest // swiftlint:disable:next type_name class AWSS3StoragePluginDownloadDataResumabilityTests: AWSS3StoragePluginTestBase { diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/ResumabilityTests/AWSS3StoragePluginPutDataResumabilityTests.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/ResumabilityTests/AWSS3StoragePluginPutDataResumabilityTests.swift index 8d76b67bef..00ae337d28 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/ResumabilityTests/AWSS3StoragePluginPutDataResumabilityTests.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/ResumabilityTests/AWSS3StoragePluginPutDataResumabilityTests.swift @@ -5,11 +5,11 @@ // SPDX-License-Identifier: Apache-2.0 // -import XCTest import Amplify -import AWSS3StoragePlugin import AWSS3 +import AWSS3StoragePlugin import Combine +import XCTest // swiftlint:disable:next type_name class AWSS3StoragePluginUploadDataResumabilityTests: AWSS3StoragePluginTestBase { diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/ResumabilityTests/AWSS3StoragePluginUploadFileResumabilityTests.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/ResumabilityTests/AWSS3StoragePluginUploadFileResumabilityTests.swift index 098dd9266c..ecb62eb8ed 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/ResumabilityTests/AWSS3StoragePluginUploadFileResumabilityTests.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/ResumabilityTests/AWSS3StoragePluginUploadFileResumabilityTests.swift @@ -5,10 +5,10 @@ // SPDX-License-Identifier: Apache-2.0 // -import XCTest import Amplify -import AWSS3StoragePlugin import AWSS3 +import AWSS3StoragePlugin +import XCTest // swiftlint:disable:next type_name class AWSS3StoragePluginUploadFileResumabilityTests: AWSS3StoragePluginTestBase { diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/StorageStressTests/StorageStressTests.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/StorageStressTests/StorageStressTests.swift index ffc25e3d2c..1504d73985 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/StorageStressTests/StorageStressTests.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/StorageStressTests/StorageStressTests.swift @@ -5,10 +5,10 @@ // SPDX-License-Identifier: Apache-2.0 // +import AWSCognitoAuthPlugin import XCTest @testable import Amplify @testable import AWSS3StoragePlugin -import AWSCognitoAuthPlugin final class StorageStressTests: XCTestCase { @@ -17,7 +17,7 @@ final class StorageStressTests: XCTestCase { let smallDataObjectForStressTest = Data(repeating: 0xff, count: 1_024 * 1_024) // 1MB let largeDataObjectForStressTest = Data(repeating: 0xff, count: 1_024 * 1_024 * 100) // 100MB let concurrencyLimit = 10 - + static var user1: String = "integTest\(UUID().uuidString)" static var user2: String = "integTest\(UUID().uuidString)" static var password: String = "P123@\(UUID().uuidString)" @@ -34,7 +34,7 @@ final class StorageStressTests: XCTestCase { try Amplify.add(plugin: AWSCognitoAuthPlugin()) try Amplify.add(plugin: AWSS3StoragePlugin()) try Amplify.configure() - if (try? await Amplify.Auth.getCurrentUser()) != nil { + if await (try? Amplify.Auth.getCurrentUser()) != nil { await signOut() } await signUp() @@ -54,7 +54,7 @@ final class StorageStressTests: XCTestCase { try await Task.sleep(seconds: 1) } // MARK: - Stress tests - + /// Given: A small data object /// When: Upload the data simultaneously from 10 tasks /// Then: The operation completes successfully @@ -65,7 +65,7 @@ final class StorageStressTests: XCTestCase { let removeExpectation = expectation(description: "Data object removed successfully") removeExpectation.expectedFulfillmentCount = concurrencyLimit - for _ in 1...concurrencyLimit { + for _ in 1 ... concurrencyLimit { Task { do { let key = UUID().uuidString @@ -77,7 +77,7 @@ final class StorageStressTests: XCTestCase { XCTAssertEqual(uploadKey, key) uploadExpectation.fulfill() - + try await Amplify.Storage.remove(key: key) removeExpectation.fulfill() } catch { @@ -85,10 +85,10 @@ final class StorageStressTests: XCTestCase { } } } - + await fulfillment(of: [uploadExpectation, removeExpectation], timeout: 60) } - + /// Given: A very large data object(100MB) /// When: Upload the data /// Then: The operation completes successfully @@ -105,7 +105,7 @@ final class StorageStressTests: XCTestCase { XCTAssertEqual(uploadKey, key) uploadExpectation.fulfill() - + try await Amplify.Storage.remove(key: key) removeExpectation.fulfill() } catch { @@ -113,7 +113,7 @@ final class StorageStressTests: XCTestCase { } await fulfillment(of: [uploadExpectation, removeExpectation], timeout: 180) } - + /// Given: An object in storage /// When: Object is downloaded simultaneously from 10 tasks /// Then: The operation completes successfully with the data retrieved @@ -127,7 +127,7 @@ final class StorageStressTests: XCTestCase { let removeExpectation = expectation(description: "Data object removed successfully") removeExpectation.expectedFulfillmentCount = concurrencyLimit - for _ in 1...concurrencyLimit { + for _ in 1 ... concurrencyLimit { Task { let key = UUID().uuidString let uploadKey = try await Amplify.Storage.uploadData(key: key, @@ -135,18 +135,18 @@ final class StorageStressTests: XCTestCase { options: nil).value XCTAssertEqual(uploadKey, key) uploadExpectation.fulfill() - + _ = try await Amplify.Storage.downloadData(key: key, options: .init()).value downloadExpectation.fulfill() - + try await Amplify.Storage.remove(key: key) removeExpectation.fulfill() } } - + await fulfillment(of: [downloadExpectation, uploadExpectation, removeExpectation], timeout: 60) } - + /// Given: A very large data object(100MB) in storage /// When: Download the data /// Then: The operation completes successfully @@ -164,10 +164,10 @@ final class StorageStressTests: XCTestCase { XCTAssertEqual(uploadKey, key) uploadExpectation.fulfill() - + let _ = try await Amplify.Storage.downloadData(key: key, options: .init()).value downloadExpectation.fulfill() - + try await Amplify.Storage.remove(key: key) removeExpectation.fulfill() } catch { @@ -176,9 +176,9 @@ final class StorageStressTests: XCTestCase { await fulfillment(of: [downloadExpectation, uploadExpectation, removeExpectation], timeout: 180) } - + // MARK: - Helper Functions - + func signUp() async { guard !Self.isFirstUserSignedUp, !Self.isSecondUserSignedUp else { return @@ -231,7 +231,8 @@ final class StorageStressTests: XCTestCase { private func invalidateCurrentSession() { Self.logger.debug("Invalidating URLSession") guard let plugin = try? Amplify.Storage.getPlugin(for: "awsS3StoragePlugin") as? AWSS3StoragePlugin, - let service = plugin.storageService as? AWSS3StorageService else { + let service = plugin.storageService as? AWSS3StorageService + else { print("Unable to to cast to AWSS3StorageService") return } From 3a2d81a5074b971086a0b67e6f412829dee39107 Mon Sep 17 00:00:00 2001 From: Tuan Pham Date: Mon, 9 Sep 2024 16:39:06 -0500 Subject: [PATCH 2/3] updated swiftformat rules --- ...SS3StoragePlugin+AsyncClientBehavior.swift | 108 ++++--- .../AWSS3StoragePlugin+Configure.swift | 99 ++++--- .../AWSS3StoragePlugin.swift | 3 +- .../Configuration/AWSS3PluginOptions.swift | 10 +- .../AWSS3PluginPrefixResolver.swift | 28 +- .../AWSS3StoragePluginConfiguration.swift | 3 +- .../Dependency/AWSS3Adapter.swift | 34 ++- .../AWSS3ListObjectsV2Request.swift | 17 +- .../AWSS3PreSignedURLBuilderAdapter.swift | 22 +- .../AWSS3PreSignedURLBuilderBehavior.swift | 12 +- .../UploadPartInput+presignURL.swift | 24 +- .../AWSS3StorageDownloadDataOperation.swift | 27 +- .../AWSS3StorageDownloadFileOperation.swift | 25 +- .../AWSS3StorageRemoveOperation.swift | 23 +- .../AWSS3StorageUploadDataOperation.swift | 30 +- .../AWSS3StorageUploadFileOperation.swift | 36 +-- .../StorageGetURLRequest+Validate.swift | 7 +- .../StorageDownloadDataRequest+Validate.swift | 7 +- .../StorageDownloadFileRequest+Validate.swift | 7 +- .../Request/StorageListRequest+Validate.swift | 7 +- ...AWSS3StorageService+DownloadBehavior.swift | 42 +-- ...orageService+GetPreSignedURLBehavior.swift | 13 +- .../AWSS3StorageService+ListBehavior.swift | 28 +- ...orageService+MultiPartUploadBehavior.swift | 41 +-- .../AWSS3StorageService+UploadBehavior.swift | 58 ++-- .../Service/Storage/AWSS3StorageService.swift | 121 ++++---- .../Storage/AWSS3StorageServiceBehavior.swift | 66 +++-- .../Constants/PluginErrorConstants.swift | 36 ++- .../Constants/StorageErrorConstants.swift | 33 ++- .../Support/Internal/Attempt.swift | 14 +- .../CreateMultipartUploadRequest.swift | 20 +- .../DefaultStorageTransferDatabase.swift | 58 ++-- .../Internal/StorageConfiguration.swift | 11 +- .../Internal/StorageMultipartUpload.swift | 9 +- .../StorageMultipartUploadClient.swift | 17 +- .../StorageMultipartUploadSession.swift | 48 ++-- .../StoragePersistableTransferTask.swift | 14 +- .../StorageServiceSessionDelegate.swift | 3 +- .../Internal/StorageTransferDatabase.swift | 17 +- .../Internal/StorageTransferResponse.swift | 21 +- .../Internal/StorageTransferTask.swift | 37 +-- .../Internal/StorageTransferTaskPair.swift | 10 +- .../Utils/StorageRequestUtils+Getter.swift | 9 +- .../Utils/StorageRequestUtils+Validator.swift | 69 +++-- .../Tasks/AWSS3StorageListObjectsTask.swift | 29 +- .../Tasks/AWSS3StorageRemoveTask.swift | 18 +- .../Tasks/AWSS3torageGetURLTask.swift | 13 +- ...uginAmplifyOutputsConfigurationTests.swift | 12 +- ...AWSS3StoragePluginAsyncBehaviorTests.swift | 34 ++- .../AWSS3StoragePluginConfigureTests.swift | 60 ++-- ...SS3StoragePluginGetPresignedUrlTests.swift | 10 +- .../AWSS3StoragePluginTestBase.swift | 10 +- .../AWSS3PluginPrefixResolverTests.swift | 10 +- ...AWSS3StoragePluginConfigurationTests.swift | 7 +- .../Mocks/MockAWSS3PreSignedURLBuilder.swift | 3 +- .../Mocks/MockAWSS3StorageService.swift | 59 ++-- ...SS3StorageDownloadFileOperationTests.swift | 202 ++++++++------ .../AWSS3StorageGetDataOperationTests.swift | 97 ++++--- .../AWSS3StoragePutDataOperationTests.swift | 198 +++++++------ .../AWSS3StorageRemoveOperationTests.swift | 55 ++-- ...AWSS3StorageUploadFileOperationTests.swift | 263 +++++++++++------- ...WSS3StorageUploadFileOperationTests2.swift | 22 +- ...AWSS3StorageDownloadFileRequestTests.swift | 40 ++- .../AWSS3StorageGetDataRequestTests.swift | 40 ++- .../AWSS3StorageGetURLRequestTests.swift | 50 ++-- .../AWSS3StorageListRequestTests.swift | 40 +-- .../AWSS3StoragePutDataRequestTests.swift | 50 ++-- .../AWSS3StorageRemoveRequestTests.swift | 12 +- .../AWSS3StorageUploadFileRequestTests.swift | 50 ++-- ...eServiceGetPreSignedURLBehaviorTests.swift | 58 ++-- .../AWSS3StorageServiceListTests.swift | 38 ++- .../Storage/AWSS3StorageServiceTests.swift | 16 +- .../Support/Internal/AttemptTests.swift | 12 +- ...ultStorageMultipartUploadClientTests.swift | 3 +- .../DefaultStorageTransferDatabaseTests.swift | 3 +- .../MockStorageTransferDatabase.swift | 24 +- .../StoragePersistableTransferTaskTests.swift | 101 ++++--- .../StorageTransferDatabaseTests.swift | 99 ++++--- .../Internal/StorageUploadPartSizeTests.swift | 16 +- .../StorageRequestUtilsGetterTests.swift | 55 ++-- .../Tasks/AWSS3StorageGetURLTaskTests.swift | 30 +- .../AWSS3StorageListObjectsTaskTests.swift | 36 ++- .../Tasks/AWSS3StorageRemoveTaskTests.swift | 30 +- ...ragePluginAccelerateIntegrationTests.swift | 46 +-- .../AWSS3StoragePluginAccessLevelTests.swift | 46 +-- ...S3StoragePluginBasicIntegrationTests.swift | 48 ++-- ...agePluginListObjectsIntegrationTests.swift | 12 +- .../AWSS3StoragePluginNegativeTests.swift | 8 +- .../AWSS3StoragePluginProgressTests.swift | 3 +- ...3StoragePluginRemoveIntegrationTests.swift | 6 +- .../AWSS3StoragePluginRequestRecorder.swift | 3 +- .../AWSS3StoragePluginTestBase.swift | 22 +- ...3StoragePluginUploadIntegrationTests.swift | 16 +- .../Helpers/AuthSignInHelper.swift | 9 +- .../StorageStressTests.swift | 30 +- 95 files changed, 2066 insertions(+), 1412 deletions(-) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+AsyncClientBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+AsyncClientBehavior.swift index f6510aa195..dd9c295130 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+AsyncClientBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+AsyncClientBehavior.swift @@ -24,8 +24,10 @@ public extension AWSS3StoragePlugin { throw error } let prefixResolver = storageConfiguration.prefixResolver ?? StorageAccessLevelAwarePrefixResolver(authService: authService) - let prefix = try await prefixResolver.resolvePrefix(for: options.accessLevel, - targetIdentityId: options.targetIdentityId) + let prefix = try await prefixResolver.resolvePrefix( + for: options.accessLevel, + targetIdentityId: options.targetIdentityId + ) let serviceKey = prefix + request.key if let pluginOptions = options.pluginOptions as? AWSStorageGetURLOptions, pluginOptions.validateObjectExistence { try await storageService.validateObjectExistence(serviceKey: serviceKey) @@ -37,7 +39,8 @@ public extension AWSS3StoragePlugin { signingOperation: .getObject, metadata: nil, accelerate: accelerate, - expires: options.expires) + expires: options.expires + ) let channel = HubChannel(from: categoryType) let payload = HubPayload(eventName: HubPayload.EventName.Storage.getURL, context: options, data: result) @@ -53,7 +56,8 @@ public extension AWSS3StoragePlugin { let request = StorageGetURLRequest(path: path, options: options) let task = AWSS3StorageGetURLTask( request, - storageBehaviour: storageService) + storageBehaviour: storageService + ) return try await task.value } @@ -63,10 +67,12 @@ public extension AWSS3StoragePlugin { ) -> StorageDownloadDataTask { let options = options ?? StorageDownloadDataRequest.Options() let request = StorageDownloadDataRequest(path: path, options: options) - let operation = AWSS3StorageDownloadDataOperation(request, - storageConfiguration: storageConfiguration, - storageService: storageService, - authService: authService) + let operation = AWSS3StorageDownloadDataOperation( + request, + storageConfiguration: storageConfiguration, + storageService: storageService, + authService: authService + ) let taskAdapter = AmplifyInProcessReportingOperationTaskAdapter(operation: operation) queue.addOperation(operation) @@ -80,10 +86,12 @@ public extension AWSS3StoragePlugin { ) -> StorageDownloadDataTask { let options = options ?? StorageDownloadDataRequest.Options() let request = StorageDownloadDataRequest(key: key, options: options) - let operation = AWSS3StorageDownloadDataOperation(request, - storageConfiguration: storageConfiguration, - storageService: storageService, - authService: authService) + let operation = AWSS3StorageDownloadDataOperation( + request, + storageConfiguration: storageConfiguration, + storageService: storageService, + authService: authService + ) let taskAdapter = AmplifyInProcessReportingOperationTaskAdapter(operation: operation) queue.addOperation(operation) @@ -98,10 +106,12 @@ public extension AWSS3StoragePlugin { ) -> StorageDownloadFileTask { let options = options ?? StorageDownloadFileRequest.Options() let request = StorageDownloadFileRequest(key: key, local: local, options: options) - let operation = AWSS3StorageDownloadFileOperation(request, - storageConfiguration: storageConfiguration, - storageService: storageService, - authService: authService) + let operation = AWSS3StorageDownloadFileOperation( + request, + storageConfiguration: storageConfiguration, + storageService: storageService, + authService: authService + ) let taskAdapter = AmplifyInProcessReportingOperationTaskAdapter(operation: operation) queue.addOperation(operation) @@ -116,10 +126,12 @@ public extension AWSS3StoragePlugin { ) -> StorageDownloadFileTask { let options = options ?? StorageDownloadFileRequest.Options() let request = StorageDownloadFileRequest(path: path, local: local, options: options) - let operation = AWSS3StorageDownloadFileOperation(request, - storageConfiguration: storageConfiguration, - storageService: storageService, - authService: authService) + let operation = AWSS3StorageDownloadFileOperation( + request, + storageConfiguration: storageConfiguration, + storageService: storageService, + authService: authService + ) let taskAdapter = AmplifyInProcessReportingOperationTaskAdapter(operation: operation) queue.addOperation(operation) @@ -134,10 +146,12 @@ public extension AWSS3StoragePlugin { ) -> StorageUploadDataTask { let options = options ?? StorageUploadDataRequest.Options() let request = StorageUploadDataRequest(key: key, data: data, options: options) - let operation = AWSS3StorageUploadDataOperation(request, - storageConfiguration: storageConfiguration, - storageService: storageService, - authService: authService) + let operation = AWSS3StorageUploadDataOperation( + request, + storageConfiguration: storageConfiguration, + storageService: storageService, + authService: authService + ) let taskAdapter = AmplifyInProcessReportingOperationTaskAdapter(operation: operation) queue.addOperation(operation) @@ -152,10 +166,12 @@ public extension AWSS3StoragePlugin { ) -> StorageUploadDataTask { let options = options ?? StorageUploadDataRequest.Options() let request = StorageUploadDataRequest(path: path, data: data, options: options) - let operation = AWSS3StorageUploadDataOperation(request, - storageConfiguration: storageConfiguration, - storageService: storageService, - authService: authService) + let operation = AWSS3StorageUploadDataOperation( + request, + storageConfiguration: storageConfiguration, + storageService: storageService, + authService: authService + ) let taskAdapter = AmplifyInProcessReportingOperationTaskAdapter(operation: operation) queue.addOperation(operation) @@ -170,10 +186,12 @@ public extension AWSS3StoragePlugin { ) -> StorageUploadFileTask { let options = options ?? StorageUploadFileRequest.Options() let request = StorageUploadFileRequest(key: key, local: local, options: options) - let operation = AWSS3StorageUploadFileOperation(request, - storageConfiguration: storageConfiguration, - storageService: storageService, - authService: authService) + let operation = AWSS3StorageUploadFileOperation( + request, + storageConfiguration: storageConfiguration, + storageService: storageService, + authService: authService + ) let taskAdapter = AmplifyInProcessReportingOperationTaskAdapter(operation: operation) queue.addOperation(operation) @@ -188,10 +206,12 @@ public extension AWSS3StoragePlugin { ) -> StorageUploadFileTask { let options = options ?? StorageUploadFileRequest.Options() let request = StorageUploadFileRequest(path: path, local: local, options: options) - let operation = AWSS3StorageUploadFileOperation(request, - storageConfiguration: storageConfiguration, - storageService: storageService, - authService: authService) + let operation = AWSS3StorageUploadFileOperation( + request, + storageConfiguration: storageConfiguration, + storageService: storageService, + authService: authService + ) let taskAdapter = AmplifyInProcessReportingOperationTaskAdapter(operation: operation) queue.addOperation(operation) @@ -205,10 +225,12 @@ public extension AWSS3StoragePlugin { ) async throws -> String { let options = options ?? StorageRemoveRequest.Options() let request = StorageRemoveRequest(key: key, options: options) - let operation = AWSS3StorageRemoveOperation(request, - storageConfiguration: storageConfiguration, - storageService: storageService, - authService: authService) + let operation = AWSS3StorageRemoveOperation( + request, + storageConfiguration: storageConfiguration, + storageService: storageService, + authService: authService + ) let taskAdapter = AmplifyOperationTaskAdapter(operation: operation) queue.addOperation(operation) @@ -225,7 +247,8 @@ public extension AWSS3StoragePlugin { let task = AWSS3StorageRemoveTask( request, storageConfiguration: storageConfiguration, - storageBehaviour: storageService) + storageBehaviour: storageService + ) return try await task.value } @@ -253,7 +276,8 @@ public extension AWSS3StoragePlugin { let task = AWSS3StorageListObjectsTask( request, storageConfiguration: storageConfiguration, - storageBehaviour: storageService) + storageBehaviour: storageService + ) return try await task.value } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+Configure.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+Configure.swift index 6bc82747f2..1e6885560a 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+Configure.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin+Configure.swift @@ -32,21 +32,26 @@ extension AWSS3StoragePlugin { } else { throw PluginError.pluginConfigurationError( PluginErrorConstants.decodeConfigurationError.errorDescription, - PluginErrorConstants.decodeConfigurationError.recoverySuggestion) + PluginErrorConstants.decodeConfigurationError.recoverySuggestion + ) } do { let authService = AWSAuthService() let defaultAccessLevel = try configClosures.retrieveDefaultAccessLevel() - let storageService = try AWSS3StorageService(authService: authService, - region: configClosures.retrieveRegion(), - bucket: configClosures.retrieveBucket(), - httpClientEngineProxy: httpClientEngineProxy) + let storageService = try AWSS3StorageService( + authService: authService, + region: configClosures.retrieveRegion(), + bucket: configClosures.retrieveBucket(), + httpClientEngineProxy: httpClientEngineProxy + ) storageService.urlRequestDelegate = urlRequestDelegate - configure(storageService: storageService, - authService: authService, - defaultAccessLevel: defaultAccessLevel) + configure( + storageService: storageService, + authService: authService, + defaultAccessLevel: defaultAccessLevel + ) } catch let storageError as StorageError { throw storageError } catch { @@ -55,7 +60,8 @@ extension AWSS3StoragePlugin { """ There was an error configuring the plugin. See the underlying error for more details. """, - error) + error + ) throw amplifyError } } @@ -71,11 +77,12 @@ extension AWSS3StoragePlugin { /// - authService: The authentication service object. /// - defaultAccessLevel: The access level to be used for all API calls by default. /// - queue: The queue which operations are stored and dispatched for asychronous processing. - func configure(storageService: AWSS3StorageServiceBehavior, - authService: AWSAuthServiceBehavior, - defaultAccessLevel: StorageAccessLevel, - queue: OperationQueue = OperationQueue()) - { + func configure( + storageService: AWSS3StorageServiceBehavior, + authService: AWSAuthServiceBehavior, + defaultAccessLevel: StorageAccessLevel, + queue: OperationQueue = OperationQueue() + ) { self.storageService = storageService self.authService = authService self.queue = queue @@ -94,7 +101,8 @@ extension AWSS3StoragePlugin { guard let storage = configuration.storage else { throw PluginError.pluginConfigurationError( PluginErrorConstants.missingStorageCategoryConfiguration.errorDescription, - PluginErrorConstants.missingStorageCategoryConfiguration.recoverySuggestion) + PluginErrorConstants.missingStorageCategoryConfiguration.recoverySuggestion + ) } let regionClosure = { @@ -107,37 +115,46 @@ extension AWSS3StoragePlugin { return storage.bucketName } - return ConfigurationClosures(retrieveRegion: regionClosure, - retrieveBucket: bucketClosure, - retrieveDefaultAccessLevel: { .guest }) + return ConfigurationClosures( + retrieveRegion: regionClosure, + retrieveBucket: bucketClosure, + retrieveDefaultAccessLevel: { .guest } + ) } private func retrieveConfiguration(_ configuration: JSONValue) throws -> ConfigurationClosures { guard case let .object(configObject) = configuration else { throw StorageError.configuration( PluginErrorConstants.configurationObjectExpected.errorDescription, - PluginErrorConstants.configurationObjectExpected.recoverySuggestion) + PluginErrorConstants.configurationObjectExpected.recoverySuggestion + ) } let regionClosure = { try AWSS3StoragePlugin.getRegion(configObject) } let bucketClosure = { try AWSS3StoragePlugin.getBucket(configObject) } let defaultAccessLevelClosure = { try AWSS3StoragePlugin.getDefaultAccessLevel(configObject) } - return ConfigurationClosures(retrieveRegion: regionClosure, - retrieveBucket: bucketClosure, - retrieveDefaultAccessLevel: defaultAccessLevelClosure) + return ConfigurationClosures( + retrieveRegion: regionClosure, + retrieveBucket: bucketClosure, + retrieveDefaultAccessLevel: defaultAccessLevelClosure + ) } /// Retrieves the region from configuration, validates, and returns it. private static func getRegion(_ configuration: [String: JSONValue]) throws -> String { guard let region = configuration[PluginConstants.region] else { - throw PluginError.pluginConfigurationError(PluginErrorConstants.missingRegion.errorDescription, - PluginErrorConstants.missingRegion.recoverySuggestion) + throw PluginError.pluginConfigurationError( + PluginErrorConstants.missingRegion.errorDescription, + PluginErrorConstants.missingRegion.recoverySuggestion + ) } guard case let .string(regionValue) = region else { - throw PluginError.pluginConfigurationError(PluginErrorConstants.invalidRegion.errorDescription, - PluginErrorConstants.invalidRegion.recoverySuggestion) + throw PluginError.pluginConfigurationError( + PluginErrorConstants.invalidRegion.errorDescription, + PluginErrorConstants.invalidRegion.recoverySuggestion + ) } try validateRegionNonEmpty(regionValue) @@ -147,21 +164,27 @@ extension AWSS3StoragePlugin { private static func validateRegionNonEmpty(_ region: String) throws { if region.isEmpty { - throw PluginError.pluginConfigurationError(PluginErrorConstants.emptyRegion.errorDescription, - PluginErrorConstants.emptyRegion.recoverySuggestion) + throw PluginError.pluginConfigurationError( + PluginErrorConstants.emptyRegion.errorDescription, + PluginErrorConstants.emptyRegion.recoverySuggestion + ) } } /// Retrieves the bucket from configuration, validates, and returns it. private static func getBucket(_ configuration: [String: JSONValue]) throws -> String { guard let bucket = configuration[PluginConstants.bucket] else { - throw PluginError.pluginConfigurationError(PluginErrorConstants.missingBucket.errorDescription, - PluginErrorConstants.missingBucket.recoverySuggestion) + throw PluginError.pluginConfigurationError( + PluginErrorConstants.missingBucket.errorDescription, + PluginErrorConstants.missingBucket.recoverySuggestion + ) } guard case let .string(bucketValue) = bucket else { - throw PluginError.pluginConfigurationError(PluginErrorConstants.invalidBucket.errorDescription, - PluginErrorConstants.invalidBucket.recoverySuggestion) + throw PluginError.pluginConfigurationError( + PluginErrorConstants.invalidBucket.errorDescription, + PluginErrorConstants.invalidBucket.recoverySuggestion + ) } try validateBucketNonEmpty(bucketValue) @@ -171,8 +194,10 @@ extension AWSS3StoragePlugin { private static func validateBucketNonEmpty(_ bucket: String) throws { if bucket.isEmpty { - throw PluginError.pluginConfigurationError(PluginErrorConstants.emptyBucket.errorDescription, - PluginErrorConstants.emptyBucket.recoverySuggestion) + throw PluginError.pluginConfigurationError( + PluginErrorConstants.emptyBucket.errorDescription, + PluginErrorConstants.emptyBucket.recoverySuggestion + ) } } @@ -183,14 +208,16 @@ extension AWSS3StoragePlugin { guard case let .string(defaultAccessLevelString) = defaultAccessLevelConfig else { throw PluginError.pluginConfigurationError( PluginErrorConstants.invalidDefaultAccessLevel.errorDescription, - PluginErrorConstants.invalidDefaultAccessLevel.recoverySuggestion) + PluginErrorConstants.invalidDefaultAccessLevel.recoverySuggestion + ) } let defaultAccessLevelOptional = StorageAccessLevel.init(rawValue: defaultAccessLevelString) guard let defaultAccessLevel = defaultAccessLevelOptional else { throw PluginError.pluginConfigurationError( PluginErrorConstants.invalidDefaultAccessLevel.errorDescription, - PluginErrorConstants.invalidDefaultAccessLevel.recoverySuggestion) + PluginErrorConstants.invalidDefaultAccessLevel.recoverySuggestion + ) } return defaultAccessLevel diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin.swift index 32b1409114..1a1faacfbf 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/AWSS3StoragePlugin.swift @@ -48,8 +48,7 @@ public final class AWSS3StoragePlugin: StorageCategoryPlugin { /// /// - Tag: AWSS3StoragePlugin.init public init(configuration - storageConfiguration: AWSS3StoragePluginConfiguration = AWSS3StoragePluginConfiguration()) - { + storageConfiguration: AWSS3StoragePluginConfiguration = AWSS3StoragePluginConfiguration()) { self.storageConfiguration = storageConfiguration } } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3PluginOptions.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3PluginOptions.swift index dfe446cacf..7aa7f13b95 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3PluginOptions.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3PluginOptions.swift @@ -37,10 +37,12 @@ enum AWSS3PluginOptions { return nil } guard let boolValue = value as? Bool else { - throw StorageError.validation(CodingKeys.useAccelerateEndpoint.rawValue, - "Expecting boolean value for key \(CodingKeys.useAccelerateEndpoint.rawValue)", - "Ensure the value associated with \(CodingKeys.useAccelerateEndpoint.rawValue) is a boolean", - nil) + throw StorageError.validation( + CodingKeys.useAccelerateEndpoint.rawValue, + "Expecting boolean value for key \(CodingKeys.useAccelerateEndpoint.rawValue)", + "Ensure the value associated with \(CodingKeys.useAccelerateEndpoint.rawValue) is a boolean", + nil + ) } return boolValue } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3PluginPrefixResolver.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3PluginPrefixResolver.swift index 0ebd0b332a..2c2a908cd0 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3PluginPrefixResolver.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3PluginPrefixResolver.swift @@ -15,8 +15,10 @@ import Foundation @available(*, deprecated) public protocol AWSS3PluginPrefixResolver { /// - Tag: AWSS3PluginPrefixResolver.resolvePrefix - func resolvePrefix(for accessLevel: StorageAccessLevel, - targetIdentityId: String?) async throws -> String + func resolvePrefix( + for accessLevel: StorageAccessLevel, + targetIdentityId: String? + ) async throws -> String } /// Convenience resolver. Resolves the provided key as-is, with no manipulation @@ -24,9 +26,10 @@ public protocol AWSS3PluginPrefixResolver { /// - Tag: PassThroughPrefixResolver @available(*, deprecated) public struct PassThroughPrefixResolver: AWSS3PluginPrefixResolver { - public func resolvePrefix(for accessLevel: StorageAccessLevel, - targetIdentityId: String?) async throws -> String - { + public func resolvePrefix( + for accessLevel: StorageAccessLevel, + targetIdentityId: String? + ) async throws -> String { "" } } @@ -45,14 +48,17 @@ struct StorageAccessLevelAwarePrefixResolver { } extension StorageAccessLevelAwarePrefixResolver: AWSS3PluginPrefixResolver { - func resolvePrefix(for accessLevel: StorageAccessLevel, - targetIdentityId: String?) async throws -> String - { + func resolvePrefix( + for accessLevel: StorageAccessLevel, + targetIdentityId: String? + ) async throws -> String { do { let identityId = try await authService.getIdentityID() - let prefix = StorageRequestUtils.getAccessLevelPrefix(accessLevel: accessLevel, - identityId: identityId, - targetIdentityId: targetIdentityId) + let prefix = StorageRequestUtils.getAccessLevelPrefix( + accessLevel: accessLevel, + identityId: identityId, + targetIdentityId: targetIdentityId + ) return prefix } catch { guard let authError = error as? AuthError else { diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3StoragePluginConfiguration.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3StoragePluginConfiguration.swift index e5d73628c1..63ec95ba5e 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3StoragePluginConfiguration.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Configuration/AWSS3StoragePluginConfiguration.swift @@ -24,8 +24,7 @@ public struct AWSS3StoragePluginConfiguration { /// - Tag: AWSS3StoragePluginConfiguration.prefixResolverFunc @available(*, deprecated, message: "Use `StoragePath` instead") public static func prefixResolver( - _ prefixResolver: AWSS3PluginPrefixResolver) -> AWSS3StoragePluginConfiguration - { + _ prefixResolver: AWSS3PluginPrefixResolver) -> AWSS3StoragePluginConfiguration { .init(prefixResolver: prefixResolver) } } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3Adapter.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3Adapter.swift index cd829d5bab..7899bc4f45 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3Adapter.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3Adapter.swift @@ -52,12 +52,14 @@ class AWSS3Adapter: AWSS3Behavior { if let prefix = request.prefix { finalPrefix = prefix + (request.path ?? "") } - let input = ListObjectsV2Input(bucket: request.bucket, - continuationToken: request.continuationToken, - delimiter: request.delimiter, - maxKeys: request.maxKeys, - prefix: finalPrefix, - startAfter: request.startAfter) + let input = ListObjectsV2Input( + bucket: request.bucket, + continuationToken: request.continuationToken, + delimiter: request.delimiter, + maxKeys: request.maxKeys, + prefix: finalPrefix, + startAfter: request.startAfter + ) do { let response = try await awsS3.listObjectsV2(input: input) let contents: S3BucketContents = response.contents ?? [] @@ -80,15 +82,17 @@ class AWSS3Adapter: AWSS3Behavior { /// - completion: handler which returns a result with uploadId func createMultipartUpload(_ request: CreateMultipartUploadRequest, completion: @escaping (Result) -> Void) { Task { - let input = CreateMultipartUploadInput(bucket: request.bucket, - cacheControl: request.cacheControl, - contentDisposition: request.contentDisposition, - contentEncoding: request.contentEncoding, - contentLanguage: request.contentLanguage, - contentType: request.contentType, - expires: request.expires, - key: request.key, - metadata: request.metadata) + let input = CreateMultipartUploadInput( + bucket: request.bucket, + cacheControl: request.cacheControl, + contentDisposition: request.contentDisposition, + contentEncoding: request.contentEncoding, + contentLanguage: request.contentLanguage, + contentType: request.contentType, + expires: request.expires, + key: request.key, + metadata: request.metadata + ) do { let response = try await awsS3.createMultipartUpload(input: input) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3ListObjectsV2Request.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3ListObjectsV2Request.swift index 18476e2e06..cee82d228d 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3ListObjectsV2Request.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3ListObjectsV2Request.swift @@ -22,14 +22,15 @@ struct AWSS3ListObjectsV2Request { let maxKeys: Int let startAfter: String? - init(bucket: String, - prefix: String? = nil, - path: String? = nil, - continuationToken: String? = nil, - delimiter: String? = nil, - maxKeys: Int = 1_000, - startAfter: String? = nil) - { + init( + bucket: String, + prefix: String? = nil, + path: String? = nil, + continuationToken: String? = nil, + delimiter: String? = nil, + maxKeys: Int = 1_000, + startAfter: String? = nil + ) { self.bucket = bucket self.prefix = prefix self.path = path diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderAdapter.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderAdapter.swift index 86ae3fc1d5..ce050aef55 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderAdapter.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderAdapter.swift @@ -32,12 +32,13 @@ class AWSS3PreSignedURLBuilderAdapter: AWSS3PreSignedURLBuilderBehavior { /// Gets pre-signed URL. /// - Returns: Pre-Signed URL - func getPreSignedURL(key: String, - signingOperation: AWSS3SigningOperation, - metadata: [String: String]? = nil, - accelerate: Bool? = nil, - expires: Int64? = nil) async throws -> 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)) let expiration = expiresDate.timeIntervalSinceNow let config = try config.withAccelerate(accelerate) @@ -47,17 +48,20 @@ class AWSS3PreSignedURLBuilderAdapter: AWSS3PreSignedURLBuilderBehavior { let input = GetObjectInput(bucket: bucket, key: key) preSignedUrl = try await input.presignURL( config: config, - expiration: expiration) + expiration: expiration + ) case .putObject: let input = PutObjectInput(bucket: bucket, key: key, metadata: metadata) preSignedUrl = try await input.presignURL( config: config, - expiration: expiration) + expiration: expiration + ) case .uploadPart(let partNumber, let uploadId): let input = UploadPartInput(bucket: bucket, key: key, partNumber: partNumber, uploadId: uploadId) preSignedUrl = try await input.customPresignURL( config: config, - expiration: expiration) + expiration: expiration + ) } guard let escapedURL = urlWithEscapedToken(preSignedUrl) else { throw AWSS3PreSignedURLBuilderError.failed(reason: "Failed to get presigned URL.", error: nil) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderBehavior.swift index 32fb00174d..f30ff3c32a 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/AWSS3PreSignedURLBuilderBehavior.swift @@ -39,10 +39,12 @@ protocol AWSS3PreSignedURLBuilderBehavior { /// - Returns: Pre-Signed URL /// /// - Tag: AWSS3PreSignedURLBuilderBehavior.getPreSignedURL - func getPreSignedURL(key: String, - signingOperation: AWSS3SigningOperation, - metadata: [String: String]?, - accelerate: Bool?, - expires: Int64?) async throws -> URL + func getPreSignedURL( + key: String, + signingOperation: AWSS3SigningOperation, + metadata: [String: String]?, + accelerate: Bool?, + expires: Int64? + ) async throws -> URL } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/UploadPartInput+presignURL.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/UploadPartInput+presignURL.swift index 60603efd93..0f93f17e3f 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/UploadPartInput+presignURL.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Dependency/UploadPartInput+presignURL.swift @@ -28,7 +28,8 @@ extension UploadPartInput { .build() var operation = ClientRuntime.OperationStack(id: "uploadPart") operation.initializeStep.intercept( - position: .after, middleware: ClientRuntime.URLPathMiddleware(UploadPartInput.urlPathProvider(_:))) + position: .after, middleware: ClientRuntime.URLPathMiddleware(UploadPartInput.urlPathProvider(_:)) + ) operation.initializeStep.intercept(position: .after, middleware: ClientRuntime.URLHostMiddleware()) operation.buildStep.intercept( position: .before, @@ -38,25 +39,32 @@ extension UploadPartInput { ) ) operation.serializeStep.intercept( - position: .after, middleware: ClientRuntime.QueryItemMiddleware(UploadPartInput.queryItemProvider(_:))) + position: .after, middleware: ClientRuntime.QueryItemMiddleware(UploadPartInput.queryItemProvider(_:)) + ) operation.finalizeStep.intercept( position: .after, middleware: ClientRuntime.RetryMiddleware( - options: config.retryStrategyOptions)) + options: config.retryStrategyOptions) + ) let sigv4Config = AWSClientRuntime.SigV4Config( signatureType: .requestQueryParams, useDoubleURIEncode: false, expiration: expiration, unsignedBody: true, - signingAlgorithm: .sigv4) + signingAlgorithm: .sigv4 + ) operation.finalizeStep.intercept( - position: .before, middleware: AWSClientRuntime.SigV4Middleware(config: sigv4Config)) + position: .before, middleware: AWSClientRuntime.SigV4Middleware(config: sigv4Config) + ) operation.deserializeStep.intercept( - position: .after, middleware: ClientRuntime.LoggerMiddleware(clientLogMode: config.clientLogMode)) + position: .after, middleware: ClientRuntime.LoggerMiddleware(clientLogMode: config.clientLogMode) + ) operation.deserializeStep.intercept( - position: .after, middleware: AWSClientRuntime.AWSS3ErrorWith200StatusXMLMiddleware()) + position: .after, middleware: AWSClientRuntime.AWSS3ErrorWith200StatusXMLMiddleware() + ) let presignedRequestBuilder = try await operation.presignedRequest( - context: context, input: input, output: UploadPartOutput(), next: ClientRuntime.NoopHandler()) + context: context, input: input, output: UploadPartOutput(), next: ClientRuntime.NoopHandler() + ) guard let builtRequest = presignedRequestBuilder?.build(), let presignedURL = builtRequest.endpoint.url else { return nil } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageDownloadDataOperation.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageDownloadDataOperation.swift index b1767631d2..b83bb0c81c 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageDownloadDataOperation.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageDownloadDataOperation.swift @@ -30,22 +30,25 @@ class AWSS3StorageDownloadDataOperation: AmplifyInProcessReportingOperation< // Serial queue for synchronizing access to `storageTaskReference`. private let storageTaskActionQueue = DispatchQueue(label: "com.amazonaws.amplify.StorageTaskActionQueue") - init(_ request: StorageDownloadDataRequest, - storageConfiguration: AWSS3StoragePluginConfiguration, - storageService: AWSS3StorageServiceBehavior, - authService: AWSAuthServiceBehavior, - progressListener: InProcessListener? = nil, - resultListener: ResultListener? = nil) - { + init( + _ request: StorageDownloadDataRequest, + storageConfiguration: AWSS3StoragePluginConfiguration, + storageService: AWSS3StorageServiceBehavior, + authService: AWSAuthServiceBehavior, + progressListener: InProcessListener? = nil, + resultListener: ResultListener? = nil + ) { self.storageConfiguration = storageConfiguration self.storageService = storageService self.authService = authService - super.init(categoryType: .storage, - eventName: HubPayload.EventName.Storage.downloadData, - request: request, - inProcessListener: progressListener, - resultListener: resultListener) + super.init( + categoryType: .storage, + eventName: HubPayload.EventName.Storage.downloadData, + request: request, + inProcessListener: progressListener, + resultListener: resultListener + ) } /// Pauses operation. diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageDownloadFileOperation.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageDownloadFileOperation.swift index 28e4aae652..b0a272e447 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageDownloadFileOperation.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageDownloadFileOperation.swift @@ -32,22 +32,25 @@ class AWSS3StorageDownloadFileOperation: AmplifyInProcessReportingOperation< // Serial queue for synchronizing access to `storageTaskReference`. private let storageTaskActionQueue = DispatchQueue(label: "com.amazonaws.amplify.StorageTaskActionQueue") - init(_ request: StorageDownloadFileRequest, - storageConfiguration: AWSS3StoragePluginConfiguration, - storageService: AWSS3StorageServiceBehavior, - authService: AWSAuthServiceBehavior, - progressListener: InProcessListener? = nil, - resultListener: ResultListener? = nil + init( + _ request: StorageDownloadFileRequest, + storageConfiguration: AWSS3StoragePluginConfiguration, + storageService: AWSS3StorageServiceBehavior, + authService: AWSAuthServiceBehavior, + progressListener: InProcessListener? = nil, + resultListener: ResultListener? = nil ) { self.storageConfiguration = storageConfiguration self.storageService = storageService self.authService = authService - super.init(categoryType: .storage, - eventName: HubPayload.EventName.Storage.downloadFile, - request: request, - inProcessListener: progressListener, - resultListener: resultListener) + super.init( + categoryType: .storage, + eventName: HubPayload.EventName.Storage.downloadFile, + request: request, + inProcessListener: progressListener, + resultListener: resultListener + ) } /// Pauses operation. diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageRemoveOperation.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageRemoveOperation.swift index 763f639a04..a1d8da11a6 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageRemoveOperation.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageRemoveOperation.swift @@ -24,20 +24,23 @@ class AWSS3StorageRemoveOperation: AmplifyOperation< let storageService: AWSS3StorageServiceBehavior let authService: AWSAuthServiceBehavior - init(_ request: StorageRemoveRequest, - storageConfiguration: AWSS3StoragePluginConfiguration, - storageService: AWSS3StorageServiceBehavior, - authService: AWSAuthServiceBehavior, - resultListener: ResultListener? = nil) - { + init( + _ request: StorageRemoveRequest, + storageConfiguration: AWSS3StoragePluginConfiguration, + storageService: AWSS3StorageServiceBehavior, + authService: AWSAuthServiceBehavior, + resultListener: ResultListener? = nil + ) { self.storageConfiguration = storageConfiguration self.storageService = storageService self.authService = authService - super.init(categoryType: .storage, - eventName: HubPayload.EventName.Storage.remove, - request: request, - resultListener: resultListener) + super.init( + categoryType: .storage, + eventName: HubPayload.EventName.Storage.remove, + request: request, + resultListener: resultListener + ) } /// Perform the task to remove item. diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageUploadDataOperation.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageUploadDataOperation.swift index 5aa81db86d..a3fdf916a6 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageUploadDataOperation.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageUploadDataOperation.swift @@ -30,22 +30,25 @@ class AWSS3StorageUploadDataOperation: AmplifyInProcessReportingOperation< /// Serial queue for synchronizing access to `storageTaskReference`. private let storageTaskActionQueue = DispatchQueue(label: "com.amazonaws.amplify.StorageTaskActionQueue") - init(_ request: StorageUploadDataRequest, - storageConfiguration: AWSS3StoragePluginConfiguration, - storageService: AWSS3StorageServiceBehavior, - authService: AWSAuthServiceBehavior, - progressListener: InProcessListener? = nil, - resultListener: ResultListener? = nil) - { + init( + _ request: StorageUploadDataRequest, + storageConfiguration: AWSS3StoragePluginConfiguration, + storageService: AWSS3StorageServiceBehavior, + authService: AWSAuthServiceBehavior, + progressListener: InProcessListener? = nil, + resultListener: ResultListener? = nil + ) { self.storageConfiguration = storageConfiguration self.storageService = storageService self.authService = authService - super.init(categoryType: .storage, - eventName: HubPayload.EventName.Storage.uploadData, - request: request, - inProcessListener: progressListener, - resultListener: resultListener) + super.init( + categoryType: .storage, + eventName: HubPayload.EventName.Storage.uploadData, + request: request, + inProcessListener: progressListener, + resultListener: resultListener + ) } /// Pauses operation. @@ -131,8 +134,7 @@ class AWSS3StorageUploadDataOperation: AmplifyInProcessReportingOperation< } private func onServiceEvent( - event: StorageEvent) - { + event: StorageEvent) { switch event { case .initiated(let reference): storageTaskActionQueue.async { diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageUploadFileOperation.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageUploadFileOperation.swift index 8144cb1901..1d8201e711 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageUploadFileOperation.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Operation/AWSS3StorageUploadFileOperation.swift @@ -30,22 +30,25 @@ class AWSS3StorageUploadFileOperation: AmplifyInProcessReportingOperation< /// Serial queue for synchronizing access to `storageTaskReference`. private let storageTaskActionQueue = DispatchQueue(label: "com.amazonaws.amplify.StorageTaskActionQueue") - init(_ request: StorageUploadFileRequest, - storageConfiguration: AWSS3StoragePluginConfiguration, - storageService: AWSS3StorageServiceBehavior, - authService: AWSAuthServiceBehavior, - progressListener: InProcessListener? = nil, - resultListener: ResultListener? = nil) - { + init( + _ request: StorageUploadFileRequest, + storageConfiguration: AWSS3StoragePluginConfiguration, + storageService: AWSS3StorageServiceBehavior, + authService: AWSAuthServiceBehavior, + progressListener: InProcessListener? = nil, + resultListener: ResultListener? = nil + ) { self.storageConfiguration = storageConfiguration self.storageService = storageService self.authService = authService - super.init(categoryType: .storage, - eventName: HubPayload.EventName.Storage.uploadFile, - request: request, - inProcessListener: progressListener, - resultListener: resultListener) + super.init( + categoryType: .storage, + eventName: HubPayload.EventName.Storage.uploadFile, + request: request, + inProcessListener: progressListener, + resultListener: resultListener + ) } /// Pauses operation. @@ -89,8 +92,10 @@ class AWSS3StorageUploadFileOperation: AmplifyInProcessReportingOperation< // failed silently on access denied. if FileManager.default.fileExists(atPath: request.local.path) { guard FileManager.default.isReadableFile(atPath: request.local.path) else { - dispatch(StorageError.accessDenied("Access to local file denied: \(request.local.path)", - "Please ensure that \(request.local) is readable")) + dispatch(StorageError.accessDenied( + "Access to local file denied: \(request.local.path)", + "Please ensure that \(request.local) is readable" + )) finish() return } @@ -154,8 +159,7 @@ class AWSS3StorageUploadFileOperation: AmplifyInProcessReportingOperation< } private func onServiceEvent( - event: StorageEvent) - { + event: StorageEvent) { switch event { case .initiated(let reference): storageTaskActionQueue.async { diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/GetURL/StorageGetURLRequest+Validate.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/GetURL/StorageGetURLRequest+Validate.swift index 076d09cd8d..b3e050deab 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/GetURL/StorageGetURLRequest+Validate.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/GetURL/StorageGetURLRequest+Validate.swift @@ -11,9 +11,10 @@ import Foundation extension StorageGetURLRequest { /// Performs client side validation and returns a `StorageError` for any validation failures. func validate() -> StorageError? { - if let error = StorageRequestUtils.validateTargetIdentityId(options.targetIdentityId, - accessLevel: options.accessLevel) - { + if let error = StorageRequestUtils.validateTargetIdentityId( + options.targetIdentityId, + accessLevel: options.accessLevel + ) { return error } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageDownloadDataRequest+Validate.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageDownloadDataRequest+Validate.swift index 2b362a9478..2f090e6721 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageDownloadDataRequest+Validate.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageDownloadDataRequest+Validate.swift @@ -16,9 +16,10 @@ extension StorageDownloadDataRequest { // at during execution of request operation where the path is resolved return nil } - if let error = StorageRequestUtils.validateTargetIdentityId(options.targetIdentityId, - accessLevel: options.accessLevel) - { + if let error = StorageRequestUtils.validateTargetIdentityId( + options.targetIdentityId, + accessLevel: options.accessLevel + ) { return error } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageDownloadFileRequest+Validate.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageDownloadFileRequest+Validate.swift index 0945e28414..79de947f55 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageDownloadFileRequest+Validate.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageDownloadFileRequest+Validate.swift @@ -16,9 +16,10 @@ extension StorageDownloadFileRequest { // at during execution of request operation where the path is resolved return nil } - if let error = StorageRequestUtils.validateTargetIdentityId(options.targetIdentityId, - accessLevel: options.accessLevel) - { + if let error = StorageRequestUtils.validateTargetIdentityId( + options.targetIdentityId, + accessLevel: options.accessLevel + ) { return error } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageListRequest+Validate.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageListRequest+Validate.swift index 028f37917e..288195e494 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageListRequest+Validate.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Request/StorageListRequest+Validate.swift @@ -11,9 +11,10 @@ import Foundation extension StorageListRequest { /// Performs client side validation and returns a `StorageError` for any validation failures. func validate() -> StorageError? { - if let error = StorageRequestUtils.validateTargetIdentityId(options.targetIdentityId, - accessLevel: options.accessLevel) - { + if let error = StorageRequestUtils.validateTargetIdentityId( + options.targetIdentityId, + accessLevel: options.accessLevel + ) { return error } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+DownloadBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+DownloadBehavior.swift index 6a6c3f84f2..e1ef301bf2 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+DownloadBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+DownloadBehavior.swift @@ -10,11 +10,12 @@ import Foundation extension AWSS3StorageService { - func download(serviceKey: String, - fileURL: URL?, - accelerate: Bool?, - onEvent: @escaping StorageServiceDownloadEventHandler) - { + func download( + serviceKey: String, + fileURL: URL?, + accelerate: Bool?, + onEvent: @escaping StorageServiceDownloadEventHandler + ) { let fail: (Error) -> Void = { error in let storageError = StorageError(error: error) onEvent(.failed(storageError)) @@ -22,18 +23,22 @@ extension AWSS3StorageService { guard try attempt(validateParameters(bucket: bucket, key: serviceKey, accelerationModeEnabled: false), fail: fail) else { return } - let transferTask = createTransferTask(transferType: .download(onEvent: onEvent), - bucket: bucket, - key: serviceKey, - location: fileURL) + let transferTask = createTransferTask( + transferType: .download(onEvent: onEvent), + bucket: bucket, + key: serviceKey, + location: fileURL + ) Task { do { - let preSignedURL = try await preSignedURLBuilder.getPreSignedURL(key: serviceKey, - signingOperation: .getObject, - metadata: nil, - accelerate: accelerate, - expires: nil) + let preSignedURL = try await preSignedURLBuilder.getPreSignedURL( + key: serviceKey, + signingOperation: .getObject, + metadata: nil, + accelerate: accelerate, + expires: nil + ) await startDownload(preSignedURL: preSignedURL, transferTask: transferTask) } catch { onEvent(.failed(StorageError.unknown("Failed to get pre-signed URL", nil))) @@ -41,10 +46,11 @@ extension AWSS3StorageService { } } - private func startDownload(preSignedURL: URL, - transferTask: StorageTransferTask, - startTransfer: Bool = true) async - { + private func startDownload( + preSignedURL: URL, + transferTask: StorageTransferTask, + startTransfer: Bool = true + ) async { guard case .download = transferTask.transferType else { fatalError("Transfer type must be download") } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+GetPreSignedURLBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+GetPreSignedURLBehavior.swift index c7981e8461..ea5561ac50 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+GetPreSignedURLBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+GetPreSignedURLBehavior.swift @@ -12,12 +12,13 @@ import Foundation extension AWSS3StorageService { - func getPreSignedURL(serviceKey: String, - signingOperation: AWSS3SigningOperation, - metadata: [String: String]?, - accelerate: Bool?, - expires: Int) async throws -> URL - { + 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, diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+ListBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+ListBehavior.swift index 0c938e5043..3148a90a5b 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+ListBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+ListBehavior.swift @@ -13,12 +13,14 @@ import Foundation extension AWSS3StorageService { - func list(prefix: String, - options: StorageListRequest.Options) async throws -> StorageListResult - { - if let error = StorageRequestUtils.validateTargetIdentityId(options.targetIdentityId, - accessLevel: options.accessLevel) - { + func list( + prefix: String, + options: StorageListRequest.Options + ) async throws -> StorageListResult { + if let error = StorageRequestUtils.validateTargetIdentityId( + options.targetIdentityId, + accessLevel: options.accessLevel + ) { throw error } if let error = StorageRequestUtils.validatePath(options.path) { @@ -30,12 +32,14 @@ extension AWSS3StorageService { } else { prefix } - let input = ListObjectsV2Input(bucket: bucket, - continuationToken: options.nextToken, - delimiter: options.subpathStrategy.delimiter, - maxKeys: Int(options.pageSize), - prefix: finalPrefix, - startAfter: nil) + let input = ListObjectsV2Input( + bucket: bucket, + continuationToken: options.nextToken, + delimiter: options.subpathStrategy.delimiter, + maxKeys: Int(options.pageSize), + prefix: finalPrefix, + startAfter: nil + ) do { let response = try await client.listObjectsV2(input: input) let contents: S3BucketContents = response.contents ?? [] diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+MultiPartUploadBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+MultiPartUploadBehavior.swift index 0c8c1e2c35..b8b2308266 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+MultiPartUploadBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+MultiPartUploadBehavior.swift @@ -10,13 +10,14 @@ import Foundation extension AWSS3StorageService { - func multiPartUpload(serviceKey: String, - uploadSource: UploadSource, - contentType: String?, - metadata: [String: String]?, - accelerate: Bool?, - onEvent: @escaping StorageServiceMultiPartUploadEventHandler) - { + func multiPartUpload( + serviceKey: String, + uploadSource: UploadSource, + contentType: String?, + metadata: [String: String]?, + accelerate: Bool?, + onEvent: @escaping StorageServiceMultiPartUploadEventHandler + ) { let fail: (Error) -> Void = { error in let storageError = StorageError(error: error) onEvent(.failed(storageError)) @@ -30,17 +31,21 @@ extension AWSS3StorageService { // Get file using upload source guard let uploadFile = try attempt(uploadSource.getFile(), fail: fail) else { return } - let client = DefaultStorageMultipartUploadClient(serviceProxy: self, - bucket: bucket, - key: serviceKey, - uploadFile: uploadFile, - metadata: metadata) - let multipartUploadSession = StorageMultipartUploadSession(client: client, - bucket: bucket, - key: serviceKey, - contentType: contentType, - requestHeaders: requestHeaders, - onEvent: onEvent) + let client = DefaultStorageMultipartUploadClient( + serviceProxy: self, + bucket: bucket, + key: serviceKey, + uploadFile: uploadFile, + metadata: metadata + ) + let multipartUploadSession = StorageMultipartUploadSession( + client: client, + bucket: bucket, + key: serviceKey, + contentType: contentType, + requestHeaders: requestHeaders, + onEvent: onEvent + ) register(multipartUploadSession: multipartUploadSession) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+UploadBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+UploadBehavior.swift index 48c382a8b8..5a6d8bfa39 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+UploadBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService+UploadBehavior.swift @@ -10,13 +10,14 @@ import Foundation extension AWSS3StorageService { - func upload(serviceKey: String, - uploadSource: UploadSource, - contentType: String?, - metadata: [String: String]?, - accelerate: Bool?, - onEvent: @escaping StorageServiceUploadEventHandler) - { + func upload( + serviceKey: String, + uploadSource: UploadSource, + contentType: String?, + metadata: [String: String]?, + accelerate: Bool?, + onEvent: @escaping StorageServiceUploadEventHandler + ) { let fail: (Error) -> Void = { error in let storageError = StorageError(error: error) onEvent(.failed(storageError)) @@ -25,9 +26,11 @@ extension AWSS3StorageService { guard try attempt(validateParameters(bucket: bucket, key: serviceKey, accelerationModeEnabled: false), fail: fail) else { return } Task { - let transferTask = createTransferTask(transferType: .upload(onEvent: onEvent), - bucket: bucket, - key: serviceKey) + let transferTask = createTransferTask( + transferType: .upload(onEvent: onEvent), + bucket: bucket, + key: serviceKey + ) let uploadFileURL: URL guard let uploadFile = try attempt(uploadSource.getFile(), fail: fail) else { return } uploadFileURL = uploadFile.fileURL @@ -35,27 +38,32 @@ extension AWSS3StorageService { let contentType = contentType ?? "application/octet-stream" do { - let preSignedURL = try await preSignedURLBuilder.getPreSignedURL(key: serviceKey, - signingOperation: .putObject, - metadata: metadata, - accelerate: accelerate, - expires: nil) - await startUpload(preSignedURL: preSignedURL, - fileURL: uploadFileURL, - contentType: contentType, - transferTask: transferTask) + let preSignedURL = try await preSignedURLBuilder.getPreSignedURL( + key: serviceKey, + signingOperation: .putObject, + metadata: metadata, + accelerate: accelerate, + expires: nil + ) + await startUpload( + preSignedURL: preSignedURL, + fileURL: uploadFileURL, + contentType: contentType, + transferTask: transferTask + ) } catch { onEvent(.failed(StorageError.unknown("Failed to get pre-signed URL", nil))) } } } - func startUpload(preSignedURL: URL, - fileURL: URL, - contentType: String, - transferTask: StorageTransferTask, - startTransfer: Bool = true) async - { + func startUpload( + preSignedURL: URL, + fileURL: URL, + contentType: String, + transferTask: StorageTransferTask, + startTransfer: Bool = true + ) async { guard case .upload = transferTask.transferType else { fatalError("Transfer type must be upload") } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService.swift index e105405bdc..f0736a88a8 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageService.swift @@ -53,17 +53,18 @@ class AWSS3StorageService: AWSS3StorageServiceBehavior, StorageServiceProxy { storageConfiguration.sessionIdentifier } - convenience init(authService: AWSAuthCredentialsProviderBehavior, - region: String, - bucket: String, - httpClientEngineProxy: HttpClientEngineProxy? = nil, - storageConfiguration: StorageConfiguration = .default, - storageTransferDatabase: StorageTransferDatabase = .default, - fileSystem: FileSystem = .default, - sessionConfiguration: URLSessionConfiguration? = nil, - delegateQueue: OperationQueue? = nil, - logger: Logger = storageLogger) throws - { + convenience init( + authService: AWSAuthCredentialsProviderBehavior, + region: String, + bucket: String, + httpClientEngineProxy: HttpClientEngineProxy? = nil, + storageConfiguration: StorageConfiguration = .default, + storageTransferDatabase: StorageTransferDatabase = .default, + fileSystem: FileSystem = .default, + sessionConfiguration: URLSessionConfiguration? = nil, + delegateQueue: OperationQueue? = nil, + logger: Logger = storageLogger + ) throws { let credentialsProvider = authService.getCredentialsProvider() let clientConfig = try S3Client.S3ClientConfiguration( region: region, @@ -101,30 +102,33 @@ class AWSS3StorageService: AWSS3StorageServiceBehavior, StorageServiceProxy { sessionConfig.sharedContainerIdentifier = storageConfiguration.sharedContainerIdentifier - self.init(authService: authService, - storageConfiguration: storageConfiguration, - storageTransferDatabase: storageTransferDatabase, - fileSystem: fileSystem, - sessionConfiguration: sessionConfig, - logger: logger, - s3Client: s3Client, - preSignedURLBuilder: preSignedURLBuilder, - awsS3: awsS3, - bucket: bucket) + self.init( + authService: authService, + storageConfiguration: storageConfiguration, + storageTransferDatabase: storageTransferDatabase, + fileSystem: fileSystem, + sessionConfiguration: sessionConfig, + logger: logger, + s3Client: s3Client, + preSignedURLBuilder: preSignedURLBuilder, + awsS3: awsS3, + bucket: bucket + ) } - init(authService: AWSAuthCredentialsProviderBehavior, - storageConfiguration: StorageConfiguration = .default, - storageTransferDatabase: StorageTransferDatabase = .default, - fileSystem: FileSystem = .default, - sessionConfiguration: URLSessionConfiguration, - delegateQueue: OperationQueue? = nil, - logger: Logger = storageLogger, - s3Client: S3Client, - preSignedURLBuilder: AWSS3PreSignedURLBuilderBehavior, - awsS3: AWSS3Behavior, - bucket: String) - { + init( + authService: AWSAuthCredentialsProviderBehavior, + storageConfiguration: StorageConfiguration = .default, + storageTransferDatabase: StorageTransferDatabase = .default, + fileSystem: FileSystem = .default, + sessionConfiguration: URLSessionConfiguration, + delegateQueue: OperationQueue? = nil, + logger: Logger = storageLogger, + s3Client: S3Client, + preSignedURLBuilder: AWSS3PreSignedURLBuilderBehavior, + awsS3: AWSS3Behavior, + bucket: String + ) { self.storageConfiguration = storageConfiguration self.storageTransferDatabase = storageTransferDatabase self.fileSystem = fileSystem @@ -176,10 +180,11 @@ class AWSS3StorageService: AWSS3StorageServiceBehavior, StorageServiceProxy { urlSession = URLSession(configuration: sessionConfiguration, delegate: delegate, delegateQueue: delegateQueue) } - func attachEventHandlers(onUpload: AWSS3StorageServiceBehavior.StorageServiceUploadEventHandler? = nil, - onDownload: AWSS3StorageServiceBehavior.StorageServiceDownloadEventHandler? = nil, - onMultipartUpload: AWSS3StorageServiceBehavior.StorageServiceMultiPartUploadEventHandler? = nil) - { + func attachEventHandlers( + onUpload: AWSS3StorageServiceBehavior.StorageServiceUploadEventHandler? = nil, + onDownload: AWSS3StorageServiceBehavior.StorageServiceDownloadEventHandler? = nil, + onMultipartUpload: AWSS3StorageServiceBehavior.StorageServiceMultiPartUploadEventHandler? = nil + ) { storageTransferDatabase.attachEventHandlers(onUpload: onUpload, onDownload: onDownload, onMultipartUpload: onMultipartUpload) } @@ -187,12 +192,13 @@ class AWSS3StorageService: AWSS3StorageServiceBehavior, StorageServiceProxy { for pair in pairs { register(task: pair.transferTask) if let multipartUpload = pair.multipartUpload, - let uploadFile = multipartUpload.uploadFile - { - let client = DefaultStorageMultipartUploadClient(serviceProxy: self, - bucket: pair.transferTask.bucket, - key: pair.transferTask.key, - uploadFile: uploadFile) + let uploadFile = multipartUpload.uploadFile { + let client = DefaultStorageMultipartUploadClient( + serviceProxy: self, + bucket: pair.transferTask.bucket, + key: pair.transferTask.key, + uploadFile: uploadFile + ) guard let session = StorageMultipartUploadSession( client: client, transferTask: pair.transferTask, @@ -267,19 +273,22 @@ class AWSS3StorageService: AWSS3StorageServiceBehavior, StorageServiceProxy { } } - func createTransferTask(transferType: StorageTransferType, - bucket: String, - key: String, - location: URL? = nil, - requestHeaders: [String: String]? = nil) -> StorageTransferTask - { - let transferTask = StorageTransferTask(transferType: transferType, - bucket: bucket, - key: key, - location: location, - requestHeaders: requestHeaders, - storageTransferDatabase: storageTransferDatabase, - logger: logger) + func createTransferTask( + transferType: StorageTransferType, + bucket: String, + key: String, + location: URL? = nil, + requestHeaders: [String: String]? = nil + ) -> StorageTransferTask { + let transferTask = StorageTransferTask( + transferType: transferType, + bucket: bucket, + key: key, + location: location, + requestHeaders: requestHeaders, + storageTransferDatabase: storageTransferDatabase, + logger: logger + ) return transferTask } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageServiceBehavior.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageServiceBehavior.swift index ae3c74818c..5f4d670216 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageServiceBehavior.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Service/Storage/AWSS3StorageServiceBehavior.swift @@ -43,38 +43,50 @@ protocol AWSS3StorageServiceBehavior { func getEscapeHatch() -> S3Client - func download(serviceKey: String, - fileURL: URL?, - accelerate: Bool?, - onEvent: @escaping StorageServiceDownloadEventHandler) - - func getPreSignedURL(serviceKey: String, - signingOperation: AWSS3SigningOperation, - metadata: [String: String]?, - accelerate: Bool?, - expires: Int) async throws -> URL + func download( + serviceKey: String, + fileURL: URL?, + accelerate: Bool?, + onEvent: @escaping StorageServiceDownloadEventHandler + ) + + func getPreSignedURL( + serviceKey: String, + signingOperation: AWSS3SigningOperation, + metadata: [String: String]?, + accelerate: Bool?, + expires: Int + ) async throws -> URL func validateObjectExistence(serviceKey: String) async throws - func upload(serviceKey: String, - uploadSource: UploadSource, - contentType: String?, - metadata: [String: String]?, - accelerate: Bool?, - onEvent: @escaping StorageServiceUploadEventHandler) - - func multiPartUpload(serviceKey: String, - uploadSource: UploadSource, - contentType: String?, - metadata: [String: String]?, - accelerate: Bool?, - onEvent: @escaping StorageServiceMultiPartUploadEventHandler) + func upload( + serviceKey: String, + uploadSource: UploadSource, + contentType: String?, + metadata: [String: String]?, + accelerate: Bool?, + onEvent: @escaping StorageServiceUploadEventHandler + ) + + func multiPartUpload( + serviceKey: String, + uploadSource: UploadSource, + contentType: String?, + metadata: [String: String]?, + accelerate: Bool?, + onEvent: @escaping StorageServiceMultiPartUploadEventHandler + ) @available(*, deprecated, message: "Use `AWSS3StorageListObjectsTask` instead") - func list(prefix: String, - options: StorageListRequest.Options) async throws -> StorageListResult + func list( + prefix: String, + options: StorageListRequest.Options + ) async throws -> StorageListResult @available(*, deprecated, message: "Use `AWSS3StorageRemoveTask` instead") - func delete(serviceKey: String, - onEvent: @escaping StorageServiceDeleteEventHandler) + func delete( + serviceKey: String, + onEvent: @escaping StorageServiceDeleteEventHandler + ) } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Constants/PluginErrorConstants.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Constants/PluginErrorConstants.swift index b6b9be0c17..b644fc2ad1 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Constants/PluginErrorConstants.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Constants/PluginErrorConstants.swift @@ -13,50 +13,62 @@ typealias PluginErrorString = (errorDescription: ErrorDescription, recoverySugge enum PluginErrorConstants { static let decodeConfigurationError: PluginErrorString = ( "Unable to decode configuration", - "Make sure the plugin configuration is JSONValue") + "Make sure the plugin configuration is JSONValue" + ) static let configurationObjectExpected: PluginErrorString = ( "Configuration was not a dictionary literal", - "Make sure the value for the plugin is a dictionary literal with keys 'Bucket' and 'Region'") + "Make sure the value for the plugin is a dictionary literal with keys 'Bucket' and 'Region'" + ) static let missingStorageCategoryConfiguration: PluginErrorString = ( "Plugin is missing `Storage` category in configuration.", - "Add the `Storage` section to the configuration.") + "Add the `Storage` section to the configuration." + ) static let missingBucket: PluginErrorString = ( "The 'Bucket' key is missing from the configuration", - "Make sure 'Bucket' is in the dictionary for the plugin configuration") + "Make sure 'Bucket' is in the dictionary for the plugin configuration" + ) static let invalidBucket: PluginErrorString = ( "The bucket is invalid", - "The bucket should be a string value") + "The bucket should be a string value" + ) static let emptyBucket: PluginErrorString = ( "The bucket value is empty", - "Add the bucket as the value to the 'Bucket' key in the plugin configuration") + "Add the bucket as the value to the 'Bucket' key in the plugin configuration" + ) static let missingRegion: PluginErrorString = ( "The 'Region' key is missing from the configuration", - "Make sure 'Region' is in the dictionary for the plugin configuration") + "Make sure 'Region' is in the dictionary for the plugin configuration" + ) static let emptyRegion: PluginErrorString = ( "The region value is empty", - "Add the region as the value to the 'Region' key in the plugin configuration") + "Add the region as the value to the 'Region' key in the plugin configuration" + ) static let invalidRegion: PluginErrorString = ( "The region is invalid", - "Make sure the region is of the AWS regions, like 'us-east-1', etc...") + "Make sure the region is of the AWS regions, like 'us-east-1', etc..." + ) static let invalidDefaultAccessLevel: PluginErrorString = ( "The default access level specified is invalid", - "Specify an override with one of the valid access level values such as 'guest', 'protected', or 'private'.") + "Specify an override with one of the valid access level values such as 'guest', 'protected', or 'private'." + ) static let serviceConfigurationInitializationError: PluginErrorString = ( "Could not initialize service configuration", - "This should not happen") + "This should not happen" + ) static let transferUtilityInitializationError: PluginErrorString = ( "Could not initialize transfer utility", - "This should not happen") + "This should not happen" + ) } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Constants/StorageErrorConstants.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Constants/StorageErrorConstants.swift index bb97a21811..f87c1ef9f9 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Constants/StorageErrorConstants.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Constants/StorageErrorConstants.swift @@ -8,9 +8,11 @@ import Amplify import Foundation -typealias StorageValidationErrorString = (field: Field, +typealias StorageValidationErrorString = ( + field: Field, errorDescription: ErrorDescription, - recoverySuggestion: RecoverySuggestion) + recoverySuggestion: RecoverySuggestion +) typealias StorageServiceErrorString = (errorDescription: ErrorDescription, recoverySuggestion: RecoverySuggestion) enum StorageErrorConstants { @@ -18,22 +20,26 @@ enum StorageErrorConstants { static let identityIdIsEmpty: StorageValidationErrorString = ( "targetIdentityId", "The `targetIdentityId` is specified but is empty.", - "Specify a non-empty identityId of the target user you wish to use.") + "Specify a non-empty identityId of the target user you wish to use." + ) static let keyIsEmpty: StorageValidationErrorString = ( "key", "The `key` is specified but is empty.", - "Specify a non-empty key.") + "Specify a non-empty key." + ) static let expiresIsInvalid: StorageValidationErrorString = ( "expire", "The `expire` field is out of range.", - "Specify a positive expire time in seconds like 3600 for an one hour expiry time.") + "Specify a positive expire time in seconds like 3600 for an one hour expiry time." + ) static let pathIsEmpty: StorageValidationErrorString = ( "path", "The `path` is specified but is empty.", - "Specify a non-empty path") + "Specify a non-empty path" + ) // TODO content type messaging static let contentTypeIsEmpty: StorageValidationErrorString = ( @@ -42,7 +48,8 @@ enum StorageErrorConstants { """ Either do not specify a contentType and it will default to TODO or specify a correct MIME type like X, Y, Z representing the type of the object you are uploading. For more information, please see X - """) + """ + ) static let invalidAccessLevelWithTarget: StorageValidationErrorString = ( "accessLevel", @@ -51,19 +58,23 @@ enum StorageErrorConstants { An action can only be performed on a target user by specifying the `targetIdentityId` with an accessLevel of protected. Perform an action on your own user with private `accessLevel` by removing the `targetIdentityId` or change the `accessLevel` to protected and specify the target user to perform the action. - """) + """ + ) static let localFileNotFound: StorageValidationErrorString = ( "local", "The file located at the `local` URL is missing", - "Make sure the file exists before uploading to storage.") + "Make sure the file exists before uploading to storage." + ) static let metadataKeysInvalid: StorageValidationErrorString = ( "metadata", "The keys in `metadata` dictionary is invalid.", - "The values of the keys can only be lowercased.") + "The values of the keys can only be lowercased." + ) static let accessDenied: StorageServiceErrorString = ( "Access denied!", - "") + "" + ) } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/Attempt.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/Attempt.swift index 6f855375f1..451a203f28 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/Attempt.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/Attempt.swift @@ -12,9 +12,10 @@ import Foundation /// - expression: expression /// - fail: error handler /// - Returns: optional result -func attempt(_ expression: @autoclosure () throws -> T, - fail: @autoclosure () -> ((Swift.Error) -> Void)) -> T? -{ +func attempt( + _ expression: @autoclosure () throws -> T, + fail: @autoclosure () -> ((Swift.Error) -> Void) +) -> T? { do { return try expression() } catch { @@ -29,9 +30,10 @@ func attempt(_ expression: @autoclosure () throws -> T, /// - fail: error handler /// - Returns: success @discardableResult -func attempt(_ expression: @autoclosure () throws -> Void, - fail: @autoclosure () -> ((Swift.Error) -> Void)) -> Bool -{ +func attempt( + _ expression: @autoclosure () throws -> Void, + fail: @autoclosure () -> ((Swift.Error) -> Void) +) -> Bool { do { try expression() return true diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/CreateMultipartUploadRequest.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/CreateMultipartUploadRequest.swift index e5f30beff7..447bec910d 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/CreateMultipartUploadRequest.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/CreateMultipartUploadRequest.swift @@ -19,15 +19,17 @@ struct CreateMultipartUploadRequest { let contentType: String? let metadata: [String: String]? - init(bucket: String, key: String, - expires: Date? = nil, - cacheControl: String? = nil, - contentDisposition: String? = nil, - contentEncoding: String? = nil, - contentLanguage: String? = nil, - contentType: String? = nil, - metadata: [String: String]? = nil) - { + init( + bucket: String, + key: String, + expires: Date? = nil, + cacheControl: String? = nil, + contentDisposition: String? = nil, + contentEncoding: String? = nil, + contentLanguage: String? = nil, + contentType: String? = nil, + metadata: [String: String]? = nil + ) { self.bucket = bucket self.key = key diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/DefaultStorageTransferDatabase.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/DefaultStorageTransferDatabase.swift index c5078000db..9bc16db406 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/DefaultStorageTransferDatabase.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/DefaultStorageTransferDatabase.swift @@ -57,38 +57,42 @@ class DefaultStorageTransferDatabase { // TODO: observe application state changes to trigger call to prepareForBackground } - func recover(urlSession: StorageURLSession = URLSession.shared, - completionHandler: @escaping (Result) -> Void) - { + func recover( + urlSession: StorageURLSession = URLSession.shared, + completionHandler: @escaping (Result) -> Void + ) { queue.async { [weak self] in guard let self else { fatalError("self cannot be weak") } loadTasksAndLinkSessions(urlSession: urlSession, completionHandler: completionHandler) } } - func linkTasksWithSessions(persistableTransferTasks: [TransferID: StoragePersistableTransferTask], - sessionTasks: StorageSessionTasks) -> StorageTransferTaskPairs - { + func linkTasksWithSessions( + persistableTransferTasks: [TransferID: StoragePersistableTransferTask], + sessionTasks: StorageSessionTasks + ) -> StorageTransferTaskPairs { let transferTasks: [StorageTransferTask] = persistableTransferTasks.reduce(into: []) { tasks, pair in // match sessionTask to persistableTransferTask with taskIdentifier let persistableTransferTask = pair.value if let taskIdentifier = persistableTransferTask.taskIdentifier, let transferType = defaultTransferType(persistableTransferTask: persistableTransferTask), - let sessionTask = sessionTasks.first(where: { $0.taskIdentifier == taskIdentifier}) - { - let transferTask = StorageTransferTask(persistableTransferTask: persistableTransferTask, - transferType: transferType, - sessionTask: sessionTask, - storageTransferDatabase: self, - logger: logger) + let sessionTask = sessionTasks.first(where: { $0.taskIdentifier == taskIdentifier}) { + let transferTask = StorageTransferTask( + persistableTransferTask: persistableTransferTask, + transferType: transferType, + sessionTask: sessionTask, + storageTransferDatabase: self, + logger: logger + ) tasks.append(transferTask) } else if persistableTransferTask.transferTypeRawValue == StorageTransferType.RawValues.multiPartUpload.rawValue, - let transferType = defaultTransferType(persistableTransferTask: persistableTransferTask) - { - let transferTask = StorageTransferTask(persistableTransferTask: persistableTransferTask, - transferType: transferType, - storageTransferDatabase: self, - logger: logger) + let transferType = defaultTransferType(persistableTransferTask: persistableTransferTask) { + let transferTask = StorageTransferTask( + persistableTransferTask: persistableTransferTask, + transferType: transferType, + storageTransferDatabase: self, + logger: logger + ) tasks.append(transferTask) } } @@ -149,9 +153,10 @@ class DefaultStorageTransferDatabase { return persistableTransferTasks } - private func loadTasksAndLinkSessions(urlSession: StorageURLSession = URLSession.shared, - completionHandler: @escaping (Result) -> Void) - { + private func loadTasksAndLinkSessions( + urlSession: StorageURLSession = URLSession.shared, + completionHandler: @escaping (Result) -> Void + ) { dispatchPrecondition(condition: .notOnQueue(.main)) dispatchPrecondition(condition: .onQueue(queue)) @@ -342,10 +347,11 @@ extension DefaultStorageTransferDatabase: StorageTransferDatabase { return transferType } - func attachEventHandlers(onUpload: AWSS3StorageServiceBehavior.StorageServiceUploadEventHandler?, - onDownload: AWSS3StorageServiceBehavior.StorageServiceDownloadEventHandler?, - onMultipartUpload: AWSS3StorageServiceBehavior.StorageServiceMultiPartUploadEventHandler?) - { + func attachEventHandlers( + onUpload: AWSS3StorageServiceBehavior.StorageServiceUploadEventHandler?, + onDownload: AWSS3StorageServiceBehavior.StorageServiceDownloadEventHandler?, + onMultipartUpload: AWSS3StorageServiceBehavior.StorageServiceMultiPartUploadEventHandler? + ) { queue.async { [weak self] in guard let self else { fatalError("self cannot be weak") } uploadEventHandler = onUpload diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageConfiguration.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageConfiguration.swift index b0d854b6b2..2ab78afd2a 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageConfiguration.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageConfiguration.swift @@ -22,11 +22,12 @@ struct StorageConfiguration { static let `default`: StorageConfiguration = .init() - init(sessionIdentifier: String = Defaults.sessionIdentifier, - sharedContainerIdentifier: String = Defaults.sharedContainerIdentifier, - allowsCellularAccess: Bool = Defaults.allowsCellularAccess, - timeoutIntervalForResource: TimeInterval = Defaults.timeoutIntervalForResource) - { + init( + sessionIdentifier: String = Defaults.sessionIdentifier, + sharedContainerIdentifier: String = Defaults.sharedContainerIdentifier, + allowsCellularAccess: Bool = Defaults.allowsCellularAccess, + timeoutIntervalForResource: TimeInterval = Defaults.timeoutIntervalForResource + ) { self.sessionIdentifier = sessionIdentifier self.sharedContainerIdentifier = sharedContainerIdentifier self.allowsCellularAccess = allowsCellularAccess diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUpload.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUpload.swift index d2c6431fa2..7362ba1025 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUpload.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUpload.swift @@ -313,10 +313,11 @@ enum StorageMultipartUpload { self = .failed(uploadId: uploadId, parts: parts, error: error) } - private mutating func createParts(uploadFile: UploadFile, - uploadId: UploadID, - logger: Logger = storageLogger) throws - { + private mutating func createParts( + uploadFile: UploadFile, + uploadId: UploadID, + logger: Logger = storageLogger + ) throws { let partSize = try StorageUploadPartSize(fileSize: uploadFile.size) let parts = try StorageUploadParts(fileSize: uploadFile.size, partSize: partSize, logger: logger) self = .parts(uploadId: uploadId, uploadFile: uploadFile, partSize: partSize, parts: parts) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadClient.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadClient.swift index 29977d67f3..5573645e0c 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadClient.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadClient.swift @@ -44,14 +44,15 @@ class DefaultStorageMultipartUploadClient: StorageMultipartUploadClient { 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, - metadata: [String: String]? = nil + init( + serviceProxy: StorageServiceProxy, + fileSystem: FileSystem = .default, + bucket: String, + key: String, + uploadFile: UploadFile, + contentType: String? = nil, + requestHeaders: RequestHeaders? = nil, + metadata: [String: String]? = nil ) { self.serviceProxy = serviceProxy self.fileSystem = fileSystem diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadSession.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadSession.swift index ce344d607a..08dc2584db 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadSession.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageMultipartUploadSession.swift @@ -44,24 +44,27 @@ class StorageMultipartUploadSession { private let transferTask: StorageTransferTask - init(client: StorageMultipartUploadClient, - bucket: String, - key: String, - contentType: String? = nil, - requestHeaders: RequestHeaders? = nil, - onEvent: @escaping AWSS3StorageServiceBehavior.StorageServiceMultiPartUploadEventHandler, - behavior: StorageMultipartUploadBehavior = .progressive, - fileSystem: FileSystem = .default, - logger: Logger = storageLogger) - { + init( + client: StorageMultipartUploadClient, + bucket: String, + key: String, + contentType: String? = nil, + requestHeaders: RequestHeaders? = nil, + onEvent: @escaping AWSS3StorageServiceBehavior.StorageServiceMultiPartUploadEventHandler, + behavior: StorageMultipartUploadBehavior = .progressive, + fileSystem: FileSystem = .default, + logger: Logger = storageLogger + ) { self.client = client let transferType: StorageTransferType = .multiPartUpload(onEvent: onEvent) - let transferTask = StorageTransferTask(transferType: transferType, - bucket: bucket, - key: key, - contentType: contentType, - requestHeaders: requestHeaders) + let transferTask = StorageTransferTask( + transferType: transferType, + bucket: bucket, + key: key, + contentType: contentType, + requestHeaders: requestHeaders + ) self.transferTask = transferTask self.onEvent = onEvent @@ -78,13 +81,14 @@ class StorageMultipartUploadSession { logger.info("Concurrency Limit is \(concurrentLimit) [based on active processors]") } - init?(client: StorageMultipartUploadClient, - transferTask: StorageTransferTask, - multipartUpload: StorageMultipartUpload, - behavior: StorageMultipartUploadBehavior = .progressive, - fileSystem: FileSystem = .default, - logger: Logger = storageLogger) - { + init?( + client: StorageMultipartUploadClient, + transferTask: StorageTransferTask, + multipartUpload: StorageMultipartUpload, + behavior: StorageMultipartUploadBehavior = .progressive, + fileSystem: FileSystem = .default, + logger: Logger = storageLogger + ) { guard case let .multiPartUpload(onEvent) = transferTask.transferType else { return nil } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StoragePersistableTransferTask.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StoragePersistableTransferTask.swift index ffd96df45f..3a93af246c 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StoragePersistableTransferTask.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StoragePersistableTransferTask.swift @@ -51,9 +51,11 @@ struct StoragePersistableTransferTask: Codable { return nil } - let uploadFile = UploadFile(fileURL: multipartUpload.fileURL, - temporaryFileCreated: multipartUpload.temporaryFileCreated, - size: multipartUpload.size) + let uploadFile = UploadFile( + fileURL: multipartUpload.fileURL, + temporaryFileCreated: multipartUpload.temporaryFileCreated, + size: multipartUpload.size + ) return uploadFile } @@ -68,15 +70,13 @@ struct StoragePersistableTransferTask: Codable { self.location = task.location if case .multiPartUpload = task.transferType, - let multipartUpload = task.multipartUpload - { + let multipartUpload = task.multipartUpload { self.multipartUpload = StoragePersistableMultipartUpload(multipartUpload: multipartUpload) self.subTask = nil } else if case .multiPartUploadPart = task.transferType, let uploadId = task.uploadId, let partNumber = task.partNumber, - let part = task.uploadPart - { + let part = task.uploadPart { self.multipartUpload = nil self.subTask = StoragePersistableSubTask(uploadId: uploadId, partNumber: partNumber, part: part) } else { diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageServiceSessionDelegate.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageServiceSessionDelegate.swift index 710540b2a1..56e47863a1 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageServiceSessionDelegate.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageServiceSessionDelegate.swift @@ -54,8 +54,7 @@ extension StorageServiceSessionDelegate: URLSessionDelegate { logURLSessionActivity("Session did finish background events") if let identifier = storageService?.identifier, - let continuation = StorageBackgroundEventsRegistry.getContinuation(for: identifier) - { + let continuation = StorageBackgroundEventsRegistry.getContinuation(for: identifier) { // Must be run on main thread as covered by Apple Developer docs. Task { @MainActor in continuation.resume(returning: true) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferDatabase.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferDatabase.swift index 6ffa0ca312..96d92f576c 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferDatabase.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferDatabase.swift @@ -29,9 +29,11 @@ protocol StorageTransferDatabase { func recover(urlSession: StorageURLSession, completionHandler: @escaping (Result) -> Void) - func attachEventHandlers(onUpload: AWSS3StorageServiceBehavior.StorageServiceUploadEventHandler?, - onDownload: AWSS3StorageServiceBehavior.StorageServiceDownloadEventHandler?, - onMultipartUpload: AWSS3StorageServiceBehavior.StorageServiceMultiPartUploadEventHandler?) + func attachEventHandlers( + onUpload: AWSS3StorageServiceBehavior.StorageServiceUploadEventHandler?, + onDownload: AWSS3StorageServiceBehavior.StorageServiceDownloadEventHandler?, + onMultipartUpload: AWSS3StorageServiceBehavior.StorageServiceMultiPartUploadEventHandler? + ) } extension StorageTransferDatabase { @@ -39,10 +41,11 @@ extension StorageTransferDatabase { prepareForBackground(completion: nil) } - func attachEventHandlers(onUpload: AWSS3StorageServiceBehavior.StorageServiceUploadEventHandler? = nil, - onDownload: AWSS3StorageServiceBehavior.StorageServiceDownloadEventHandler? = nil, - onMultipartUpload: AWSS3StorageServiceBehavior.StorageServiceMultiPartUploadEventHandler? = nil ) - { + func attachEventHandlers( + onUpload: AWSS3StorageServiceBehavior.StorageServiceUploadEventHandler? = nil, + onDownload: AWSS3StorageServiceBehavior.StorageServiceDownloadEventHandler? = nil, + onMultipartUpload: AWSS3StorageServiceBehavior.StorageServiceMultiPartUploadEventHandler? = nil + ) { attachEventHandlers(onUpload: onUpload, onDownload: onDownload, onMultipartUpload: onMultipartUpload) } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferResponse.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferResponse.swift index eb5419fa47..414b3b6ac1 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferResponse.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferResponse.swift @@ -32,14 +32,18 @@ class StorageTransferResponse { // 400 range: Client Error let description = errorDescription(forStatusCode: statusCode) if [401, 403].contains(statusCode) { - error = .accessDenied(description, - "Make sure the user has access to the key before trying to download/upload it.", - self.error) + error = .accessDenied( + description, + "Make sure the user has access to the key before trying to download/upload it.", + self.error + ) } else if statusCode == 404 { - error = .keyNotFound(transferTask.key, - description, - "Make sure the key exists before trying to download it.", - self.error) + error = .keyNotFound( + transferTask.key, + description, + "Make sure the key exists before trying to download it.", + self.error + ) } else { error = .httpStatusError(statusCode, "Client error", self.error) } @@ -77,8 +81,7 @@ class StorageTransferResponse { // If we didn't get any more info from the server, error is retriable result = true } else if let responseText = transferTask.responseText, - ["RequestTimeout", "ExpiredToken", "TokenRefreshRequired"].contains(responseText) - { + ["RequestTimeout", "ExpiredToken", "TokenRefreshRequired"].contains(responseText) { result = true } else { result = false diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferTask.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferTask.swift index e794ec0ba2..ffc28f75fe 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferTask.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferTask.swift @@ -99,16 +99,17 @@ class StorageTransferTask { return text } - init(transferID: String = UUID().uuidString, - transferType: StorageTransferType, - bucket: String, - key: String, - location: URL? = nil, - contentType: String? = nil, - requestHeaders: [String: String]? = nil, - storageTransferDatabase: StorageTransferDatabase = .default, - logger: Logger = storageLogger) - { + init( + transferID: String = UUID().uuidString, + transferType: StorageTransferType, + bucket: String, + key: String, + location: URL? = nil, + contentType: String? = nil, + requestHeaders: [String: String]? = nil, + storageTransferDatabase: StorageTransferDatabase = .default, + logger: Logger = storageLogger + ) { self.transferID = transferID self.transferType = transferType self.bucket = bucket @@ -122,12 +123,13 @@ class StorageTransferTask { storageTransferDatabase.insertTransferRequest(task: self) } - init(persistableTransferTask: StoragePersistableTransferTask, - transferType: StorageTransferType, - sessionTask: StorageSessionTask? = nil, - storageTransferDatabase: StorageTransferDatabase = .default, - logger: Logger = storageLogger) - { + init( + persistableTransferTask: StoragePersistableTransferTask, + transferType: StorageTransferType, + sessionTask: StorageSessionTask? = nil, + storageTransferDatabase: StorageTransferDatabase = .default, + logger: Logger = storageLogger + ) { // swiftlint:disable line_length guard let rawValue = StorageTransferType.RawValues(rawValue: persistableTransferTask.transferTypeRawValue) else { @@ -149,8 +151,7 @@ class StorageTransferTask { // set multiPartUpload with default value which can resume upload process if rawValue == .multiPartUpload, let uploadId = persistableTransferTask.uploadId, - let uploadFile = persistableTransferTask.uploadFile - { + let uploadFile = persistableTransferTask.uploadFile { let multipartUpload = StorageMultipartUpload.created(uploadId: uploadId, uploadFile: uploadFile) self.uploadId = persistableTransferTask.uploadId self.multipartUpload = multipartUpload diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferTaskPair.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferTaskPair.swift index 82ae55f1e7..a5b84f47c5 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferTaskPair.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferTaskPair.swift @@ -13,16 +13,16 @@ struct StorageTransferTaskPair { let transferTask: StorageTransferTask let multipartUpload: StorageMultipartUpload? - init(transferTask: StorageTransferTask, - multipartUploads: [StorageMultipartUpload]) - { + init( + transferTask: StorageTransferTask, + multipartUploads: [StorageMultipartUpload] + ) { self.transferTask = transferTask if let uploadId = transferTask.uploadId, let multipartUpload = multipartUploads.first(where: { $0.uploadId == uploadId - }) - { + }) { self.multipartUpload = multipartUpload } else { self.multipartUpload = nil diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/StorageRequestUtils+Getter.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/StorageRequestUtils+Getter.swift index ea2990c32c..e972ed0749 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/StorageRequestUtils+Getter.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/StorageRequestUtils+Getter.swift @@ -11,10 +11,11 @@ import Foundation extension StorageRequestUtils { // MARK: Getter methods - static func getAccessLevelPrefix(accessLevel: StorageAccessLevel, - identityId: String, - targetIdentityId: String?) -> String - { + static func getAccessLevelPrefix( + accessLevel: StorageAccessLevel, + identityId: String, + targetIdentityId: String? + ) -> String { let targetIdentityId = targetIdentityId ?? identityId diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/StorageRequestUtils+Validator.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/StorageRequestUtils+Validator.swift index d9ebd107b0..95af026a7b 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/StorageRequestUtils+Validator.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Utils/StorageRequestUtils+Validator.swift @@ -13,20 +13,25 @@ extension StorageRequestUtils { // MARK: Validation methods /// Validate `targetIdentityId` is specified only for `protected` accessLevel. - static func validateTargetIdentityId(_ targetIdentityId: String?, - accessLevel: StorageAccessLevel) -> StorageError? - { + static func validateTargetIdentityId( + _ targetIdentityId: String?, + accessLevel: StorageAccessLevel + ) -> StorageError? { if let targetIdentityId { if targetIdentityId.isEmpty { - return StorageError.validation(StorageErrorConstants.identityIdIsEmpty.field, - StorageErrorConstants.identityIdIsEmpty.errorDescription, - StorageErrorConstants.identityIdIsEmpty.recoverySuggestion) + return StorageError.validation( + StorageErrorConstants.identityIdIsEmpty.field, + StorageErrorConstants.identityIdIsEmpty.errorDescription, + StorageErrorConstants.identityIdIsEmpty.recoverySuggestion + ) } if accessLevel != .protected { - return StorageError.validation(StorageErrorConstants.invalidAccessLevelWithTarget.field, - StorageErrorConstants.invalidAccessLevelWithTarget.errorDescription, - StorageErrorConstants.invalidAccessLevelWithTarget.recoverySuggestion) + return StorageError.validation( + StorageErrorConstants.invalidAccessLevelWithTarget.field, + StorageErrorConstants.invalidAccessLevelWithTarget.errorDescription, + StorageErrorConstants.invalidAccessLevelWithTarget.recoverySuggestion + ) } } @@ -36,9 +41,11 @@ extension StorageRequestUtils { /// Validate `key` is non-empty string. static func validateKey(_ key: String) -> StorageError? { if key.isEmpty { - return StorageError.validation(StorageErrorConstants.keyIsEmpty.field, - StorageErrorConstants.keyIsEmpty.errorDescription, - StorageErrorConstants.keyIsEmpty.recoverySuggestion) + return StorageError.validation( + StorageErrorConstants.keyIsEmpty.field, + StorageErrorConstants.keyIsEmpty.errorDescription, + StorageErrorConstants.keyIsEmpty.recoverySuggestion + ) } return nil @@ -47,9 +54,11 @@ extension StorageRequestUtils { /// Validate `expires` value is non-zero positive. static func validate(expires: Int) -> StorageError? { if expires <= 0 { - return StorageError.validation(StorageErrorConstants.expiresIsInvalid.field, - StorageErrorConstants.expiresIsInvalid.errorDescription, - StorageErrorConstants.expiresIsInvalid.recoverySuggestion) + return StorageError.validation( + StorageErrorConstants.expiresIsInvalid.field, + StorageErrorConstants.expiresIsInvalid.errorDescription, + StorageErrorConstants.expiresIsInvalid.recoverySuggestion + ) } return nil @@ -59,9 +68,11 @@ extension StorageRequestUtils { static func validatePath(_ path: String?) -> StorageError? { if let path { if path.isEmpty { - return StorageError.validation(StorageErrorConstants.pathIsEmpty.field, - StorageErrorConstants.pathIsEmpty.errorDescription, - StorageErrorConstants.pathIsEmpty.recoverySuggestion) + return StorageError.validation( + StorageErrorConstants.pathIsEmpty.field, + StorageErrorConstants.pathIsEmpty.errorDescription, + StorageErrorConstants.pathIsEmpty.recoverySuggestion + ) } } @@ -72,9 +83,11 @@ extension StorageRequestUtils { static func validateContentType(_ contentType: String?) -> StorageError? { if let contentType { if contentType.isEmpty { - return StorageError.validation(StorageErrorConstants.contentTypeIsEmpty.field, - StorageErrorConstants.contentTypeIsEmpty.errorDescription, - StorageErrorConstants.contentTypeIsEmpty.recoverySuggestion) + return StorageError.validation( + StorageErrorConstants.contentTypeIsEmpty.field, + StorageErrorConstants.contentTypeIsEmpty.errorDescription, + StorageErrorConstants.contentTypeIsEmpty.recoverySuggestion + ) } } @@ -86,9 +99,11 @@ extension StorageRequestUtils { if let metadata { for (key, _) in metadata { if key != key.lowercased() { - return StorageError.validation(StorageErrorConstants.metadataKeysInvalid.field, - StorageErrorConstants.metadataKeysInvalid.errorDescription, - StorageErrorConstants.metadataKeysInvalid.recoverySuggestion) + return StorageError.validation( + StorageErrorConstants.metadataKeysInvalid.field, + StorageErrorConstants.metadataKeysInvalid.errorDescription, + StorageErrorConstants.metadataKeysInvalid.recoverySuggestion + ) } // TODO: validate that metadata values are within a certain size. // https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html#object-metadata 2KB @@ -101,8 +116,10 @@ extension StorageRequestUtils { // Validate `file` file exists static func validateFileExists(_ file: URL) -> StorageError? { if !FileManager.default.fileExists(atPath: file.path) { - return StorageError.localFileNotFound(StorageErrorConstants.localFileNotFound.errorDescription, - StorageErrorConstants.localFileNotFound.recoverySuggestion) + return StorageError.localFileNotFound( + StorageErrorConstants.localFileNotFound.errorDescription, + StorageErrorConstants.localFileNotFound.recoverySuggestion + ) } return nil diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3StorageListObjectsTask.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3StorageListObjectsTask.swift index 5f2101b63c..ff2c884304 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3StorageListObjectsTask.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3StorageListObjectsTask.swift @@ -18,10 +18,11 @@ class AWSS3StorageListObjectsTask: StorageListObjectsTask, DefaultLogger { let storageConfiguration: AWSS3StoragePluginConfiguration let storageBehaviour: AWSS3StorageServiceBehavior - init(_ request: StorageListRequest, - storageConfiguration: AWSS3StoragePluginConfiguration, - storageBehaviour: AWSS3StorageServiceBehavior) - { + init( + _ request: StorageListRequest, + storageConfiguration: AWSS3StoragePluginConfiguration, + storageBehaviour: AWSS3StorageServiceBehavior + ) { self.request = request self.storageConfiguration = storageConfiguration self.storageBehaviour = storageBehaviour @@ -40,14 +41,17 @@ class AWSS3StorageListObjectsTask: StorageListObjectsTask, DefaultLogger { throw StorageError.validation( "path", "`path` is required for listing objects", - "Make sure that a valid `path` is passed for removing an object") + "Make sure that a valid `path` is passed for removing an object" + ) } - let input = ListObjectsV2Input(bucket: storageBehaviour.bucket, - continuationToken: request.options.nextToken, - delimiter: request.options.subpathStrategy.delimiter, - maxKeys: Int(request.options.pageSize), - prefix: path, - startAfter: nil) + let input = ListObjectsV2Input( + bucket: storageBehaviour.bucket, + continuationToken: request.options.nextToken, + delimiter: request.options.subpathStrategy.delimiter, + maxKeys: Int(request.options.pageSize), + prefix: path, + startAfter: nil + ) do { let response = try await storageBehaviour.client.listObjectsV2(input: input) let contents: S3BucketContents = response.contents ?? [] @@ -73,7 +77,8 @@ class AWSS3StorageListObjectsTask: StorageListObjectsTask, DefaultLogger { throw StorageError.service( "Service error occurred.", "Please inspect the underlying error for more details.", - error) + error + ) } } } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3StorageRemoveTask.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3StorageRemoveTask.swift index 056a2ebf8d..2c575cd945 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3StorageRemoveTask.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3StorageRemoveTask.swift @@ -18,10 +18,11 @@ class AWSS3StorageRemoveTask: StorageRemoveTask, DefaultLogger { let storageConfiguration: AWSS3StoragePluginConfiguration let storageBehaviour: AWSS3StorageServiceBehavior - init(_ request: StorageRemoveRequest, - storageConfiguration: AWSS3StoragePluginConfiguration, - storageBehaviour: AWSS3StorageServiceBehavior) - { + init( + _ request: StorageRemoveRequest, + storageConfiguration: AWSS3StoragePluginConfiguration, + storageBehaviour: AWSS3StorageServiceBehavior + ) { self.request = request self.storageConfiguration = storageConfiguration self.storageBehaviour = storageBehaviour @@ -40,11 +41,13 @@ class AWSS3StorageRemoveTask: StorageRemoveTask, DefaultLogger { throw StorageError.validation( "path", "`path` is required for removing an object", - "Make sure that a valid `path` is passed for removing an object") + "Make sure that a valid `path` is passed for removing an object" + ) } let input = DeleteObjectInput( bucket: storageBehaviour.bucket, - key: serviceKey) + key: serviceKey + ) do { _ = try await storageBehaviour.client.deleteObject(input: input) } catch let error as StorageErrorConvertible { @@ -53,7 +56,8 @@ class AWSS3StorageRemoveTask: StorageRemoveTask, DefaultLogger { throw StorageError.service( "Service error occurred.", "Please inspect the underlying error for more details.", - error) + error + ) } return serviceKey } diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3torageGetURLTask.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3torageGetURLTask.swift index 944d2f2d01..48056ea39f 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3torageGetURLTask.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Tasks/AWSS3torageGetURLTask.swift @@ -17,9 +17,10 @@ class AWSS3StorageGetURLTask: StorageGetURLTask, DefaultLogger { let request: StorageGetURLRequest let storageBehaviour: AWSS3StorageServiceBehavior - init(_ request: StorageGetURLRequest, - storageBehaviour: AWSS3StorageServiceBehavior) - { + init( + _ request: StorageGetURLRequest, + storageBehaviour: AWSS3StorageServiceBehavior + ) { self.request = request self.storageBehaviour = storageBehaviour } @@ -37,7 +38,8 @@ class AWSS3StorageGetURLTask: StorageGetURLTask, DefaultLogger { throw StorageError.validation( "path", "`path` is required field", - "Make sure that a valid `path` is passed for removing an object") + "Make sure that a valid `path` is passed for removing an object" + ) } // Validate object if needed @@ -62,7 +64,8 @@ class AWSS3StorageGetURLTask: StorageGetURLTask, DefaultLogger { throw StorageError.service( "Service error occurred.", "Please inspect the underlying error for more details.", - error) + error + ) } } diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginAmplifyOutputsConfigurationTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginAmplifyOutputsConfigurationTests.swift index e7cf698a01..2c9a18cb27 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginAmplifyOutputsConfigurationTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginAmplifyOutputsConfigurationTests.swift @@ -15,7 +15,8 @@ class AWSS3StoragePluginAmplifyOutputsConfigurationTests: AWSS3StoragePluginTest do { let config = AmplifyOutputsData(storage: .init( awsRegion: testRegion, - bucketName: testBucket)) + bucketName: testBucket + )) try storagePlugin.configure(using: config) } catch { XCTFail("Failed to configure storage plugin") @@ -37,7 +38,8 @@ class AWSS3StoragePluginAmplifyOutputsConfigurationTests: AWSS3StoragePluginTest func testConfigureThrowsForEmptyBucketValue() { let config = AmplifyOutputsData(storage: .init( awsRegion: testRegion, - bucketName: "")) + bucketName: "" + )) XCTAssertThrowsError(try storagePlugin.configure(using: config)) { error in guard case let StorageError.configuration(_, _, underlyingError) = error else { XCTFail("Expected PluginError pluginConfigurationError, got: \(error)") @@ -61,7 +63,8 @@ class AWSS3StoragePluginAmplifyOutputsConfigurationTests: AWSS3StoragePluginTest func testConfigureThrowsForEmptyRegionValue() { let config = AmplifyOutputsData(storage: .init( awsRegion: "", - bucketName: testBucket)) + bucketName: testBucket + )) XCTAssertThrowsError(try storagePlugin.configure(using: config)) { error in guard case let StorageError.configuration(_, _, underlyingError) = error else { XCTFail("Expected PluginError pluginConfigurationError, got: \(error)") @@ -88,7 +91,8 @@ class AWSS3StoragePluginAmplifyOutputsConfigurationTests: AWSS3StoragePluginTest try XCTSkipIf(!isValidationRegionConfig, "Skipping until region validation is enabled") let config = AmplifyOutputsData(storage: .init( awsRegion: "invalidRegionType", - bucketName: testBucket)) + bucketName: testBucket + )) XCTAssertThrowsError(try storagePlugin.configure(using: config)) { error in guard case let StorageError.configuration(_, _, underlyingError) = error else { diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginAsyncBehaviorTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginAsyncBehaviorTests.swift index bd1d2b03d5..aea7d13690 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginAsyncBehaviorTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginAsyncBehaviorTests.swift @@ -31,10 +31,12 @@ class AWSS3StoragePluginAsyncBehaviorTests: XCTestCase { testURL = URL(fileURLWithPath: NSTemporaryDirectory().appendingPathComponent(UUID().uuidString)) testData = Data(UUID().uuidString.utf8) queue = OperationQueue() - storagePlugin.configure(storageService: storageService, - authService: authService, - defaultAccessLevel: defaultAccessLevel, - queue: queue) + storagePlugin.configure( + storageService: storageService, + authService: authService, + defaultAccessLevel: defaultAccessLevel, + queue: queue + ) } override func tearDownWithError() throws { @@ -60,9 +62,11 @@ class AWSS3StoragePluginAsyncBehaviorTests: XCTestCase { func testPluginDownloadFileAsync() async throws { storageService.storageServiceDownloadEvents = [.completed(nil)] - let task = storagePlugin.downloadFile(key: testKey, - local: testURL, - options: nil) + let task = storagePlugin.downloadFile( + key: testKey, + local: testURL, + options: nil + ) _ = try await task.value XCTAssertEqual(1, storageService.downloadCalled) } @@ -70,9 +74,11 @@ class AWSS3StoragePluginAsyncBehaviorTests: XCTestCase { func testPluginUploadDataAsync() async throws { storageService.storageServiceUploadEvents = [.completedVoid] let input = try XCTUnwrap(testKey) - let task = storagePlugin.uploadData(key: input, - data: testData, - options: nil) + let task = storagePlugin.uploadData( + key: input, + data: testData, + options: nil + ) let output = try await task.value XCTAssertEqual(input, output) XCTAssertEqual(1, storageService.uploadCalled) @@ -86,9 +92,11 @@ class AWSS3StoragePluginAsyncBehaviorTests: XCTestCase { FileSystem.default.removeFileIfExists(fileURL: fileURL) } - let task = storagePlugin.uploadFile(key: key, - local: fileURL, - options: nil) + let task = storagePlugin.uploadFile( + key: key, + local: fileURL, + options: nil + ) let output = try await task.value XCTAssertEqual(key, output) XCTAssertEqual(1, storageService.uploadCalled) diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginConfigureTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginConfigureTests.swift index 6b385b5684..123e30ec7b 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginConfigureTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginConfigureTests.swift @@ -23,7 +23,8 @@ class AWSS3StoragePluginConfigureTests: AWSS3StoragePluginTests { let bucket = JSONValue.init(stringLiteral: testBucket) let region = JSONValue.init(stringLiteral: testRegion) let storagePluginConfig = JSONValue.init( - dictionaryLiteral: (PluginConstants.bucket, bucket), (PluginConstants.region, region)) + dictionaryLiteral: (PluginConstants.bucket, bucket), (PluginConstants.region, region) + ) do { try storagePlugin.configure(using: storagePluginConfig) @@ -36,10 +37,12 @@ class AWSS3StoragePluginConfigureTests: AWSS3StoragePluginTests { let bucket = JSONValue.init(stringLiteral: testBucket) let region = JSONValue.init(stringLiteral: testRegion) let accessLevel = JSONValue.init(stringLiteral: defaultAccessLevel.rawValue) - let storagePluginConfig = JSONValue.init(dictionaryLiteral: + let storagePluginConfig = JSONValue.init( + dictionaryLiteral: (PluginConstants.bucket, bucket), (PluginConstants.region, region), - (PluginConstants.defaultAccessLevel, accessLevel)) + (PluginConstants.defaultAccessLevel, accessLevel) + ) do { try storagePlugin.configure(using: storagePluginConfig) @@ -115,7 +118,8 @@ class AWSS3StoragePluginConfigureTests: AWSS3StoragePluginTests { let region = JSONValue.init(stringLiteral: testRegion) let storagePluginConfig = JSONValue.init( - dictionaryLiteral: (PluginConstants.bucket, ""), (PluginConstants.region, region)) + dictionaryLiteral: (PluginConstants.bucket, ""), (PluginConstants.region, region) + ) XCTAssertThrowsError(try storagePlugin.configure(using: storagePluginConfig)) { error in guard case let StorageError.configuration(_, _, underlyingError) = error else { @@ -141,7 +145,8 @@ class AWSS3StoragePluginConfigureTests: AWSS3StoragePluginTests { let bucket = JSONValue.init(integerLiteral: 1) let region = JSONValue.init(stringLiteral: testRegion) let storagePluginConfig = JSONValue.init( - dictionaryLiteral: (PluginConstants.bucket, bucket), (PluginConstants.region, region)) + dictionaryLiteral: (PluginConstants.bucket, bucket), (PluginConstants.region, region) + ) XCTAssertThrowsError(try storagePlugin.configure(using: storagePluginConfig)) { error in guard case let StorageError.configuration(_, _, underlyingError) = error else { @@ -193,7 +198,8 @@ class AWSS3StoragePluginConfigureTests: AWSS3StoragePluginTests { let bucket = JSONValue.init(stringLiteral: testBucket) let region = JSONValue.init(stringLiteral: "") let storagePluginConfig = JSONValue.init( - dictionaryLiteral: (PluginConstants.bucket, bucket), (PluginConstants.region, region)) + dictionaryLiteral: (PluginConstants.bucket, bucket), (PluginConstants.region, region) + ) XCTAssertThrowsError(try storagePlugin.configure(using: storagePluginConfig)) { error in guard case let StorageError.configuration(_, _, underlyingError) = error else { @@ -219,7 +225,8 @@ class AWSS3StoragePluginConfigureTests: AWSS3StoragePluginTests { let bucket = JSONValue.init(stringLiteral: testBucket) let region = JSONValue.init(integerLiteral: 1) let storagePluginConfig = JSONValue.init( - dictionaryLiteral: (PluginConstants.bucket, bucket), (PluginConstants.region, region)) + dictionaryLiteral: (PluginConstants.bucket, bucket), (PluginConstants.region, region) + ) XCTAssertThrowsError(try storagePlugin.configure(using: storagePluginConfig)) { error in guard case let StorageError.configuration(_, _, underlyingError) = error else { @@ -248,7 +255,8 @@ class AWSS3StoragePluginConfigureTests: AWSS3StoragePluginTests { let bucket = JSONValue.init(stringLiteral: testBucket) let region = JSONValue.init(stringLiteral: "invalidRegionType") let storagePluginConfig = JSONValue.init( - dictionaryLiteral: (PluginConstants.bucket, bucket), (PluginConstants.region, region)) + dictionaryLiteral: (PluginConstants.bucket, bucket), (PluginConstants.region, region) + ) XCTAssertThrowsError(try storagePlugin.configure(using: storagePluginConfig)) { error in guard case let StorageError.configuration(_, _, underlyingError) = error else { @@ -274,10 +282,12 @@ class AWSS3StoragePluginConfigureTests: AWSS3StoragePluginTests { let bucket = JSONValue.init(stringLiteral: testBucket) let region = JSONValue.init(stringLiteral: testRegion) let accessLevel = JSONValue.init(stringLiteral: "invalidAccessLevel") - let storagePluginConfig = JSONValue.init(dictionaryLiteral: + let storagePluginConfig = JSONValue.init( + dictionaryLiteral: (PluginConstants.bucket, bucket), (PluginConstants.region, region), - (PluginConstants.defaultAccessLevel, accessLevel)) + (PluginConstants.defaultAccessLevel, accessLevel) + ) XCTAssertThrowsError(try storagePlugin.configure(using: storagePluginConfig)) { error in guard case let StorageError.configuration(_, _, underlyingError) = error else { @@ -295,8 +305,10 @@ class AWSS3StoragePluginConfigureTests: AWSS3StoragePluginTests { return } - XCTAssertEqual(amplifyError.errorDescription, - PluginErrorConstants.invalidDefaultAccessLevel.errorDescription) + XCTAssertEqual( + amplifyError.errorDescription, + PluginErrorConstants.invalidDefaultAccessLevel.errorDescription + ) } } @@ -304,10 +316,12 @@ class AWSS3StoragePluginConfigureTests: AWSS3StoragePluginTests { let bucket = JSONValue.init(stringLiteral: testBucket) let region = JSONValue.init(stringLiteral: testRegion) let accessLevel = JSONValue.init(integerLiteral: 1) - let storagePluginConfig = JSONValue.init(dictionaryLiteral: + let storagePluginConfig = JSONValue.init( + dictionaryLiteral: (PluginConstants.bucket, bucket), (PluginConstants.region, region), - (PluginConstants.defaultAccessLevel, accessLevel)) + (PluginConstants.defaultAccessLevel, accessLevel) + ) XCTAssertThrowsError(try storagePlugin.configure(using: storagePluginConfig)) { error in guard case let StorageError.configuration(_, _, underlyingError) = error else { @@ -325,8 +339,10 @@ class AWSS3StoragePluginConfigureTests: AWSS3StoragePluginTests { return } - XCTAssertEqual(amplifyError.errorDescription, - PluginErrorConstants.invalidDefaultAccessLevel.errorDescription) + XCTAssertEqual( + amplifyError.errorDescription, + PluginErrorConstants.invalidDefaultAccessLevel.errorDescription + ) } } @@ -335,10 +351,12 @@ class AWSS3StoragePluginConfigureTests: AWSS3StoragePluginTests { let bucket = JSONValue.init(stringLiteral: testBucket) let region = JSONValue.init(stringLiteral: testRegion) let accessLevel = JSONValue.init(stringLiteral: "") - let storagePluginConfig = JSONValue.init(dictionaryLiteral: + let storagePluginConfig = JSONValue.init( + dictionaryLiteral: (PluginConstants.bucket, bucket), (PluginConstants.region, region), - (PluginConstants.defaultAccessLevel, accessLevel)) + (PluginConstants.defaultAccessLevel, accessLevel) + ) XCTAssertThrowsError(try storagePlugin.configure(using: storagePluginConfig)) { error in guard case let StorageError.configuration(_, _, underlyingError) = error else { @@ -356,8 +374,10 @@ class AWSS3StoragePluginConfigureTests: AWSS3StoragePluginTests { return } - XCTAssertEqual(amplifyError.errorDescription, - PluginErrorConstants.invalidDefaultAccessLevel.errorDescription) + XCTAssertEqual( + amplifyError.errorDescription, + PluginErrorConstants.invalidDefaultAccessLevel.errorDescription + ) } } } diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginGetPresignedUrlTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginGetPresignedUrlTests.swift index 5987d8601c..8524c6f906 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginGetPresignedUrlTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginGetPresignedUrlTests.swift @@ -32,10 +32,12 @@ final class AWSS3StoragePluginGetPresignedUrlTests: XCTestCase { testData = Data(UUID().uuidString.utf8) queue = OperationQueue() systemUnderTest = AWSS3StoragePlugin() - systemUnderTest.configure(storageService: storageService, - authService: authService, - defaultAccessLevel: defaultAccessLevel, - queue: queue) + systemUnderTest.configure( + storageService: storageService, + authService: authService, + defaultAccessLevel: defaultAccessLevel, + queue: queue + ) let url = try XCTUnwrap(testURL) storageService.getPreSignedURLHandler = { _, _, _ in return url diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginTestBase.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginTestBase.swift index bdc4a9438e..2147eaa3e0 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginTestBase.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/AWSS3StoragePluginTestBase.swift @@ -33,9 +33,11 @@ class AWSS3StoragePluginTests: XCTestCase { authService = MockAWSAuthService() queue = MockOperationQueue() - storagePlugin.configure(storageService: storageService, - authService: authService, - defaultAccessLevel: defaultAccessLevel, - queue: queue) + storagePlugin.configure( + storageService: storageService, + authService: authService, + defaultAccessLevel: defaultAccessLevel, + queue: queue + ) } } diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Configuration/AWSS3PluginPrefixResolverTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Configuration/AWSS3PluginPrefixResolverTests.swift index 831a74c6da..5196e7c11f 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Configuration/AWSS3PluginPrefixResolverTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Configuration/AWSS3PluginPrefixResolverTests.swift @@ -29,9 +29,13 @@ struct PrefixTestData { let file: StaticString let line: UInt - init(_ accessLevel: StorageAccessLevel, _ targetIdentityId: String?, _ expectedPrefix: String, - file: StaticString = #filePath, line: UInt = #line) - { + init( + _ accessLevel: StorageAccessLevel, + _ targetIdentityId: String?, + _ expectedPrefix: String, + file: StaticString = #filePath, + line: UInt = #line + ) { self.accessLevel = accessLevel self.targetIdentityId = targetIdentityId self.expectedPrefix = expectedPrefix diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Configuration/AWSS3StoragePluginConfigurationTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Configuration/AWSS3StoragePluginConfigurationTests.swift index 70cdd4b024..c531557890 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Configuration/AWSS3StoragePluginConfigurationTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Configuration/AWSS3StoragePluginConfigurationTests.swift @@ -18,9 +18,10 @@ class AWSS3StoragePluginConfigurationTests: XCTestCase { } struct MockPrefixResolver: AWSS3PluginPrefixResolver { - func resolvePrefix(for accessLevel: StorageAccessLevel, - targetIdentityId: String?) async throws -> String - { + func resolvePrefix( + for accessLevel: StorageAccessLevel, + targetIdentityId: String? + ) async throws -> String { "" } } diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3PreSignedURLBuilder.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3PreSignedURLBuilder.swift index 2b506e8cc5..c8c22e639d 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3PreSignedURLBuilder.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3PreSignedURLBuilder.swift @@ -24,7 +24,8 @@ extension MockAWSS3PreSignedURLBuilder: AWSS3PreSignedURLBuilderBehavior { signingOperation: AWSS3SigningOperation, metadata: [String: String]?, accelerate: Bool?, - expires: Int64?) async throws -> URL { + expires: Int64? + ) async throws -> URL { 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 da18b84e78..06848a9e01 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3StorageService.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Mocks/MockAWSS3StorageService.swift @@ -86,7 +86,8 @@ public class MockAWSS3StorageService: AWSS3StorageServiceBehavior { signingOperation: AWSS3SigningOperation, metadata: [String: String]?, accelerate: Bool?, - expires: Int) async throws -> URL { + expires: Int + ) async throws -> URL { interactions.append("\(#function) \(serviceKey) \(signingOperation) \(String(describing: metadata)) \(expires)") return try await getPreSignedURLHandler(serviceKey, signingOperation, expires) } @@ -98,13 +99,14 @@ public class MockAWSS3StorageService: AWSS3StorageServiceBehavior { try await validateObjectExistenceHandler(serviceKey) } - public func upload(serviceKey: String, - uploadSource: UploadSource, - contentType: String?, - metadata: [String: String]?, - accelerate: Bool?, - onEvent: @escaping StorageServiceUploadEventHandler) - { + public func upload( + serviceKey: String, + uploadSource: UploadSource, + contentType: String?, + metadata: [String: String]?, + accelerate: Bool?, + onEvent: @escaping StorageServiceUploadEventHandler + ) { interactions.append(#function) uploadCalled += 1 @@ -118,13 +120,14 @@ public class MockAWSS3StorageService: AWSS3StorageServiceBehavior { } } - public func multiPartUpload(serviceKey: String, - uploadSource: UploadSource, - contentType: String?, - metadata: [String: String]?, - accelerate: Bool?, - onEvent: @escaping StorageServiceMultiPartUploadEventHandler) - { + public func multiPartUpload( + serviceKey: String, + uploadSource: UploadSource, + contentType: String?, + metadata: [String: String]?, + accelerate: Bool?, + onEvent: @escaping StorageServiceMultiPartUploadEventHandler + ) { interactions.append(#function) multiPartUploadCalled += 1 @@ -174,12 +177,13 @@ public class MockAWSS3StorageService: AWSS3StorageServiceBehavior { XCTAssertEqual(downloadFileURL, fileURL) } - public func verifyUpload(serviceKey: String, - key: String, - uploadSource: UploadSource, - contentType: String?, - metadata: [String: String]?) - { + public func verifyUpload( + serviceKey: String, + key: String, + uploadSource: UploadSource, + contentType: String?, + metadata: [String: String]? + ) { XCTAssertEqual(uploadCalled, 1) XCTAssertEqual(uploadServiceKey, serviceKey) if let uploadUploadSource { @@ -199,12 +203,13 @@ public class MockAWSS3StorageService: AWSS3StorageServiceBehavior { XCTAssertEqual(uploadMetadata, metadata) } - public func verifyMultiPartUpload(serviceKey: String, - key: String, - uploadSource: UploadSource, - contentType: String?, - metadata: [String: String]?) - { + public func verifyMultiPartUpload( + serviceKey: String, + key: String, + uploadSource: UploadSource, + contentType: String?, + metadata: [String: String]? + ) { XCTAssertEqual(multiPartUploadCalled, 1) XCTAssertEqual(multiPartUploadServiceKey, serviceKey) diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageDownloadFileOperationTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageDownloadFileOperationTests.swift index 5ed450396f..aad1fa2e8e 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageDownloadFileOperationTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageDownloadFileOperationTests.swift @@ -22,16 +22,19 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { ) func testDownloadFileOperationValidationError() async { - let request = StorageDownloadFileRequest(key: "", - local: testURL, - options: StorageDownloadFileRequest.Options()) + let request = StorageDownloadFileRequest( + key: "", + local: testURL, + options: StorageDownloadFileRequest.Options() + ) let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageDownloadFileOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil) - { result in + let operation = AWSS3StorageDownloadFileOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil + ) { result in switch result { case .failure(let error): guard case .validation = error else { @@ -51,16 +54,19 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { func testDownloadFileOperationGetIdentityIdError() async throws { mockAuthService.getIdentityIdError = AuthError.service("", "", "") - let request = StorageDownloadFileRequest(key: testKey, - local: testURL, - options: StorageDownloadFileRequest.Options()) + let request = StorageDownloadFileRequest( + key: testKey, + local: testURL, + options: StorageDownloadFileRequest.Options() + ) let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageDownloadFileOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil) - { result in + let operation = AWSS3StorageDownloadFileOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil + ) { result in switch result { case .failure(let error): guard case .authError = error else { @@ -84,11 +90,14 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceDownloadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.completed(nil)] + StorageEvent.completed(nil) + ] let url = URL(fileURLWithPath: "path") - let request = StorageDownloadFileRequest(key: testKey, - local: testURL, - options: StorageDownloadFileRequest.Options()) + let request = StorageDownloadFileRequest( + key: testKey, + local: testURL, + options: StorageDownloadFileRequest.Options() + ) let expectedServiceKey = StorageAccessLevel.guest.serviceAccessPrefix + "/" + testKey let inProcessInvoked = expectation(description: "inProgress was invoked on operation") let completeInvoked = expectation(description: "complete was invoked on operation") @@ -106,7 +115,8 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { case .failure(let error): XCTFail("Unexpected error on operation: \(error)") } - }) + } + ) operation.start() @@ -120,11 +130,14 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceDownloadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.failed(StorageError.service("", ""))] + StorageEvent.failed(StorageError.service("", "")) + ] let url = URL(fileURLWithPath: "path") - let request = StorageDownloadFileRequest(key: testKey, - local: testURL, - options: StorageDownloadFileRequest.Options()) + let request = StorageDownloadFileRequest( + key: testKey, + local: testURL, + options: StorageDownloadFileRequest.Options() + ) let expectedServiceKey = StorageAccessLevel.guest.serviceAccessPrefix + "/" + testKey let inProcessInvoked = expectation(description: "inProgress was invoked on operation") let failedInvoked = expectation(description: "failed was invoked on operation") @@ -142,7 +155,8 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { case .success: XCTFail("Unexpected event invoked on operation") } - }) + } + ) operation.start() @@ -156,13 +170,18 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceDownloadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.completed(nil)] + StorageEvent.completed(nil) + ] let url = URL(fileURLWithPath: "path") - let options = StorageDownloadFileRequest.Options(accessLevel: .protected, - targetIdentityId: testTargetIdentityId) - let request = StorageDownloadFileRequest(key: testKey, - local: testURL, - options: options) + let options = StorageDownloadFileRequest.Options( + accessLevel: .protected, + targetIdentityId: testTargetIdentityId + ) + let request = StorageDownloadFileRequest( + key: testKey, + local: testURL, + options: options + ) let expectedServiceKey = StorageAccessLevel.protected.rawValue + "/" + testTargetIdentityId + "/" + testKey let inProcessInvoked = expectation(description: "inProgress was invoked on operation") let completeInvoked = expectation(description: "complete was invoked on operation") @@ -180,7 +199,8 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { case .failure(let error): XCTFail("Unexpected error on operation: \(error)") } - }) + } + ) operation.start() @@ -194,17 +214,20 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { /// Then: The operation will fail with a validation error func testDownloadFileOperationStringStoragePathValidationError() async { let path = StringStoragePath(resolve: { _ in return "/my/path" }) - let request = StorageDownloadFileRequest(path: path, - local: testURL, - options: StorageDownloadFileRequest.Options()) + let request = StorageDownloadFileRequest( + path: path, + local: testURL, + options: StorageDownloadFileRequest.Options() + ) let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageDownloadFileOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil) - { result in + let operation = AWSS3StorageDownloadFileOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil + ) { result in switch result { case .failure(let error): guard case .validation = error else { @@ -227,17 +250,20 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { /// Then: The operation will fail with a validation error func testDownloadFileOperationEmptyStoragePathValidationError() async { let path = StringStoragePath(resolve: { _ in return " " }) - let request = StorageDownloadFileRequest(path: path, - local: testURL, - options: StorageDownloadFileRequest.Options()) + let request = StorageDownloadFileRequest( + path: path, + local: testURL, + options: StorageDownloadFileRequest.Options() + ) let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageDownloadFileOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil) - { result in + let operation = AWSS3StorageDownloadFileOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil + ) { result in switch result { case .failure(let error): guard case .validation = error else { @@ -260,17 +286,20 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { /// Then: The operation will fail with a validation error func testDownloadFileOperationIdentityIDStoragePathValidationError() async { let path = IdentityIDStoragePath(resolve: { _ in return "/my/path" }) - let request = StorageDownloadFileRequest(path: path, - local: testURL, - options: StorageDownloadFileRequest.Options()) + let request = StorageDownloadFileRequest( + path: path, + local: testURL, + options: StorageDownloadFileRequest.Options() + ) let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageDownloadFileOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil) - { result in + let operation = AWSS3StorageDownloadFileOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil + ) { result in switch result { case .failure(let error): guard case .validation = error else { @@ -293,17 +322,20 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { /// Then: The operation will fail with a validation error func testDownloadFileOperationCustomStoragePathValidationError() async { let path = InvalidCustomStoragePath(resolve: { _ in return "my/path" }) - let request = StorageDownloadFileRequest(path: path, - local: testURL, - options: StorageDownloadFileRequest.Options()) + let request = StorageDownloadFileRequest( + path: path, + local: testURL, + options: StorageDownloadFileRequest.Options() + ) let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageDownloadFileOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil) - { result in + let operation = AWSS3StorageDownloadFileOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil + ) { result in switch result { case .failure(let error): guard case .validation = error else { @@ -330,11 +362,14 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceDownloadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.completed(nil)] + StorageEvent.completed(nil) + ] let url = URL(fileURLWithPath: "path") - let request = StorageDownloadFileRequest(path: path, - local: testURL, - options: StorageDownloadFileRequest.Options()) + let request = StorageDownloadFileRequest( + path: path, + local: testURL, + options: StorageDownloadFileRequest.Options() + ) let inProcessInvoked = expectation(description: "inProgress was invoked on operation") let completeInvoked = expectation(description: "complete was invoked on operation") let operation = AWSS3StorageDownloadFileOperation( @@ -351,7 +386,8 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { case .failure(let error): XCTFail("Unexpected error on operation: \(error)") } - }) + } + ) operation.start() @@ -370,11 +406,14 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceDownloadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.completed(nil)] + StorageEvent.completed(nil) + ] let url = URL(fileURLWithPath: "path") - let request = StorageDownloadFileRequest(path: path, - local: testURL, - options: StorageDownloadFileRequest.Options()) + let request = StorageDownloadFileRequest( + path: path, + local: testURL, + options: StorageDownloadFileRequest.Options() + ) let inProcessInvoked = expectation(description: "inProgress was invoked on operation") let completeInvoked = expectation(description: "complete was invoked on operation") let operation = AWSS3StorageDownloadFileOperation( @@ -391,7 +430,8 @@ class AWSS3StorageDownloadFileOperationTests: AWSS3StorageOperationTestBase { case .failure(let error): XCTFail("Unexpected error on operation: \(error)") } - }) + } + ) operation.start() diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageGetDataOperationTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageGetDataOperationTests.swift index f3bdbebab1..90f4039ab5 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageGetDataOperationTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageGetDataOperationTests.swift @@ -19,12 +19,13 @@ class AWSS3StorageDownloadDataOperationTests: AWSS3StorageOperationTestBase { func testDownloadDataOperationValidationError() async { let request = StorageDownloadDataRequest(key: "", options: StorageDownloadDataRequest.Options()) let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageDownloadDataOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil) - { event in + let operation = AWSS3StorageDownloadDataOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil + ) { event in switch event { case .failure(let error): guard case .validation = error else { @@ -76,7 +77,8 @@ class AWSS3StorageDownloadDataOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceDownloadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.completed(Data())] + StorageEvent.completed(Data()) + ] let request = StorageDownloadDataRequest(key: testKey, options: StorageDownloadDataRequest.Options()) let expectedServiceKey = StorageAccessLevel.guest.serviceAccessPrefix + "/" + testKey let inProcessInvoked = expectation(description: "inProgress was invoked on operation") @@ -95,7 +97,8 @@ class AWSS3StorageDownloadDataOperationTests: AWSS3StorageOperationTestBase { case .failure(let error): XCTFail("Unexpected event invoked on operation: \(error)") } - }) + } + ) operation.start() @@ -109,7 +112,8 @@ class AWSS3StorageDownloadDataOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceDownloadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.failed(StorageError.service("", ""))] + StorageEvent.failed(StorageError.service("", "")) + ] let request = StorageDownloadDataRequest(key: testKey, options: StorageDownloadDataRequest.Options()) let expectedServiceKey = StorageAccessLevel.guest.serviceAccessPrefix + "/" + testKey let inProcessInvoked = expectation(description: "inProgress was invoked on operation") @@ -128,7 +132,8 @@ class AWSS3StorageDownloadDataOperationTests: AWSS3StorageOperationTestBase { case .failure: failInvoked.fulfill() } - }) + } + ) operation.start() @@ -142,9 +147,12 @@ class AWSS3StorageDownloadDataOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceDownloadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.completed(Data())] - let options = StorageDownloadDataRequest.Options(accessLevel: .protected, - targetIdentityId: testTargetIdentityId) + StorageEvent.completed(Data()) + ] + let options = StorageDownloadDataRequest.Options( + accessLevel: .protected, + targetIdentityId: testTargetIdentityId + ) let request = StorageDownloadDataRequest(key: testKey, options: options) let expectedServiceKey = StorageAccessLevel.protected.rawValue + "/" + testTargetIdentityId + "/" + testKey let inProcessInvoked = expectation(description: "inProgress was invoked on operation") @@ -163,7 +171,8 @@ class AWSS3StorageDownloadDataOperationTests: AWSS3StorageOperationTestBase { case .failure(let error): XCTFail("Unexpected error in operation: \(error)") } - }) + } + ) operation.start() @@ -182,11 +191,12 @@ class AWSS3StorageDownloadDataOperationTests: AWSS3StorageOperationTestBase { let path = StringStoragePath(resolve: { _ in return "/my/path" }) let request = StorageDownloadDataRequest(path: path, options: StorageDownloadDataRequest.Options()) let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageDownloadDataOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil + let operation = AWSS3StorageDownloadDataOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil ) { event in switch event { case .failure(let error): @@ -212,11 +222,12 @@ class AWSS3StorageDownloadDataOperationTests: AWSS3StorageOperationTestBase { let path = StringStoragePath(resolve: { _ in return " " }) let request = StorageDownloadDataRequest(path: path, options: StorageDownloadDataRequest.Options()) let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageDownloadDataOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil + let operation = AWSS3StorageDownloadDataOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil ) { event in switch event { case .failure(let error): @@ -242,12 +253,13 @@ class AWSS3StorageDownloadDataOperationTests: AWSS3StorageOperationTestBase { let path = IdentityIDStoragePath(resolve: { _ in return "/my/path" }) let request = StorageDownloadDataRequest(path: path, options: StorageDownloadDataRequest.Options()) let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageDownloadDataOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil) - { event in + let operation = AWSS3StorageDownloadDataOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil + ) { event in switch event { case .failure(let error): guard case .validation = error else { @@ -272,12 +284,13 @@ class AWSS3StorageDownloadDataOperationTests: AWSS3StorageOperationTestBase { let path = InvalidCustomStoragePath(resolve: { _ in return "my/path" }) let request = StorageDownloadDataRequest(path: path, options: StorageDownloadDataRequest.Options()) let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageDownloadDataOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil) - { event in + let operation = AWSS3StorageDownloadDataOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil + ) { event in switch event { case .failure(let error): guard case .validation = error else { @@ -303,7 +316,8 @@ class AWSS3StorageDownloadDataOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceDownloadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.completed(Data())] + StorageEvent.completed(Data()) + ] let path = StringStoragePath(resolve: { _ in return "public/\(self.testKey)" }) let request = StorageDownloadDataRequest(path: path, options: StorageDownloadDataRequest.Options()) @@ -323,7 +337,8 @@ class AWSS3StorageDownloadDataOperationTests: AWSS3StorageOperationTestBase { case .failure(let error): XCTFail("Unexpected event invoked on operation: \(error)") } - }) + } + ) operation.start() @@ -341,7 +356,8 @@ class AWSS3StorageDownloadDataOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceDownloadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.completed(Data())] + StorageEvent.completed(Data()) + ] let path = IdentityIDStoragePath(resolve: { id in return "public/\(id)/\(self.testKey)" }) let request = StorageDownloadDataRequest(path: path, options: StorageDownloadDataRequest.Options()) @@ -361,7 +377,8 @@ class AWSS3StorageDownloadDataOperationTests: AWSS3StorageOperationTestBase { case .failure(let error): XCTFail("Unexpected event invoked on operation: \(error)") } - }) + } + ) operation.start() diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StoragePutDataOperationTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StoragePutDataOperationTests.swift index 92bb1234ea..7b91030fc8 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StoragePutDataOperationTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StoragePutDataOperationTests.swift @@ -21,12 +21,13 @@ class AWSS3StorageUploadDataOperationTests: AWSS3StorageOperationTestBase { let request = StorageUploadDataRequest(key: "", data: testData, options: options) let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageUploadDataOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil) - { result in + let operation = AWSS3StorageUploadDataOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil + ) { result in switch result { case .failure(let error): guard case .validation = error else { @@ -52,12 +53,13 @@ class AWSS3StorageUploadDataOperationTests: AWSS3StorageOperationTestBase { let request = StorageUploadDataRequest(key: testKey, data: testData, options: options) let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageUploadDataOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil) - { result in + let operation = AWSS3StorageUploadDataOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil + ) { result in switch result { case .failure(let error): guard case .authError = error else { @@ -82,14 +84,17 @@ class AWSS3StorageUploadDataOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceUploadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.completedVoid] + StorageEvent.completedVoid + ] let expectedUploadSource = UploadSource.data(testData) let metadata = ["mykey": "Value"] - let options = StorageUploadDataRequest.Options(accessLevel: .protected, - metadata: metadata, - contentType: testContentType) + let options = StorageUploadDataRequest.Options( + accessLevel: .protected, + metadata: metadata, + contentType: testContentType + ) let request = StorageUploadDataRequest(key: testKey, data: testData, options: options) let expectedServiceKey = StorageAccessLevel.protected.rawValue + "/" + testIdentityId + "/" + testKey @@ -109,18 +114,21 @@ class AWSS3StorageUploadDataOperationTests: AWSS3StorageOperationTestBase { default: XCTFail("Should have received completed event") } - }) + } + ) operation.start() await fulfillment(of: [completeInvoked, inProcessInvoked], timeout: 1) XCTAssertTrue(operation.isFinished) XCTAssertEqual(mockStorageService.uploadCalled, 1) - mockStorageService.verifyUpload(serviceKey: expectedServiceKey, - key: testKey, - uploadSource: expectedUploadSource, - contentType: testContentType, - metadata: metadata) + mockStorageService.verifyUpload( + serviceKey: expectedServiceKey, + key: testKey, + uploadSource: expectedUploadSource, + contentType: testContentType, + metadata: metadata + ) } func testUploadDataOperationUploadFail() async { @@ -129,7 +137,8 @@ class AWSS3StorageUploadDataOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceUploadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.failed(StorageError.service("", ""))] + StorageEvent.failed(StorageError.service("", "")) + ] let expectedUploadSource = UploadSource.data(testData) @@ -153,18 +162,21 @@ class AWSS3StorageUploadDataOperationTests: AWSS3StorageOperationTestBase { default: XCTFail("Should have received completed event") } - }) + } + ) operation.start() await fulfillment(of: [failInvoked, inProcessInvoked], timeout: 1) XCTAssertTrue(operation.isFinished) XCTAssertEqual(mockStorageService.uploadCalled, 1) - mockStorageService.verifyUpload(serviceKey: expectedServiceKey, - key: testKey, - uploadSource: expectedUploadSource, - contentType: nil, - metadata: nil) + mockStorageService.verifyUpload( + serviceKey: expectedServiceKey, + key: testKey, + uploadSource: expectedUploadSource, + contentType: nil, + metadata: nil + ) } func testUploadDataOperationMultiPartUploadSuccess() async { @@ -173,21 +185,26 @@ class AWSS3StorageUploadDataOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceMultiPartUploadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.completedVoid] + StorageEvent.completedVoid + ] var testLargeDataString = "testLargeDataString" for _ in 1 ... 20 { testLargeDataString += testLargeDataString } let testLargeData = Data(testLargeDataString.utf8) - XCTAssertTrue(testLargeData.count > StorageUploadDataRequest.Options.multiPartUploadSizeThreshold, - "Could not create data object greater than MultiPartUploadSizeThreshold") + XCTAssertTrue( + testLargeData.count > StorageUploadDataRequest.Options.multiPartUploadSizeThreshold, + "Could not create data object greater than MultiPartUploadSizeThreshold" + ) let expectedUploadSource = UploadSource.data(testLargeData) let metadata = ["mykey": "Value"] - let options = StorageUploadDataRequest.Options(accessLevel: .protected, - metadata: metadata, - contentType: testContentType) + let options = StorageUploadDataRequest.Options( + accessLevel: .protected, + metadata: metadata, + contentType: testContentType + ) let request = StorageUploadDataRequest(key: testKey, data: testLargeData, options: options) let expectedServiceKey = StorageAccessLevel.protected.rawValue + "/" + testIdentityId + "/" + testKey @@ -207,18 +224,21 @@ class AWSS3StorageUploadDataOperationTests: AWSS3StorageOperationTestBase { default: XCTFail("Should have received completed event") } - }) + } + ) operation.start() await fulfillment(of: [completeInvoked, inProcessInvoked], timeout: 1) XCTAssertTrue(operation.isFinished) XCTAssertEqual(mockStorageService.multiPartUploadCalled, 1) - mockStorageService.verifyMultiPartUpload(serviceKey: expectedServiceKey, - key: testKey, - uploadSource: expectedUploadSource, - contentType: testContentType, - metadata: metadata) + mockStorageService.verifyMultiPartUpload( + serviceKey: expectedServiceKey, + key: testKey, + uploadSource: expectedUploadSource, + contentType: testContentType, + metadata: metadata + ) } /// Given: Storage Upload Data Operation @@ -229,11 +249,12 @@ class AWSS3StorageUploadDataOperationTests: AWSS3StorageOperationTestBase { let failedInvoked = expectation(description: "failed was invoked on operation") let options = StorageUploadDataRequest.Options(accessLevel: .protected) let request = StorageUploadDataRequest(path: path, data: testData, options: options) - let operation = AWSS3StorageUploadDataOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil + let operation = AWSS3StorageUploadDataOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil ) { result in switch result { case .failure(let error): @@ -260,11 +281,12 @@ class AWSS3StorageUploadDataOperationTests: AWSS3StorageOperationTestBase { let failedInvoked = expectation(description: "failed was invoked on operation") let options = StorageUploadDataRequest.Options(accessLevel: .protected) let request = StorageUploadDataRequest(path: path, data: testData, options: options) - let operation = AWSS3StorageUploadDataOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil + let operation = AWSS3StorageUploadDataOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil ) { result in switch result { case .failure(let error): @@ -291,11 +313,12 @@ class AWSS3StorageUploadDataOperationTests: AWSS3StorageOperationTestBase { let failedInvoked = expectation(description: "failed was invoked on operation") let options = StorageUploadDataRequest.Options(accessLevel: .protected) let request = StorageUploadDataRequest(path: path, data: testData, options: options) - let operation = AWSS3StorageUploadDataOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil + let operation = AWSS3StorageUploadDataOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil ) { result in switch result { case .failure(let error): @@ -322,11 +345,12 @@ class AWSS3StorageUploadDataOperationTests: AWSS3StorageOperationTestBase { let failedInvoked = expectation(description: "failed was invoked on operation") let options = StorageUploadDataRequest.Options(accessLevel: .protected) let request = StorageUploadDataRequest(path: path, data: testData, options: options) - let operation = AWSS3StorageUploadDataOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil + let operation = AWSS3StorageUploadDataOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil ) { result in switch result { case .failure(let error): @@ -354,14 +378,17 @@ class AWSS3StorageUploadDataOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceUploadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.completedVoid] + StorageEvent.completedVoid + ] let expectedUploadSource = UploadSource.data(testData) let metadata = ["mykey": "Value"] - let options = StorageUploadDataRequest.Options(accessLevel: .protected, - metadata: metadata, - contentType: testContentType) + let options = StorageUploadDataRequest.Options( + accessLevel: .protected, + metadata: metadata, + contentType: testContentType + ) let request = StorageUploadDataRequest(path: path, data: testData, options: options) let inProcessInvoked = expectation(description: "inProgress was invoked on operation") @@ -380,18 +407,21 @@ class AWSS3StorageUploadDataOperationTests: AWSS3StorageOperationTestBase { default: XCTFail("Should have received completed event") } - }) + } + ) operation.start() await fulfillment(of: [completeInvoked, inProcessInvoked], timeout: 1) XCTAssertTrue(operation.isFinished) XCTAssertEqual(mockStorageService.uploadCalled, 1) - mockStorageService.verifyUpload(serviceKey: "public/\(testKey)", - key: testKey, - uploadSource: expectedUploadSource, - contentType: testContentType, - metadata: metadata) + mockStorageService.verifyUpload( + serviceKey: "public/\(testKey)", + key: testKey, + uploadSource: expectedUploadSource, + contentType: testContentType, + metadata: metadata + ) } /// Given: Storage UploadData Operation @@ -404,14 +434,17 @@ class AWSS3StorageUploadDataOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceUploadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.completedVoid] + StorageEvent.completedVoid + ] let expectedUploadSource = UploadSource.data(testData) let metadata = ["mykey": "Value"] - let options = StorageUploadDataRequest.Options(accessLevel: .protected, - metadata: metadata, - contentType: testContentType) + let options = StorageUploadDataRequest.Options( + accessLevel: .protected, + metadata: metadata, + contentType: testContentType + ) let request = StorageUploadDataRequest(path: path, data: testData, options: options) let inProcessInvoked = expectation(description: "inProgress was invoked on operation") let completeInvoked = expectation(description: "complete was invoked on operation") @@ -429,18 +462,21 @@ class AWSS3StorageUploadDataOperationTests: AWSS3StorageOperationTestBase { default: XCTFail("Should have received completed event") } - }) + } + ) operation.start() await fulfillment(of: [completeInvoked, inProcessInvoked], timeout: 1) XCTAssertTrue(operation.isFinished) XCTAssertEqual(mockStorageService.uploadCalled, 1) - mockStorageService.verifyUpload(serviceKey: "public/\(testIdentityId)/\(testKey)", - key: testKey, - uploadSource: expectedUploadSource, - contentType: testContentType, - metadata: metadata) + mockStorageService.verifyUpload( + serviceKey: "public/\(testIdentityId)/\(testKey)", + key: testKey, + uploadSource: expectedUploadSource, + contentType: testContentType, + metadata: metadata + ) } // TODO: test pause, resume, canel, etc. diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageRemoveOperationTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageRemoveOperationTests.swift index 2e24943c00..0d835fdfa3 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageRemoveOperationTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageRemoveOperationTests.swift @@ -19,11 +19,12 @@ class AWSS3StorageRemoveOperationTests: AWSS3StorageOperationTestBase { let request = StorageRemoveRequest(key: "", options: options) let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageRemoveOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService) - { result in + let operation = AWSS3StorageRemoveOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService + ) { result in switch result { case .failure(let error): guard case .validation = error else { @@ -48,11 +49,12 @@ class AWSS3StorageRemoveOperationTests: AWSS3StorageOperationTestBase { let options = StorageRemoveRequest.Options() let request = StorageRemoveRequest(key: testKey, options: options) let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageRemoveOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService) - { result in + let operation = AWSS3StorageRemoveOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService + ) { result in switch result { case .failure(let error): guard case .authError = error else { @@ -77,11 +79,12 @@ class AWSS3StorageRemoveOperationTests: AWSS3StorageOperationTestBase { let expectedServiceKey = StorageAccessLevel.guest.serviceAccessPrefix + "/" + testKey let completeInvoked = expectation(description: "complete was invoked on operation") - let operation = AWSS3StorageRemoveOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService) - { result in + let operation = AWSS3StorageRemoveOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService + ) { result in switch result { case .success: completeInvoked.fulfill() @@ -104,11 +107,12 @@ class AWSS3StorageRemoveOperationTests: AWSS3StorageOperationTestBase { let expectedServiceKey = StorageAccessLevel.guest.serviceAccessPrefix + "/" + testKey let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageRemoveOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService) - { result in + let operation = AWSS3StorageRemoveOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService + ) { result in switch result { case .failure: failedInvoked.fulfill() @@ -132,11 +136,12 @@ class AWSS3StorageRemoveOperationTests: AWSS3StorageOperationTestBase { let expectedServiceKey = StorageAccessLevel.private.rawValue + "/" + testIdentityId + "/" + testKey let completeInvoked = expectation(description: "complete was invoked on operation") - let operation = AWSS3StorageRemoveOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService) - { result in + let operation = AWSS3StorageRemoveOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService + ) { result in switch result { case .success: completeInvoked.fulfill() diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageUploadFileOperationTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageUploadFileOperationTests.swift index adb545b76c..0493d1a291 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageUploadFileOperationTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageUploadFileOperationTests.swift @@ -21,12 +21,13 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { let request = StorageUploadFileRequest(key: "", local: testURL, options: options) let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageUploadFileOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil) - { result in + let operation = AWSS3StorageUploadFileOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil + ) { result in switch result { case .failure(let error): guard case .validation = error else { @@ -54,12 +55,13 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { let request = StorageUploadFileRequest(key: testKey, local: fileURL, options: options) let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageUploadFileOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil) - { result in + let operation = AWSS3StorageUploadFileOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil + ) { result in switch result { case .failure(let error): guard case .authError = error else { @@ -84,12 +86,13 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { let request = StorageUploadFileRequest(key: testKey, local: url, options: options) let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageUploadFileOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil) - { event in + let operation = AWSS3StorageUploadFileOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil + ) { event in switch event { case .failure(let error): guard case .localFileNotFound = error else { @@ -114,7 +117,8 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceUploadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.completedVoid] + StorageEvent.completedVoid + ] let filePath = NSTemporaryDirectory() + UUID().uuidString + ".tmp" let fileURL = URL(fileURLWithPath: filePath) @@ -122,9 +126,11 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { let expectedUploadSource = UploadSource.local(fileURL) let metadata = ["mykey": "Value"] - let options = StorageUploadFileRequest.Options(accessLevel: .protected, - metadata: metadata, - contentType: testContentType) + let options = StorageUploadFileRequest.Options( + accessLevel: .protected, + metadata: metadata, + contentType: testContentType + ) let request = StorageUploadFileRequest(key: testKey, local: fileURL, options: options) let expectedServiceKey = StorageAccessLevel.protected.rawValue + "/" + testIdentityId + "/" + testKey @@ -144,18 +150,21 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { default: XCTFail("Should have received completed event") } - }) + } + ) operation.start() await fulfillment(of: [completeInvoked, inProcessInvoked], timeout: 1) XCTAssertTrue(operation.isFinished) XCTAssertEqual(mockStorageService.uploadCalled, 1) - mockStorageService.verifyUpload(serviceKey: expectedServiceKey, - key: testKey, - uploadSource: expectedUploadSource, - contentType: testContentType, - metadata: metadata) + mockStorageService.verifyUpload( + serviceKey: expectedServiceKey, + key: testKey, + uploadSource: expectedUploadSource, + contentType: testContentType, + metadata: metadata + ) } func testUploadFileOperationUploadFail() async { @@ -164,7 +173,8 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceUploadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.failed(StorageError.service("", ""))] + StorageEvent.failed(StorageError.service("", "")) + ] let filePath = NSTemporaryDirectory() + UUID().uuidString + ".tmp" let fileURL = URL(fileURLWithPath: filePath) @@ -191,18 +201,21 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { default: XCTFail("Should have received completed event") } - }) + } + ) operation.start() await fulfillment(of: [failInvoked, inProcessInvoked], timeout: 1) XCTAssertTrue(operation.isFinished) XCTAssertEqual(mockStorageService.uploadCalled, 1) - mockStorageService.verifyUpload(serviceKey: expectedServiceKey, - key: testKey, - uploadSource: expectedUploadSource, - contentType: nil, - metadata: nil) + mockStorageService.verifyUpload( + serviceKey: expectedServiceKey, + key: testKey, + uploadSource: expectedUploadSource, + contentType: nil, + metadata: nil + ) } func testUploadFileOperationMultiPartUploadSuccess() async { @@ -211,20 +224,25 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceMultiPartUploadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.completedVoid] + StorageEvent.completedVoid + ] let largeDataObject = Data(repeating: 0xff, count: 1_024 * 1_024 * 6) // 6MB let filePath = NSTemporaryDirectory() + UUID().uuidString + ".tmp" let fileURL = URL(fileURLWithPath: filePath) FileManager.default.createFile(atPath: filePath, contents: largeDataObject, attributes: nil) - XCTAssertTrue(largeDataObject.count > StorageUploadDataRequest.Options.multiPartUploadSizeThreshold, - "Could not create data object greater than MultiPartUploadSizeThreshold") + XCTAssertTrue( + largeDataObject.count > StorageUploadDataRequest.Options.multiPartUploadSizeThreshold, + "Could not create data object greater than MultiPartUploadSizeThreshold" + ) let expectedUploadSource = UploadSource.local(testURL) let metadata = ["mykey": "Value"] - let options = StorageUploadFileRequest.Options(accessLevel: .protected, - metadata: metadata, - contentType: testContentType) + let options = StorageUploadFileRequest.Options( + accessLevel: .protected, + metadata: metadata, + contentType: testContentType + ) let request = StorageUploadFileRequest(key: testKey, local: fileURL, options: options) let expectedServiceKey = StorageAccessLevel.protected.rawValue + "/" + testIdentityId + "/" + testKey @@ -244,18 +262,21 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { default: XCTFail("Should have received completed event") } - }) + } + ) operation.start() await fulfillment(of: [completeInvoked, inProcessInvoked], timeout: 1) XCTAssertTrue(operation.isFinished) XCTAssertEqual(mockStorageService.multiPartUploadCalled, 1) - mockStorageService.verifyMultiPartUpload(serviceKey: expectedServiceKey, - key: testKey, - uploadSource: expectedUploadSource, - contentType: testContentType, - metadata: metadata) + mockStorageService.verifyMultiPartUpload( + serviceKey: expectedServiceKey, + key: testKey, + uploadSource: expectedUploadSource, + contentType: testContentType, + metadata: metadata + ) } /// Given: Storage Upload File Operation @@ -268,7 +289,8 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceUploadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.completedVoid] + StorageEvent.completedVoid + ] let filePath = NSTemporaryDirectory() + UUID().uuidString + ".tmp" let fileURL = URL(fileURLWithPath: filePath) @@ -276,18 +298,21 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { let expectedUploadSource = UploadSource.local(fileURL) let metadata = ["mykey": "Value"] - let options = StorageUploadFileRequest.Options(accessLevel: .protected, - metadata: metadata, - contentType: testContentType) + let options = StorageUploadFileRequest.Options( + accessLevel: .protected, + metadata: metadata, + contentType: testContentType + ) let request = StorageUploadFileRequest(path: path, local: fileURL, options: options) let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageUploadFileOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil) - { result in + let operation = AWSS3StorageUploadFileOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil + ) { result in switch result { case .failure(let error): guard case .validation = error else { @@ -315,7 +340,8 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceUploadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.completedVoid] + StorageEvent.completedVoid + ] let filePath = NSTemporaryDirectory() + UUID().uuidString + ".tmp" let fileURL = URL(fileURLWithPath: filePath) @@ -323,18 +349,21 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { let expectedUploadSource = UploadSource.local(fileURL) let metadata = ["mykey": "Value"] - let options = StorageUploadFileRequest.Options(accessLevel: .protected, - metadata: metadata, - contentType: testContentType) + let options = StorageUploadFileRequest.Options( + accessLevel: .protected, + metadata: metadata, + contentType: testContentType + ) let request = StorageUploadFileRequest(path: path, local: fileURL, options: options) let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageUploadFileOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil) - { result in + let operation = AWSS3StorageUploadFileOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil + ) { result in switch result { case .failure(let error): guard case .validation = error else { @@ -362,7 +391,8 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceUploadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.completedVoid] + StorageEvent.completedVoid + ] let filePath = NSTemporaryDirectory() + UUID().uuidString + ".tmp" let fileURL = URL(fileURLWithPath: filePath) @@ -370,18 +400,21 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { let expectedUploadSource = UploadSource.local(fileURL) let metadata = ["mykey": "Value"] - let options = StorageUploadFileRequest.Options(accessLevel: .protected, - metadata: metadata, - contentType: testContentType) + let options = StorageUploadFileRequest.Options( + accessLevel: .protected, + metadata: metadata, + contentType: testContentType + ) let request = StorageUploadFileRequest(path: path, local: fileURL, options: options) let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageUploadFileOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil) - { result in + let operation = AWSS3StorageUploadFileOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil + ) { result in switch result { case .failure(let error): guard case .validation = error else { @@ -409,7 +442,8 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceUploadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.completedVoid] + StorageEvent.completedVoid + ] let filePath = NSTemporaryDirectory() + UUID().uuidString + ".tmp" let fileURL = URL(fileURLWithPath: filePath) @@ -417,18 +451,21 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { let expectedUploadSource = UploadSource.local(fileURL) let metadata = ["mykey": "Value"] - let options = StorageUploadFileRequest.Options(accessLevel: .protected, - metadata: metadata, - contentType: testContentType) + let options = StorageUploadFileRequest.Options( + accessLevel: .protected, + metadata: metadata, + contentType: testContentType + ) let request = StorageUploadFileRequest(path: path, local: fileURL, options: options) let failedInvoked = expectation(description: "failed was invoked on operation") - let operation = AWSS3StorageUploadFileOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: nil) - { result in + let operation = AWSS3StorageUploadFileOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: nil + ) { result in switch result { case .failure(let error): guard case .validation = error else { @@ -456,7 +493,8 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceUploadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.completedVoid] + StorageEvent.completedVoid + ] let filePath = NSTemporaryDirectory() + UUID().uuidString + ".tmp" let fileURL = URL(fileURLWithPath: filePath) @@ -464,9 +502,11 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { let expectedUploadSource = UploadSource.local(fileURL) let metadata = ["mykey": "Value"] - let options = StorageUploadFileRequest.Options(accessLevel: .protected, - metadata: metadata, - contentType: testContentType) + let options = StorageUploadFileRequest.Options( + accessLevel: .protected, + metadata: metadata, + contentType: testContentType + ) let request = StorageUploadFileRequest(path: path, local: fileURL, options: options) let inProcessInvoked = expectation(description: "inProgress was invoked on operation") @@ -485,18 +525,21 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { default: XCTFail("Should have received completed event") } - }) + } + ) operation.start() await fulfillment(of: [completeInvoked, inProcessInvoked], timeout: 1) XCTAssertTrue(operation.isFinished) XCTAssertEqual(mockStorageService.uploadCalled, 1) - mockStorageService.verifyUpload(serviceKey: "public/\(testKey)", - key: testKey, - uploadSource: expectedUploadSource, - contentType: testContentType, - metadata: metadata) + mockStorageService.verifyUpload( + serviceKey: "public/\(testKey)", + key: testKey, + uploadSource: expectedUploadSource, + contentType: testContentType, + metadata: metadata + ) } /// Given: Storage Upload File Operation @@ -509,7 +552,8 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { mockStorageService.storageServiceUploadEvents = [ StorageEvent.initiated(StorageTaskReference(task)), StorageEvent.inProcess(Progress()), - StorageEvent.completedVoid] + StorageEvent.completedVoid + ] let filePath = NSTemporaryDirectory() + UUID().uuidString + ".tmp" let fileURL = URL(fileURLWithPath: filePath) @@ -517,9 +561,11 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { let expectedUploadSource = UploadSource.local(fileURL) let metadata = ["mykey": "Value"] - let options = StorageUploadFileRequest.Options(accessLevel: .protected, - metadata: metadata, - contentType: testContentType) + let options = StorageUploadFileRequest.Options( + accessLevel: .protected, + metadata: metadata, + contentType: testContentType + ) let request = StorageUploadFileRequest(path: path, local: fileURL, options: options) let inProcessInvoked = expectation(description: "inProgress was invoked on operation") let completeInvoked = expectation(description: "complete was invoked on operation") @@ -537,18 +583,21 @@ class AWSS3StorageUploadFileOperationTests: AWSS3StorageOperationTestBase { default: XCTFail("Should have received completed event") } - }) + } + ) operation.start() await fulfillment(of: [completeInvoked, inProcessInvoked], timeout: 1) XCTAssertTrue(operation.isFinished) XCTAssertEqual(mockStorageService.uploadCalled, 1) - mockStorageService.verifyUpload(serviceKey: "public/\(testIdentityId)/\(testKey)", - key: testKey, - uploadSource: expectedUploadSource, - contentType: testContentType, - metadata: metadata) + mockStorageService.verifyUpload( + serviceKey: "public/\(testIdentityId)/\(testKey)", + key: testKey, + uploadSource: expectedUploadSource, + contentType: testContentType, + metadata: metadata + ) } // TODO: test pause, resume, canel, etc. diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageUploadFileOperationTests2.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageUploadFileOperationTests2.swift index d282616c0c..adf6c43379 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageUploadFileOperationTests2.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Operation/AWSS3StorageUploadFileOperationTests2.swift @@ -26,9 +26,11 @@ final class AWSS3StorageUploadFileOperationTests2: AWSS3StorageOperationTestBase /// - Then: An accessDenied error is returned before attempting proceed further func testAccessDenied() throws { let path = NSTemporaryDirectory().appending(UUID().uuidString) - FileManager.default.createFile(atPath: path, - contents: Data(UUID().uuidString.utf8), - attributes: [FileAttributeKey.posixPermissions: 000]) + FileManager.default.createFile( + atPath: path, + contents: Data(UUID().uuidString.utf8), + attributes: [FileAttributeKey.posixPermissions: 000] + ) defer { try? FileManager.default.removeItem(atPath: path) } @@ -60,12 +62,14 @@ final class AWSS3StorageUploadFileOperationTests2: AWSS3StorageOperationTestBase } } - let operation = AWSS3StorageUploadFileOperation(request, - storageConfiguration: testStorageConfiguration, - storageService: mockStorageService, - authService: mockAuthService, - progressListener: progressListner, - resultListener: resultListener) + let operation = AWSS3StorageUploadFileOperation( + request, + storageConfiguration: testStorageConfiguration, + storageService: mockStorageService, + authService: mockAuthService, + progressListener: progressListner, + resultListener: resultListener + ) operation.start() wait(for: [progressExpectation, resultExpectation], timeout: 1) diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageDownloadFileRequestTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageDownloadFileRequestTests.swift index f66b40c2f9..91145a9c5d 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageDownloadFileRequestTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageDownloadFileRequestTests.swift @@ -17,9 +17,11 @@ class StorageDownloadFileRequestTests: XCTestCase { let testURL = URL(fileURLWithPath: "path") func testValidateSuccess() { - let options = StorageDownloadFileRequest.Options(accessLevel: .protected, - targetIdentityId: testTargetIdentityId, - pluginOptions: testPluginOptions) + let options = StorageDownloadFileRequest.Options( + accessLevel: .protected, + targetIdentityId: testTargetIdentityId, + pluginOptions: testPluginOptions + ) let request = StorageDownloadFileRequest(key: testKey, local: testURL, options: options) let storageErrorOptional = request.validate() @@ -28,9 +30,11 @@ class StorageDownloadFileRequestTests: XCTestCase { } func testValidateEmptyTargetIdentityIdError() { - let options = StorageDownloadFileRequest.Options(accessLevel: .protected, - targetIdentityId: "", - pluginOptions: testPluginOptions) + let options = StorageDownloadFileRequest.Options( + accessLevel: .protected, + targetIdentityId: "", + pluginOptions: testPluginOptions + ) let request = StorageDownloadFileRequest(key: testKey, local: testURL, options: options) let storageErrorOptional = request.validate() @@ -51,9 +55,11 @@ class StorageDownloadFileRequestTests: XCTestCase { } func testValidateTargetIdentityIdWithPrivateAccessLevelError() { - let options = StorageDownloadFileRequest.Options(accessLevel: .private, - targetIdentityId: testTargetIdentityId, - pluginOptions: testPluginOptions) + let options = StorageDownloadFileRequest.Options( + accessLevel: .private, + targetIdentityId: testTargetIdentityId, + pluginOptions: testPluginOptions + ) let request = StorageDownloadFileRequest(key: testKey, local: testURL, options: options) let storageErrorOptional = request.validate() @@ -74,9 +80,11 @@ class StorageDownloadFileRequestTests: XCTestCase { } func testValidateKeyIsEmptyError() { - let options = StorageDownloadFileRequest.Options(accessLevel: .protected, - targetIdentityId: testTargetIdentityId, - pluginOptions: testPluginOptions) + let options = StorageDownloadFileRequest.Options( + accessLevel: .protected, + targetIdentityId: testTargetIdentityId, + pluginOptions: testPluginOptions + ) let request = StorageDownloadFileRequest(key: "", local: testURL, options: options) let storageErrorOptional = request.validate() @@ -101,9 +109,11 @@ class StorageDownloadFileRequestTests: XCTestCase { /// Then: There is no error returned even though the storage path is invalid /// There is no error because the path validation is done at operation execution time and not part of the request func testValidateWithStoragePath() { - let options = StorageDownloadFileRequest.Options(accessLevel: .private, - targetIdentityId: "", - pluginOptions: testPluginOptions) + let options = StorageDownloadFileRequest.Options( + accessLevel: .private, + targetIdentityId: "", + pluginOptions: testPluginOptions + ) let path = StringStoragePath(resolve: {_ in "my/path"}) let request = StorageDownloadFileRequest(path: path, local: testURL, options: options) diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageGetDataRequestTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageGetDataRequestTests.swift index b09a29cea4..3ad96f0321 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageGetDataRequestTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageGetDataRequestTests.swift @@ -16,9 +16,11 @@ class StorageDownloadDataRequestTests: XCTestCase { let testPluginOptions: Any? = [:] func testValidateSuccess() { - let options = StorageDownloadDataRequest.Options(accessLevel: .protected, - targetIdentityId: testTargetIdentityId, - pluginOptions: testPluginOptions) + let options = StorageDownloadDataRequest.Options( + accessLevel: .protected, + targetIdentityId: testTargetIdentityId, + pluginOptions: testPluginOptions + ) let request = StorageDownloadDataRequest(key: testKey, options: options) let storageErrorOptional = request.validate() @@ -27,9 +29,11 @@ class StorageDownloadDataRequestTests: XCTestCase { } func testValidateEmptyTargetIdentityIdError() { - let options = StorageDownloadDataRequest.Options(accessLevel: .protected, - targetIdentityId: "", - pluginOptions: testPluginOptions) + let options = StorageDownloadDataRequest.Options( + accessLevel: .protected, + targetIdentityId: "", + pluginOptions: testPluginOptions + ) let request = StorageDownloadDataRequest(key: testKey, options: options) let storageErrorOptional = request.validate() @@ -50,9 +54,11 @@ class StorageDownloadDataRequestTests: XCTestCase { } func testValidateTargetIdentityIdWithPrivateAccessLevelError() { - let options = StorageDownloadDataRequest.Options(accessLevel: .private, - targetIdentityId: testTargetIdentityId, - pluginOptions: testPluginOptions) + let options = StorageDownloadDataRequest.Options( + accessLevel: .private, + targetIdentityId: testTargetIdentityId, + pluginOptions: testPluginOptions + ) let request = StorageDownloadDataRequest(key: testKey, options: options) let storageErrorOptional = request.validate() @@ -73,9 +79,11 @@ class StorageDownloadDataRequestTests: XCTestCase { } func testValidateKeyIsEmptyError() { - let options = StorageDownloadDataRequest.Options(accessLevel: .protected, - targetIdentityId: testTargetIdentityId, - pluginOptions: testPluginOptions) + let options = StorageDownloadDataRequest.Options( + accessLevel: .protected, + targetIdentityId: testTargetIdentityId, + pluginOptions: testPluginOptions + ) let request = StorageDownloadDataRequest(key: "", options: options) let storageErrorOptional = request.validate() @@ -100,9 +108,11 @@ class StorageDownloadDataRequestTests: XCTestCase { /// Then: There is no error returned even though the storage path is invalid /// There is no error because the path validation is done at operation execution time and not part of the request func testValidateWithStoragePath() { - let options = StorageDownloadDataRequest.Options(accessLevel: .private, - targetIdentityId: "", - pluginOptions: testPluginOptions) + let options = StorageDownloadDataRequest.Options( + accessLevel: .private, + targetIdentityId: "", + pluginOptions: testPluginOptions + ) let path = StringStoragePath(resolve: { input in return "my/path/"}) let request = StorageDownloadDataRequest(path: path, options: options) diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageGetURLRequestTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageGetURLRequestTests.swift index 5d05ebb82c..2af23d2ac7 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageGetURLRequestTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageGetURLRequestTests.swift @@ -17,10 +17,12 @@ class StorageGetURLRequestTests: XCTestCase { let testExpires = 10 func testValidateSuccess() { - let options = StorageGetURLRequest.Options(accessLevel: .protected, - targetIdentityId: testTargetIdentityId, - expires: testExpires, - pluginOptions: testPluginOptions) + let options = StorageGetURLRequest.Options( + accessLevel: .protected, + targetIdentityId: testTargetIdentityId, + expires: testExpires, + pluginOptions: testPluginOptions + ) let request = StorageGetURLRequest(key: testKey, options: options) let storageErrorOptional = request.validate() @@ -29,10 +31,12 @@ class StorageGetURLRequestTests: XCTestCase { } func testValidateEmptyTargetIdentityIdError() { - let options = StorageGetURLRequest.Options(accessLevel: .protected, - targetIdentityId: "", - expires: testExpires, - pluginOptions: testPluginOptions) + let options = StorageGetURLRequest.Options( + accessLevel: .protected, + targetIdentityId: "", + expires: testExpires, + pluginOptions: testPluginOptions + ) let request = StorageGetURLRequest(key: testKey, options: options) let storageErrorOptional = request.validate() @@ -53,10 +57,12 @@ class StorageGetURLRequestTests: XCTestCase { } func testValidateTargetIdentityIdWithPrivateAccessLevelError() { - let options = StorageGetURLRequest.Options(accessLevel: .private, - targetIdentityId: testTargetIdentityId, - expires: testExpires, - pluginOptions: testPluginOptions) + let options = StorageGetURLRequest.Options( + accessLevel: .private, + targetIdentityId: testTargetIdentityId, + expires: testExpires, + pluginOptions: testPluginOptions + ) let request = StorageGetURLRequest(key: testKey, options: options) let storageErrorOptional = request.validate() @@ -77,10 +83,12 @@ class StorageGetURLRequestTests: XCTestCase { } func testValidateKeyIsEmptyError() { - let options = StorageGetURLRequest.Options(accessLevel: .protected, - targetIdentityId: testTargetIdentityId, - expires: testExpires, - pluginOptions: testPluginOptions) + let options = StorageGetURLRequest.Options( + accessLevel: .protected, + targetIdentityId: testTargetIdentityId, + expires: testExpires, + pluginOptions: testPluginOptions + ) let request = StorageGetURLRequest(key: "", options: options) let storageErrorOptional = request.validate() @@ -101,10 +109,12 @@ class StorageGetURLRequestTests: XCTestCase { } func testValidateURLNonPositiveExpiresError() { - let options = StorageGetURLRequest.Options(accessLevel: .protected, - targetIdentityId: testTargetIdentityId, - expires: -1, - pluginOptions: testPluginOptions) + let options = StorageGetURLRequest.Options( + accessLevel: .protected, + targetIdentityId: testTargetIdentityId, + expires: -1, + pluginOptions: testPluginOptions + ) let request = StorageGetURLRequest(key: testKey, options: options) let storageErrorOptional = request.validate() diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageListRequestTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageListRequestTests.swift index 09d0807ab3..13091877a1 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageListRequestTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageListRequestTests.swift @@ -16,10 +16,12 @@ class StorageListRequestTests: XCTestCase { let testPluginOptions: Any? = [:] func testValidateSuccess() { - let options = StorageListRequest.Options(accessLevel: .protected, - targetIdentityId: testTargetIdentityId, - path: testPath, - pluginOptions: testPluginOptions) + let options = StorageListRequest.Options( + accessLevel: .protected, + targetIdentityId: testTargetIdentityId, + path: testPath, + pluginOptions: testPluginOptions + ) let request = StorageListRequest(options: options) let storageErrorOptional = request.validate() @@ -45,10 +47,12 @@ class StorageListRequestTests: XCTestCase { } func testValidateEmptyTargetIdentityIdError() { - let options = StorageListRequest.Options(accessLevel: .protected, - targetIdentityId: "", - path: testPath, - pluginOptions: testPluginOptions) + let options = StorageListRequest.Options( + accessLevel: .protected, + targetIdentityId: "", + path: testPath, + pluginOptions: testPluginOptions + ) let request = StorageListRequest(options: options) let storageErrorOptional = request.validate() @@ -69,10 +73,12 @@ class StorageListRequestTests: XCTestCase { } func testValidateTargetIdentityIdWithPrivateAccessLevelError() { - let options = StorageListRequest.Options(accessLevel: .private, - targetIdentityId: testTargetIdentityId, - path: testPath, - pluginOptions: testPluginOptions) + let options = StorageListRequest.Options( + accessLevel: .private, + targetIdentityId: testTargetIdentityId, + path: testPath, + pluginOptions: testPluginOptions + ) let request = StorageListRequest(options: options) let storageErrorOptional = request.validate() @@ -93,10 +99,12 @@ class StorageListRequestTests: XCTestCase { } func testValidateEmptyPathError() { - let options = StorageListRequest.Options(accessLevel: .protected, - targetIdentityId: testTargetIdentityId, - path: "", - pluginOptions: testPluginOptions) + let options = StorageListRequest.Options( + accessLevel: .protected, + targetIdentityId: testTargetIdentityId, + path: "", + pluginOptions: testPluginOptions + ) let request = StorageListRequest(options: options) let storageErrorOptional = request.validate() diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StoragePutDataRequestTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StoragePutDataRequestTests.swift index 377ca07deb..b731bd98a1 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StoragePutDataRequestTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StoragePutDataRequestTests.swift @@ -19,10 +19,12 @@ class AWSS3StorageUploadDataRequestTests: XCTestCase { let testMetadata: [String: String] = [:] func testValidateSuccess() { - let options = StorageUploadDataRequest.Options(accessLevel: .protected, - metadata: testMetadata, - contentType: testContentType, - pluginOptions: testPluginOptions) + let options = StorageUploadDataRequest.Options( + accessLevel: .protected, + metadata: testMetadata, + contentType: testContentType, + pluginOptions: testPluginOptions + ) let request = StorageUploadDataRequest(key: testKey, data: testData, options: options) let storageErrorOptional = request.validate() @@ -31,10 +33,12 @@ class AWSS3StorageUploadDataRequestTests: XCTestCase { } func testValidateEmptyKeyError() { - let options = StorageUploadDataRequest.Options(accessLevel: .protected, - metadata: testMetadata, - contentType: testContentType, - pluginOptions: testPluginOptions) + let options = StorageUploadDataRequest.Options( + accessLevel: .protected, + metadata: testMetadata, + contentType: testContentType, + pluginOptions: testPluginOptions + ) let request = StorageUploadDataRequest(key: "", data: testData, options: options) let storageErrorOptional = request.validate() @@ -55,10 +59,12 @@ class AWSS3StorageUploadDataRequestTests: XCTestCase { } func testValidateEmptyContentTypeError() { - let options = StorageUploadDataRequest.Options(accessLevel: .protected, - metadata: testMetadata, - contentType: "", - pluginOptions: testPluginOptions) + let options = StorageUploadDataRequest.Options( + accessLevel: .protected, + metadata: testMetadata, + contentType: "", + pluginOptions: testPluginOptions + ) let request = StorageUploadDataRequest(key: testKey, data: testData, options: options) let storageErrorOptional = request.validate() @@ -80,10 +86,12 @@ class AWSS3StorageUploadDataRequestTests: XCTestCase { func testValidateMetadataKeyIsInvalid() { let metadata = ["InvalidKeyNotLowerCase": "someValue"] - let options = StorageUploadDataRequest.Options(accessLevel: .protected, - metadata: metadata, - contentType: testContentType, - pluginOptions: testPluginOptions) + let options = StorageUploadDataRequest.Options( + accessLevel: .protected, + metadata: metadata, + contentType: testContentType, + pluginOptions: testPluginOptions + ) let request = StorageUploadDataRequest(key: testKey, data: testData, options: options) let storageErrorOptional = request.validate() @@ -109,10 +117,12 @@ class AWSS3StorageUploadDataRequestTests: XCTestCase { /// There is no error because the path validation is done at operation execution time and not part of the request func testValidateWithStoragePath() { let path = StringStoragePath(resolve: {_ in "my/path"}) - let options = StorageUploadDataRequest.Options(accessLevel: .protected, - metadata: testMetadata, - contentType: testContentType, - pluginOptions: testPluginOptions) + let options = StorageUploadDataRequest.Options( + accessLevel: .protected, + metadata: testMetadata, + contentType: testContentType, + pluginOptions: testPluginOptions + ) let request = StorageUploadDataRequest(path: path, data: testData, options: options) let storageErrorOptional = request.validate() diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageRemoveRequestTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageRemoveRequestTests.swift index ae1756745a..3d47ee4774 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageRemoveRequestTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageRemoveRequestTests.swift @@ -19,8 +19,10 @@ class AWSS3StorageRemoveRequestTests: XCTestCase { let testMetadata: [String: String] = [:] func testValidateSuccess() { - let options = StorageRemoveRequest.Options(accessLevel: .protected, - pluginOptions: testPluginOptions) + let options = StorageRemoveRequest.Options( + accessLevel: .protected, + pluginOptions: testPluginOptions + ) let request = StorageRemoveRequest(key: testKey, options: options) let storageErrorOptional = request.validate() @@ -29,8 +31,10 @@ class AWSS3StorageRemoveRequestTests: XCTestCase { } func testValidateEmptyKeyError() { - let options = StorageRemoveRequest.Options(accessLevel: .protected, - pluginOptions: testPluginOptions) + let options = StorageRemoveRequest.Options( + accessLevel: .protected, + pluginOptions: testPluginOptions + ) let request = StorageRemoveRequest(key: "", options: options) let storageErrorOptional = request.validate() diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageUploadFileRequestTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageUploadFileRequestTests.swift index 57bcd34447..07fb3fc3ee 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageUploadFileRequestTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Request/AWSS3StorageUploadFileRequestTests.swift @@ -22,10 +22,12 @@ class AWSS3StorageUploadFileRequestTests: XCTestCase { let filePath = NSTemporaryDirectory() + UUID().uuidString + ".tmp" let fileURL = URL(fileURLWithPath: filePath) FileManager.default.createFile(atPath: filePath, contents: testData, attributes: nil) - let options = StorageUploadFileRequest.Options(accessLevel: .protected, - metadata: testMetadata, - contentType: testContentType, - pluginOptions: testPluginOptions) + let options = StorageUploadFileRequest.Options( + accessLevel: .protected, + metadata: testMetadata, + contentType: testContentType, + pluginOptions: testPluginOptions + ) let request = StorageUploadFileRequest(key: testKey, local: fileURL, options: options) let storageErrorOptional = request.validate() @@ -37,10 +39,12 @@ class AWSS3StorageUploadFileRequestTests: XCTestCase { let filePath = NSTemporaryDirectory() + UUID().uuidString + ".tmp" let fileURL = URL(fileURLWithPath: filePath) FileManager.default.createFile(atPath: filePath, contents: testData, attributes: nil) - let options = StorageUploadFileRequest.Options(accessLevel: .protected, - metadata: testMetadata, - contentType: testContentType, - pluginOptions: testPluginOptions) + let options = StorageUploadFileRequest.Options( + accessLevel: .protected, + metadata: testMetadata, + contentType: testContentType, + pluginOptions: testPluginOptions + ) let request = StorageUploadFileRequest(key: "", local: fileURL, options: options) let storageErrorOptional = request.validate() @@ -64,10 +68,12 @@ class AWSS3StorageUploadFileRequestTests: XCTestCase { let filePath = NSTemporaryDirectory() + UUID().uuidString + ".tmp" let fileURL = URL(fileURLWithPath: filePath) FileManager.default.createFile(atPath: filePath, contents: testData, attributes: nil) - let options = StorageUploadFileRequest.Options(accessLevel: .protected, - metadata: testMetadata, - contentType: "", - pluginOptions: testPluginOptions) + let options = StorageUploadFileRequest.Options( + accessLevel: .protected, + metadata: testMetadata, + contentType: "", + pluginOptions: testPluginOptions + ) let request = StorageUploadFileRequest(key: testKey, local: fileURL, options: options) let storageErrorOptional = request.validate() @@ -92,10 +98,12 @@ class AWSS3StorageUploadFileRequestTests: XCTestCase { let fileURL = URL(fileURLWithPath: filePath) FileManager.default.createFile(atPath: filePath, contents: testData, attributes: nil) let metadata = ["InvalidKeyNotLowerCase": "someValue"] - let options = StorageUploadFileRequest.Options(accessLevel: .protected, - metadata: metadata, - contentType: testContentType, - pluginOptions: testPluginOptions) + let options = StorageUploadFileRequest.Options( + accessLevel: .protected, + metadata: metadata, + contentType: testContentType, + pluginOptions: testPluginOptions + ) let request = StorageUploadFileRequest(key: testKey, local: fileURL, options: options) let storageErrorOptional = request.validate() @@ -124,10 +132,12 @@ class AWSS3StorageUploadFileRequestTests: XCTestCase { let filePath = NSTemporaryDirectory() + UUID().uuidString + ".tmp" let fileURL = URL(fileURLWithPath: filePath) FileManager.default.createFile(atPath: filePath, contents: testData, attributes: nil) - let options = StorageUploadFileRequest.Options(accessLevel: .protected, - metadata: testMetadata, - contentType: testContentType, - pluginOptions: testPluginOptions) + let options = StorageUploadFileRequest.Options( + accessLevel: .protected, + metadata: testMetadata, + contentType: testContentType, + pluginOptions: testPluginOptions + ) let request = StorageUploadFileRequest(path: path, local: fileURL, options: options) let storageErrorOptional = request.validate() diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceGetPreSignedURLBehaviorTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceGetPreSignedURLBehaviorTests.swift index 1b4cb4fbf9..839bf2dd3e 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceGetPreSignedURLBehaviorTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceGetPreSignedURLBehaviorTests.swift @@ -38,10 +38,12 @@ class AWSS3StorageServiceGetPreSignedURLBehaviorTests: XCTestCase { serviceKey = UUID().uuidString presignedURL = URL(fileURLWithPath: NSTemporaryDirectory().appendingPathComponent(serviceKey)) expires = Int(Date.distantFuture.timeIntervalSince1970) - systemUnderTest = try AWSS3StorageService(authService: authService, - region: region, - bucket: bucket, - storageTransferDatabase: database) + systemUnderTest = try AWSS3StorageService( + authService: authService, + region: region, + bucket: bucket, + storageTransferDatabase: database + ) systemUnderTest.preSignedURLBuilder = builder systemUnderTest.client = client @@ -66,11 +68,13 @@ class AWSS3StorageServiceGetPreSignedURLBehaviorTests: XCTestCase { /// - When: A presigned URL is requested for a **AWSS3SigningOperation.getObject** operation /// - Then: A valid URL is returned func testForGetObject() async throws { - let url = try await systemUnderTest.getPreSignedURL(serviceKey: serviceKey, - signingOperation: .getObject, - metadata: nil, - accelerate: nil, - expires: expires) + 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:metadata:accelerate:expires:) \(serviceKey ?? "") \(AWSS3SigningOperation.getObject) nil \(String(describing: expires))" @@ -81,11 +85,13 @@ class AWSS3StorageServiceGetPreSignedURLBehaviorTests: XCTestCase { /// - When: A presigned URL is requested for a **AWSS3SigningOperation.putObject** operation /// - Then: A valid URL is returned func testForPutObject() async throws { - let url = try await systemUnderTest.getPreSignedURL(serviceKey: serviceKey, - signingOperation: .putObject, - metadata: nil, - accelerate: nil, - expires: expires) + 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:metadata:accelerate:expires:) \(serviceKey ?? "") \(AWSS3SigningOperation.putObject) nil \(String(describing: expires))" @@ -97,11 +103,13 @@ class AWSS3StorageServiceGetPreSignedURLBehaviorTests: XCTestCase { /// - 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) + 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))" @@ -113,11 +121,13 @@ class AWSS3StorageServiceGetPreSignedURLBehaviorTests: XCTestCase { /// - Then: A valid URL is returned func testForUploadPart() async throws { 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) + 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:metadata:accelerate:expires:) \(serviceKey ?? "") \(operation) nil \(String(describing: expires))" diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceListTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceListTests.swift index 65475f9bc8..421b1d3c43 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceListTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceListTests.swift @@ -33,9 +33,11 @@ final class AWSS3StorageServiceListTests: XCTestCase { prefix = UUID().uuidString path = UUID().uuidString targetIdentityId = UUID().uuidString - systemUnderTest = try AWSS3StorageService(authService: authService, - region: region, - bucket: bucket) + systemUnderTest = try AWSS3StorageService( + authService: authService, + region: region, + bucket: bucket + ) systemUnderTest.client = client } @@ -61,8 +63,10 @@ final class AWSS3StorageServiceListTests: XCTestCase { } let pageSize = UInt.random(in: 1 ..< 1_000) let nextToken = UUID().uuidString - let options = StorageListRequest.Options(pageSize: pageSize, - nextToken: nextToken) + let options = StorageListRequest.Options( + pageSize: pageSize, + nextToken: nextToken + ) let listing = try await systemUnderTest.list(prefix: prefix, options: options) XCTAssertEqual(listing.items.map(\.key), []) XCTAssertEqual(inputs.map(\.continuationToken), [nextToken]) @@ -135,9 +139,11 @@ final class AWSS3StorageServiceListTests: XCTestCase { /// When: A listing of it is requested using this empty targetIdentityId /// Then: The service throws a `StorageError.validation` error func testValidateEmptyTargetIdentityIdError() async throws { - let options = StorageListRequest.Options(accessLevel: .protected, - targetIdentityId: "", - path: path) + let options = StorageListRequest.Options( + accessLevel: .protected, + targetIdentityId: "", + path: path + ) do { let _ = try await systemUnderTest.list(prefix: prefix, options: options) XCTFail("Missing StorageError") @@ -152,9 +158,11 @@ final class AWSS3StorageServiceListTests: XCTestCase { /// When: A listing of it is requested using `accessLevel: .private` /// Then: The service throws a `StorageError.validation` error func testValidateTargetIdentityIdWithPrivateAccessLevelError() async throws { - let options = StorageListRequest.Options(accessLevel: .private, - targetIdentityId: targetIdentityId, - path: path) + let options = StorageListRequest.Options( + accessLevel: .private, + targetIdentityId: targetIdentityId, + path: path + ) do { let _ = try await systemUnderTest.list(prefix: prefix, options: options) XCTFail("Missing StorageError") @@ -169,9 +177,11 @@ final class AWSS3StorageServiceListTests: XCTestCase { /// When: A listing of it is requested using an empty string value for the `path` parameter /// Then: The service throws a `StorageError.validation` error func testValidateEmptyPathError() async throws { - let options = StorageListRequest.Options(accessLevel: .protected, - targetIdentityId: targetIdentityId, - path: "") + let options = StorageListRequest.Options( + accessLevel: .protected, + targetIdentityId: targetIdentityId, + path: "" + ) do { let _ = try await systemUnderTest.list(prefix: prefix, options: options) XCTFail("Missing StorageError") diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceTests.swift index 80c5640039..93fe9e6f75 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceTests.swift @@ -31,8 +31,9 @@ class AWSS3StorageServiceTests: XCTestCase { task.uploadId = "uploadId" task.sessionTask = MockStorageSessionTask(taskIdentifier: 1) database.recoverResult = .success([ - .init(transferTask: task, - multipartUploads: [ + .init( + transferTask: task, + multipartUploads: [ .created( uploadId: "uploadId", uploadFile: UploadFile( @@ -41,8 +42,8 @@ class AWSS3StorageServiceTests: XCTestCase { size: UInt64(Bytes.megabytes(12).bytes) ) ) - ] - ) + ] + ) ]) service = try AWSS3StorageService( authService: authService, @@ -422,9 +423,10 @@ private class StorageTransferDatabaseMock: StorageTransferDatabase { var recoverCount = 0 var recoverResult: Result = .failure(StorageError.unknown("Result not set", nil)) - func recover(urlSession: StorageURLSession, - completionHandler: @escaping (Result) -> Void) - { + func recover( + urlSession: StorageURLSession, + completionHandler: @escaping (Result) -> Void + ) { recoverCount += 1 completionHandler(recoverResult) } diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/AttemptTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/AttemptTests.swift index a1e9c62401..657cf7d25d 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/AttemptTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/AttemptTests.swift @@ -48,14 +48,18 @@ class AttemptTests: XCTestCase { } func testAttemptNoFailClosureNoThrow() throws { - let result = try attempt(work1(number: badNumber), - fail: { error in }) + let result = try attempt( + work1(number: badNumber), + fail: { error in } + ) XCTAssertNil(result) } func testAttemptNoFailClosureThrow() throws { - let result = try attempt(work2(number: badNumber), - fail: { error in }) + let result = try attempt( + work2(number: badNumber), + fail: { error in } + ) XCTAssertEqual(false, result) } diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/DefaultStorageMultipartUploadClientTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/DefaultStorageMultipartUploadClientTests.swift index ad7816367a..349fc12327 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/DefaultStorageMultipartUploadClientTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/DefaultStorageMultipartUploadClientTests.swift @@ -155,7 +155,8 @@ class DefaultStorageMultipartUploadClientTests: XCTestCase { uploadFile: .init( fileURL: FileManager.default.temporaryDirectory.appendingPathComponent("noFile.txt"), temporaryFileCreated: false, - size: 1_024), + size: 1_024 + ), partSize: .default, parts: [ .pending(bytes: 10), diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/DefaultStorageTransferDatabaseTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/DefaultStorageTransferDatabaseTests.swift index 8ac205b94b..f3ab8dbcc8 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/DefaultStorageTransferDatabaseTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/DefaultStorageTransferDatabaseTests.swift @@ -150,7 +150,8 @@ class DefaultStorageTransferDatabaseTests: XCTestCase { ), .completed( bytes: Bytes.megabytes(6).bytes, - eTag: "eTag"), + eTag: "eTag" + ), .pending(bytes: Bytes.megabytes(6).bytes) ] diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/MockStorageTransferDatabase.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/MockStorageTransferDatabase.swift index 0ea4b4a665..333284ae8d 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/MockStorageTransferDatabase.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/MockStorageTransferDatabase.swift @@ -11,9 +11,11 @@ import Foundation class MockStorageTransferDatabase: StorageTransferDatabase { - private let queue = DispatchQueue(label: "com.amazon.aws.amplify.storage-tests", - qos: .background, - target: .global()) + private let queue = DispatchQueue( + label: "com.amazon.aws.amplify.storage-tests", + qos: .background, + target: .global() + ) private var tasks: [TransferID: StorageTransferTask] = [:] private var uploadEventHandler: AWSS3StorageServiceBehavior.StorageServiceUploadEventHandler? @@ -46,9 +48,10 @@ class MockStorageTransferDatabase: StorageTransferDatabase { completion?() } - func recover(urlSession: StorageURLSession, - completionHandler: @escaping (Result) -> Void) - { + func recover( + urlSession: StorageURLSession, + completionHandler: @escaping (Result) -> Void + ) { // do nothing } @@ -80,10 +83,11 @@ class MockStorageTransferDatabase: StorageTransferDatabase { } // swiftlint:disable line_length - func attachEventHandlers(onUpload: AWSS3StorageServiceBehavior.StorageServiceUploadEventHandler? = nil, - onDownload: AWSS3StorageServiceBehavior.StorageServiceDownloadEventHandler? = nil, - onMultipartUpload: AWSS3StorageServiceBehavior.StorageServiceMultiPartUploadEventHandler? = nil) - { + func attachEventHandlers( + onUpload: AWSS3StorageServiceBehavior.StorageServiceUploadEventHandler? = nil, + onDownload: AWSS3StorageServiceBehavior.StorageServiceDownloadEventHandler? = nil, + onMultipartUpload: AWSS3StorageServiceBehavior.StorageServiceMultiPartUploadEventHandler? = nil + ) { queue.async { [weak self] in guard let self else { fatalError("self cannot be weak") } uploadEventHandler = onUpload diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StoragePersistableTransferTaskTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StoragePersistableTransferTaskTests.swift index 994ccc08ba..1a6df06241 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StoragePersistableTransferTaskTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StoragePersistableTransferTaskTests.swift @@ -47,11 +47,13 @@ class StoragePersistableTransferTaskTests: XCTestCase { return } - let loadedTask1 = StorageTransferTask(persistableTransferTask: persistableTask1, - transferType: loadedTranferType1, - sessionTask: sessionTask1, - storageTransferDatabase: database, - logger: logger) + let loadedTask1 = StorageTransferTask( + persistableTransferTask: persistableTask1, + transferType: loadedTranferType1, + sessionTask: sessionTask1, + storageTransferDatabase: database, + logger: logger + ) XCTAssertEqual(task1.transferID, loadedTask1.transferID) XCTAssertEqual(task1.taskIdentifier, loadedTask1.taskIdentifier) @@ -78,11 +80,13 @@ class StoragePersistableTransferTaskTests: XCTestCase { return } - let loadedTask1 = StorageTransferTask(persistableTransferTask: persistableTask1, - transferType: loadedTranferType1, - sessionTask: sessionTask1, - storageTransferDatabase: database, - logger: logger) + let loadedTask1 = StorageTransferTask( + persistableTransferTask: persistableTask1, + transferType: loadedTranferType1, + sessionTask: sessionTask1, + storageTransferDatabase: database, + logger: logger + ) XCTAssertEqual(task1.transferID, loadedTask1.transferID) XCTAssertEqual(task1.taskIdentifier, loadedTask1.taskIdentifier) @@ -93,9 +97,11 @@ class StoragePersistableTransferTaskTests: XCTestCase { func testPersistingTransferTaskForPendingMultipartUpload() throws { let uploadId = UUID().uuidString let fileURL = fileSystem.createTemporaryFileURL() - let uploadFile = UploadFile(fileURL: fileURL, - temporaryFileCreated: true, - size: UInt64(Bytes.megabytes(12).bytes)) + let uploadFile = UploadFile( + fileURL: fileURL, + temporaryFileCreated: true, + size: UInt64(Bytes.megabytes(12).bytes) + ) let transferType1 = StorageTransferType.multiPartUpload(onEvent: { _ in }) let task1 = createTask(transferType: transferType1, sessionTask: nil) @@ -114,9 +120,11 @@ class StoragePersistableTransferTaskTests: XCTestCase { func testPersistingTransferTaskForInProgressMultipartUpload() throws { let uploadId = UUID().uuidString let fileURL = fileSystem.createTemporaryFileURL() - let uploadFile = UploadFile(fileURL: fileURL, - temporaryFileCreated: true, - size: UInt64(Bytes.megabytes(12).bytes)) + let uploadFile = UploadFile( + fileURL: fileURL, + temporaryFileCreated: true, + size: UInt64(Bytes.megabytes(12).bytes) + ) let transferType1 = StorageTransferType.multiPartUpload(onEvent: { _ in }) let transferType2 = StorageTransferType.multiPartUploadPart(uploadId: uploadId, partNumber: 1) @@ -170,10 +178,12 @@ class StoragePersistableTransferTaskTests: XCTestCase { return } - let loadedTask1 = StorageTransferTask(persistableTransferTask: persistableTask1, - transferType: loadedTranferType1, - storageTransferDatabase: database, - logger: logger) + let loadedTask1 = StorageTransferTask( + persistableTransferTask: persistableTask1, + transferType: loadedTranferType1, + storageTransferDatabase: database, + logger: logger + ) XCTAssertNil(loadedTask1.taskIdentifier) XCTAssertEqual(task1.transferID, loadedTask1.transferID) @@ -186,11 +196,13 @@ class StoragePersistableTransferTaskTests: XCTestCase { return } - let loadedTask2 = StorageTransferTask(persistableTransferTask: persistableTask2, - transferType: loadedTranferType2, - sessionTask: sessionTask2, - storageTransferDatabase: database, - logger: logger) + let loadedTask2 = StorageTransferTask( + persistableTransferTask: persistableTask2, + transferType: loadedTranferType2, + sessionTask: sessionTask2, + storageTransferDatabase: database, + logger: logger + ) XCTAssertEqual(task2.transferID, loadedTask2.transferID) XCTAssertEqual(task2.taskIdentifier, loadedTask2.taskIdentifier) @@ -202,11 +214,13 @@ class StoragePersistableTransferTaskTests: XCTestCase { return } - let loadedTask3 = StorageTransferTask(persistableTransferTask: persistableTask3, - transferType: loadedTranferType3, - sessionTask: sessionTask3, - storageTransferDatabase: database, - logger: logger) + let loadedTask3 = StorageTransferTask( + persistableTransferTask: persistableTask3, + transferType: loadedTranferType3, + sessionTask: sessionTask3, + storageTransferDatabase: database, + logger: logger + ) XCTAssertEqual(task3.transferID, loadedTask3.transferID) XCTAssertEqual(task3.taskIdentifier, loadedTask3.taskIdentifier) @@ -223,22 +237,25 @@ class StoragePersistableTransferTaskTests: XCTestCase { // MARK: - Private - - private func createTask(transferType: StorageTransferType, - sessionTask: StorageSessionTask? = nil) -> StorageTransferTask - { + private func createTask( + transferType: StorageTransferType, + sessionTask: StorageSessionTask? = nil + ) -> StorageTransferTask { let transferID = UUID().uuidString let bucket = "BUCKET" let key = UUID().uuidString - let task = StorageTransferTask(transferID: transferID, - transferType: transferType, - bucket: bucket, - key: key, - location: nil, - contentType: nil, - requestHeaders: nil, - storageTransferDatabase: database, - logger: storageLogger) + let task = StorageTransferTask( + transferID: transferID, + transferType: transferType, + bucket: bucket, + key: key, + location: nil, + contentType: nil, + requestHeaders: nil, + storageTransferDatabase: database, + logger: storageLogger + ) task.sessionTask = sessionTask return task } diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageTransferDatabaseTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageTransferDatabaseTests.swift index 1048bf7999..1c44fb8a91 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageTransferDatabaseTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageTransferDatabaseTests.swift @@ -85,9 +85,11 @@ class StorageTransferDatabaseTests: XCTestCase { return } - let loadedTask = StorageTransferTask(persistableTransferTask: persistableTransferTask, - transferType: transferType, - sessionTask: sessionTask) + let loadedTask = StorageTransferTask( + persistableTransferTask: persistableTransferTask, + transferType: transferType, + sessionTask: sessionTask + ) XCTAssertEqual(sessionTask.taskIdentifier, originalTask.taskIdentifier) XCTAssertEqual(sessionTask.taskIdentifier, persistableTransferTask.taskIdentifier) @@ -109,9 +111,11 @@ class StorageTransferDatabaseTests: XCTestCase { return } - let loadedTask = StorageTransferTask(persistableTransferTask: persistableTransferTask, - transferType: transferType, - sessionTask: sessionTask) + let loadedTask = StorageTransferTask( + persistableTransferTask: persistableTransferTask, + transferType: transferType, + sessionTask: sessionTask + ) XCTAssertEqual(sessionTask.taskIdentifier, originalTask.taskIdentifier) XCTAssertEqual(sessionTask.taskIdentifier, persistableTransferTask.taskIdentifier) @@ -133,10 +137,12 @@ class StorageTransferDatabaseTests: XCTestCase { let parts = try StorageUploadParts(fileSize: uploadFile.size, partSize: partSize, logger: logger) XCTAssertGreaterThanOrEqual(3, parts.count) - let multipartUpload = StorageMultipartUpload.parts(uploadId: uploadId, - uploadFile: uploadFile, - partSize: partSize, - parts: parts) + let multipartUpload = StorageMultipartUpload.parts( + uploadId: uploadId, + uploadFile: uploadFile, + partSize: partSize, + parts: parts + ) originalTask.multipartUpload = multipartUpload XCTAssertNotNil(originalTask.multipartUpload) @@ -149,8 +155,10 @@ class StorageTransferDatabaseTests: XCTestCase { return } - let loadedTask = StorageTransferTask(persistableTransferTask: persistableTransferTask, - transferType: transferType) + let loadedTask = StorageTransferTask( + persistableTransferTask: persistableTransferTask, + transferType: transferType + ) XCTAssertNil(originalTask.taskIdentifier) XCTAssertNil(loadedTask.taskIdentifier) @@ -187,21 +195,27 @@ class StorageTransferDatabaseTests: XCTestCase { if index <= 1 { let partNumber = index + 1 - let subTask = createSubTask(createMultipartUploadTask: originalTask, - uploadId: uploadId, - partNumber: partNumber) + let subTask = createSubTask( + createMultipartUploadTask: originalTask, + uploadId: uploadId, + partNumber: partNumber + ) let sessionTask = MockStorageSessionTask(taskIdentifier: taskIdentifier + index) sessionTasks.append(sessionTask) subTask.sessionTask = sessionTask subTask.uploadPart = .pending(bytes: Bytes.megabytes(5).bytes) if index == 0 { - parts[index] = .inProgress(bytes: part.bytes, - bytesTransferred: UInt64(Double(part.bytes) * 0.75), - taskIdentifier: sessionTask.taskIdentifier) + parts[index] = .inProgress( + bytes: part.bytes, + bytesTransferred: UInt64(Double(part.bytes) * 0.75), + taskIdentifier: sessionTask.taskIdentifier + ) } else if index == 1 { - parts[index] = .inProgress(bytes: part.bytes, - bytesTransferred: UInt64(Double(part.bytes) * 0.25), - taskIdentifier: sessionTask.taskIdentifier) + parts[index] = .inProgress( + bytes: part.bytes, + bytesTransferred: UInt64(Double(part.bytes) * 0.25), + taskIdentifier: sessionTask.taskIdentifier + ) } } else { parts[index] = .queued(bytes: part.bytes) @@ -210,10 +224,12 @@ class StorageTransferDatabaseTests: XCTestCase { XCTAssertEqual(sessionTasks.count, 2) - let multipartUpload = StorageMultipartUpload.parts(uploadId: uploadId, - uploadFile: uploadFile, - partSize: partSize, - parts: parts) + let multipartUpload = StorageMultipartUpload.parts( + uploadId: uploadId, + uploadFile: uploadFile, + partSize: partSize, + parts: parts + ) originalTask.multipartUpload = multipartUpload XCTAssertEqual(database.tasksCount, 3) @@ -271,23 +287,28 @@ class StorageTransferDatabaseTests: XCTestCase { // MARK: - Private - private func createTask(transferType: StorageTransferType) -> StorageTransferTask { - StorageTransferTask(transferType: transferType, - bucket: bucket, - key: generatedKey(), - storageTransferDatabase: database, - logger: logger) + StorageTransferTask( + transferType: transferType, + bucket: bucket, + key: generatedKey(), + storageTransferDatabase: database, + logger: logger + ) } - private func createSubTask(createMultipartUploadTask: StorageTransferTask, - uploadId: UploadID, - partNumber: PartNumber) -> StorageTransferTask - { + private func createSubTask( + createMultipartUploadTask: StorageTransferTask, + uploadId: UploadID, + partNumber: PartNumber + ) -> StorageTransferTask { let transferType: StorageTransferType = .multiPartUploadPart(uploadId: uploadId, partNumber: partNumber) - let subTask = StorageTransferTask(transferType: transferType, - bucket: createMultipartUploadTask.bucket, - key: createMultipartUploadTask.key, - storageTransferDatabase: database, - logger: logger) + let subTask = StorageTransferTask( + transferType: transferType, + bucket: createMultipartUploadTask.bucket, + key: createMultipartUploadTask.key, + storageTransferDatabase: database, + logger: logger + ) subTask.uploadId = uploadId return subTask } diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageUploadPartSizeTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageUploadPartSizeTests.swift index 17f8b256a2..35d1135a0e 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageUploadPartSizeTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Internal/StorageUploadPartSizeTests.swift @@ -52,8 +52,7 @@ class StorageUploadPartSizeTests: XCTestCase { let partSize = try assertNoThrow(StorageUploadPartSize(fileSize: fileSize)) XCTAssertNotNil(partSize) if let partSize, - let parts = try? StorageUploadParts(fileSize: fileSize, partSize: partSize) - { + let parts = try? StorageUploadParts(fileSize: fileSize, partSize: partSize) { print("Part Size: \(partSize.size)") print("Parts Count: \(parts.count)") XCTAssertGreaterThan(partSize.size, minimumPartSize) @@ -67,8 +66,7 @@ class StorageUploadPartSizeTests: XCTestCase { let partSize = try assertNoThrow(StorageUploadPartSize(fileSize: fileSize)) XCTAssertNotNil(partSize) if let partSize, - let parts = try? StorageUploadParts(fileSize: fileSize, partSize: partSize) - { + let parts = try? StorageUploadParts(fileSize: fileSize, partSize: partSize) { print("Part Size: \(partSize.size)") print("Parts Count: \(parts.count)") print("Max Part Size: \(maximumPartSize)") @@ -86,8 +84,7 @@ class StorageUploadPartSizeTests: XCTestCase { let partSize = try assertNoThrow(StorageUploadPartSize(fileSize: fileSize)) XCTAssertNotNil(partSize) if let partSize, - let parts = try? StorageUploadParts(fileSize: fileSize, partSize: partSize) - { + let parts = try? StorageUploadParts(fileSize: fileSize, partSize: partSize) { print(" Part Size: \(partSize.size)") print(" Parts Count: \(parts.count)") print(" Min Part Size: \(minimumPartSize)") @@ -104,11 +101,12 @@ class StorageUploadPartSizeTests: XCTestCase { _ expression: @autoclosure () throws -> T, _ message: @autoclosure () -> String = "", file: StaticString = #filePath, - line: UInt = #line) -> T? - { + line: UInt = #line + ) -> T? { var result: T? XCTAssertNoThrow( - try { result = try expression() }(), message(), file: file, line: line) + try { result = try expression() }(), message(), file: file, line: line + ) return result } diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Utils/StorageRequestUtilsGetterTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Utils/StorageRequestUtilsGetterTests.swift index a9bc475f2c..91915b4407 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Utils/StorageRequestUtilsGetterTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Support/Utils/StorageRequestUtilsGetterTests.swift @@ -21,49 +21,61 @@ class StorageRequestUtilsGetterTests: XCTestCase { func testGetAccessLevelPrefixWithPublic() { let expected = guestAccessLevel.serviceAccessPrefix + "/" - let result = StorageRequestUtils.getAccessLevelPrefix(accessLevel: guestAccessLevel, - identityId: testIdentityId, - targetIdentityId: nil) + let result = StorageRequestUtils.getAccessLevelPrefix( + accessLevel: guestAccessLevel, + identityId: testIdentityId, + targetIdentityId: nil + ) XCTAssertEqual(result, expected) } func testGetAccessLevelPrefixWithProtected() { let expected = protectedAccessLevel.serviceAccessPrefix + "/" + testIdentityId + "/" - let result = StorageRequestUtils.getAccessLevelPrefix(accessLevel: protectedAccessLevel, - identityId: testIdentityId, - targetIdentityId: nil) + let result = StorageRequestUtils.getAccessLevelPrefix( + accessLevel: protectedAccessLevel, + identityId: testIdentityId, + targetIdentityId: nil + ) XCTAssertEqual(result, expected) } func testGetAccessLevelPrefixWithPrivate() { let expected = privateAccessLevel.serviceAccessPrefix + "/" + testIdentityId + "/" - let result = StorageRequestUtils.getAccessLevelPrefix(accessLevel: privateAccessLevel, - identityId: testIdentityId, - targetIdentityId: nil) + let result = StorageRequestUtils.getAccessLevelPrefix( + accessLevel: privateAccessLevel, + identityId: testIdentityId, + targetIdentityId: nil + ) XCTAssertEqual(result, expected) } func testGetAccessLevelPrefixWithPublicAndTargetIdentityId() { let expected = guestAccessLevel.serviceAccessPrefix + "/" - let result = StorageRequestUtils.getAccessLevelPrefix(accessLevel: guestAccessLevel, - identityId: testIdentityId, - targetIdentityId: testTargetIdentityId) + let result = StorageRequestUtils.getAccessLevelPrefix( + accessLevel: guestAccessLevel, + identityId: testIdentityId, + targetIdentityId: testTargetIdentityId + ) XCTAssertEqual(result, expected) } func testGetAccessLevelPrefixWithProtectedAndTargetIdentityId() { let expected = protectedAccessLevel.serviceAccessPrefix + "/" + testTargetIdentityId + "/" - let result = StorageRequestUtils.getAccessLevelPrefix(accessLevel: protectedAccessLevel, - identityId: testIdentityId, - targetIdentityId: testTargetIdentityId) + let result = StorageRequestUtils.getAccessLevelPrefix( + accessLevel: protectedAccessLevel, + identityId: testIdentityId, + targetIdentityId: testTargetIdentityId + ) XCTAssertEqual(result, expected) } func testGetAccessLevelPrefixWithPrivateAndTargetIdentityId() { let expected = privateAccessLevel.serviceAccessPrefix + "/" + testTargetIdentityId + "/" - let result = StorageRequestUtils.getAccessLevelPrefix(accessLevel: privateAccessLevel, - identityId: testIdentityId, - targetIdentityId: testTargetIdentityId) + let result = StorageRequestUtils.getAccessLevelPrefix( + accessLevel: privateAccessLevel, + identityId: testIdentityId, + targetIdentityId: testTargetIdentityId + ) XCTAssertEqual(result, expected) } @@ -81,9 +93,10 @@ class StorageRequestUtilsGetterTests: XCTestCase { func testGetSizeForMissingFileReturnsError() { let fileURL = URL(fileURLWithPath: "path") - XCTAssertThrowsError(try StorageRequestUtils.getSize(fileURL), - "GetSize for missing file should throw") - { error in + XCTAssertThrowsError( + try StorageRequestUtils.getSize(fileURL), + "GetSize for missing file should throw" + ) { error in guard case StorageError.localFileNotFound = error else { XCTFail("Expected StorageError.StorageError") return diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageGetURLTaskTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageGetURLTaskTests.swift index 63df26201f..f06267d858 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageGetURLTaskTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageGetURLTaskTests.swift @@ -31,10 +31,12 @@ class AWSS3StorageGetURLTaskTests: XCTestCase { } let request = StorageGetURLRequest( - path: StringStoragePath.fromString(somePath), options: .init()) + path: StringStoragePath.fromString(somePath), options: .init() + ) let task = AWSS3StorageGetURLTask( request, - storageBehaviour: serviceMock) + storageBehaviour: serviceMock + ) let value = try await task.value XCTAssertEqual(value, tempURL) } @@ -51,10 +53,12 @@ class AWSS3StorageGetURLTaskTests: XCTestCase { } let request = StorageGetURLRequest( - path: StringStoragePath.fromString(somePath), options: .init()) + path: StringStoragePath.fromString(somePath), options: .init() + ) let task = AWSS3StorageGetURLTask( request, - storageBehaviour: serviceMock) + storageBehaviour: serviceMock + ) do { _ = try await task.value XCTFail("Task should throw an exception") @@ -65,8 +69,10 @@ class AWSS3StorageGetURLTaskTests: XCTestCase { XCTFail("Should throw a Storage service error, instead threw \(error)") return } - XCTAssertTrue(underlyingError is AWSS3.NotFound, - "Underlying error should be NoSuchKey, instead got \(String(describing: underlyingError))") + XCTAssertTrue( + underlyingError is AWSS3.NotFound, + "Underlying error should be NoSuchKey, instead got \(String(describing: underlyingError))" + ) } } @@ -84,10 +90,12 @@ class AWSS3StorageGetURLTaskTests: XCTestCase { } let request = StorageGetURLRequest( - path: StringStoragePath.fromString(somePath), options: .init()) + path: StringStoragePath.fromString(somePath), options: .init() + ) let task = AWSS3StorageGetURLTask( request, - storageBehaviour: serviceMock) + storageBehaviour: serviceMock + ) do { _ = try await task.value XCTFail("Task should throw an exception") @@ -117,10 +125,12 @@ class AWSS3StorageGetURLTaskTests: XCTestCase { } let request = StorageGetURLRequest( - path: StringStoragePath.fromString(emptyPath), options: .init()) + path: StringStoragePath.fromString(emptyPath), options: .init() + ) let task = AWSS3StorageGetURLTask( request, - storageBehaviour: serviceMock) + storageBehaviour: serviceMock + ) do { _ = try await task.value XCTFail("Task should throw an exception") diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageListObjectsTaskTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageListObjectsTaskTests.swift index e0d577ff19..41be544581 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageListObjectsTaskTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageListObjectsTaskTests.swift @@ -25,17 +25,20 @@ class AWSS3StorageListObjectsTaskTests: XCTestCase { return .init( contents: [ .init(eTag: "tag", key: "key", lastModified: Date()), - .init(eTag: "tag", key: "key", lastModified: Date())], + .init(eTag: "tag", key: "key", lastModified: Date()) + ], nextContinuationToken: "continuationToken" ) } let request = StorageListRequest( - path: StringStoragePath.fromString("path"), options: .init()) + path: StringStoragePath.fromString("path"), options: .init() + ) let task = AWSS3StorageListObjectsTask( request, storageConfiguration: AWSS3StoragePluginConfiguration(), - storageBehaviour: serviceMock) + storageBehaviour: serviceMock + ) let value = try await task.value XCTAssertEqual(value.items.count, 2) XCTAssertTrue(value.excludedSubpaths.isEmpty) @@ -58,11 +61,13 @@ class AWSS3StorageListObjectsTaskTests: XCTestCase { } let request = StorageListRequest( - path: StringStoragePath.fromString("path"), options: .init()) + path: StringStoragePath.fromString("path"), options: .init() + ) let task = AWSS3StorageListObjectsTask( request, storageConfiguration: AWSS3StoragePluginConfiguration(), - storageBehaviour: serviceMock) + storageBehaviour: serviceMock + ) do { _ = try await task.value XCTFail("Task should throw an exception") @@ -73,8 +78,10 @@ class AWSS3StorageListObjectsTaskTests: XCTestCase { XCTFail("Should throw a Storage service error, instead threw \(error)") return } - XCTAssertTrue(underlyingError is AWSS3.NoSuchKey, - "Underlying error should be NoSuchKey, instead got \(String(describing: underlyingError))") + XCTAssertTrue( + underlyingError is AWSS3.NoSuchKey, + "Underlying error should be NoSuchKey, instead got \(String(describing: underlyingError))" + ) } } @@ -85,11 +92,13 @@ class AWSS3StorageListObjectsTaskTests: XCTestCase { let serviceMock = MockAWSS3StorageService() let request = StorageListRequest( - path: StringStoragePath.fromString("/path"), options: .init()) + path: StringStoragePath.fromString("/path"), options: .init() + ) let task = AWSS3StorageListObjectsTask( request, storageConfiguration: AWSS3StoragePluginConfiguration(), - storageBehaviour: serviceMock) + storageBehaviour: serviceMock + ) do { _ = try await task.value XCTFail("Task should throw an exception") @@ -112,11 +121,13 @@ class AWSS3StorageListObjectsTaskTests: XCTestCase { let serviceMock = MockAWSS3StorageService() let request = StorageListRequest( - path: StringStoragePath.fromString(" "), options: .init()) + path: StringStoragePath.fromString(" "), options: .init() + ) let task = AWSS3StorageListObjectsTask( request, storageConfiguration: AWSS3StoragePluginConfiguration(), - storageBehaviour: serviceMock) + storageBehaviour: serviceMock + ) do { _ = try await task.value XCTFail("Task should throw an exception") @@ -199,7 +210,8 @@ class AWSS3StorageListObjectsTaskTests: XCTestCase { let task = AWSS3StorageListObjectsTask( request, storageConfiguration: AWSS3StoragePluginConfiguration(), - storageBehaviour: serviceMock) + storageBehaviour: serviceMock + ) let value = try await task.value XCTAssertEqual(value.items.count, 1) XCTAssertEqual(value.items[0].eTag, "tag") diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageRemoveTaskTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageRemoveTaskTests.swift index 21133dc4ee..3737851a84 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageRemoveTaskTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Tasks/AWSS3StorageRemoveTaskTests.swift @@ -27,11 +27,13 @@ class AWSS3StorageRemoveTaskTests: XCTestCase { } let request = StorageRemoveRequest( - path: StringStoragePath.fromString("path"), options: .init()) + path: StringStoragePath.fromString("path"), options: .init() + ) let task = AWSS3StorageRemoveTask( request, storageConfiguration: AWSS3StoragePluginConfiguration(), - storageBehaviour: serviceMock) + storageBehaviour: serviceMock + ) let value = try await task.value XCTAssertEqual(value, "path") } @@ -47,11 +49,13 @@ class AWSS3StorageRemoveTaskTests: XCTestCase { } let request = StorageRemoveRequest( - path: StringStoragePath.fromString("path"), options: .init()) + path: StringStoragePath.fromString("path"), options: .init() + ) let task = AWSS3StorageRemoveTask( request, storageConfiguration: AWSS3StoragePluginConfiguration(), - storageBehaviour: serviceMock) + storageBehaviour: serviceMock + ) do { _ = try await task.value XCTFail("Task should throw an exception") @@ -62,8 +66,10 @@ class AWSS3StorageRemoveTaskTests: XCTestCase { XCTFail("Should throw a Storage service error, instead threw \(error)") return } - XCTAssertTrue(underlyingError is AWSS3.NoSuchKey, - "Underlying error should be NoSuchKey, instead got \(String(describing: underlyingError))") + XCTAssertTrue( + underlyingError is AWSS3.NoSuchKey, + "Underlying error should be NoSuchKey, instead got \(String(describing: underlyingError))" + ) } } @@ -74,11 +80,13 @@ class AWSS3StorageRemoveTaskTests: XCTestCase { let serviceMock = MockAWSS3StorageService() let request = StorageRemoveRequest( - path: StringStoragePath.fromString("/path"), options: .init()) + path: StringStoragePath.fromString("/path"), options: .init() + ) let task = AWSS3StorageRemoveTask( request, storageConfiguration: AWSS3StoragePluginConfiguration(), - storageBehaviour: serviceMock) + storageBehaviour: serviceMock + ) do { _ = try await task.value XCTFail("Task should throw an exception") @@ -101,11 +109,13 @@ class AWSS3StorageRemoveTaskTests: XCTestCase { let serviceMock = MockAWSS3StorageService() let request = StorageRemoveRequest( - path: StringStoragePath.fromString(" "), options: .init()) + path: StringStoragePath.fromString(" "), options: .init() + ) let task = AWSS3StorageRemoveTask( request, storageConfiguration: AWSS3StoragePluginConfiguration(), - storageBehaviour: serviceMock) + storageBehaviour: serviceMock + ) do { _ = try await task.value XCTFail("Task should throw an exception") diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginAccelerateIntegrationTests.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginAccelerateIntegrationTests.swift index eb1f956879..daba70c4e2 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginAccelerateIntegrationTests.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginAccelerateIntegrationTests.swift @@ -22,9 +22,11 @@ class AWSS3StoragePluginAccelerateIntegrationTests: AWSS3StoragePluginTestBase { func testUploadDataWithAccelerateDisabledExplicitly() async throws { let key = UUID().uuidString let data = Data(key.utf8) - let task = Amplify.Storage.uploadData(key: key, - data: data, - options: .init(pluginOptions: ["useAccelerateEndpoint": useAccelerateEndpoint])) + let task = Amplify.Storage.uploadData( + key: key, + data: data, + options: .init(pluginOptions: ["useAccelerateEndpoint": useAccelerateEndpoint]) + ) _ = try await task.value try await Amplify.Storage.remove(key: key) } @@ -36,9 +38,11 @@ class AWSS3StoragePluginAccelerateIntegrationTests: AWSS3StoragePluginTestBase { let key = UUID().uuidString let data = Data(key.utf8) do { - let task = Amplify.Storage.uploadData(key: key, - data: data, - options: .init(pluginOptions: ["useAccelerateEndpoint": "false"])) + let task = Amplify.Storage.uploadData( + key: key, + data: data, + options: .init(pluginOptions: ["useAccelerateEndpoint": "false"]) + ) _ = try await task.value XCTFail("Expecting error from bogus useAccelerateEndpoint value type (String)") try await Amplify.Storage.remove(key: key) @@ -60,9 +64,11 @@ class AWSS3StoragePluginAccelerateIntegrationTests: AWSS3StoragePluginTestBase { try? FileManager.default.removeItem(at: fileURL) } - let task = Amplify.Storage.uploadFile(key: key, - local: fileURL, - options: .init(pluginOptions: ["useAccelerateEndpoint": useAccelerateEndpoint])) + let task = Amplify.Storage.uploadFile( + key: key, + local: fileURL, + options: .init(pluginOptions: ["useAccelerateEndpoint": useAccelerateEndpoint]) + ) _ = try await task.value try await Amplify.Storage.remove(key: key) } @@ -72,9 +78,11 @@ class AWSS3StoragePluginAccelerateIntegrationTests: AWSS3StoragePluginTestBase { /// Then: The operation completes successfully. func testUploadLargeData() async throws { let key = UUID().uuidString - let task = Amplify.Storage.uploadData(key: key, - data: AWSS3StoragePluginTestBase.largeDataObject, - options: .init(pluginOptions: ["useAccelerateEndpoint": useAccelerateEndpoint])) + let task = Amplify.Storage.uploadData( + key: key, + data: AWSS3StoragePluginTestBase.largeDataObject, + options: .init(pluginOptions: ["useAccelerateEndpoint": useAccelerateEndpoint]) + ) _ = try await task.value try await Amplify.Storage.remove(key: key) } @@ -85,13 +93,17 @@ class AWSS3StoragePluginAccelerateIntegrationTests: AWSS3StoragePluginTestBase { func testDownloadDataToMemory() async throws { let key = UUID().uuidString let data = Data(key.utf8) - let uploadTask = Amplify.Storage.uploadData(key: key, - data: data, - options: .init(pluginOptions: ["useAccelerateEndpoint": useAccelerateEndpoint])) + let uploadTask = Amplify.Storage.uploadData( + key: key, + data: data, + options: .init(pluginOptions: ["useAccelerateEndpoint": useAccelerateEndpoint]) + ) _ = try await uploadTask.value - let downloadTask = Amplify.Storage.downloadData(key: key, - options: .init(pluginOptions: ["useAccelerateEndpoint": useAccelerateEndpoint])) + let downloadTask = Amplify.Storage.downloadData( + key: key, + options: .init(pluginOptions: ["useAccelerateEndpoint": useAccelerateEndpoint]) + ) let downloadedData = try await downloadTask.value XCTAssertEqual(downloadedData, data) diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginAccessLevelTests.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginAccessLevelTests.swift index 7e60eaef58..0b74d0bebd 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginAccessLevelTests.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginAccessLevelTests.swift @@ -23,8 +23,10 @@ class AWSS3StoragePluginAccessLevelTests: AWSS3StoragePluginTestBase { /// Then: Operation completes successfully with no items since there are no keys at that location. func testListFromProtectedForUnauthenticatedUser() async throws { let key = UUID().uuidString - let options = StorageListRequest.Options(accessLevel: .protected, - path: key) + let options = StorageListRequest.Options( + accessLevel: .protected, + path: key + ) let items = try await Amplify.Storage.list(options: options).items XCTAssertEqual(items.count, 0) } @@ -35,8 +37,10 @@ class AWSS3StoragePluginAccessLevelTests: AWSS3StoragePluginTestBase { func testListFromPrivateForUnauthenticatedUserForReturnAccessDenied() async throws { do { let key = UUID().uuidString - let options = StorageListRequest.Options(accessLevel: .private, - path: key) + let options = StorageListRequest.Options( + accessLevel: .private, + path: key + ) _ = try await Amplify.Storage.list(options: options).items XCTFail("Expecting failure") } catch StorageError.accessDenied(let description, _, _) { @@ -124,8 +128,10 @@ class AWSS3StoragePluginAccessLevelTests: AWSS3StoragePluginTestBase { XCTAssertEqual(key, uploadKey) logger.debug("List [\(accessLevel)]") - let listOptions = StorageListRequest.Options(accessLevel: accessLevel, - path: key) + let listOptions = StorageListRequest.Options( + accessLevel: accessLevel, + path: key + ) let keys = try await Amplify.Storage.list(options: listOptions).items XCTAssertEqual(keys.count, 1) @@ -185,8 +191,10 @@ class AWSS3StoragePluginAccessLevelTests: AWSS3StoragePluginTestBase { _ = try await Amplify.Storage.uploadData(key: testRun.key, data: Data(testRun.key.utf8), options: options).value logger.debug("Getting list as user1") - let listOptions1 = StorageListRequest.Options(accessLevel: testRun.accessLevel, - path: testRun.key) + let listOptions1 = StorageListRequest.Options( + accessLevel: testRun.accessLevel, + path: testRun.key + ) let keys1 = try await Amplify.Storage.list(options: listOptions1).items.filter { $0.key == testRun.key } @@ -211,9 +219,11 @@ class AWSS3StoragePluginAccessLevelTests: AWSS3StoragePluginTestBase { // check for Access Denied error do { logger.debug("Getting list as user2") - let listOptions2 = StorageListRequest.Options(accessLevel: testRun.accessLevel, - targetIdentityId: user1IdentityId, - path: testRun.key) + let listOptions2 = StorageListRequest.Options( + accessLevel: testRun.accessLevel, + targetIdentityId: user1IdentityId, + path: testRun.key + ) try await Amplify.Storage.list(options: listOptions2) XCTFail("Expecting validation error") } catch StorageError.validation(_, let errorDescription, _, _) { @@ -233,17 +243,21 @@ class AWSS3StoragePluginAccessLevelTests: AWSS3StoragePluginTestBase { await remove(key: testRun.key, accessLevel: testRun.accessLevel) } else { logger.debug("Getting list as user2: \(testRun.accessLevel)") - let listOptions2 = StorageListRequest.Options(accessLevel: testRun.accessLevel, - targetIdentityId: targetIdentityId, - path: testRun.key) + let listOptions2 = StorageListRequest.Options( + accessLevel: testRun.accessLevel, + targetIdentityId: targetIdentityId, + path: testRun.key + ) let keys2 = try await Amplify.Storage.list(options: listOptions2).items.filter { $0.key == testRun.key } XCTAssertEqual(keys2.count, 1) logger.debug("Downloading as user2") - let downloadDataOptions = StorageDownloadDataRequest.Options(accessLevel: testRun.accessLevel, - targetIdentityId: targetIdentityId) + let downloadDataOptions = StorageDownloadDataRequest.Options( + accessLevel: testRun.accessLevel, + targetIdentityId: targetIdentityId + ) let data = try await Amplify.Storage.downloadData(key: testRun.key, options: downloadDataOptions).value XCTAssertNotNil(data) diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginBasicIntegrationTests.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginBasicIntegrationTests.swift index a75cbfb2d8..2e217ac782 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginBasicIntegrationTests.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginBasicIntegrationTests.swift @@ -130,9 +130,11 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { func testUploadLargeData() async throws { let key = UUID().uuidString - let uploadKey = try await Amplify.Storage.uploadData(key: key, - data: AWSS3StoragePluginTestBase.largeDataObject, - options: nil).value + let uploadKey = try await Amplify.Storage.uploadData( + key: key, + data: AWSS3StoragePluginTestBase.largeDataObject, + options: nil + ).value XCTAssertEqual(uploadKey, key) try await Amplify.Storage.remove(key: key) @@ -153,9 +155,11 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { let filePath = NSTemporaryDirectory() + key + ".tmp" let fileURL = URL(fileURLWithPath: filePath) - FileManager.default.createFile(atPath: filePath, - contents: AWSS3StoragePluginTestBase.largeDataObject, - attributes: nil) + FileManager.default.createFile( + atPath: filePath, + contents: AWSS3StoragePluginTestBase.largeDataObject, + attributes: nil + ) _ = try await Amplify.Storage.uploadFile(key: key, local: fileURL, options: nil).value _ = try await Amplify.Storage.remove(key: key) @@ -275,9 +279,11 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { let key = UUID().uuidString let expectedMD5Hex = "\"\(key.md5())\"" try await uploadData(key: key, dataString: key) - let options = StorageListRequest.Options(accessLevel: .guest, - targetIdentityId: nil, - path: key) + let options = StorageListRequest.Options( + accessLevel: .guest, + targetIdentityId: nil, + path: key + ) let result = try await Amplify.Storage.list(options: options) let items = try XCTUnwrap(result.items) @@ -356,9 +362,11 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { /// Then: The operation completes successfully with empty list of keys returned func testListEmpty() async throws { let key = UUID().uuidString - let options = StorageListRequest.Options(accessLevel: .guest, - targetIdentityId: nil, - path: key) + let options = StorageListRequest.Options( + accessLevel: .guest, + targetIdentityId: nil, + path: key + ) let result = try await Amplify.Storage.list(options: options) XCTAssertNotNil(result) @@ -384,9 +392,11 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { keys.append(key) try await uploadData(key: key, dataString: key) } - let options = StorageListRequest.Options(accessLevel: .guest, - targetIdentityId: nil, - path: folder) + let options = StorageListRequest.Options( + accessLevel: .guest, + targetIdentityId: nil, + path: folder + ) let result = try await Amplify.Storage.list(options: options) let items = result.items @@ -420,9 +430,11 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { try await uploadData(key: key, dataString: key) } - let options = StorageListRequest.Options(accessLevel: .guest, - targetIdentityId: nil, - path: key1) + let options = StorageListRequest.Options( + accessLevel: .guest, + targetIdentityId: nil, + path: key1 + ) let result = try await Amplify.Storage.list(options: options) let items = result.items diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginListObjectsIntegrationTests.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginListObjectsIntegrationTests.swift index 72f6a3ba86..ba41e58782 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginListObjectsIntegrationTests.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginListObjectsIntegrationTests.swift @@ -62,7 +62,8 @@ class AWSS3StoragePluginListObjectsIntegrationTests: AWSS3StoragePluginTestBase return uniqueStringPath + "test1" }, data: data, - options: nil).value + options: nil + ).value let firstListResult = try await Amplify.Storage.list(path: .fromString(uniqueStringPath)) @@ -76,7 +77,8 @@ class AWSS3StoragePluginListObjectsIntegrationTests: AWSS3StoragePluginTestBase return uniqueStringPath + "test2" }, data: data, - options: nil).value + options: nil + ).value let secondListResult = try await Amplify.Storage.list(path: .fromString(uniqueStringPath)) @@ -107,7 +109,8 @@ class AWSS3StoragePluginListObjectsIntegrationTests: AWSS3StoragePluginTestBase return uniqueStringPath + "test1" }, data: data, - options: nil).value + options: nil + ).value let firstListResult = try await Amplify.Storage.list(path: .fromString(uniqueStringPath)) @@ -121,7 +124,8 @@ class AWSS3StoragePluginListObjectsIntegrationTests: AWSS3StoragePluginTestBase return uniqueStringPath + "test2" }, data: data, - options: nil).value + options: nil + ).value let secondListResult = try await Amplify.Storage.list(path: .fromString(uniqueStringPath)) diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginNegativeTests.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginNegativeTests.swift index 9aed744cf0..698b067440 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginNegativeTests.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginNegativeTests.swift @@ -90,9 +90,11 @@ class AWSS3StoragePluginNegativeTests: AWSS3StoragePluginTestBase { func testUploadUnreadableFile() async throws { let key = UUID().uuidString let path = NSTemporaryDirectory() + key + ".tmp" - FileManager.default.createFile(atPath: path, - contents: Data(key.utf8), - attributes: [FileAttributeKey.posixPermissions: 000]) + FileManager.default.createFile( + atPath: path, + contents: Data(key.utf8), + attributes: [FileAttributeKey.posixPermissions: 000] + ) defer { try? FileManager.default.removeItem(atPath: path) } diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginProgressTests.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginProgressTests.swift index 4e424ccc57..ffa9d6d6b1 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginProgressTests.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginProgressTests.swift @@ -38,7 +38,8 @@ class AWSS3StoragePluginProgressTests: AWSS3StoragePluginTestBase { progressReceived.assertForOverFulfill = false let uploadOperation = Amplify.Storage.uploadData( key: key, - data: .testDataOfSize(.bytes(100))) + data: .testDataOfSize(.bytes(100)) + ) uploadOperation.resultPublisher .sink(receiveCompletion: { completion in diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginRemoveIntegrationTests.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginRemoveIntegrationTests.swift index ba15cc90c4..f95da5895e 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginRemoveIntegrationTests.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginRemoveIntegrationTests.swift @@ -58,7 +58,8 @@ class AWSS3StoragePluginRemoveIntegrationTests: AWSS3StoragePluginTestBase { return uniqueStringPath }, data: data, - options: nil).value + options: nil + ).value let firstListResult = try await Amplify.Storage.list(path: .fromString(uniqueStringPath)) @@ -92,7 +93,8 @@ class AWSS3StoragePluginRemoveIntegrationTests: AWSS3StoragePluginTestBase { return uniqueStringPath }, data: data, - options: nil).value + options: nil + ).value let firstListResult = try await Amplify.Storage.list(path: .fromString(uniqueStringPath)) diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginRequestRecorder.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginRequestRecorder.swift index 461cdc3d89..68b8071223 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginRequestRecorder.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginRequestRecorder.swift @@ -19,8 +19,7 @@ class AWSS3StoragePluginRequestRecorder { } extension AWSS3StoragePluginRequestRecorder: HttpClientEngineProxy { - func send(request: SdkHttpRequest) async throws -> HttpResponse - { + func send(request: SdkHttpRequest) async throws -> HttpResponse { guard let target else { throw ClientError.unknownError("HttpClientEngine is not set") } diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginTestBase.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginTestBase.swift index e145059ed0..845a997bc5 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginTestBase.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginTestBase.swift @@ -153,9 +153,11 @@ class AWSS3StoragePluginTestBase: XCTestCase { let registerFirstUserComplete = expectation(description: "register firt user completed") Task { do { - try await AuthSignInHelper.signUpUser(username: AWSS3StoragePluginTestBase.user1, - password: AWSS3StoragePluginTestBase.password, - email: AWSS3StoragePluginTestBase.email1) + try await AuthSignInHelper.signUpUser( + username: AWSS3StoragePluginTestBase.user1, + password: AWSS3StoragePluginTestBase.password, + email: AWSS3StoragePluginTestBase.email1 + ) Self.isFirstUserSignedUp = true registerFirstUserComplete.fulfill() } catch { @@ -167,9 +169,11 @@ class AWSS3StoragePluginTestBase: XCTestCase { let registerSecondUserComplete = expectation(description: "register second user completed") Task { do { - try await AuthSignInHelper.signUpUser(username: AWSS3StoragePluginTestBase.user2, - password: AWSS3StoragePluginTestBase.password, - email: AWSS3StoragePluginTestBase.email2) + try await AuthSignInHelper.signUpUser( + username: AWSS3StoragePluginTestBase.user2, + password: AWSS3StoragePluginTestBase.password, + email: AWSS3StoragePluginTestBase.email2 + ) Self.isSecondUserSignedUp = true registerSecondUserComplete.fulfill() } catch { @@ -178,8 +182,10 @@ class AWSS3StoragePluginTestBase: XCTestCase { } } - await fulfillment(of: [registerFirstUserComplete, registerSecondUserComplete], - timeout: TestCommonConstants.networkTimeout) + await fulfillment( + of: [registerFirstUserComplete, registerSecondUserComplete], + timeout: TestCommonConstants.networkTimeout + ) } func getURL(key: String, options: StorageGetURLRequest.Options? = nil) async -> URL? { diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginUploadIntegrationTests.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginUploadIntegrationTests.swift index 950387f41b..e5ff4462d6 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginUploadIntegrationTests.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginUploadIntegrationTests.swift @@ -130,9 +130,11 @@ class AWSS3StoragePluginUploadIntegrationTests: AWSS3StoragePluginTestBase { func testUploadLargeData() async throws { let key = "public/" + UUID().uuidString - let uploadKey = try await Amplify.Storage.uploadData(path: .fromString(key), - data: AWSS3StoragePluginTestBase.largeDataObject, - options: nil).value + let uploadKey = try await Amplify.Storage.uploadData( + path: .fromString(key), + data: AWSS3StoragePluginTestBase.largeDataObject, + options: nil + ).value XCTAssertEqual(uploadKey, key) try await Amplify.Storage.remove(path: .fromString(key)) @@ -153,9 +155,11 @@ class AWSS3StoragePluginUploadIntegrationTests: AWSS3StoragePluginTestBase { let filePath = NSTemporaryDirectory() + key + ".tmp" let fileURL = URL(fileURLWithPath: filePath) - FileManager.default.createFile(atPath: filePath, - contents: AWSS3StoragePluginTestBase.largeDataObject, - attributes: nil) + FileManager.default.createFile( + atPath: filePath, + contents: AWSS3StoragePluginTestBase.largeDataObject, + attributes: nil + ) _ = try await Amplify.Storage.uploadFile(path: .fromString("public/\(key)"), local: fileURL, options: nil).value _ = try await Amplify.Storage.remove(path: .fromString("public/\(key)")) diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/Helpers/AuthSignInHelper.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/Helpers/AuthSignInHelper.swift index 91426f32a4..834911b81a 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/Helpers/AuthSignInHelper.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/Helpers/AuthSignInHelper.swift @@ -22,10 +22,11 @@ enum AuthSignInHelper { return try await Amplify.Auth.signIn(username: username, password: password, options: nil) } - static func registerAndSignInUser(username: String, - password: String, - email: String) async throws -> Bool - { + static func registerAndSignInUser( + username: String, + password: String, + email: String + ) async throws -> Bool { try await signUpUser(username: username, password: password, email: email) let result = try await Self.signInUser(username: username, password: password) return result.isSignedIn diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/StorageStressTests/StorageStressTests.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/StorageStressTests/StorageStressTests.swift index 1504d73985..596a153003 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/StorageStressTests/StorageStressTests.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/StorageStressTests/StorageStressTests.swift @@ -130,9 +130,11 @@ final class StorageStressTests: XCTestCase { for _ in 1 ... concurrencyLimit { Task { let key = UUID().uuidString - let uploadKey = try await Amplify.Storage.uploadData(key: key, - data: smallDataObjectForStressTest, - options: nil).value + let uploadKey = try await Amplify.Storage.uploadData( + key: key, + data: smallDataObjectForStressTest, + options: nil + ).value XCTAssertEqual(uploadKey, key) uploadExpectation.fulfill() @@ -187,9 +189,11 @@ final class StorageStressTests: XCTestCase { let registerFirstUserComplete = expectation(description: "register firt user completed") Task { do { - try await AuthSignInHelper.signUpUser(username: AWSS3StoragePluginTestBase.user1, - password: AWSS3StoragePluginTestBase.password, - email: AWSS3StoragePluginTestBase.email1) + try await AuthSignInHelper.signUpUser( + username: AWSS3StoragePluginTestBase.user1, + password: AWSS3StoragePluginTestBase.password, + email: AWSS3StoragePluginTestBase.email1 + ) Self.isFirstUserSignedUp = true registerFirstUserComplete.fulfill() } catch { @@ -201,9 +205,11 @@ final class StorageStressTests: XCTestCase { let registerSecondUserComplete = expectation(description: "register second user completed") Task { do { - try await AuthSignInHelper.signUpUser(username: AWSS3StoragePluginTestBase.user2, - password: AWSS3StoragePluginTestBase.password, - email: AWSS3StoragePluginTestBase.email2) + try await AuthSignInHelper.signUpUser( + username: AWSS3StoragePluginTestBase.user2, + password: AWSS3StoragePluginTestBase.password, + email: AWSS3StoragePluginTestBase.email2 + ) Self.isSecondUserSignedUp = true registerSecondUserComplete.fulfill() } catch { @@ -212,8 +218,10 @@ final class StorageStressTests: XCTestCase { } } - await fulfillment(of: [registerFirstUserComplete, registerSecondUserComplete], - timeout: TestCommonConstants.networkTimeout) + await fulfillment( + of: [registerFirstUserComplete, registerSecondUserComplete], + timeout: TestCommonConstants.networkTimeout + ) } func getURL(key: String, options: StorageGetURLRequest.Options? = nil) async -> URL? { From 2326834f2bb98c77ad1698dc0e7d06b6f804fbe3 Mon Sep 17 00:00:00 2001 From: Tuan Pham Date: Fri, 13 Sep 2024 19:10:18 -0500 Subject: [PATCH 3/3] update rules --- .../Internal/StorageTransferResponse.swift | 14 +++--- .../Storage/AWSS3StorageServiceTests.swift | 6 +-- ...S3StoragePluginBasicIntegrationTests.swift | 50 +++++++++---------- ...3StoragePluginGetURLIntegrationTests.swift | 8 +-- ...3StoragePluginUploadIntegrationTests.swift | 12 ++--- 5 files changed, 44 insertions(+), 46 deletions(-) diff --git a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferResponse.swift b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferResponse.swift index 414b3b6ac1..27162d22d6 100644 --- a/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferResponse.swift +++ b/AmplifyPlugins/Storage/Sources/AWSS3StoragePlugin/Support/Internal/StorageTransferResponse.swift @@ -63,8 +63,7 @@ class StorageTransferResponse { // See https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html for S3 error responses guard let httpResponse, - transferTask.retryCount < transferTask.retryLimit - else { + transferTask.retryCount < transferTask.retryLimit else { return false } @@ -98,15 +97,16 @@ class StorageTransferResponse { } private func errorDescription(forStatusCode statusCode: Int) -> ErrorDescription { - let description = switch statusCode { + let description: String + switch statusCode { case 401: - "Unauthorized" + description = "Unauthorized" case 403: - "Forbidden" + description = "Forbidden" case 404: - "NotFound" + description = "NotFound" default: - "" + description = "" } return "Received HTTP Response status code \(statusCode) \(description)" diff --git a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceTests.swift b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceTests.swift index 93fe9e6f75..faf3f8b06c 100644 --- a/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceTests.swift +++ b/AmplifyPlugins/Storage/Tests/AWSS3StoragePluginTests/Service/Storage/AWSS3StorageServiceTests.swift @@ -228,8 +228,7 @@ class AWSS3StorageServiceTests: XCTestCase { let downloadTask = StorageTransferTask( transferType: .download(onEvent: { event in guard case .completed(let data) = event, - let data - else { + let data else { XCTFail("Expected .completed event with data") return } @@ -350,8 +349,7 @@ class AWSS3StorageServiceTests: XCTestCase { accelerate: true, onEvent: { event in guard case .failed(let error) = event, - case .unknown(let description, _) = error - else { + case .unknown(let description, _) = error else { XCTFail("Expected .failed event with .unknown error, got \(event)") return } diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginBasicIntegrationTests.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginBasicIntegrationTests.swift index 2e217ac782..c37da8b153 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginBasicIntegrationTests.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginBasicIntegrationTests.swift @@ -67,10 +67,10 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { _ = try await Amplify.Storage.remove(key: key) // Only the remove operation results in an SDK request - XCTAssertEqual(requestRecorder.sdkRequests.map(\.method), [.delete]) + XCTAssertEqual(requestRecorder.sdkRequests.map { $0.method }, [.delete]) try assertUserAgentComponents(sdkRequests: requestRecorder.sdkRequests) - XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), ["PUT"]) + XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, ["PUT"]) try assertUserAgentComponents(urlRequests: requestRecorder.urlRequests) } @@ -83,7 +83,7 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { _ = try await Amplify.Storage.uploadData(key: key, data: data, options: nil).value _ = try await Amplify.Storage.remove(key: key) - XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), ["PUT"]) + XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, ["PUT"]) try assertUserAgentComponents(urlRequests: requestRecorder.urlRequests) } @@ -101,10 +101,10 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { _ = try await Amplify.Storage.remove(key: key) // Only the remove operation results in an SDK request - XCTAssertEqual(requestRecorder.sdkRequests.map(\.method), [.delete]) + XCTAssertEqual(requestRecorder.sdkRequests.map { $0.method}, [.delete]) try assertUserAgentComponents(sdkRequests: requestRecorder.sdkRequests) - XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), ["PUT"]) + XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, ["PUT"]) try assertUserAgentComponents(urlRequests: requestRecorder.urlRequests) } @@ -120,7 +120,7 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { _ = try await Amplify.Storage.uploadFile(key: key, local: fileURL, options: nil).value _ = try await Amplify.Storage.remove(key: key) - XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), ["PUT"]) + XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, ["PUT"]) try assertUserAgentComponents(urlRequests: requestRecorder.urlRequests) } @@ -218,7 +218,7 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { let remoteURL = try await Amplify.Storage.getURL(key: key) // The presigned URL generation does not result in an SDK or HTTP call. - XCTAssertEqual(requestRecorder.sdkRequests.map(\.method), []) + XCTAssertEqual(requestRecorder.sdkRequests.map { $0.method}, []) let (data, response) = try await URLSession.shared.data(from: remoteURL) let httpResponse = try XCTUnwrap(response as? HTTPURLResponse) @@ -251,7 +251,7 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { XCTAssert(requestRecorder.sdkRequests.map(\.method).allSatisfy { $0 == .head }) try assertUserAgentComponents(sdkRequests: requestRecorder.sdkRequests) - XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), []) + XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, []) } /// - Given: A key for a non-existent S3 object @@ -268,8 +268,8 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { XCTAssertNotNil(url) // No SDK or URLRequest calls expected - XCTAssertEqual(requestRecorder.sdkRequests.map(\.method), []) - XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), []) + XCTAssertEqual(requestRecorder.sdkRequests.map { $0.method}, []) + XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, []) } /// Given: An object in storage @@ -298,11 +298,11 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { _ = try await Amplify.Storage.remove(key: key) // S3 GetObjectList and DeleteObject calls are expected - XCTAssertEqual(requestRecorder.sdkRequests.map(\.method), [.get, .delete]) + XCTAssertEqual(requestRecorder.sdkRequests.map { $0.method}, [.get, .delete]) try assertUserAgentComponents(sdkRequests: requestRecorder.sdkRequests) // A single URLRequest call is expected - XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), ["PUT"]) + XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, ["PUT"]) } /// Given: A collection of objects in storage numbering `objectCount`. @@ -344,16 +344,16 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { XCTAssertEqual( uploadedKeys.sorted(), - Array((firstPage + secondPage).map(\.key)).sorted() + Array((firstPage + secondPage).map { $0.key }).sorted() ) // S3 GetObjectList calls are expected (DeleteObject calls happen during tearDown) - XCTAssertEqual(requestRecorder.sdkRequests.map(\.method), [.get, .get]) + XCTAssertEqual(requestRecorder.sdkRequests.map { $0.method}, [.get, .get]) try assertUserAgentComponents(sdkRequests: requestRecorder.sdkRequests) // A URLRequest call for each uploaded file is expected let expectedURLRequestMethods: [String] = uploadedKeys.map { _ in "PUT" } - XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), expectedURLRequestMethods) + XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, expectedURLRequestMethods) try assertUserAgentComponents(urlRequests: requestRecorder.urlRequests) } @@ -373,11 +373,11 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { XCTAssertEqual(result.items.count, 0) // A single SDK call for the ListObjectsV2 request is expected - XCTAssertEqual(requestRecorder.sdkRequests.map(\.method), [.get]) + XCTAssertEqual(requestRecorder.sdkRequests.map { $0.method}, [.get]) try assertUserAgentComponents(sdkRequests: requestRecorder.sdkRequests) // No URLRequest calls expected - XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), []) + XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, []) } /// Given: No object in storage for the key @@ -407,12 +407,12 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { _ = try await Amplify.Storage.remove(key: key) - XCTAssertEqual(requestRecorder.sdkRequests.map(\.method), [.get, .delete]) + XCTAssertEqual(requestRecorder.sdkRequests.map { $0.method}, [.get, .delete]) try assertUserAgentComponents(sdkRequests: requestRecorder.sdkRequests) // A URLRequest call for each uploaded file is expected let expectedURLRequestMethods: [String] = keys.map { _ in "PUT" } - XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), expectedURLRequestMethods) + XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, expectedURLRequestMethods) try assertUserAgentComponents(urlRequests: requestRecorder.urlRequests) } @@ -449,12 +449,12 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { // An SDK call for the ListObjectsV2 call and each deletion is expected let expectedMethods = [.get] + keys.map {_ in HttpMethodType.delete} - XCTAssertEqual(requestRecorder.sdkRequests.map(\.method), expectedMethods) + XCTAssertEqual(requestRecorder.sdkRequests.map { $0.method}, expectedMethods) try assertUserAgentComponents(sdkRequests: requestRecorder.sdkRequests) // A URLRequest call for each uploaded file is expected let expectedURLRequestMethods: [String] = keys.map { _ in "PUT" } - XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), expectedURLRequestMethods) + XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, expectedURLRequestMethods) try assertUserAgentComponents(urlRequests: requestRecorder.urlRequests) } @@ -468,10 +468,10 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { let result = try await Amplify.Storage.remove(key: key, options: nil) XCTAssertEqual(result, key) - XCTAssertEqual(requestRecorder.sdkRequests.map(\.method), [.delete]) + XCTAssertEqual(requestRecorder.sdkRequests.map { $0.method}, [.delete]) try assertUserAgentComponents(sdkRequests: requestRecorder.sdkRequests) - XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), ["PUT"]) + XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, ["PUT"]) try assertUserAgentComponents(urlRequests: requestRecorder.urlRequests) } @@ -484,10 +484,10 @@ class AWSS3StoragePluginBasicIntegrationTests: AWSS3StoragePluginTestBase { let result = try await Amplify.Storage.remove(key: key, options: nil) XCTAssertEqual(result, key) - XCTAssertEqual(requestRecorder.sdkRequests.map(\.method), [.delete]) + XCTAssertEqual(requestRecorder.sdkRequests.map { $0.method}, [.delete]) try assertUserAgentComponents(sdkRequests: requestRecorder.sdkRequests) - XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), []) + XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, []) } // /// Given: Object with key `key` in storage diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginGetURLIntegrationTests.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginGetURLIntegrationTests.swift index 718cc2370e..fbc9c9969b 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginGetURLIntegrationTests.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginGetURLIntegrationTests.swift @@ -31,7 +31,7 @@ class AWSS3StoragePluginGetURLIntegrationTests: AWSS3StoragePluginTestBase { let remoteURL = try await Amplify.Storage.getURL(path: .fromString(key)) // The presigned URL generation does not result in an SDK or HTTP call. - XCTAssertEqual(requestRecorder.sdkRequests.map(\.method), []) + XCTAssertEqual(requestRecorder.sdkRequests.map { $0.method}, []) let (data, response) = try await URLSession.shared.data(from: remoteURL) let httpResponse = try XCTUnwrap(response as? HTTPURLResponse) @@ -63,7 +63,7 @@ class AWSS3StoragePluginGetURLIntegrationTests: AWSS3StoragePluginTestBase { // A S3 HeadObject call is expected XCTAssert(requestRecorder.sdkRequests.map(\.method).allSatisfy { $0 == .head }) - XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), []) + XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, []) } /// - Given: A key for a non-existent S3 object @@ -80,7 +80,7 @@ class AWSS3StoragePluginGetURLIntegrationTests: AWSS3StoragePluginTestBase { XCTAssertNotNil(url) // No SDK or URLRequest calls expected - XCTAssertEqual(requestRecorder.sdkRequests.map(\.method), []) - XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), []) + XCTAssertEqual(requestRecorder.sdkRequests.map { $0.method}, []) + XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, []) } } diff --git a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginUploadIntegrationTests.swift b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginUploadIntegrationTests.swift index e5ff4462d6..4c94b7397f 100644 --- a/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginUploadIntegrationTests.swift +++ b/AmplifyPlugins/Storage/Tests/StorageHostApp/AWSS3StoragePluginIntegrationTests/AWSS3StoragePluginUploadIntegrationTests.swift @@ -67,10 +67,10 @@ class AWSS3StoragePluginUploadIntegrationTests: AWSS3StoragePluginTestBase { _ = try await Amplify.Storage.remove(path: .fromString("public/\(key)")) // Only the remove operation results in an SDK request - XCTAssertEqual(requestRecorder.sdkRequests.map(\.method), [.delete]) + XCTAssertEqual(requestRecorder.sdkRequests.map { $0.method }, [.delete]) try assertUserAgentComponents(sdkRequests: requestRecorder.sdkRequests) - XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), ["PUT"]) + XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, ["PUT"]) try assertUserAgentComponents(urlRequests: requestRecorder.urlRequests) } @@ -83,7 +83,7 @@ class AWSS3StoragePluginUploadIntegrationTests: AWSS3StoragePluginTestBase { _ = try await Amplify.Storage.uploadData(path: .fromString("public/\(key)"), data: data, options: nil).value _ = try await Amplify.Storage.remove(path: .fromString("public/\(key)")) - XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), ["PUT"]) + XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, ["PUT"]) try assertUserAgentComponents(urlRequests: requestRecorder.urlRequests) } @@ -101,10 +101,10 @@ class AWSS3StoragePluginUploadIntegrationTests: AWSS3StoragePluginTestBase { _ = try await Amplify.Storage.remove(path: .fromString("public/\(key)")) // Only the remove operation results in an SDK request - XCTAssertEqual(requestRecorder.sdkRequests.map(\.method), [.delete]) + XCTAssertEqual(requestRecorder.sdkRequests.map { $0.method}, [.delete]) try assertUserAgentComponents(sdkRequests: requestRecorder.sdkRequests) - XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), ["PUT"]) + XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, ["PUT"]) try assertUserAgentComponents(urlRequests: requestRecorder.urlRequests) } @@ -120,7 +120,7 @@ class AWSS3StoragePluginUploadIntegrationTests: AWSS3StoragePluginTestBase { _ = try await Amplify.Storage.uploadFile(path: .fromString("public/\(key)"), local: fileURL, options: nil).value _ = try await Amplify.Storage.remove(path: .fromString("public/\(key)")) - XCTAssertEqual(requestRecorder.urlRequests.map(\.httpMethod), ["PUT"]) + XCTAssertEqual(requestRecorder.urlRequests.map { $0.httpMethod }, ["PUT"]) try assertUserAgentComponents(urlRequests: requestRecorder.urlRequests) }