From 973cd52fafacb22854a96ed72b6ce340902f45b0 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Fri, 14 Oct 2022 12:40:07 +0200 Subject: [PATCH 01/18] Add MessengerReceiveFile function --- .../Functions/MessengerReceiveFile.swift | 32 +++++++++++++++++++ .../Messenger/Messenger.swift | 7 ++-- .../Functions/MessengerReceiveFileTests.swift | 27 ++++++++++++++++ 3 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift create mode 100644 Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift new file mode 100644 index 00000000..91230c63 --- /dev/null +++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift @@ -0,0 +1,32 @@ +import Foundation +import XCTestDynamicOverlay +import XXClient + +public struct MessengerReceiveFile { + public enum Error: Swift.Error, Equatable { + case notConnected + } + + public var run: () throws -> Void + + public func callAsFunction() throws -> Void { + try run() + } +} + +extension MessengerReceiveFile { + public static func live(_ env: MessengerEnvironment) -> MessengerReceiveFile { + MessengerReceiveFile { + guard let e2e = env.e2e() else { + throw Error.notConnected + } + // TODO: implement receiving file + } + } +} + +extension MessengerReceiveFile { + public static let unimplemented = MessengerReceiveFile( + run: XCTUnimplemented("\(Self.self)") + ) +} diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift index 22f11030..b2cc82fb 100644 --- a/Sources/XXMessengerClient/Messenger/Messenger.swift +++ b/Sources/XXMessengerClient/Messenger/Messenger.swift @@ -40,6 +40,7 @@ public struct Messenger { public var stopBackup: MessengerStopBackup public var setLogLevel: MessengerSetLogLevel public var startLogging: MessengerStartLogging + public var receiveFile: MessengerReceiveFile } extension Messenger { @@ -83,7 +84,8 @@ extension Messenger { backupParams: .live(env), stopBackup: .live(env), setLogLevel: .live(env), - startLogging: .live(env) + startLogging: .live(env), + receiveFile: .live(env) ) } } @@ -128,6 +130,7 @@ extension Messenger { backupParams: .unimplemented, stopBackup: .unimplemented, setLogLevel: .unimplemented, - startLogging: .unimplemented + startLogging: .unimplemented, + receiveFile: .unimplemented ) } diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift new file mode 100644 index 00000000..ef9b5864 --- /dev/null +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift @@ -0,0 +1,27 @@ +import CustomDump +import XCTest +import XXClient +@testable import XXMessengerClient + +final class MessengerReceiveFileTests: XCTestCase { + func testReceiveFile() throws { + var env: MessengerEnvironment = .unimplemented + env.e2e.get = { .unimplemented } + let receiveFile: MessengerReceiveFile = .live(env) + + try receiveFile() + } + + func testReceiveFileWhenNotConnected() { + var env: MessengerEnvironment = .unimplemented + env.e2e.get = { nil } + let receiveFile: MessengerReceiveFile = .live(env) + + XCTAssertThrowsError(try receiveFile()) { error in + XCTAssertNoDifference( + error as? MessengerReceiveFile.Error, + MessengerReceiveFile.Error.notConnected + ) + } + } +} -- GitLab From 5057d2ab14dca1796d8f4221db3e6d709ede87c5 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Sun, 16 Oct 2022 22:56:00 +0200 Subject: [PATCH 02/18] Store FileTransfer in MessengerEnvironment --- Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift index 0bd1212c..30f3b22e 100644 --- a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift +++ b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift @@ -10,6 +10,7 @@ public struct MessengerEnvironment { public var downloadNDF: DownloadAndVerifySignedNdf public var e2e: Stored<E2E?> public var fileManager: MessengerFileManager + public var fileTransfer: Stored<FileTransfer?> public var generateSecret: GenerateSecret public var getCMixParams: GetCMixParams public var getE2EFileTransferParams: GetE2EFileTransferParams @@ -59,6 +60,7 @@ extension MessengerEnvironment { downloadNDF: .live, e2e: .inMemory(), fileManager: .live(), + fileTransfer: .inMemory(), generateSecret: .live, getCMixParams: .liveDefault, getE2EFileTransferParams: .liveDefault, @@ -103,6 +105,7 @@ extension MessengerEnvironment { downloadNDF: .unimplemented, e2e: .unimplemented(), fileManager: .unimplemented, + fileTransfer: .unimplemented(), generateSecret: .unimplemented, getCMixParams: .unimplemented, getE2EFileTransferParams: .unimplemented, -- GitLab From e378d3add5eaf42c48dc7933938d0dde742c81aa Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Sun, 16 Oct 2022 23:09:28 +0200 Subject: [PATCH 03/18] Add MessengerStartFileTransfer function --- .../MessengerStartFileTransfer.swift | 41 ++++++++++++ .../Messenger/Messenger.swift | 3 + .../MessengerStartFileTransferTests.swift | 63 +++++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 Sources/XXMessengerClient/Messenger/Functions/MessengerStartFileTransfer.swift create mode 100644 Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartFileTransferTests.swift diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerStartFileTransfer.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerStartFileTransfer.swift new file mode 100644 index 00000000..4a8e460d --- /dev/null +++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerStartFileTransfer.swift @@ -0,0 +1,41 @@ +import XCTestDynamicOverlay +import XXClient + +public struct MessengerStartFileTransfer { + public enum Error: Swift.Error, Equatable { + case notConnected + } + + public var run: () throws -> Void + + public func callAsFunction() throws -> Void { + try run() + } +} + +extension MessengerStartFileTransfer { + public static func live(_ env: MessengerEnvironment) -> MessengerStartFileTransfer { + MessengerStartFileTransfer { + guard let e2e = env.e2e() else { + throw Error.notConnected + } + let fileTransfer = try env.initFileTransfer( + params: InitFileTransfer.Params( + e2eId: e2e.getId(), + e2eFileTransferParamsJSON: env.getE2EFileTransferParams(), + fileTransferParamsJSON: env.getFileTransferParams() + ), + callback: ReceiveFileCallback { result in + // TODO: + } + ) + env.fileTransfer.set(fileTransfer) + } + } +} + +extension MessengerStartFileTransfer { + public static let unimplemented = MessengerStartFileTransfer( + run: XCTUnimplemented("\(Self.self)") + ) +} diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift index 0dce7ff2..793daab0 100644 --- a/Sources/XXMessengerClient/Messenger/Messenger.swift +++ b/Sources/XXMessengerClient/Messenger/Messenger.swift @@ -40,6 +40,7 @@ public struct Messenger { public var stopBackup: MessengerStopBackup public var setLogLevel: MessengerSetLogLevel public var startLogging: MessengerStartLogging + public var startFileTransfer: MessengerStartFileTransfer public var sendFile: MessengerSendFile public var receiveFile: MessengerReceiveFile } @@ -86,6 +87,7 @@ extension Messenger { stopBackup: .live(env), setLogLevel: .live(env), startLogging: .live(env), + startFileTransfer: .live(env), sendFile: .live(env), receiveFile: .live(env) ) @@ -133,6 +135,7 @@ extension Messenger { stopBackup: .unimplemented, setLogLevel: .unimplemented, startLogging: .unimplemented, + startFileTransfer: .unimplemented, sendFile: .unimplemented, receiveFile: .unimplemented ) diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartFileTransferTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartFileTransferTests.swift new file mode 100644 index 00000000..56195f23 --- /dev/null +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartFileTransferTests.swift @@ -0,0 +1,63 @@ +import CustomDump +import XCTest +import XXClient +@testable import XXMessengerClient + +final class MessengerStartFileTransferTests: XCTestCase { + func testStart() throws { + let e2eId = 123 + let e2eFileTransferParams = "e2eFileTransferParams".data(using: .utf8)! + let fileTransferParams = "fileTransferParams".data(using: .utf8)! + + var didInitFileTransfer: [InitFileTransfer.Params] = [] + var receiveFileCallback: ReceiveFileCallback? + var didSetFileTransfer: [FileTransfer?] = [] + + var env: MessengerEnvironment = .unimplemented + env.e2e.get = { + var e2e: E2E = .unimplemented + e2e.getId.run = { e2eId } + return e2e + } + env.getE2EFileTransferParams.run = { + e2eFileTransferParams + } + env.getFileTransferParams.run = { + fileTransferParams + } + env.initFileTransfer.run = { params, callback in + didInitFileTransfer.append(params) + receiveFileCallback = callback + var fileTransfer: FileTransfer = .unimplemented + return fileTransfer + } + env.fileTransfer.set = { + didSetFileTransfer.append($0) + } + + let start: MessengerStartFileTransfer = .live(env) + + try start() + + XCTAssertNoDifference(didInitFileTransfer, [.init( + e2eId: e2eId, + e2eFileTransferParamsJSON: e2eFileTransferParams, + fileTransferParamsJSON: fileTransferParams + )]) + XCTAssertNotNil(receiveFileCallback) + XCTAssertNoDifference(didSetFileTransfer.map { $0 != nil }, [true]) + } + + func testStartWhenNotConnected() { + var env: MessengerEnvironment = .unimplemented + env.e2e.get = { nil } + let start: MessengerStartFileTransfer = .live(env) + + XCTAssertThrowsError(try start()) { error in + XCTAssertNoDifference( + error as NSError, + MessengerStartFileTransfer.Error.notConnected as NSError + ) + } + } +} -- GitLab From cb3fbbb2211ff21e887c7062d464c2b7c6ff65c1 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Sun, 16 Oct 2022 23:15:27 +0200 Subject: [PATCH 04/18] Update MessengerSendFile function Use stored FileTransfer manager --- .../Functions/MessengerSendFile.swift | 16 ++---- .../Functions/MessengerSendFileTests.swift | 53 +++---------------- 2 files changed, 10 insertions(+), 59 deletions(-) diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerSendFile.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerSendFile.swift index 8aca65c4..fde8607c 100644 --- a/Sources/XXMessengerClient/Messenger/Functions/MessengerSendFile.swift +++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerSendFile.swift @@ -37,7 +37,7 @@ public struct MessengerSendFile { public typealias Callback = (CallbackInfo) -> Void public enum Error: Swift.Error, Equatable { - case notConnected + case fileTransferNotStarted } public var run: (Params, @escaping Callback) throws -> Data @@ -53,19 +53,9 @@ public struct MessengerSendFile { extension MessengerSendFile { public static func live(_ env: MessengerEnvironment) -> MessengerSendFile { MessengerSendFile { params, callback in - guard let e2e = env.e2e() else { - throw Error.notConnected + guard let fileTransfer = env.fileTransfer() else { + throw Error.fileTransferNotStarted } - let fileTransfer = try env.initFileTransfer( - params: InitFileTransfer.Params( - e2eId: e2e.getId(), - e2eFileTransferParamsJSON: env.getE2EFileTransferParams(), - fileTransferParamsJSON: env.getFileTransferParams() - ), - callback: ReceiveFileCallback { _ in - fatalError("Bindings issue: ReceiveFileCallback called when sending file.") - } - ) func close(id: Data) { do { try fileTransfer.closeSend(transferId: id) diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerSendFileTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerSendFileTests.swift index 9adc15b1..5ea8410d 100644 --- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerSendFileTests.swift +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerSendFileTests.swift @@ -5,28 +5,17 @@ import XXClient final class MessengerSendFileTests: XCTestCase { func testSendFile() throws { - let e2eId = 123 let e2eFileTransferParams = "e2eFileTransferParams".data(using: .utf8)! let fileTransferParams = "fileTransferParams".data(using: .utf8)! let newTransferId = "transferId".data(using: .utf8)! - var didInitFileTransfer: [InitFileTransfer.Params] = [] var didSendFile: [FileTransferSend.Params] = [] var didCloseSend: [Data] = [] var didReceiveCallback: [MessengerSendFile.CallbackInfo] = [] - var fileTransferProgressCallback: FileTransferProgressCallback! var env: MessengerEnvironment = .unimplemented - env.e2e.get = { - var e2e: E2E = .unimplemented - e2e.getId.run = { e2eId } - return e2e - } - env.getE2EFileTransferParams.run = { e2eFileTransferParams } - env.getFileTransferParams.run = { fileTransferParams } - env.initFileTransfer.run = { params, callback in - didInitFileTransfer.append(params) + env.fileTransfer.get = { var fileTransfer: FileTransfer = .unimplemented fileTransfer.send.run = { params, callback in didSendFile.append(params) @@ -47,13 +36,6 @@ final class MessengerSendFileTests: XCTestCase { } XCTAssertNoDifference(transferId, newTransferId) - XCTAssertNoDifference(didInitFileTransfer, [ - .init( - e2eId: e2eId, - e2eFileTransferParamsJSON: e2eFileTransferParams, - fileTransferParamsJSON: fileTransferParams - ) - ]) XCTAssertNoDifference(didSendFile, [ .init( payload: params.file, @@ -99,15 +81,15 @@ final class MessengerSendFileTests: XCTestCase { XCTAssertNoDifference(didCloseSend, [transferId]) } - func testSendFileWhenNotConnected() { + func testSendFileWhenNotStarted() { var env: MessengerEnvironment = .unimplemented - env.e2e.get = { nil } + env.fileTransfer.get = { nil } let sendFile: MessengerSendFile = .live(env) XCTAssertThrowsError(try sendFile(.stub) { _ in }) { error in XCTAssertNoDifference( error as? MessengerSendFile.Error, - MessengerSendFile.Error.notConnected + MessengerSendFile.Error.fileTransferNotStarted ) } } @@ -118,14 +100,7 @@ final class MessengerSendFileTests: XCTestCase { var fileTransferProgressCallback: FileTransferProgressCallback! var env: MessengerEnvironment = .unimplemented - env.e2e.get = { - var e2e: E2E = .unimplemented - e2e.getId.run = { 123 } - return e2e - } - env.getE2EFileTransferParams.run = { Data() } - env.getFileTransferParams.run = { Data() } - env.initFileTransfer.run = { params, callback in + env.fileTransfer.get = { var fileTransfer: FileTransfer = .unimplemented fileTransfer.send.run = { _, callback in fileTransferProgressCallback = callback @@ -157,14 +132,7 @@ final class MessengerSendFileTests: XCTestCase { var fileTransferProgressCallback: FileTransferProgressCallback! var env: MessengerEnvironment = .unimplemented - env.e2e.get = { - var e2e: E2E = .unimplemented - e2e.getId.run = { 123 } - return e2e - } - env.getE2EFileTransferParams.run = { Data() } - env.getFileTransferParams.run = { Data() } - env.initFileTransfer.run = { params, callback in + env.fileTransfer.get = { var fileTransfer: FileTransfer = .unimplemented fileTransfer.send.run = { _, callback in fileTransferProgressCallback = callback @@ -205,14 +173,7 @@ final class MessengerSendFileTests: XCTestCase { var fileTransferProgressCallback: FileTransferProgressCallback! var env: MessengerEnvironment = .unimplemented - env.e2e.get = { - var e2e: E2E = .unimplemented - e2e.getId.run = { 123 } - return e2e - } - env.getE2EFileTransferParams.run = { Data() } - env.getFileTransferParams.run = { Data() } - env.initFileTransfer.run = { params, callback in + env.fileTransfer.get = { var fileTransfer: FileTransfer = .unimplemented fileTransfer.send.run = { _, callback in fileTransferProgressCallback = callback -- GitLab From ff222fa40d2c70d73bee5fdc5fd4ec8243480f82 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Sun, 16 Oct 2022 23:16:46 +0200 Subject: [PATCH 05/18] Remove MessengerReceiveFile function --- .../Functions/MessengerReceiveFile.swift | 32 ------------------- .../Messenger/Messenger.swift | 7 ++-- .../Functions/MessengerReceiveFileTests.swift | 27 ---------------- 3 files changed, 2 insertions(+), 64 deletions(-) delete mode 100644 Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift delete mode 100644 Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift deleted file mode 100644 index 91230c63..00000000 --- a/Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift +++ /dev/null @@ -1,32 +0,0 @@ -import Foundation -import XCTestDynamicOverlay -import XXClient - -public struct MessengerReceiveFile { - public enum Error: Swift.Error, Equatable { - case notConnected - } - - public var run: () throws -> Void - - public func callAsFunction() throws -> Void { - try run() - } -} - -extension MessengerReceiveFile { - public static func live(_ env: MessengerEnvironment) -> MessengerReceiveFile { - MessengerReceiveFile { - guard let e2e = env.e2e() else { - throw Error.notConnected - } - // TODO: implement receiving file - } - } -} - -extension MessengerReceiveFile { - public static let unimplemented = MessengerReceiveFile( - run: XCTUnimplemented("\(Self.self)") - ) -} diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift index 793daab0..2c8ef5d5 100644 --- a/Sources/XXMessengerClient/Messenger/Messenger.swift +++ b/Sources/XXMessengerClient/Messenger/Messenger.swift @@ -42,7 +42,6 @@ public struct Messenger { public var startLogging: MessengerStartLogging public var startFileTransfer: MessengerStartFileTransfer public var sendFile: MessengerSendFile - public var receiveFile: MessengerReceiveFile } extension Messenger { @@ -88,8 +87,7 @@ extension Messenger { setLogLevel: .live(env), startLogging: .live(env), startFileTransfer: .live(env), - sendFile: .live(env), - receiveFile: .live(env) + sendFile: .live(env) ) } } @@ -136,7 +134,6 @@ extension Messenger { setLogLevel: .unimplemented, startLogging: .unimplemented, startFileTransfer: .unimplemented, - sendFile: .unimplemented, - receiveFile: .unimplemented + sendFile: .unimplemented ) } diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift deleted file mode 100644 index ef9b5864..00000000 --- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift +++ /dev/null @@ -1,27 +0,0 @@ -import CustomDump -import XCTest -import XXClient -@testable import XXMessengerClient - -final class MessengerReceiveFileTests: XCTestCase { - func testReceiveFile() throws { - var env: MessengerEnvironment = .unimplemented - env.e2e.get = { .unimplemented } - let receiveFile: MessengerReceiveFile = .live(env) - - try receiveFile() - } - - func testReceiveFileWhenNotConnected() { - var env: MessengerEnvironment = .unimplemented - env.e2e.get = { nil } - let receiveFile: MessengerReceiveFile = .live(env) - - XCTAssertThrowsError(try receiveFile()) { error in - XCTAssertNoDifference( - error as? MessengerReceiveFile.Error, - MessengerReceiveFile.Error.notConnected - ) - } - } -} -- GitLab From a11960d92a477cb23f59d30a110089775d4b0a63 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Sun, 16 Oct 2022 23:17:08 +0200 Subject: [PATCH 06/18] Clean up unused code --- .../Messenger/Functions/MessengerSendFileTests.swift | 2 -- .../Messenger/Functions/MessengerStartFileTransferTests.swift | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerSendFileTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerSendFileTests.swift index 5ea8410d..4e1c1763 100644 --- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerSendFileTests.swift +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerSendFileTests.swift @@ -5,8 +5,6 @@ import XXClient final class MessengerSendFileTests: XCTestCase { func testSendFile() throws { - let e2eFileTransferParams = "e2eFileTransferParams".data(using: .utf8)! - let fileTransferParams = "fileTransferParams".data(using: .utf8)! let newTransferId = "transferId".data(using: .utf8)! var didSendFile: [FileTransferSend.Params] = [] diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartFileTransferTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartFileTransferTests.swift index 56195f23..5164700f 100644 --- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartFileTransferTests.swift +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartFileTransferTests.swift @@ -28,8 +28,7 @@ final class MessengerStartFileTransferTests: XCTestCase { env.initFileTransfer.run = { params, callback in didInitFileTransfer.append(params) receiveFileCallback = callback - var fileTransfer: FileTransfer = .unimplemented - return fileTransfer + return .unimplemented } env.fileTransfer.set = { didSetFileTransfer.append($0) -- GitLab From 42f41741011fe99b33b0b7c6f01530d39b1bfb64 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Sun, 16 Oct 2022 23:22:26 +0200 Subject: [PATCH 07/18] Revert "Remove MessengerReceiveFile function" This reverts commit ff222fa40d2c70d73bee5fdc5fd4ec8243480f82. --- .../Functions/MessengerReceiveFile.swift | 32 +++++++++++++++++++ .../Messenger/Messenger.swift | 7 ++-- .../Functions/MessengerReceiveFileTests.swift | 27 ++++++++++++++++ 3 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift create mode 100644 Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift new file mode 100644 index 00000000..91230c63 --- /dev/null +++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift @@ -0,0 +1,32 @@ +import Foundation +import XCTestDynamicOverlay +import XXClient + +public struct MessengerReceiveFile { + public enum Error: Swift.Error, Equatable { + case notConnected + } + + public var run: () throws -> Void + + public func callAsFunction() throws -> Void { + try run() + } +} + +extension MessengerReceiveFile { + public static func live(_ env: MessengerEnvironment) -> MessengerReceiveFile { + MessengerReceiveFile { + guard let e2e = env.e2e() else { + throw Error.notConnected + } + // TODO: implement receiving file + } + } +} + +extension MessengerReceiveFile { + public static let unimplemented = MessengerReceiveFile( + run: XCTUnimplemented("\(Self.self)") + ) +} diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift index 2c8ef5d5..793daab0 100644 --- a/Sources/XXMessengerClient/Messenger/Messenger.swift +++ b/Sources/XXMessengerClient/Messenger/Messenger.swift @@ -42,6 +42,7 @@ public struct Messenger { public var startLogging: MessengerStartLogging public var startFileTransfer: MessengerStartFileTransfer public var sendFile: MessengerSendFile + public var receiveFile: MessengerReceiveFile } extension Messenger { @@ -87,7 +88,8 @@ extension Messenger { setLogLevel: .live(env), startLogging: .live(env), startFileTransfer: .live(env), - sendFile: .live(env) + sendFile: .live(env), + receiveFile: .live(env) ) } } @@ -134,6 +136,7 @@ extension Messenger { setLogLevel: .unimplemented, startLogging: .unimplemented, startFileTransfer: .unimplemented, - sendFile: .unimplemented + sendFile: .unimplemented, + receiveFile: .unimplemented ) } diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift new file mode 100644 index 00000000..ef9b5864 --- /dev/null +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift @@ -0,0 +1,27 @@ +import CustomDump +import XCTest +import XXClient +@testable import XXMessengerClient + +final class MessengerReceiveFileTests: XCTestCase { + func testReceiveFile() throws { + var env: MessengerEnvironment = .unimplemented + env.e2e.get = { .unimplemented } + let receiveFile: MessengerReceiveFile = .live(env) + + try receiveFile() + } + + func testReceiveFileWhenNotConnected() { + var env: MessengerEnvironment = .unimplemented + env.e2e.get = { nil } + let receiveFile: MessengerReceiveFile = .live(env) + + XCTAssertThrowsError(try receiveFile()) { error in + XCTAssertNoDifference( + error as? MessengerReceiveFile.Error, + MessengerReceiveFile.Error.notConnected + ) + } + } +} -- GitLab From cb7787002e2e0bf5059d5e84ef7436e01b1be2d0 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Sun, 16 Oct 2022 23:57:36 +0200 Subject: [PATCH 08/18] Implement MessengerReceiveFile function --- .../Functions/MessengerReceiveFile.swift | 71 +++++- .../Functions/MessengerReceiveFileTests.swift | 206 +++++++++++++++++- 2 files changed, 264 insertions(+), 13 deletions(-) diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift index 91230c63..ef4290f8 100644 --- a/Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift +++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift @@ -3,24 +3,79 @@ import XCTestDynamicOverlay import XXClient public struct MessengerReceiveFile { + public struct Params: Equatable { + public init( + transferId: Data, + callbackIntervalMS: Int = 250 + ) { + self.transferId = transferId + self.callbackIntervalMS = callbackIntervalMS + } + + public var transferId: Data + public var callbackIntervalMS: Int + } + + public enum CallbackInfo: Equatable { + public enum Failure: Equatable { + case callbackError(NSError) + case progressError(String) + case receiveError(NSError) + } + + case progress(transmitted: Int, total: Int) + case finished(Data) + case failed(Failure) + } + + public typealias Callback = (CallbackInfo) -> Void + public enum Error: Swift.Error, Equatable { - case notConnected + case fileTransferNotStarted } - public var run: () throws -> Void + public var run: (Params, @escaping Callback) throws -> Void - public func callAsFunction() throws -> Void { - try run() + public func callAsFunction( + _ params: Params, + callback: @escaping Callback + ) throws -> Void { + try run(params, callback) } } extension MessengerReceiveFile { public static func live(_ env: MessengerEnvironment) -> MessengerReceiveFile { - MessengerReceiveFile { - guard let e2e = env.e2e() else { - throw Error.notConnected + MessengerReceiveFile { params, callback in + guard let fileTransfer = env.fileTransfer() else { + throw Error.fileTransferNotStarted } - // TODO: implement receiving file + try fileTransfer.registerReceivedProgressCallback( + transferId: params.transferId, + period: params.callbackIntervalMS, + callback: FileTransferProgressCallback { result in + switch result { + case .success(let info): + if let error = info.progress.error { + callback(.failed(.progressError(error))) + } else if info.progress.completed { + do { + callback(.finished(try fileTransfer.receive(transferId: params.transferId))) + } catch { + callback(.failed(.receiveError(error as NSError))) + } + } else { + callback(.progress( + transmitted: info.progress.transmitted, + total: info.progress.total + )) + } + + case .failure(let error): + callback(.failed(.callbackError(error))) + } + } + ) } } } diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift index ef9b5864..554b7f30 100644 --- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift @@ -5,23 +5,219 @@ import XXClient final class MessengerReceiveFileTests: XCTestCase { func testReceiveFile() throws { + let params: MessengerReceiveFile.Params = .stub + let receivedData = "received".data(using: .utf8)! + + var didRegisterReceivedProgressCallbackWithTransferId: [Data] = [] + var didRegisterReceivedProgressCallbackWithPeriod: [Int] = [] + var didRegisterReceivedProgressCallbackWithCallback: [FileTransferProgressCallback] = [] + var didReceiveTransferId: [Data] = [] + var didReceiveCallback: [MessengerReceiveFile.CallbackInfo] = [] + var env: MessengerEnvironment = .unimplemented - env.e2e.get = { .unimplemented } + env.fileTransfer.get = { + var fileTransfer: FileTransfer = .unimplemented + fileTransfer.registerReceivedProgressCallback.run = { transferId, period, callback in + didRegisterReceivedProgressCallbackWithTransferId.append(transferId) + didRegisterReceivedProgressCallbackWithPeriod.append(period) + didRegisterReceivedProgressCallbackWithCallback.append(callback) + } + fileTransfer.receive.run = { transferId in + didReceiveTransferId.append(transferId) + return receivedData + } + return fileTransfer + } let receiveFile: MessengerReceiveFile = .live(env) - try receiveFile() + try receiveFile(params) { info in + didReceiveCallback.append(info) + } + + XCTAssertNoDifference(didRegisterReceivedProgressCallbackWithTransferId, [ + params.transferId + ]) + XCTAssertNoDifference(didRegisterReceivedProgressCallbackWithPeriod, [ + params.callbackIntervalMS + ]) + XCTAssertNoDifference(didReceiveCallback, []) + + didReceiveCallback = [] + didRegisterReceivedProgressCallbackWithCallback.first?.handle(.success( + FileTransferProgressCallback.Callback( + progress: Progress( + completed: false, + transmitted: 1, + total: 3, + error: nil + ), + partTracker: .unimplemented + ) + )) + + XCTAssertNoDifference(didReceiveCallback, [ + .progress(transmitted: 1, total: 3), + ]) + + didReceiveCallback = [] + didRegisterReceivedProgressCallbackWithCallback.first?.handle(.success( + FileTransferProgressCallback.Callback( + progress: Progress( + completed: false, + transmitted: 2, + total: 3, + error: nil + ), + partTracker: .unimplemented + ) + )) + + XCTAssertNoDifference(didReceiveCallback, [ + .progress(transmitted: 2, total: 3), + ]) + + didReceiveCallback = [] + didRegisterReceivedProgressCallbackWithCallback.first?.handle(.success( + FileTransferProgressCallback.Callback( + progress: Progress( + completed: true, + transmitted: 3, + total: 3, + error: nil + ), + partTracker: .unimplemented + ) + )) + + XCTAssertNoDifference(didReceiveTransferId, [ + params.transferId, + ]) + XCTAssertNoDifference(didReceiveCallback, [ + .finished(receivedData), + ]) } func testReceiveFileWhenNotConnected() { var env: MessengerEnvironment = .unimplemented - env.e2e.get = { nil } + env.fileTransfer.get = { nil } let receiveFile: MessengerReceiveFile = .live(env) - XCTAssertThrowsError(try receiveFile()) { error in + XCTAssertThrowsError(try receiveFile(.stub) { _ in }) { error in XCTAssertNoDifference( error as? MessengerReceiveFile.Error, - MessengerReceiveFile.Error.notConnected + MessengerReceiveFile.Error.fileTransferNotStarted ) } } + + func testReceiveFileProgressError() throws { + let error = "Something went wrong..." + + var receivedProgressCallback: FileTransferProgressCallback? + var didReceiveCallback: [MessengerReceiveFile.CallbackInfo] = [] + + var env: MessengerEnvironment = .unimplemented + env.fileTransfer.get = { + var fileTransfer: FileTransfer = .unimplemented + fileTransfer.registerReceivedProgressCallback.run = { _, _, callback in + receivedProgressCallback = callback + } + return fileTransfer + } + let receiveFile: MessengerReceiveFile = .live(env) + + try receiveFile(.stub) { info in + didReceiveCallback.append(info) + } + + receivedProgressCallback?.handle(.success( + FileTransferProgressCallback.Callback( + progress: Progress( + completed: false, + transmitted: 1, + total: 3, + error: error + ), + partTracker: .unimplemented + ) + )) + + XCTAssertNoDifference(didReceiveCallback, [ + .failed(.progressError(error)) + ]) + } + + func testReceiveFileCallbackError() throws { + let error = NSError(domain: "test", code: 123) + + var receivedProgressCallback: FileTransferProgressCallback? + var didReceiveCallback: [MessengerReceiveFile.CallbackInfo] = [] + + var env: MessengerEnvironment = .unimplemented + env.fileTransfer.get = { + var fileTransfer: FileTransfer = .unimplemented + fileTransfer.registerReceivedProgressCallback.run = { _, _, callback in + receivedProgressCallback = callback + } + return fileTransfer + } + let receiveFile: MessengerReceiveFile = .live(env) + + try receiveFile(.stub) { info in + didReceiveCallback.append(info) + } + + receivedProgressCallback?.handle(.failure(error)) + + XCTAssertNoDifference(didReceiveCallback, [ + .failed(.callbackError(error)) + ]) + } + + func testReceiveFileReceiveError() throws { + let error = NSError(domain: "test", code: 123) + + var receivedProgressCallback: FileTransferProgressCallback? + var didReceiveCallback: [MessengerReceiveFile.CallbackInfo] = [] + + var env: MessengerEnvironment = .unimplemented + env.fileTransfer.get = { + var fileTransfer: FileTransfer = .unimplemented + fileTransfer.registerReceivedProgressCallback.run = { _, _, callback in + receivedProgressCallback = callback + } + fileTransfer.receive.run = { _ in + throw error + } + return fileTransfer + } + let receiveFile: MessengerReceiveFile = .live(env) + + try receiveFile(.stub) { info in + didReceiveCallback.append(info) + } + + receivedProgressCallback?.handle(.success( + FileTransferProgressCallback.Callback( + progress: Progress( + completed: true, + transmitted: 3, + total: 3, + error: nil + ), + partTracker: .unimplemented + ) + )) + + XCTAssertNoDifference(didReceiveCallback, [ + .failed(.receiveError(error)) + ]) + } +} + +private extension MessengerReceiveFile.Params { + static let stub = MessengerReceiveFile.Params( + transferId: "transfer-id".data(using: .utf8)!, + callbackIntervalMS: 123 + ) } -- GitLab From c7898f41acf12d0c60f064102e94f049ed63ef6a Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Mon, 17 Oct 2022 00:23:25 +0200 Subject: [PATCH 09/18] Add ReceiveFileCallbacksRegistry --- .../Utils/ReceiveFileCallbacksRegistry.swift | 36 ++++++++++++ .../ReceiveFileCallbacksRegistryTests.swift | 57 +++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 Sources/XXMessengerClient/Utils/ReceiveFileCallbacksRegistry.swift create mode 100644 Tests/XXMessengerClientTests/Utils/ReceiveFileCallbacksRegistryTests.swift diff --git a/Sources/XXMessengerClient/Utils/ReceiveFileCallbacksRegistry.swift b/Sources/XXMessengerClient/Utils/ReceiveFileCallbacksRegistry.swift new file mode 100644 index 00000000..e82670ca --- /dev/null +++ b/Sources/XXMessengerClient/Utils/ReceiveFileCallbacksRegistry.swift @@ -0,0 +1,36 @@ +import Foundation +import XCTestDynamicOverlay +import XXClient + +public struct ReceiveFileCallbacksRegistry { + public var register: (ReceiveFileCallback) -> Cancellable + public var registered: () -> ReceiveFileCallback +} + +extension ReceiveFileCallbacksRegistry { + public static func live() -> ReceiveFileCallbacksRegistry { + class Registry { + var callbacks: [UUID: ReceiveFileCallback] = [:] + } + let registry = Registry() + return ReceiveFileCallbacksRegistry( + register: { callback in + let id = UUID() + registry.callbacks[id] = callback + return Cancellable { registry.callbacks[id] = nil } + }, + registered: { + ReceiveFileCallback { result in + registry.callbacks.values.forEach { $0.handle(result) } + } + } + ) + } +} + +extension ReceiveFileCallbacksRegistry { + public static let unimplemented = ReceiveFileCallbacksRegistry( + register: XCTUnimplemented("\(Self.self).register", placeholder: Cancellable {}), + registered: XCTUnimplemented("\(Self.self).registered", placeholder: .unimplemented) + ) +} diff --git a/Tests/XXMessengerClientTests/Utils/ReceiveFileCallbacksRegistryTests.swift b/Tests/XXMessengerClientTests/Utils/ReceiveFileCallbacksRegistryTests.swift new file mode 100644 index 00000000..d40e6d79 --- /dev/null +++ b/Tests/XXMessengerClientTests/Utils/ReceiveFileCallbacksRegistryTests.swift @@ -0,0 +1,57 @@ +import CustomDump +import XCTest +import XXClient +@testable import XXMessengerClient + +final class ReceiveFileCallbacksRegistryTests: XCTestCase { + func testRegistry() { + var firstCallbackDidHandle: [Result<ReceivedFile, NSError>] = [] + var secondCallbackDidHandle: [Result<ReceivedFile, NSError>] = [] + + let firstCallback = ReceiveFileCallback { result in + firstCallbackDidHandle.append(result) + } + let secondCallback = ReceiveFileCallback { result in + secondCallbackDidHandle.append(result) + } + let callbackRegistry: ReceiveFileCallbacksRegistry = .live() + let registeredCallbacks = callbackRegistry.registered() + let firstCallbackCancellable = callbackRegistry.register(firstCallback) + let secondCallbackCancellable = callbackRegistry.register(secondCallback) + + let firstResult = Result<ReceivedFile, NSError>.success(.stub(1)) + registeredCallbacks.handle(firstResult) + + XCTAssertNoDifference(firstCallbackDidHandle, [firstResult]) + XCTAssertNoDifference(secondCallbackDidHandle, [firstResult]) + + firstCallbackCancellable.cancel() + let secondError = NSError(domain: "test", code: 321) + let secondResult = Result<ReceivedFile, NSError>.failure(secondError) + registeredCallbacks.handle(secondResult) + + XCTAssertNoDifference(firstCallbackDidHandle, [firstResult]) + XCTAssertNoDifference(secondCallbackDidHandle, [firstResult, secondResult]) + + secondCallbackCancellable.cancel() + + let thirdData = Result<ReceivedFile, NSError>.success(.stub(2)) + registeredCallbacks.handle(thirdData) + + XCTAssertNoDifference(firstCallbackDidHandle, [firstResult]) + XCTAssertNoDifference(secondCallbackDidHandle, [firstResult, secondResult]) + } +} + +private extension ReceivedFile { + static func stub(_ id: Int) -> ReceivedFile { + ReceivedFile( + transferId: "transfer-id-\(id)".data(using: .utf8)!, + senderId: "sender-id-\(id)".data(using: .utf8)!, + preview: "preview-\(id)".data(using: .utf8)!, + name: "name-\(id)", + type: "type-\(id)", + size: id + ) + } +} -- GitLab From eeef2850d04be71742308bbe49c1aca6898aef19 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Mon, 17 Oct 2022 00:28:49 +0200 Subject: [PATCH 10/18] Refactor ReceiveFileCallback --- Sources/XXClient/Callbacks/ReceiveFileCallback.swift | 6 ++++-- .../Utils/ReceiveFileCallbacksRegistryTests.swift | 10 +++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Sources/XXClient/Callbacks/ReceiveFileCallback.swift b/Sources/XXClient/Callbacks/ReceiveFileCallback.swift index 3f414934..2c1d94be 100644 --- a/Sources/XXClient/Callbacks/ReceiveFileCallback.swift +++ b/Sources/XXClient/Callbacks/ReceiveFileCallback.swift @@ -2,11 +2,13 @@ import Bindings import XCTestDynamicOverlay public struct ReceiveFileCallback { - public init(handle: @escaping (Result<ReceivedFile, NSError>) -> Void) { + public typealias Result = Swift.Result<ReceivedFile, NSError> + + public init(handle: @escaping (Result) -> Void) { self.handle = handle } - public var handle: (Result<ReceivedFile, NSError>) -> Void + public var handle: (Result) -> Void } extension ReceiveFileCallback { diff --git a/Tests/XXMessengerClientTests/Utils/ReceiveFileCallbacksRegistryTests.swift b/Tests/XXMessengerClientTests/Utils/ReceiveFileCallbacksRegistryTests.swift index d40e6d79..e99890b4 100644 --- a/Tests/XXMessengerClientTests/Utils/ReceiveFileCallbacksRegistryTests.swift +++ b/Tests/XXMessengerClientTests/Utils/ReceiveFileCallbacksRegistryTests.swift @@ -5,8 +5,8 @@ import XXClient final class ReceiveFileCallbacksRegistryTests: XCTestCase { func testRegistry() { - var firstCallbackDidHandle: [Result<ReceivedFile, NSError>] = [] - var secondCallbackDidHandle: [Result<ReceivedFile, NSError>] = [] + var firstCallbackDidHandle: [ReceiveFileCallback.Result] = [] + var secondCallbackDidHandle: [ReceiveFileCallback.Result] = [] let firstCallback = ReceiveFileCallback { result in firstCallbackDidHandle.append(result) @@ -19,7 +19,7 @@ final class ReceiveFileCallbacksRegistryTests: XCTestCase { let firstCallbackCancellable = callbackRegistry.register(firstCallback) let secondCallbackCancellable = callbackRegistry.register(secondCallback) - let firstResult = Result<ReceivedFile, NSError>.success(.stub(1)) + let firstResult = ReceiveFileCallback.Result.success(.stub(1)) registeredCallbacks.handle(firstResult) XCTAssertNoDifference(firstCallbackDidHandle, [firstResult]) @@ -27,7 +27,7 @@ final class ReceiveFileCallbacksRegistryTests: XCTestCase { firstCallbackCancellable.cancel() let secondError = NSError(domain: "test", code: 321) - let secondResult = Result<ReceivedFile, NSError>.failure(secondError) + let secondResult = ReceiveFileCallback.Result.failure(secondError) registeredCallbacks.handle(secondResult) XCTAssertNoDifference(firstCallbackDidHandle, [firstResult]) @@ -35,7 +35,7 @@ final class ReceiveFileCallbacksRegistryTests: XCTestCase { secondCallbackCancellable.cancel() - let thirdData = Result<ReceivedFile, NSError>.success(.stub(2)) + let thirdData = ReceiveFileCallback.Result.success(.stub(2)) registeredCallbacks.handle(thirdData) XCTAssertNoDifference(firstCallbackDidHandle, [firstResult]) -- GitLab From 226213375824d62cdd98a6d894180bcf5ab844d8 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Mon, 17 Oct 2022 00:30:31 +0200 Subject: [PATCH 11/18] Refactor --- .../TestHelpers/TestDoubles.swift | 13 +++++++++++++ .../Utils/ReceiveFileCallbacksRegistryTests.swift | 13 ------------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Tests/XXMessengerClientTests/TestHelpers/TestDoubles.swift b/Tests/XXMessengerClientTests/TestHelpers/TestDoubles.swift index c9a90bde..93110b2e 100644 --- a/Tests/XXMessengerClientTests/TestHelpers/TestDoubles.swift +++ b/Tests/XXMessengerClientTests/TestHelpers/TestDoubles.swift @@ -23,3 +23,16 @@ extension BackupParams { username: "stub-username" ) } + +extension ReceivedFile { + static func stub(_ id: Int) -> ReceivedFile { + ReceivedFile( + transferId: "transfer-id-\(id)".data(using: .utf8)!, + senderId: "sender-id-\(id)".data(using: .utf8)!, + preview: "preview-\(id)".data(using: .utf8)!, + name: "name-\(id)", + type: "type-\(id)", + size: id + ) + } +} diff --git a/Tests/XXMessengerClientTests/Utils/ReceiveFileCallbacksRegistryTests.swift b/Tests/XXMessengerClientTests/Utils/ReceiveFileCallbacksRegistryTests.swift index e99890b4..87733caa 100644 --- a/Tests/XXMessengerClientTests/Utils/ReceiveFileCallbacksRegistryTests.swift +++ b/Tests/XXMessengerClientTests/Utils/ReceiveFileCallbacksRegistryTests.swift @@ -42,16 +42,3 @@ final class ReceiveFileCallbacksRegistryTests: XCTestCase { XCTAssertNoDifference(secondCallbackDidHandle, [firstResult, secondResult]) } } - -private extension ReceivedFile { - static func stub(_ id: Int) -> ReceivedFile { - ReceivedFile( - transferId: "transfer-id-\(id)".data(using: .utf8)!, - senderId: "sender-id-\(id)".data(using: .utf8)!, - preview: "preview-\(id)".data(using: .utf8)!, - name: "name-\(id)", - type: "type-\(id)", - size: id - ) - } -} -- GitLab From 393e17ff0550d5c202528cb6b5ed47bcb8433279 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Mon, 17 Oct 2022 00:32:43 +0200 Subject: [PATCH 12/18] Use ReceiveFileCallbacksRegistry --- .../Functions/MessengerStartFileTransfer.swift | 4 +--- .../Messenger/MessengerEnvironment.swift | 3 +++ .../MessengerStartFileTransferTests.swift | 18 ++++++++++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerStartFileTransfer.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerStartFileTransfer.swift index 4a8e460d..2ce92adf 100644 --- a/Sources/XXMessengerClient/Messenger/Functions/MessengerStartFileTransfer.swift +++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerStartFileTransfer.swift @@ -25,9 +25,7 @@ extension MessengerStartFileTransfer { e2eFileTransferParamsJSON: env.getE2EFileTransferParams(), fileTransferParamsJSON: env.getFileTransferParams() ), - callback: ReceiveFileCallback { result in - // TODO: - } + callback: env.receiveFileCallbacksRegistry.registered() ) env.fileTransfer.set(fileTransfer) } diff --git a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift index 30f3b22e..dcb706d4 100644 --- a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift +++ b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift @@ -33,6 +33,7 @@ public struct MessengerEnvironment { public var newOrLoadUd: NewOrLoadUd public var newUdManagerFromBackup: NewUdManagerFromBackup public var passwordStorage: PasswordStorage + public var receiveFileCallbacksRegistry: ReceiveFileCallbacksRegistry public var registerForNotifications: RegisterForNotifications public var registerLogWriter: RegisterLogWriter public var resumeBackup: ResumeBackup @@ -83,6 +84,7 @@ extension MessengerEnvironment { newOrLoadUd: .live, newUdManagerFromBackup: .live, passwordStorage: .keychain, + receiveFileCallbacksRegistry: .live(), registerForNotifications: .live, registerLogWriter: .live, resumeBackup: .live, @@ -128,6 +130,7 @@ extension MessengerEnvironment { newOrLoadUd: .unimplemented, newUdManagerFromBackup: .unimplemented, passwordStorage: .unimplemented, + receiveFileCallbacksRegistry: .unimplemented, registerForNotifications: .unimplemented, registerLogWriter: .unimplemented, resumeBackup: .unimplemented, diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartFileTransferTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartFileTransferTests.swift index 5164700f..f0da2047 100644 --- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartFileTransferTests.swift +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartFileTransferTests.swift @@ -12,6 +12,7 @@ final class MessengerStartFileTransferTests: XCTestCase { var didInitFileTransfer: [InitFileTransfer.Params] = [] var receiveFileCallback: ReceiveFileCallback? var didSetFileTransfer: [FileTransfer?] = [] + var didReceiveFile: [ReceiveFileCallback.Result] = [] var env: MessengerEnvironment = .unimplemented env.e2e.get = { @@ -33,6 +34,11 @@ final class MessengerStartFileTransferTests: XCTestCase { env.fileTransfer.set = { didSetFileTransfer.append($0) } + env.receiveFileCallbacksRegistry.registered = { + ReceiveFileCallback { result in + didReceiveFile.append(result) + } + } let start: MessengerStartFileTransfer = .live(env) @@ -45,6 +51,17 @@ final class MessengerStartFileTransferTests: XCTestCase { )]) XCTAssertNotNil(receiveFileCallback) XCTAssertNoDifference(didSetFileTransfer.map { $0 != nil }, [true]) + + let error = NSError(domain: "test", code: 7) + receiveFileCallback?.handle(.success(.stub(1))) + receiveFileCallback?.handle(.failure(error)) + receiveFileCallback?.handle(.success(.stub(2))) + + XCTAssertNoDifference(didReceiveFile, [ + .success(.stub(1)), + .failure(error), + .success(.stub(2)), + ]) } func testStartWhenNotConnected() { @@ -60,3 +77,4 @@ final class MessengerStartFileTransferTests: XCTestCase { } } } + -- GitLab From 2edf739af1f1d322c45fe31db195c7de0f48a5d2 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Mon, 17 Oct 2022 00:38:49 +0200 Subject: [PATCH 13/18] Add MessengerRegisterReceiveFileCallback function --- ...MessengerRegisterReceiveFileCallback.swift | 24 +++++++++++++ .../Messenger/Messenger.swift | 3 ++ ...ngerRegisterReceiveFileCallbackTests.swift | 34 +++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterReceiveFileCallback.swift create mode 100644 Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterReceiveFileCallbackTests.swift diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterReceiveFileCallback.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterReceiveFileCallback.swift new file mode 100644 index 00000000..42d56389 --- /dev/null +++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterReceiveFileCallback.swift @@ -0,0 +1,24 @@ +import XCTestDynamicOverlay +import XXClient + +public struct MessengerRegisterReceiveFileCallback { + public var run: (ReceiveFileCallback) -> Cancellable + + public func callAsFunction(_ callback: ReceiveFileCallback) -> Cancellable { + run(callback) + } +} + +extension MessengerRegisterReceiveFileCallback { + public static func live(_ env: MessengerEnvironment) -> MessengerRegisterReceiveFileCallback { + MessengerRegisterReceiveFileCallback { callback in + env.receiveFileCallbacksRegistry.register(callback) + } + } +} + +extension MessengerRegisterReceiveFileCallback { + public static let unimplemented = MessengerRegisterReceiveFileCallback( + run: XCTUnimplemented("\(Self.self)", placeholder: Cancellable {}) + ) +} diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift index 793daab0..d565ebb2 100644 --- a/Sources/XXMessengerClient/Messenger/Messenger.swift +++ b/Sources/XXMessengerClient/Messenger/Messenger.swift @@ -40,6 +40,7 @@ public struct Messenger { public var stopBackup: MessengerStopBackup public var setLogLevel: MessengerSetLogLevel public var startLogging: MessengerStartLogging + public var registerReceiveFileCallback: MessengerRegisterReceiveFileCallback public var startFileTransfer: MessengerStartFileTransfer public var sendFile: MessengerSendFile public var receiveFile: MessengerReceiveFile @@ -87,6 +88,7 @@ extension Messenger { stopBackup: .live(env), setLogLevel: .live(env), startLogging: .live(env), + registerReceiveFileCallback: .live(env), startFileTransfer: .live(env), sendFile: .live(env), receiveFile: .live(env) @@ -135,6 +137,7 @@ extension Messenger { stopBackup: .unimplemented, setLogLevel: .unimplemented, startLogging: .unimplemented, + registerReceiveFileCallback: .unimplemented, startFileTransfer: .unimplemented, sendFile: .unimplemented, receiveFile: .unimplemented diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterReceiveFileCallbackTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterReceiveFileCallbackTests.swift new file mode 100644 index 00000000..c30bb10a --- /dev/null +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterReceiveFileCallbackTests.swift @@ -0,0 +1,34 @@ +import CustomDump +import XCTest +import XXClient +@testable import XXMessengerClient + +final class MessengerRegisterReceiveFileCallbackTests: XCTestCase { + func testRegisterCallback() { + var registeredCallbacks: [ReceiveFileCallback] = [] + var didHandleResult: [ReceiveFileCallback.Result] = [] + var didCancelRegisteredCallback = 0 + + var env: MessengerEnvironment = .unimplemented + env.receiveFileCallbacksRegistry.register = { callback in + registeredCallbacks.append(callback) + return Cancellable { didCancelRegisteredCallback += 1 } + } + let registerCallback: MessengerRegisterReceiveFileCallback = .live(env) + let cancellable = registerCallback(ReceiveFileCallback { result in + didHandleResult.append(result) + }) + + XCTAssertEqual(registeredCallbacks.count, 1) + + registeredCallbacks.forEach { callback in + callback.handle(.success(.stub(1))) + } + + XCTAssertNoDifference(didHandleResult, [.success(.stub(1))]) + + cancellable.cancel() + + XCTAssertEqual(didCancelRegisteredCallback, 1) + } +} -- GitLab From d7929432c0531c2bb6ccf241a4b686cdca3bc36d Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Mon, 17 Oct 2022 00:40:00 +0200 Subject: [PATCH 14/18] Refactor --- .../Functions/MessengerRegisterReceiveFileCallback.swift | 2 +- .../Messenger/Functions/MessengerStartFileTransfer.swift | 2 +- .../XXMessengerClient/Messenger/MessengerEnvironment.swift | 6 +++--- .../MessengerRegisterReceiveFileCallbackTests.swift | 2 +- .../Functions/MessengerStartFileTransferTests.swift | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterReceiveFileCallback.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterReceiveFileCallback.swift index 42d56389..e5dddd8a 100644 --- a/Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterReceiveFileCallback.swift +++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterReceiveFileCallback.swift @@ -12,7 +12,7 @@ public struct MessengerRegisterReceiveFileCallback { extension MessengerRegisterReceiveFileCallback { public static func live(_ env: MessengerEnvironment) -> MessengerRegisterReceiveFileCallback { MessengerRegisterReceiveFileCallback { callback in - env.receiveFileCallbacksRegistry.register(callback) + env.receiveFileCallbacks.register(callback) } } } diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerStartFileTransfer.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerStartFileTransfer.swift index 2ce92adf..11dfd35a 100644 --- a/Sources/XXMessengerClient/Messenger/Functions/MessengerStartFileTransfer.swift +++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerStartFileTransfer.swift @@ -25,7 +25,7 @@ extension MessengerStartFileTransfer { e2eFileTransferParamsJSON: env.getE2EFileTransferParams(), fileTransferParamsJSON: env.getFileTransferParams() ), - callback: env.receiveFileCallbacksRegistry.registered() + callback: env.receiveFileCallbacks.registered() ) env.fileTransfer.set(fileTransfer) } diff --git a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift index dcb706d4..a1ab1517 100644 --- a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift +++ b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift @@ -33,7 +33,7 @@ public struct MessengerEnvironment { public var newOrLoadUd: NewOrLoadUd public var newUdManagerFromBackup: NewUdManagerFromBackup public var passwordStorage: PasswordStorage - public var receiveFileCallbacksRegistry: ReceiveFileCallbacksRegistry + public var receiveFileCallbacks: ReceiveFileCallbacksRegistry public var registerForNotifications: RegisterForNotifications public var registerLogWriter: RegisterLogWriter public var resumeBackup: ResumeBackup @@ -84,7 +84,7 @@ extension MessengerEnvironment { newOrLoadUd: .live, newUdManagerFromBackup: .live, passwordStorage: .keychain, - receiveFileCallbacksRegistry: .live(), + receiveFileCallbacks: .live(), registerForNotifications: .live, registerLogWriter: .live, resumeBackup: .live, @@ -130,7 +130,7 @@ extension MessengerEnvironment { newOrLoadUd: .unimplemented, newUdManagerFromBackup: .unimplemented, passwordStorage: .unimplemented, - receiveFileCallbacksRegistry: .unimplemented, + receiveFileCallbacks: .unimplemented, registerForNotifications: .unimplemented, registerLogWriter: .unimplemented, resumeBackup: .unimplemented, diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterReceiveFileCallbackTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterReceiveFileCallbackTests.swift index c30bb10a..95a6cabc 100644 --- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterReceiveFileCallbackTests.swift +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterReceiveFileCallbackTests.swift @@ -10,7 +10,7 @@ final class MessengerRegisterReceiveFileCallbackTests: XCTestCase { var didCancelRegisteredCallback = 0 var env: MessengerEnvironment = .unimplemented - env.receiveFileCallbacksRegistry.register = { callback in + env.receiveFileCallbacks.register = { callback in registeredCallbacks.append(callback) return Cancellable { didCancelRegisteredCallback += 1 } } diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartFileTransferTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartFileTransferTests.swift index f0da2047..8e6d3528 100644 --- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartFileTransferTests.swift +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartFileTransferTests.swift @@ -34,7 +34,7 @@ final class MessengerStartFileTransferTests: XCTestCase { env.fileTransfer.set = { didSetFileTransfer.append($0) } - env.receiveFileCallbacksRegistry.registered = { + env.receiveFileCallbacks.registered = { ReceiveFileCallback { result in didReceiveFile.append(result) } -- GitLab From 87a3d372c95ce1c643ae31a4c8e64fcdbd696b19 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Mon, 17 Oct 2022 00:55:55 +0200 Subject: [PATCH 15/18] Update docs --- Docs/XXMessengerClient.md | 63 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/Docs/XXMessengerClient.md b/Docs/XXMessengerClient.md index efbb9de7..c2f407c3 100644 --- a/Docs/XXMessengerClient.md +++ b/Docs/XXMessengerClient.md @@ -155,4 +155,65 @@ let restoredEmail = facts.get(.email)?.value let restoredPhone = facts.get(.phone)?.value ``` -If no error was thrown during restoration, the `Messenger` is already loaded, started, connected, and logged in. \ No newline at end of file +If no error was thrown during restoration, the `Messenger` is already loaded, started, connected, and logged in. + +## 🚢 File transfers + +### Setup for receiving files + +```swift +// register receive file callback before starting file transfer manager: +let cancellable = messenger.registerReceiveFileCallback(.init { result in + switch result { + case .success(let receivedFile): + // handle file metadata... + + // start receiving file data: + try! messenger.receiveFile(.init(transferId: receivedFile.transferId)) { info in + switch info { + case .progress(let transmitted, let total): + // handle progress... + + case .finished(let data): + // handle received file data... + + case .failed(let error): + // handle error... + } + } + + case .failure(let error): + // handle error... + } +}) + +// start file transfer manager: +try messenger.startFileTransfer() +``` + +### Send files + +Make sure to call `messenger.startFileTransfer` before sending files. + +```swift +let file = FileSend( + name: ..., + type: ..., + preview: ..., + contents: ... +) + +// send file: +let transferId = try messenger.sendFile(.init(file: file, recipientId: ...)) { info in + switch info { + case .progress(let transferId, let transmitted, let total): + // handle progress... + + case .finished(let transferId): + // handle completion... + + case .failed(let transferId, let error): + // handle error... + } +} +``` -- GitLab From 34da59da3bc965a164af0d8e460ff91da63c5bcd Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Mon, 17 Oct 2022 01:03:23 +0200 Subject: [PATCH 16/18] Remove CI caches --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9f8233b4..2f28d862 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,6 +9,7 @@ before_script: - mkdir -p ~/.ssh - chmod 700 ~/.ssh - ssh-keyscan -t rsa $GITLAB_SERVER > ~/.ssh/known_hosts + - ./xcode-remove-caches.sh stages: - test -- GitLab From 72b5b4462e5e88670aeaefe7ccf0f74326fa2591 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Mon, 17 Oct 2022 01:03:34 +0200 Subject: [PATCH 17/18] Revert "Remove CI caches" This reverts commit 34da59da3bc965a164af0d8e460ff91da63c5bcd. --- .gitlab-ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2f28d862..9f8233b4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,7 +9,6 @@ before_script: - mkdir -p ~/.ssh - chmod 700 ~/.ssh - ssh-keyscan -t rsa $GITLAB_SERVER > ~/.ssh/known_hosts - - ./xcode-remove-caches.sh stages: - test -- GitLab From 6acd670e8daa47806ebd504da4d085cc8f275505 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Mon, 17 Oct 2022 01:07:20 +0200 Subject: [PATCH 18/18] Update example app package dependencies --- .../xcshareddata/swiftpm/Package.resolved | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Examples/xx-messenger/XXMessenger.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Examples/xx-messenger/XXMessenger.xcworkspace/xcshareddata/swiftpm/Package.resolved index 51664bd6..482d554f 100644 --- a/Examples/xx-messenger/XXMessenger.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Examples/xx-messenger/XXMessenger.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -50,8 +50,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-case-paths", "state" : { - "revision" : "7346701ea29da0a85d4403cf3d7a589a58ae3dee", - "version" : "0.9.2" + "revision" : "15bba50ebf3a2065388c8d12210debe4f6ada202", + "version" : "0.10.0" } }, { @@ -68,8 +68,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-composable-architecture.git", "state" : { - "revision" : "9ea8c763061287052a68d5e6723fed45e898b7d9", - "version" : "0.40.2" + "revision" : "5c476994eaa79af8e466041f6de1ab116f37c528", + "version" : "0.42.0" } }, { -- GitLab