Add kotlin BlockchainConfig and DatabaseConfig

This commit is contained in:
Steve Myers
2021-06-25 23:40:38 -07:00
parent 757113c002
commit 1249a4c491
12 changed files with 282 additions and 31 deletions

View File

@@ -0,0 +1,25 @@
package org.bitcoindevkit.bdk
import org.slf4j.Logger
import org.slf4j.LoggerFactory
abstract class BlockchainConfig() : LibBase() {
private val log: Logger = LoggerFactory.getLogger(BlockchainConfig::class.java)
abstract val blockchainConfigT: LibJna.BlockchainConfig_t
protected fun finalize() {
libJna.free_blockchain_config(blockchainConfigT)
log.debug("$blockchainConfigT freed")
}
}
class ElectrumConfig(
url: String,
socks5: String?,
retry: Short,
timeout: Short
) : BlockchainConfig() {
private val log: Logger = LoggerFactory.getLogger(ElectrumConfig::class.java)
override val blockchainConfigT = libJna.new_electrum_config(url, socks5, retry, timeout)
}

View File

@@ -0,0 +1,26 @@
package org.bitcoindevkit.bdk
import org.slf4j.Logger
import org.slf4j.LoggerFactory
abstract class DatabaseConfig() : LibBase() {
private val log: Logger = LoggerFactory.getLogger(DatabaseConfig::class.java)
abstract val databaseConfigT: LibJna.DatabaseConfig_t
protected fun finalize() {
libJna.free_database_config(databaseConfigT)
log.debug("$databaseConfigT freed")
}
}
class MemoryConfig() : DatabaseConfig() {
private val log: Logger = LoggerFactory.getLogger(MemoryConfig::class.java)
override val databaseConfigT = libJna.new_memory_config()
}
class SledConfig(path: String, treeName:String) : DatabaseConfig() {
private val log: Logger = LoggerFactory.getLogger(SledConfig::class.java)
override val databaseConfigT = libJna.new_sled_config(path, treeName)
}

View File

@@ -48,6 +48,18 @@ interface LibJna : Library {
// WalletRef_t * wallet_ref);
fun free_wallet_ref(wallet_ref: WalletRef_t)
// typedef struct BlockchainConfig BlockchainConfig_t;
class BlockchainConfig_t : PointerType {
constructor() : super()
constructor(pointer: Pointer) : super(pointer)
}
// typedef struct DatabaseConfig DatabaseConfig_t;
class DatabaseConfig_t : PointerType {
constructor() : super()
constructor(pointer: Pointer) : super(pointer)
}
// typedef struct WalletResult WalletResult_t;
class WalletResult_t : PointerType {
constructor() : super()
@@ -55,13 +67,15 @@ interface LibJna : Library {
}
// WalletResult_t * new_wallet_result (
// char const * name,
// char const * descriptor,
// char const * change_descriptor);
// char const * change_descriptor,
// BlockchainConfig_t const * blockchain_config,
// DatabaseConfig_t const * database_config);
fun new_wallet_result(
name: String,
descriptor: String,
changeDescriptor: String?
changeDescriptor: String?,
blockchainConfig: BlockchainConfig_t,
databaseConfig: DatabaseConfig_t,
): WalletResult_t
// char * get_wallet_err (
@@ -87,4 +101,32 @@ interface LibJna : Library {
// void free_string (
// char * string);
fun free_string(string: Pointer?)
// BlockchainConfig_t * new_electrum_config (
// char const * url,
// char const * socks5,
// int16_t retry,
// int16_t timeout);
fun new_electrum_config(
url: String,
socks5: String?,
retry: Short,
timeout: Short
): BlockchainConfig_t
// void free_blockchain_config (
// BlockchainConfig_t * blockchain_config);
fun free_blockchain_config( blockchain_config: BlockchainConfig_t)
// DatabaseConfig_t * new_memory_config (void);
fun new_memory_config(): DatabaseConfig_t
// DatabaseConfig_t * new_sled_config (
// char const * path,
// char const * tree_name);
fun new_sled_config(path: String, tree_name: String): DatabaseConfig_t
// void free_database_config (
// DatabaseConfig_t * database_config);
fun free_database_config( database_config: DatabaseConfig_t)
}

View File

@@ -4,15 +4,16 @@ import org.slf4j.Logger
import org.slf4j.LoggerFactory
class Wallet constructor(
name: String,
descriptor: String,
changeDescriptor: String?,
blockchainConfig: BlockchainConfig,
databaseConfig: DatabaseConfig,
) : LibBase() {
val log: Logger = LoggerFactory.getLogger(Wallet::class.java)
private val walletResult =
WalletResult(libJna.new_wallet_result(name, descriptor, changeDescriptor))
WalletResult(libJna.new_wallet_result(descriptor, changeDescriptor, blockchainConfig.blockchainConfigT, databaseConfig.databaseConfigT))
private val walletRefT = walletResult.value()
fun sync() {

View File

@@ -22,17 +22,21 @@ abstract class LibTest : LibBase() {
@Test
fun walletResultError() {
val blockchainConfig = ElectrumConfig("ssl://electrum.blockstream.info:60002", null, 5, 30)
val databaseConfig = MemoryConfig()
val jnaException = assertThrows(JnaException::class.java) {
Wallet("bad", "bad", "bad")
Wallet("bad", "bad", blockchainConfig, databaseConfig)
}
assertEquals(jnaException.err, JnaError.Descriptor)
}
@Test
fun walletResultFinalize() {
val blockchainConfig = ElectrumConfig("ssl://electrum.blockstream.info:60002", null, 5, 30)
val databaseConfig = MemoryConfig()
val names = listOf("one", "two", "three")
names.map {
val wallet = Wallet(it, desc, change)
val wallet = Wallet(desc, change, blockchainConfig, databaseConfig)
assertNotNull(wallet)
}
System.gc()
@@ -41,14 +45,18 @@ abstract class LibTest : LibBase() {
@Test
fun walletSync() {
val wallet = Wallet(name, desc, change)
val blockchainConfig = ElectrumConfig("ssl://electrum.blockstream.info:60002", null, 5, 30)
val databaseConfig = MemoryConfig()
val wallet = Wallet(desc, change, blockchainConfig, databaseConfig)
assertNotNull(wallet)
wallet.sync()
}
@Test
fun walletNewAddress() {
val wallet = Wallet(name, desc, change)
val blockchainConfig = ElectrumConfig("ssl://electrum.blockstream.info:60002", null, 5, 30)
val databaseConfig = MemoryConfig()
val wallet = Wallet(desc, change, blockchainConfig, databaseConfig)
assertNotNull(wallet)
val address = wallet.getAddress()
assertNotNull(address)