Skip to content
Snippets Groups Projects
MessengerWaitForNodesTests.swift 3.34 KiB
Newer Older
import CustomDump
import XCTest
import XXClient
@testable import XXMessengerClient

Dariusz Rybicki's avatar
Dariusz Rybicki committed
final class MessengerWaitForNodesTests: XCTestCase {
  func testWaitWhenNotLoaded() {
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    var env: MessengerEnvironment = .unimplemented
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    env.cMix.get = { nil }
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    let waitForNodes: MessengerWaitForNodes = .live(env)

    XCTAssertThrowsError(try waitForNodes()) { error in
      XCTAssertEqual(
Dariusz Rybicki's avatar
Dariusz Rybicki committed
        error as? MessengerWaitForNodes.Error,
        MessengerWaitForNodes.Error.notLoaded
      )
    }
  }

  func testWaitWhenHasTargetRatio() throws {
    var didProgress: [NodeRegistrationReport] = []
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    var env: MessengerEnvironment = .unimplemented
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    env.cMix.get = {
      var cMix: CMix = .unimplemented
      cMix.getNodeRegistrationStatus.run = {
        NodeRegistrationReport(registered: 8, total: 10)
      }
      return cMix
    }
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    let waitForNodes: MessengerWaitForNodes = .live(env)

    try waitForNodes(
      targetRatio: 0.7,
      sleepInterval: 123,
      retries: 3,
      onProgress: { didProgress.append($0) }
    )

    XCTAssertNoDifference(didProgress, [
      NodeRegistrationReport(registered: 8, total: 10)
    ])
  }

  func testWaitForTargetRatio() throws {
    var didSleep: [TimeInterval] = []
    var didProgress: [NodeRegistrationReport] = []

    var reports: [NodeRegistrationReport] = [
      .init(registered: 0, total: 10),
      .init(registered: 3, total: 10),
      .init(registered: 8, total: 10),
    ]

Dariusz Rybicki's avatar
Dariusz Rybicki committed
    var env: MessengerEnvironment = .unimplemented
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    env.cMix.get = {
      var cMix: CMix = .unimplemented
      cMix.getNodeRegistrationStatus.run = { reports.removeFirst() }
      return cMix
    }
    env.sleep = { didSleep.append($0) }
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    let waitForNodes: MessengerWaitForNodes = .live(env)

    try waitForNodes(
      targetRatio: 0.7,
      sleepInterval: 123,
      retries: 3,
      onProgress: { didProgress.append($0) }
    )

    XCTAssertNoDifference(didSleep, [123, 123])
    XCTAssertNoDifference(didProgress, [
      NodeRegistrationReport(registered: 0, total: 10),
      NodeRegistrationReport(registered: 3, total: 10),
      NodeRegistrationReport(registered: 8, total: 10),
    ])
  }

  func testWaitTimeout() {
    var didSleep: [TimeInterval] = []
    var didProgress: [NodeRegistrationReport] = []

    var reports: [NodeRegistrationReport] = [
      .init(registered: 0, total: 10),
      .init(registered: 3, total: 10),
      .init(registered: 5, total: 10),
      .init(registered: 6, total: 10),
    ]

Dariusz Rybicki's avatar
Dariusz Rybicki committed
    var env: MessengerEnvironment = .unimplemented
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    env.cMix.get = {
      var cMix: CMix = .unimplemented
      cMix.getNodeRegistrationStatus.run = { reports.removeFirst() }
      return cMix
    }
    env.sleep = { didSleep.append($0) }
Dariusz Rybicki's avatar
Dariusz Rybicki committed
    let waitForNodes: MessengerWaitForNodes = .live(env)

    XCTAssertThrowsError(try waitForNodes(
      targetRatio: 0.7,
      sleepInterval: 123,
      retries: 3,
      onProgress: { didProgress.append($0) }
    )) { error in
      XCTAssertEqual(
Dariusz Rybicki's avatar
Dariusz Rybicki committed
        error as? MessengerWaitForNodes.Error,
        MessengerWaitForNodes.Error.timeout
      )
    }

    XCTAssertNoDifference(didSleep, [123, 123, 123])
    XCTAssertNoDifference(didProgress, [
      NodeRegistrationReport(registered: 0, total: 10),
      NodeRegistrationReport(registered: 3, total: 10),
      NodeRegistrationReport(registered: 5, total: 10),
      NodeRegistrationReport(registered: 6, total: 10),
    ])