173 lines
5.6 KiB
Swift
173 lines
5.6 KiB
Swift
//
|
|
// ProvidersTests.swift
|
|
// Passepartout
|
|
//
|
|
// Created by Davide De Rosa on 3/13/22.
|
|
// Copyright (c) 2023 Davide De Rosa. All rights reserved.
|
|
//
|
|
// https://github.com/passepartoutvpn
|
|
//
|
|
// This file is part of Passepartout.
|
|
//
|
|
// Passepartout is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// Passepartout is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
|
|
//
|
|
|
|
import Combine
|
|
import CoreData
|
|
import PassepartoutCore
|
|
import PassepartoutProviders
|
|
@testable import PassepartoutProvidersImpl
|
|
import XCTest
|
|
|
|
final class ProvidersTests: XCTestCase {
|
|
private var persistence: ProvidersPersistence!
|
|
|
|
private var manager: ProviderManager!
|
|
|
|
private var cancellables: Set<AnyCancellable> = []
|
|
|
|
override func setUp() {
|
|
persistence = ProvidersPersistence(withName: "ProvidersTests", cloudKit: false, author: nil)
|
|
|
|
let remoteStrategy = APIRemoteProvidersStrategy(
|
|
appBuild: 10000,
|
|
bundleServices: APIWebServices.bundledServices(withVersion: "v5"),
|
|
remoteServices: APIWebServices("v5", URL(string: "https://passepartoutvpn.app/api/")!, timeout: nil),
|
|
webServicesRepository: persistence.webServicesRepository()
|
|
)
|
|
manager = ProviderManager(
|
|
localProvidersRepository: persistence.localProvidersRepository(),
|
|
remoteProvidersStrategy: remoteStrategy
|
|
)
|
|
// persistence.truncate()
|
|
}
|
|
|
|
override func tearDown() {
|
|
// persistence.truncate()
|
|
}
|
|
|
|
func testFetchLocalIndex() throws {
|
|
let exp = expectation(description: "Local index")
|
|
|
|
manager.fetchProvidersIndexPublisher(priority: .bundle)
|
|
.sink {
|
|
switch $0 {
|
|
case .finished:
|
|
exp.fulfill()
|
|
|
|
case .failure(let error):
|
|
pp_log.error("Unable to load remote provider: \(error)")
|
|
exp.fulfill()
|
|
}
|
|
} receiveValue: {
|
|
pp_log.debug("Loaded index")
|
|
}.store(in: &cancellables)
|
|
|
|
waitForExpectations(timeout: 10.0, handler: nil)
|
|
}
|
|
|
|
func testFetchRemoteIndex() throws {
|
|
let exp = expectation(description: "Remote index")
|
|
|
|
manager.fetchProvidersIndexPublisher(priority: .remote)
|
|
.sink {
|
|
switch $0 {
|
|
case .finished:
|
|
exp.fulfill()
|
|
|
|
case .failure(let error):
|
|
pp_log.error("Unable to load remote provider: \(error)")
|
|
exp.fulfill()
|
|
}
|
|
} receiveValue: {
|
|
pp_log.debug("Loaded index")
|
|
}.store(in: &cancellables)
|
|
|
|
waitForExpectations(timeout: 10.0, handler: nil)
|
|
}
|
|
|
|
func testFetchRemoteProvider() async {
|
|
do {
|
|
try await manager.fetchProviderPublisher(withName: .hideme, vpnProtocol: .openVPN, priority: .remote).async()
|
|
pp_log.debug("Loaded provider")
|
|
} catch {
|
|
XCTFail("Unable to load remote provider: \(error)")
|
|
}
|
|
}
|
|
|
|
func testListProviders() {
|
|
let providers = manager.allProviders()
|
|
providers.forEach {
|
|
pp_log.debug("\($0.name) -> \($0.fullName)")
|
|
}
|
|
}
|
|
|
|
func testListCategories() async {
|
|
await fetchProvider(.surfshark)
|
|
let categories = manager.categories(.surfshark, vpnProtocol: .openVPN)
|
|
categories.forEach {
|
|
pp_log.debug("Category: \($0.name)")
|
|
$0.locations.forEach {
|
|
pp_log.debug("\t\($0)")
|
|
}
|
|
}
|
|
}
|
|
|
|
func testListServers() async {
|
|
await fetchProvider(.nordvpn)
|
|
manager.allProviders().filter({ $0.name == .nordvpn }).forEach {
|
|
let location = ProviderLocation(
|
|
providerMetadata: $0,
|
|
vpnProtocol: .openVPN,
|
|
categoryName: "",
|
|
countryCode: "ES",
|
|
servers: nil
|
|
)
|
|
|
|
let servers = manager.servers(forLocation: location)
|
|
pp_log.debug("\($0.fullName): Servers [\(location.countryCode)] (\(servers.count)): \(servers)")
|
|
}
|
|
}
|
|
|
|
func testServerId() async {
|
|
await fetchProvider(.nordvpn)
|
|
guard let server = manager.server(.nordvpn, vpnProtocol: .openVPN, apiId: "es143") else {
|
|
return
|
|
}
|
|
pp_log.debug(server)
|
|
}
|
|
|
|
func testDefaultServer() async {
|
|
await fetchProvider(.protonvpn)
|
|
guard let server = manager.anyDefaultServer(.protonvpn, vpnProtocol: .openVPN) else {
|
|
return
|
|
}
|
|
pp_log.debug(server)
|
|
}
|
|
|
|
func testServerUniqueId() async {
|
|
await fetchProvider(.nordvpn)
|
|
guard let server = manager.server(withId: "BEA03D24A5854DD17395057DEFBE7D6BEEA981227ACF8949E487443E6B5EF9C7") else {
|
|
return
|
|
}
|
|
pp_log.debug(server)
|
|
XCTAssertEqual(server.apiId, "es143")
|
|
}
|
|
|
|
private func fetchProvider(_ name: ProviderName) async {
|
|
try? await manager.fetchProvidersIndexPublisher(priority: .bundle).async()
|
|
try? await manager.fetchProviderPublisher(withName: name, vpnProtocol: .openVPN, priority: .bundle).async()
|
|
}
|
|
}
|