2021-11-01 19:07:27 -07:00
package org.bitcoindevkit
2021-10-17 13:56:28 -07:00
2021-11-08 17:41:06 -08:00
import org.junit.Assert.*
import org.junit.Test
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import java.io.File
2021-11-06 05:26:56 +05:30
import java.nio.file.Files
2021-10-17 13:56:28 -07:00
/ * *
* Library test , which will execute on linux host .
*
* /
2021-11-08 17:41:06 -08:00
class JvmLibTest {
2021-11-06 05:26:56 +05:30
2021-11-08 17:41:06 -08:00
fun getTestDataDir ( ) : String {
return Files . createTempDirectory ( " bdk-test " ) . toString ( )
//return Paths.get(System.getProperty("java.io.tmpdir"), "bdk-test").toString()
}
fun cleanupTestDataDir ( testDataDir : String ) {
File ( testDataDir ) . deleteRecursively ( )
}
val log : Logger = LoggerFactory . getLogger ( JvmLibTest :: class . java )
2022-02-27 22:40:42 -08:00
val descriptor =
2021-11-08 17:41:06 -08:00
" wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*) "
2022-03-14 15:13:49 -05:00
val databaseConfig = DatabaseConfig . Memory
2022-02-27 22:40:42 -08:00
val blockchainConfig = BlockchainConfig . Electrum (
ElectrumConfig (
" ssl://electrum.blockstream.info:60002 " ,
null ,
5u ,
null ,
100u
)
)
2021-11-08 17:41:06 -08:00
@Test
fun memoryWalletNewAddress ( ) {
2022-04-22 14:50:40 -07:00
val wallet = Wallet ( descriptor , null , Network . TESTNET , databaseConfig )
2022-06-14 16:31:10 -03:00
val address = wallet . getAddress ( AddressIndex . NEW ) . address
2021-11-08 17:41:06 -08:00
assertNotNull ( address )
2022-03-28 17:17:27 -07:00
assertEquals ( " tb1qzg4mckdh50nwdm9hkzq06528rsu73hjxxzem3e " , address )
2021-11-08 17:41:06 -08:00
}
@Test ( expected = BdkException . Descriptor :: class )
fun invalidDescriptorExceptionIsThrown ( ) {
2022-04-22 14:50:40 -07:00
Wallet ( " invalid-descriptor " , null , Network . TESTNET , databaseConfig )
2021-11-08 17:41:06 -08:00
}
@Test
fun sledWalletNewAddress ( ) {
val testDataDir = getTestDataDir ( )
2022-02-27 22:40:42 -08:00
val databaseConfig = DatabaseConfig . Sled ( SledDbConfiguration ( testDataDir , " testdb " ) )
2022-04-22 14:50:40 -07:00
val wallet = Wallet ( descriptor , null , Network . TESTNET , databaseConfig )
2022-06-14 16:31:10 -03:00
val address = wallet . getAddress ( AddressIndex . NEW ) . address
2021-11-08 17:41:06 -08:00
assertNotNull ( address )
2022-03-28 17:17:27 -07:00
assertEquals ( " tb1qzg4mckdh50nwdm9hkzq06528rsu73hjxxzem3e " , address )
2021-11-08 17:41:06 -08:00
cleanupTestDataDir ( testDataDir )
}
2022-03-11 23:35:49 -06:00
@Test
fun sqliteWalletSyncGetBalance ( ) {
2022-03-28 17:17:27 -07:00
val testDataDir = getTestDataDir ( ) + " /bdk-wallet.sqlite "
2022-03-11 23:35:49 -06:00
val databaseConfig = DatabaseConfig . Sqlite ( SqliteDbConfiguration ( testDataDir ) )
2022-04-22 14:50:40 -07:00
val wallet = Wallet ( descriptor , null , Network . TESTNET , databaseConfig )
val blockchain = Blockchain ( blockchainConfig ) ;
wallet . sync ( blockchain , LogProgress ( ) )
2022-03-11 23:35:49 -06:00
val balance = wallet . getBalance ( )
assertTrue ( balance > 0u )
cleanupTestDataDir ( testDataDir )
}
2021-11-08 17:41:06 -08:00
@Test
fun onlineWalletInMemory ( ) {
2022-03-14 15:13:49 -05:00
val database = DatabaseConfig . Memory
2022-02-27 22:40:42 -08:00
val blockchain = BlockchainConfig . Electrum (
2021-11-08 17:41:06 -08:00
ElectrumConfig (
" ssl://electrum.blockstream.info:60002 " ,
null ,
5u ,
null ,
100u
)
)
2022-04-22 14:50:40 -07:00
val wallet = Wallet ( descriptor , null , Network . TESTNET , database )
2021-11-08 17:41:06 -08:00
assertNotNull ( wallet )
val network = wallet . getNetwork ( )
assertEquals ( network , Network . TESTNET )
}
2022-04-22 14:50:40 -07:00
class LogProgress : Progress {
2021-11-08 17:41:06 -08:00
val log : Logger = LoggerFactory . getLogger ( JvmLibTest :: class . java )
override fun update ( progress : Float , message : String ? ) {
log . debug ( " Syncing... " )
}
}
@Test
fun onlineWalletSyncGetBalance ( ) {
2022-04-22 14:50:40 -07:00
val wallet = Wallet ( descriptor , null , Network . TESTNET , databaseConfig )
2022-06-14 16:31:10 -03:00
val blockchain = Blockchain ( blockchainConfig )
2022-04-22 14:50:40 -07:00
wallet . sync ( blockchain , LogProgress ( ) )
2021-11-08 17:41:06 -08:00
val balance = wallet . getBalance ( )
assertTrue ( balance > 0u )
}
2021-11-06 05:26:56 +05:30
2022-02-27 22:40:42 -08:00
@Test
fun validPsbtSerde ( ) {
2022-03-28 17:20:30 -07:00
val validSerializedPsbt =
" cHNidP8BAHUCAAAAASaBcTce3/KF6Tet7qSze3gADAVmy7OtZGQXE8pCFxv2AAAAAAD+////AtPf9QUAAAAAGXapFNDFmQPFusKGh2DpD9UhpGZap2UgiKwA4fUFAAAAABepFDVF5uM7gyxHBQ8k0+65PJwDlIvHh7MuEwAAAQD9pQEBAAAAAAECiaPHHqtNIOA3G7ukzGmPopXJRjr6Ljl/hTPMti+VZ+UBAAAAFxYAFL4Y0VKpsBIDna89p95PUzSe7LmF/////4b4qkOnHf8USIk6UwpyN+9rRgi7st0tAXHmOuxqSJC0AQAAABcWABT+Pp7xp0XpdNkCxDVZQ6vLNL1TU/////8CAMLrCwAAAAAZdqkUhc/xCX/Z4Ai7NK9wnGIZeziXikiIrHL++E4sAAAAF6kUM5cluiHv1irHU6m80GfWx6ajnQWHAkcwRAIgJxK+IuAnDzlPVoMR3HyppolwuAJf3TskAinwf4pfOiQCIAGLONfc0xTnNMkna9b7QPZzMlvEuqFEyADS8vAtsnZcASED0uFWdJQbrUqZY3LLh+GFbTZSYG2YVi/jnF6efkE/IQUCSDBFAiEA0SuFLYXc2WHS9fSrZgZU327tzHlMDDPOXMMJ/7X85Y0CIGczio4OFyXBl/saiK9Z9R5E5CVbIBZ8hoQDHAXR8lkqASECI7cr7vCWXRC+B3jv7NYfysb3mk6haTkzgHNEZPhPKrMAAAAAAAAA "
val psbt = PartiallySignedBitcoinTransaction ( validSerializedPsbt )
2022-02-27 22:40:42 -08:00
val psbtSerialized = psbt . serialize ( )
assertEquals ( psbtSerialized , validSerializedPsbt )
}
2022-05-12 14:46:03 -07:00
// TODO move tx_builder tests to bdk-ffi, especially this one
// @Test
// fun walletTxBuilderBroadcast() {
// val descriptor =
// "wpkh([c1ed86ca/84'/1'/0'/0]tprv8hTkxK6QT7fCQx1wbuHuwbNh4STr2Ruz8RwEX7ymk6qnpixtbRG4T99mHxJwKTHPuKQ61heWrrpxZ8jpHj4sbisrQhDxnyx3HoQEZebtraN/*)"
// val wallet = Wallet(descriptor, null, Network.TESTNET, databaseConfig)
// val blockchain = Blockchain(blockchainConfig);
// wallet.sync(blockchain, LogProgress())
// val balance = wallet.getBalance()
// if (balance > 2000u) {
// println("balance $balance")
// // send coins back to https://bitcoinfaucet.uo1.net
// val faucetAddress = "tb1ql7w62elx9ucw4pj5lgw4l028hmuw80sndtntxt"
// val txBuilder = TxBuilder().addRecipient(faucetAddress, 1000u).feeRate(1.2f)
// val psbt = txBuilder.finish(wallet)
// wallet.sign(psbt)
// blockchain.broadcast(psbt)
// val txid = psbt.txid()
// println("https://mempool.space/testnet/tx/$txid")
// assertNotNull(txid)
// } else {
// val depositAddress = wallet.getLastUnusedAddress()
// fail("Send more testnet coins to: $depositAddress")
// }
// }
2022-03-28 17:20:30 -07:00
@Test ( expected = BdkException . Generic :: class )
fun walletTxBuilderInvalidAddress ( ) {
val descriptor =
" wpkh([c1ed86ca/84'/1'/0'/0]tprv8hTkxK6QT7fCQx1wbuHuwbNh4STr2Ruz8RwEX7ymk6qnpixtbRG4T99mHxJwKTHPuKQ61heWrrpxZ8jpHj4sbisrQhDxnyx3HoQEZebtraN/*) "
2022-04-22 14:50:40 -07:00
val wallet = Wallet ( descriptor , null , Network . TESTNET , databaseConfig )
2022-03-28 17:20:30 -07:00
val txBuilder = TxBuilder ( ) . addRecipient ( " INVALID_ADDRESS " , 1000u ) . feeRate ( 1.2f )
2022-05-12 14:46:03 -07:00
txBuilder . finish ( wallet )
2022-03-28 17:20:30 -07:00
}
2022-06-14 16:31:10 -03:00
// Comment this test in for local testing, you will need let it fail ones to get an address
// to pre-fund the test wallet before the test will pass.
// @Test
// fun walletTxBuilderDrainWallet() {
// val descriptor = "wpkh([8da6afbe/84'/1'/0'/0]tprv8hY7jbMbe17EH1cLw2feTyNDYvjcFYauLmbneBqVnDERBrV51LrxWjCYRZwWS5keYn3ijb7iHJuEzXQk7EzgPeKRBVNBgC4oFPDxGND5S3V/*)"
// val wallet = Wallet(descriptor, null, Network.TESTNET, databaseConfig)
// val blockchain = Blockchain(blockchainConfig)
// wallet.sync(blockchain, LogProgress())
// val balance = wallet.getBalance()
// if (balance > 2000u) {
// println("balance $balance")
// // send all coins back to https://bitcoinfaucet.uo1.net
// val faucetAddress = "tb1ql7w62elx9ucw4pj5lgw4l028hmuw80sndtntxt"
// val txBuilder = TxBuilder().drainWallet().drainTo(faucetAddress).feeRate(1.1f)
// val psbt = txBuilder.finish(wallet)
// wallet.sign(psbt)
// val txid = blockchain.broadcast(psbt)
// println("https://mempool.space/testnet/tx/$txid")
// assertNotNull(txid)
// } else {
// val depositAddress = wallet.getAddress(AddressIndex.LAST_UNUSED).address
// fail("Send more testnet coins to: $depositAddress")
// }
// }
2021-11-06 05:26:56 +05:30
}