Skip to content
Snippets Groups Projects
WaitForNodes.swift 1.24 KiB
Newer Older
import XXClient
import XCTestDynamicOverlay

Dariusz Rybicki's avatar
Dariusz Rybicki committed
public struct WaitForNodes {
  public typealias Progress = (NodeRegistrationReport) -> Void

  public enum Error: Swift.Error {
    case notLoaded
    case timeout
  }

  public var run: (Double, Int, Int, @escaping Progress) throws -> Void

  public func callAsFunction(
    targetRatio: Double = 0.8,
    sleepMS: Int = 1_000,
    retries: Int = 10,
    onProgress: @escaping Progress = { _ in }
  ) throws {
    try run(targetRatio, sleepMS, retries, onProgress)
  }
}

Dariusz Rybicki's avatar
Dariusz Rybicki committed
extension WaitForNodes {
  public static func live(_ env: Environment) -> WaitForNodes {
    WaitForNodes { targetRatio, sleepMS, retries, onProgress in
Dariusz Rybicki's avatar
Dariusz Rybicki committed
      guard let cMix = env.cMix() else {
        throw Error.notLoaded
      }

      var report = try cMix.getNodeRegistrationStatus()
      var retries = retries

      while report.ratio < targetRatio && retries > 0 {
        env.sleep(sleepMS)
        report = try cMix.getNodeRegistrationStatus()
        retries -= 1
        onProgress(report)
      }

      if report.ratio < targetRatio {
        throw Error.timeout
      }
    }
  }
}

Dariusz Rybicki's avatar
Dariusz Rybicki committed
extension WaitForNodes {
  public static let unimplemented = WaitForNodes(
    run: XCTUnimplemented("\(Self.self)")
  )
}