diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift index 51f6092321c0b08fb24729de3e30f55abba10318..4ed8cf2c41243bd7ae6ce9ac59d6ca69a2f3490c 100644 --- a/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift +++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift @@ -11,6 +11,16 @@ public struct MessengerDestroy { extension MessengerDestroy { public static func live(_ env: MessengerEnvironment) -> MessengerDestroy { MessengerDestroy { + if let cMix = env.cMix() { + if cMix.networkFollowerStatus() == .running { + try cMix.stopNetworkFollower() + } + var hasRunningProcesses = cMix.hasRunningProcesses() + while hasRunningProcesses { + env.sleep(1) + hasRunningProcesses = cMix.hasRunningProcesses() + } + } env.ud.set(nil) env.e2e.set(nil) env.cMix.set(nil) diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerDestroyTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerDestroyTests.swift index cfe3f9a51f447c41cf94ae077c71a0b63f3639e3..a91e32851de507ef96e354b4458228625aa352d1 100644 --- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerDestroyTests.swift +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerDestroyTests.swift @@ -6,12 +6,23 @@ import XXClient final class MessengerDestroyTests: XCTestCase { func testDestroy() throws { let storageDir = "test-storage-dir" + var hasRunningProcesses: [Bool] = [true, true, false] + var didStopNetworkFollower = 0 + var didSleep: [TimeInterval] = [] var didRemoveDirectory: [String] = [] var didSetUD: [UserDiscovery?] = [] var didSetE2E: [E2E?] = [] var didSetCMix: [CMix?] = [] var env: MessengerEnvironment = .unimplemented + env.cMix.get = { + var cMix: CMix = .unimplemented + cMix.networkFollowerStatus.run = { .running } + cMix.stopNetworkFollower.run = { didStopNetworkFollower += 1 } + cMix.hasRunningProcesses.run = { hasRunningProcesses.removeFirst() } + return cMix + } + env.sleep = { didSleep.append($0) } env.storageDir = storageDir env.ud.set = { didSetUD.append($0) } env.e2e.set = { didSetE2E.append($0) } @@ -21,12 +32,31 @@ final class MessengerDestroyTests: XCTestCase { try destroy() + XCTAssertNoDifference(didStopNetworkFollower, 1) + XCTAssertNoDifference(didSleep, [1, 1]) XCTAssertNoDifference(didSetUD.map { $0 == nil }, [true]) XCTAssertNoDifference(didSetE2E.map { $0 == nil }, [true]) XCTAssertNoDifference(didSetCMix.map { $0 == nil }, [true]) XCTAssertNoDifference(didRemoveDirectory, [storageDir]) } + func testStopNetworkFollowerFailure() { + struct Error: Swift.Error, Equatable {} + let error = Error() + var env: MessengerEnvironment = .unimplemented + env.cMix.get = { + var cMix: CMix = .unimplemented + cMix.networkFollowerStatus.run = { .running } + cMix.stopNetworkFollower.run = { throw error } + return cMix + } + let destroy: MessengerDestroy = .live(env) + + XCTAssertThrowsError(try destroy()) { err in + XCTAssertEqual(err as? Error, error) + } + } + func testRemoveDirectoryFailure() { struct Error: Swift.Error, Equatable {} let error = Error() @@ -35,6 +65,7 @@ final class MessengerDestroyTests: XCTestCase { var didSetCMix: [CMix?] = [] var env: MessengerEnvironment = .unimplemented + env.cMix.get = { nil } env.ud.set = { didSetUD.append($0) } env.e2e.set = { didSetE2E.append($0) } env.cMix.set = { didSetCMix.append($0) }