2019-10-18 11:45:19 -07:00
|
|
|
//
|
|
|
|
// TestDbBuilder.swift
|
|
|
|
// ZcashLightClientKitTests
|
|
|
|
//
|
|
|
|
// Created by Francisco Gindre on 10/14/19.
|
|
|
|
// Copyright © 2019 Electric Coin Company. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
import Foundation
|
|
|
|
import SQLite
|
|
|
|
@testable import ZcashLightClientKit
|
|
|
|
|
2019-11-18 11:49:36 -08:00
|
|
|
class TestDbBuilder {
|
2019-10-18 11:45:19 -07:00
|
|
|
|
|
|
|
enum TestBuilderError: Error {
|
|
|
|
case generalError
|
|
|
|
}
|
|
|
|
|
|
|
|
static func inMemoryCompactBlockStorage() throws -> CompactBlockStorage {
|
2019-11-04 15:18:07 -08:00
|
|
|
let compactBlockDao = CompactBlockStorage(connectionProvider: try InMemoryDbProvider())
|
2019-10-18 11:45:19 -07:00
|
|
|
try compactBlockDao.createTable()
|
|
|
|
return compactBlockDao
|
|
|
|
}
|
|
|
|
|
2019-10-18 13:09:13 -07:00
|
|
|
static func diskCompactBlockStorage(at url: URL) throws -> CompactBlockStorage {
|
2019-10-30 13:18:57 -07:00
|
|
|
let compactBlockDao = CompactBlockStorage(connectionProvider: SimpleConnectionProvider(path: url.absoluteString))
|
2019-10-18 11:45:19 -07:00
|
|
|
try compactBlockDao.createTable()
|
|
|
|
return compactBlockDao
|
|
|
|
}
|
2019-11-18 11:49:36 -08:00
|
|
|
|
|
|
|
static func prepopulatedDataDbProvider() -> ConnectionProvider? {
|
|
|
|
let bundle = Bundle(for: TestDbBuilder.self)
|
|
|
|
guard let url = bundle.url(forResource: "ZcashSdk_Data", withExtension: "db") else { return nil }
|
|
|
|
let provider = SimpleConnectionProvider(path: url.absoluteString, readonly: true)
|
|
|
|
return provider
|
|
|
|
}
|
|
|
|
|
|
|
|
static func transactionRepository() -> TransactionRepository? {
|
|
|
|
guard let provider = prepopulatedDataDbProvider() else { return nil }
|
|
|
|
|
|
|
|
return TransactionSQLDAO(dbProvider: provider)
|
|
|
|
}
|
2019-10-18 13:09:13 -07:00
|
|
|
|
2019-11-18 11:49:36 -08:00
|
|
|
static func seed(db: CompactBlockRepository, with blockRange: CompactBlockRange) throws {
|
2019-10-18 11:45:19 -07:00
|
|
|
|
|
|
|
guard let blocks = StubBlockCreator.createBlockRange(blockRange) else {
|
|
|
|
throw TestBuilderError.generalError
|
|
|
|
}
|
|
|
|
|
2019-10-30 13:18:57 -07:00
|
|
|
try db.write(blocks: blocks)
|
2019-10-18 11:45:19 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-10-30 13:18:57 -07:00
|
|
|
struct InMemoryDbProvider: ConnectionProvider {
|
|
|
|
var readonly: Bool
|
|
|
|
|
2019-11-04 15:18:07 -08:00
|
|
|
var conn: Connection
|
|
|
|
init(readonly: Bool = false) throws {
|
2019-10-30 13:18:57 -07:00
|
|
|
self.readonly = readonly
|
2019-11-04 15:18:07 -08:00
|
|
|
self.conn = try Connection(.inMemory, readonly: readonly)
|
2019-10-30 13:18:57 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
func connection() throws -> Connection {
|
2019-11-04 15:18:07 -08:00
|
|
|
self.conn
|
2019-10-30 13:18:57 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-10-18 11:45:19 -07:00
|
|
|
struct StubBlockCreator {
|
|
|
|
static func createRandomDataBlock(with height: BlockHeight) -> ZcashCompactBlock? {
|
|
|
|
guard let data = randomData(ofLength: 100) else {
|
|
|
|
print("error creating stub block")
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return ZcashCompactBlock(height: height, data: data)
|
|
|
|
}
|
|
|
|
static func createBlockRange(_ range: CompactBlockRange) -> [ZcashCompactBlock]? {
|
|
|
|
|
|
|
|
var blocks = [ZcashCompactBlock]()
|
|
|
|
for height in range {
|
|
|
|
guard let block = createRandomDataBlock(with: height) else {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
blocks.append(block)
|
|
|
|
}
|
|
|
|
|
|
|
|
return blocks
|
|
|
|
}
|
|
|
|
|
|
|
|
static func randomData(ofLength length: Int) -> Data? {
|
|
|
|
var bytes = [UInt8](repeating: 0, count: length)
|
|
|
|
let status = SecRandomCopyBytes(kSecRandomDefault, length, &bytes)
|
|
|
|
if status == errSecSuccess {
|
|
|
|
return Data(bytes: &bytes, count: bytes.count)
|
|
|
|
}
|
|
|
|
print("Status \(status)")
|
|
|
|
return nil
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|