diff --git a/bdk-kotlin/android/build.gradle b/bdk-kotlin/android/build.gradle index 8cfcfc3..f3bcdc8 100644 --- a/bdk-kotlin/android/build.gradle +++ b/bdk-kotlin/android/build.gradle @@ -35,7 +35,7 @@ afterEvaluate { // You can then customize attributes of the publication as shown below. groupId = 'org.bitcoindevkit' artifactId = 'bdk' - version = '0.0.1-dev' + version = '0.0.1-SNAPSHOT' } // Creates a Maven publication called “debug”. debug(MavenPublication) { @@ -44,14 +44,14 @@ afterEvaluate { groupId = 'org.bitcoindevkit' artifactId = 'bdk-debug' - version = '0.0.1-dev' + version = '0.0.1-SNAPSHOT' } } } } dependencies { - implementation (project(':jvm')) { + implementation(project(':jvm')) { exclude group: 'net.java.dev.jna', module: 'jna' } @@ -62,7 +62,7 @@ dependencies { api "org.slf4j:slf4j-api:1.7.30" androidTestImplementation 'com.github.tony19:logback-android:2.0.0' - androidTestImplementation (project(':test-fixtures')) { + androidTestImplementation(project(':test-fixtures')) { exclude group: 'net.java.dev.jna', module: 'jna' } androidTestImplementation 'androidx.test.ext:junit:1.1.2' diff --git a/bdk-kotlin/android/src/androidTest/java/org/bitcoindevkit/bdk/AndroidLibTest.kt b/bdk-kotlin/android/src/androidTest/java/org/bitcoindevkit/bdk/AndroidLibTest.kt index 8107e8e..9e1eec0 100644 --- a/bdk-kotlin/android/src/androidTest/java/org/bitcoindevkit/bdk/AndroidLibTest.kt +++ b/bdk-kotlin/android/src/androidTest/java/org/bitcoindevkit/bdk/AndroidLibTest.kt @@ -1,11 +1,11 @@ package org.bitcoindevkit.bdk +import android.app.Application +import android.content.Context.MODE_PRIVATE +import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 - import org.junit.runner.RunWith -import org.junit.Assert.* - /** * Instrumented test, which will execute on an Android device. * @@ -13,5 +13,9 @@ import org.junit.Assert.* */ @RunWith(AndroidJUnit4::class) class AndroidLibTest : LibTest() { + override fun getTestDataDir(): String { + val context = ApplicationProvider.getApplicationContext() + return context.getDir("bdk-test", MODE_PRIVATE).toString() + } } diff --git a/bdk-kotlin/android/src/main/AndroidManifest.xml b/bdk-kotlin/android/src/main/AndroidManifest.xml index 3d47121..2aee369 100644 --- a/bdk-kotlin/android/src/main/AndroidManifest.xml +++ b/bdk-kotlin/android/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="org.bitcoindevkit.bdk"> diff --git a/bdk-kotlin/jvm/build.gradle b/bdk-kotlin/jvm/build.gradle index 2330523..64d2c78 100644 --- a/bdk-kotlin/jvm/build.gradle +++ b/bdk-kotlin/jvm/build.gradle @@ -25,7 +25,7 @@ publishing { maven(MavenPublication) { groupId = 'org.bitcoindevkit' artifactId = 'bdk' - version = '0.0.1-dev' + version = '0.0.1-SNAPSHOT' from components.java } diff --git a/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/DatabaseConfig.kt b/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/DatabaseConfig.kt index 317965b..2f29fcd 100644 --- a/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/DatabaseConfig.kt +++ b/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/DatabaseConfig.kt @@ -19,7 +19,7 @@ class MemoryConfig() : DatabaseConfig() { override val databaseConfigT = libJna.new_memory_config() } -class SledConfig(path: String, treeName:String) : DatabaseConfig() { +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) diff --git a/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/JnaError.kt b/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/JnaError.kt index 598e4a5..32dcd5a 100644 --- a/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/JnaError.kt +++ b/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/JnaError.kt @@ -39,6 +39,6 @@ enum class JnaError { Electrum, // Esplora -// CompactFilters + // CompactFilters Sled, } \ No newline at end of file diff --git a/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/LibJna.kt b/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/LibJna.kt index 6e9d04b..ca50bb7 100644 --- a/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/LibJna.kt +++ b/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/LibJna.kt @@ -116,11 +116,11 @@ interface LibJna : Library { // void free_blockchain_config ( // BlockchainConfig_t * blockchain_config); - fun free_blockchain_config( blockchain_config: BlockchainConfig_t) + 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); @@ -128,5 +128,5 @@ interface LibJna : Library { // void free_database_config ( // DatabaseConfig_t * database_config); - fun free_database_config( database_config: DatabaseConfig_t) + fun free_database_config(database_config: DatabaseConfig_t) } diff --git a/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/ResultBase.kt b/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/ResultBase.kt index eb13cc5..5fcf168 100644 --- a/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/ResultBase.kt +++ b/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/ResultBase.kt @@ -5,33 +5,34 @@ import com.sun.jna.PointerType import org.slf4j.Logger import org.slf4j.LoggerFactory -abstract class ResultBase internal constructor(protected val resultT: PT) : +abstract class ResultBase internal constructor(private val pointerT: PT) : LibBase() { protected open val log: Logger = LoggerFactory.getLogger(ResultBase::class.java) - protected abstract fun err(): Pointer? + protected abstract fun err(pointerT: PT): Pointer? - protected abstract fun ok(): RT + protected abstract fun ok(pointerT: PT): RT - protected abstract fun free(pointer: PT) + protected abstract fun free(pointerT: PT) - private fun checkErr() { - val errPointer = err() + private fun checkErr(pointerT: PT) { + val errPointer = err(pointerT) val err = errPointer?.getString(0) libJna.free_string(errPointer) if (err != null) { + log.error("JnaError: $err") throw JnaException(JnaError.valueOf(err)) } } fun value(): RT { - checkErr() - return ok() + checkErr(pointerT) + return ok(pointerT) } protected fun finalize() { - free(resultT) - log.debug("$resultT freed") + free(pointerT) + log.debug("$pointerT freed") } } \ No newline at end of file diff --git a/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/StringResult.kt b/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/StringResult.kt index b062f36..6bfa121 100644 --- a/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/StringResult.kt +++ b/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/StringResult.kt @@ -9,18 +9,18 @@ class StringResult internal constructor(stringResultT: LibJna.StringResult_t) : override val log: Logger = LoggerFactory.getLogger(StringResult::class.java) - override fun err(): Pointer? { - return libJna.get_string_err(resultT) + override fun err(pointerT: LibJna.StringResult_t): Pointer? { + return libJna.get_string_err(pointerT) } - override fun ok(): String { - val okPointer = libJna.get_string_ok(resultT) + override fun ok(pointerT: LibJna.StringResult_t): String { + val okPointer = libJna.get_string_ok(pointerT) val ok = okPointer!!.getString(0) libJna.free_string(okPointer) return ok } - override fun free(pointer: LibJna.StringResult_t) { - libJna.free_string_result(resultT) + override fun free(pointerT: LibJna.StringResult_t) { + libJna.free_string_result(pointerT) } } \ No newline at end of file diff --git a/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/VoidResult.kt b/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/VoidResult.kt index 3f4cb5f..5ed6c25 100644 --- a/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/VoidResult.kt +++ b/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/VoidResult.kt @@ -9,15 +9,15 @@ class VoidResult internal constructor(voidResultT: LibJna.VoidResult_t) : override val log: Logger = LoggerFactory.getLogger(VoidResult::class.java) - override fun err(): Pointer? { - return libJna.get_void_err(resultT) + override fun err(pointerT: LibJna.VoidResult_t): Pointer? { + return libJna.get_void_err(pointerT) } - override fun ok() { + override fun ok(pointerT: LibJna.VoidResult_t) { // Void } - override fun free(pointer: LibJna.VoidResult_t) { - libJna.free_void_result(resultT) + override fun free(pointerT: LibJna.VoidResult_t) { + libJna.free_void_result(pointerT) } } \ No newline at end of file diff --git a/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/Wallet.kt b/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/Wallet.kt index e2a8e12..d438778 100644 --- a/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/Wallet.kt +++ b/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/Wallet.kt @@ -13,7 +13,14 @@ class Wallet constructor( val log: Logger = LoggerFactory.getLogger(Wallet::class.java) private val walletResult = - WalletResult(libJna.new_wallet_result(descriptor, changeDescriptor, blockchainConfig.blockchainConfigT, databaseConfig.databaseConfigT)) + WalletResult( + libJna.new_wallet_result( + descriptor, + changeDescriptor, + blockchainConfig.blockchainConfigT, + databaseConfig.databaseConfigT + ) + ) private val walletRefT = walletResult.value() fun sync() { @@ -26,7 +33,7 @@ class Wallet constructor( return stringResult.value() } - protected fun finalize(pointer: LibJna.WalletResult_t) { + protected fun finalize(walletRefT: LibJna.WalletRef_t) { libJna.free_wallet_ref(walletRefT) log.debug("$walletRefT freed") } diff --git a/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/WalletResult.kt b/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/WalletResult.kt index 46b7be7..1b77cb8 100644 --- a/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/WalletResult.kt +++ b/bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/WalletResult.kt @@ -9,15 +9,15 @@ class WalletResult internal constructor(walletResultT: LibJna.WalletResult_t) : override val log: Logger = LoggerFactory.getLogger(WalletResult::class.java) - override fun err(): Pointer? { - return libJna.get_wallet_err(resultT) + override fun err(pointerT: LibJna.WalletResult_t): Pointer? { + return libJna.get_wallet_err(pointerT) } - override fun ok(): LibJna.WalletRef_t { - return libJna.get_wallet_ok(resultT)!! + override fun ok(pointerT: LibJna.WalletResult_t): LibJna.WalletRef_t { + return libJna.get_wallet_ok(pointerT)!! } - override fun free(pointer: LibJna.WalletResult_t) { - libJna.free_wallet_result(resultT) + override fun free(pointerT: LibJna.WalletResult_t) { + libJna.free_wallet_result(pointerT) } } \ No newline at end of file diff --git a/bdk-kotlin/jvm/src/test/java/org/bitcoindevkit/bdk/JvmLibTest.kt b/bdk-kotlin/jvm/src/test/java/org/bitcoindevkit/bdk/JvmLibTest.kt index 8f97dfd..ddb4fb7 100644 --- a/bdk-kotlin/jvm/src/test/java/org/bitcoindevkit/bdk/JvmLibTest.kt +++ b/bdk-kotlin/jvm/src/test/java/org/bitcoindevkit/bdk/JvmLibTest.kt @@ -1,9 +1,16 @@ package org.bitcoindevkit.bdk +import java.nio.file.Paths + /** * Library test, which will execute on linux host. * */ class JvmLibTest : LibTest() { + override fun getTestDataDir(): String { + //return Files.createTempDirectory("bdk-test").toString() + return Paths.get(System.getProperty("java.io.tmpdir"), "bdk-test").toString() + } + } diff --git a/bdk-kotlin/settings.gradle b/bdk-kotlin/settings.gradle index d38f719..b44156b 100644 --- a/bdk-kotlin/settings.gradle +++ b/bdk-kotlin/settings.gradle @@ -1,3 +1,3 @@ rootProject.name = 'bdk-kotlin' -include ':jvm',':android',':test-fixtures' \ No newline at end of file +include ':jvm', ':android', ':test-fixtures' \ No newline at end of file diff --git a/bdk-kotlin/test-fixtures/build.gradle b/bdk-kotlin/test-fixtures/build.gradle index 6f80396..2853edb 100644 --- a/bdk-kotlin/test-fixtures/build.gradle +++ b/bdk-kotlin/test-fixtures/build.gradle @@ -7,7 +7,7 @@ dependencies { implementation platform('org.jetbrains.kotlin:kotlin-bom') implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "net.java.dev.jna:jna:5.8.0" - implementation (project(':jvm')) + implementation(project(':jvm')) implementation "junit:junit:4.13.2" //implementation "org.mockito.kotlin:mockito-kotlin:3.2.0" api "org.slf4j:slf4j-api:1.7.30" diff --git a/bdk-kotlin/test-fixtures/src/main/java/org/bitcoindevkit/bdk/LibTest.kt b/bdk-kotlin/test-fixtures/src/main/java/org/bitcoindevkit/bdk/LibTest.kt index 60d02de..3d0c5a0 100644 --- a/bdk-kotlin/test-fixtures/src/main/java/org/bitcoindevkit/bdk/LibTest.kt +++ b/bdk-kotlin/test-fixtures/src/main/java/org/bitcoindevkit/bdk/LibTest.kt @@ -1,14 +1,13 @@ package org.bitcoindevkit.bdk -import org.junit.* import org.junit.Assert.* +import org.junit.Test import org.slf4j.Logger import org.slf4j.LoggerFactory -import javax.management.Descriptor +import java.io.File /** - * Library test, which will execute on linux host. - * + * Library tests which will execute for jvm and android modules. */ abstract class LibTest : LibBase() { @@ -20,6 +19,12 @@ abstract class LibTest : LibBase() { val change = "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/1/*)" + abstract fun getTestDataDir(): String + + fun cleanupTestDataDir() { + File(getTestDataDir()).deleteRecursively() + } + @Test fun walletResultError() { val blockchainConfig = ElectrumConfig("ssl://electrum.blockstream.info:60002", null, 5, 30) @@ -46,10 +51,13 @@ abstract class LibTest : LibBase() { @Test fun walletSync() { val blockchainConfig = ElectrumConfig("ssl://electrum.blockstream.info:60002", null, 5, 30) - val databaseConfig = MemoryConfig() + val testDataDir = getTestDataDir() + log.debug("testDataDir = $testDataDir") + val databaseConfig = SledConfig(testDataDir, "steve-test") val wallet = Wallet(desc, change, blockchainConfig, databaseConfig) assertNotNull(wallet) wallet.sync() + cleanupTestDataDir() } @Test diff --git a/src/wallet.rs b/src/wallet.rs index 93ea73c..454f547 100644 --- a/src/wallet.rs +++ b/src/wallet.rs @@ -1,3 +1,5 @@ +use crate::blockchain::BlockchainConfig; +use crate::database::DatabaseConfig; use crate::error::get_name; use ::safer_ffi::prelude::*; use bdk::bitcoin::network::constants::Network::Testnet; @@ -10,8 +12,6 @@ use bdk::wallet::AddressIndex::New; use bdk::{Error, Wallet}; use safer_ffi::boxed::Box; use safer_ffi::char_p::{char_p_boxed, char_p_ref}; -use crate::blockchain::BlockchainConfig; -use crate::database::DatabaseConfig; #[derive_ReprC] #[ReprC::opaque] @@ -86,11 +86,10 @@ fn new_wallet_result( blockchain_config: &BlockchainConfig, database_config: &DatabaseConfig, ) -> Box { - let descriptor = descriptor.to_string(); let change_descriptor = change_descriptor.map(|s| s.to_string()); let bc_config = &blockchain_config.raw; - let db_config = &database_config.raw; + let db_config = &database_config.raw; let wallet_result = new_wallet(descriptor, change_descriptor, bc_config, db_config); Box::new(WalletResult { raw: wallet_result }) }