forked from hush/hush-android-wallet-sdk
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
5.3 KiB
148 lines
5.3 KiB
package cash.z.ecc.android.sdk.util
|
|
|
|
import androidx.test.platform.app.InstrumentationRegistry
|
|
import cash.z.ecc.android.sdk.Initializer
|
|
import cash.z.ecc.android.sdk.SdkSynchronizer
|
|
import cash.z.ecc.android.sdk.Synchronizer
|
|
import cash.z.ecc.android.sdk.internal.TroubleshootingTwig
|
|
import cash.z.ecc.android.sdk.internal.Twig
|
|
import cash.z.ecc.android.sdk.model.BlockHeight
|
|
import cash.z.ecc.android.sdk.model.ZcashNetwork
|
|
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
|
import kotlinx.coroutines.launch
|
|
import kotlinx.coroutines.runBlocking
|
|
import org.junit.Before
|
|
import org.junit.Ignore
|
|
import org.junit.Test
|
|
|
|
/**
|
|
* A tool for validating an existing database and testing reorgs.
|
|
*/
|
|
@ExperimentalCoroutinesApi
|
|
class DataDbScannerUtil {
|
|
private val context = InstrumentationRegistry.getInstrumentation().context
|
|
|
|
private val host = "lightd-main.zecwallet.co"
|
|
private val port = 443
|
|
private val alias = "ScannerUtil"
|
|
|
|
// private val mnemonics = SimpleMnemonics()
|
|
// private val caceDbPath = Initializer.cacheDbPath(context, alias)
|
|
|
|
// private val downloader = CompactBlockDownloader(
|
|
// LightWalletGrpcService(context, host, port),
|
|
// CompactBlockDbStore(context, caceDbPath)
|
|
// )
|
|
|
|
// private val processor = CompactBlockProcessor(downloader)
|
|
|
|
// private val rustBackend = RustBackend.init(context, cacheDbName, dataDbName)
|
|
|
|
private val birthdayHeight = 600_000L
|
|
private lateinit var synchronizer: Synchronizer
|
|
|
|
@Before
|
|
fun setup() {
|
|
Twig.plant(TroubleshootingTwig())
|
|
// cacheBlocks()
|
|
}
|
|
|
|
private fun cacheBlocks() = runBlocking {
|
|
// twig("downloading compact blocks...")
|
|
// val latestBlockHeight = downloader.getLatestBlockHeight()
|
|
// val lastDownloaded = downloader.getLastDownloadedHeight()
|
|
// val blockRange = (Math.max(birthday, lastDownloaded))..latestBlockHeight
|
|
// downloadNewBlocks(blockRange)
|
|
// val error = validateNewBlocks(blockRange)
|
|
// twig("validation completed with result $error")
|
|
// assertEquals(-1, error)
|
|
}
|
|
|
|
private fun deleteDb(dbName: String) {
|
|
context.getDatabasePath(dbName).absoluteFile.delete()
|
|
}
|
|
|
|
@Test
|
|
@Ignore("This test is broken")
|
|
fun scanExistingDb() {
|
|
synchronizer = run {
|
|
val initializer = runBlocking {
|
|
Initializer.new(context) {
|
|
it.setBirthdayHeight(
|
|
BlockHeight.new(
|
|
ZcashNetwork.Mainnet,
|
|
birthdayHeight
|
|
),
|
|
false
|
|
)
|
|
}
|
|
}
|
|
|
|
val synchronizer = runBlocking {
|
|
Synchronizer.new(
|
|
initializer
|
|
)
|
|
}
|
|
|
|
synchronizer
|
|
}
|
|
|
|
println("sync!")
|
|
synchronizer.start()
|
|
val scope = (synchronizer as SdkSynchronizer).coroutineScope
|
|
|
|
scope.launch {
|
|
synchronizer.status.collect { status ->
|
|
// when (status) {
|
|
println("received status of $status")
|
|
// }
|
|
}
|
|
}
|
|
println("going to sleep!")
|
|
Thread.sleep(125000)
|
|
println("I'm back and I'm out!")
|
|
synchronizer.stop()
|
|
}
|
|
//
|
|
// @Test
|
|
// fun printBalances() = runBlocking {
|
|
// readLines()
|
|
// .map { seedPhrase ->
|
|
// twig("checking balance for: $seedPhrase")
|
|
// mnemonics.toSeed(seedPhrase.toCharArray())
|
|
// }.collect { seed ->
|
|
// initializer.import(seed, birthday, clearDataDb = true, clearCacheDb = false)
|
|
// /*
|
|
// what I need to do right now
|
|
// - for each seed
|
|
// - I can reuse the cache of blocks... so just like get the cache once
|
|
// - I need to scan into a new database
|
|
// - I don't really need a new rustbackend
|
|
// - I definitely don't need a new grpc connection
|
|
// - can I just use a processor and point it to a different DB?
|
|
// + so yeah, I think I need to use the processor directly right here and just swap out its pieces
|
|
// - perhaps create a new initializer and use that to configure the processor?
|
|
// - or maybe just set the data destination for the processor
|
|
// - I might need to consider how state is impacting this design
|
|
// - can we be more stateless and thereby improve the flexibility of this code?!!!
|
|
// */
|
|
// synchronizer?.stop()
|
|
// synchronizer = Synchronizer(context, initializer)
|
|
//
|
|
// // deleteDb(dataDbPath)
|
|
// // initWallet(seed)
|
|
// // twig("scanning blocks for seed <$seed>")
|
|
// //// rustBackend.scanBlocks()
|
|
// // twig("done scanning blocks for seed $seed")
|
|
// //// val total = rustBackend.getBalance(0)
|
|
// // twig("found total: $total")
|
|
// //// val available = rustBackend.getVerifiedBalance(0)
|
|
// // twig("found available: $available")
|
|
// // twig("xrxrx2\t$seed\t$total\t$available")
|
|
// // println("xrxrx2\t$seed\t$total\t$available")
|
|
// }
|
|
//
|
|
// Thread.sleep(5000)
|
|
// assertEquals("foo", "bar")
|
|
// }
|
|
}
|
|
|