230 lines
8.4 KiB
Swift
230 lines
8.4 KiB
Swift
|
//
|
||
|
// CompactBlockStorageTests.swift
|
||
|
// ZcashLightClientKitTests
|
||
|
//
|
||
|
// Created by Francisco Gindre on 10/13/19.
|
||
|
// Copyright © 2019 Electric Coin Company. All rights reserved.
|
||
|
//
|
||
|
|
||
|
import Foundation
|
||
|
@testable import TestUtils
|
||
|
@testable import ZcashLightClientKit
|
||
|
import XCTest
|
||
|
|
||
|
class CompactBlockRepositoryTests: XCTestCase {
|
||
|
let network = ZcashNetworkBuilder.network(for: .testnet)
|
||
|
|
||
|
let testTempDirectory = URL(fileURLWithPath: NSString(
|
||
|
string: NSTemporaryDirectory()
|
||
|
)
|
||
|
.appendingPathComponent("tmp-\(Int.random(in: 0 ... .max))"))
|
||
|
|
||
|
let testFileManager = FileManager()
|
||
|
|
||
|
override func setUpWithError() throws {
|
||
|
try super.setUpWithError()
|
||
|
try self.testFileManager.createDirectory(at: self.testTempDirectory, withIntermediateDirectories: false)
|
||
|
}
|
||
|
|
||
|
override func tearDownWithError() throws {
|
||
|
try super.tearDownWithError()
|
||
|
try? testFileManager.removeItem(at: testTempDirectory)
|
||
|
}
|
||
|
|
||
|
func testEmptyStorage() throws {
|
||
|
let compactBlockRepository: CompactBlockRepository = FSCompactBlockRepository(
|
||
|
cacheDirectory: testTempDirectory,
|
||
|
metadataStore: FSMetadataStore.live(
|
||
|
fsBlockDbRoot: testTempDirectory,
|
||
|
rustBackend: ZcashRustBackend.self
|
||
|
),
|
||
|
blockDescriptor: .live,
|
||
|
contentProvider: DirectoryListingProviders.defaultSorted
|
||
|
)
|
||
|
|
||
|
try compactBlockRepository.create()
|
||
|
|
||
|
XCTAssertEqual(compactBlockRepository.latestHeight(), .empty())
|
||
|
}
|
||
|
|
||
|
func testEmptyStorageAsync() async throws {
|
||
|
let compactBlockRepository: CompactBlockRepository = FSCompactBlockRepository(
|
||
|
cacheDirectory: testTempDirectory,
|
||
|
metadataStore: FSMetadataStore.live(
|
||
|
fsBlockDbRoot: testTempDirectory,
|
||
|
rustBackend: ZcashRustBackend.self
|
||
|
),
|
||
|
blockDescriptor: .live,
|
||
|
contentProvider: DirectoryListingProviders.defaultSorted
|
||
|
)
|
||
|
|
||
|
try compactBlockRepository.create()
|
||
|
|
||
|
let latestHeight = await compactBlockRepository.latestHeightAsync()
|
||
|
|
||
|
XCTAssertEqual(latestHeight, BlockHeight.empty())
|
||
|
}
|
||
|
|
||
|
func testStoreThousandBlocks() async throws {
|
||
|
let compactBlockRepository: CompactBlockRepository = FSCompactBlockRepository(
|
||
|
cacheDirectory: testTempDirectory,
|
||
|
metadataStore: FSMetadataStore.live(
|
||
|
fsBlockDbRoot: testTempDirectory,
|
||
|
rustBackend: ZcashRustBackend.self
|
||
|
),
|
||
|
blockDescriptor: .live,
|
||
|
contentProvider: DirectoryListingProviders.defaultSorted
|
||
|
)
|
||
|
|
||
|
try compactBlockRepository.create()
|
||
|
|
||
|
let initialHeight = await compactBlockRepository.latestHeightAsync()
|
||
|
let startHeight = self.network.constants.saplingActivationHeight
|
||
|
let blockCount = Int(1_000)
|
||
|
let finalHeight = startHeight + blockCount
|
||
|
|
||
|
do {
|
||
|
try await TestDbBuilder.seed(db: compactBlockRepository, with: startHeight...finalHeight)
|
||
|
} catch {
|
||
|
XCTFail("seed failed with error: \(error)")
|
||
|
return
|
||
|
}
|
||
|
|
||
|
let latestHeight = compactBlockRepository.latestHeight()
|
||
|
XCTAssertNotEqual(initialHeight, latestHeight)
|
||
|
XCTAssertEqual(latestHeight, finalHeight)
|
||
|
}
|
||
|
|
||
|
func testStoreThousandBlocksAsync() async throws {
|
||
|
let compactBlockRepository: CompactBlockRepository = FSCompactBlockRepository(
|
||
|
cacheDirectory: testTempDirectory,
|
||
|
metadataStore: FSMetadataStore.live(
|
||
|
fsBlockDbRoot: testTempDirectory,
|
||
|
rustBackend: ZcashRustBackend.self
|
||
|
),
|
||
|
blockDescriptor: .live,
|
||
|
contentProvider: DirectoryListingProviders.defaultSorted
|
||
|
)
|
||
|
|
||
|
try compactBlockRepository.create()
|
||
|
|
||
|
let initialHeight = compactBlockRepository.latestHeight()
|
||
|
let startHeight = self.network.constants.saplingActivationHeight
|
||
|
let blockCount = Int(1_000)
|
||
|
let finalHeight = startHeight + blockCount
|
||
|
|
||
|
try await TestDbBuilder.seed(db: compactBlockRepository, with: startHeight...finalHeight)
|
||
|
|
||
|
let latestHeight = await compactBlockRepository.latestHeightAsync()
|
||
|
XCTAssertNotEqual(initialHeight, latestHeight)
|
||
|
XCTAssertEqual(latestHeight, finalHeight)
|
||
|
}
|
||
|
|
||
|
func testStoreOneBlockFromEmpty() async throws {
|
||
|
let compactBlockRepository: CompactBlockRepository = FSCompactBlockRepository(
|
||
|
cacheDirectory: testTempDirectory,
|
||
|
metadataStore: FSMetadataStore.live(
|
||
|
fsBlockDbRoot: testTempDirectory,
|
||
|
rustBackend: ZcashRustBackend.self
|
||
|
),
|
||
|
blockDescriptor: .live,
|
||
|
contentProvider: DirectoryListingProviders.defaultSorted
|
||
|
)
|
||
|
|
||
|
try compactBlockRepository.create()
|
||
|
|
||
|
let expectedHeight = BlockHeight(123_456)
|
||
|
guard let block = StubBlockCreator.createRandomDataBlock(with: expectedHeight) else {
|
||
|
XCTFail("could not create random block with height: \(expectedHeight)")
|
||
|
return
|
||
|
}
|
||
|
|
||
|
try await compactBlockRepository.write(blocks: [block])
|
||
|
|
||
|
XCTAssertEqual(compactBlockRepository.latestHeight(), expectedHeight)
|
||
|
}
|
||
|
|
||
|
func testStoreOneBlockFromEmptyAsync() async throws {
|
||
|
let compactBlockRepository: CompactBlockRepository = FSCompactBlockRepository(
|
||
|
cacheDirectory: testTempDirectory,
|
||
|
metadataStore: FSMetadataStore.live(
|
||
|
fsBlockDbRoot: testTempDirectory,
|
||
|
rustBackend: ZcashRustBackend.self
|
||
|
),
|
||
|
blockDescriptor: .live,
|
||
|
contentProvider: DirectoryListingProviders.defaultSorted
|
||
|
)
|
||
|
|
||
|
try compactBlockRepository.create()
|
||
|
|
||
|
let expectedHeight = BlockHeight(123_456)
|
||
|
guard let block = StubBlockCreator.createRandomDataBlock(with: expectedHeight) else {
|
||
|
XCTFail("could not create random block with height: \(expectedHeight)")
|
||
|
return
|
||
|
}
|
||
|
try await compactBlockRepository.write(blocks: [block])
|
||
|
|
||
|
let result = await compactBlockRepository.latestHeightAsync()
|
||
|
XCTAssertEqual(result, expectedHeight)
|
||
|
}
|
||
|
|
||
|
func testRewindTo() async throws {
|
||
|
let compactBlockRepository: CompactBlockRepository = FSCompactBlockRepository(
|
||
|
cacheDirectory: testTempDirectory,
|
||
|
metadataStore: FSMetadataStore.live(
|
||
|
fsBlockDbRoot: testTempDirectory,
|
||
|
rustBackend: ZcashRustBackend.self
|
||
|
),
|
||
|
blockDescriptor: .live,
|
||
|
contentProvider: DirectoryListingProviders.defaultSorted
|
||
|
)
|
||
|
|
||
|
try compactBlockRepository.create()
|
||
|
|
||
|
let startHeight = self.network.constants.saplingActivationHeight
|
||
|
let blockCount = Int(1_000)
|
||
|
let finalHeight = startHeight + blockCount
|
||
|
|
||
|
do {
|
||
|
try await TestDbBuilder.seed(db: compactBlockRepository, with: startHeight...finalHeight)
|
||
|
} catch {
|
||
|
XCTFail("seed failed with error: \(error)")
|
||
|
return
|
||
|
}
|
||
|
let rewindHeight = BlockHeight(finalHeight - 233)
|
||
|
|
||
|
do {
|
||
|
try await compactBlockRepository.rewindAsync(to: rewindHeight)
|
||
|
|
||
|
XCTAssertEqual(compactBlockRepository.latestHeight(), rewindHeight)
|
||
|
} catch {
|
||
|
XCTFail("Rewind latest block failed with error: \(error)")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func testRewindToAsync() async throws {
|
||
|
let compactBlockRepository: CompactBlockRepository = FSCompactBlockRepository(
|
||
|
cacheDirectory: testTempDirectory,
|
||
|
metadataStore: FSMetadataStore.live(
|
||
|
fsBlockDbRoot: testTempDirectory,
|
||
|
rustBackend: ZcashRustBackend.self
|
||
|
),
|
||
|
blockDescriptor: .live,
|
||
|
contentProvider: DirectoryListingProviders.defaultSorted
|
||
|
)
|
||
|
|
||
|
try compactBlockRepository.create()
|
||
|
|
||
|
let startHeight = self.network.constants.saplingActivationHeight
|
||
|
let blockCount = Int(1_000)
|
||
|
let finalHeight = startHeight + blockCount
|
||
|
|
||
|
try await TestDbBuilder.seed(db: compactBlockRepository, with: startHeight...finalHeight)
|
||
|
let rewindHeight = BlockHeight(finalHeight - 233)
|
||
|
|
||
|
try await compactBlockRepository.rewindAsync(to: rewindHeight)
|
||
|
let latestHeight = await compactBlockRepository.latestHeightAsync()
|
||
|
XCTAssertEqual(latestHeight, rewindHeight)
|
||
|
}
|
||
|
}
|