Return results as opaque structs from ffi calls
This commit is contained in:
@@ -6,9 +6,9 @@ plugins {
|
||||
|
||||
test {
|
||||
environment "LD_LIBRARY_PATH", file("${projectDir}/libs/x86_64_linux").absolutePath
|
||||
// testLogging {
|
||||
// events "PASSED", "SKIPPED", "FAILED", "STANDARD_OUT", "STANDARD_ERROR"
|
||||
// }
|
||||
testLogging {
|
||||
events "PASSED", "SKIPPED", "FAILED", "STANDARD_OUT", "STANDARD_ERROR"
|
||||
}
|
||||
}
|
||||
|
||||
//task buildRust(type: Exec) {
|
||||
|
||||
@@ -4,32 +4,71 @@ import com.sun.jna.*
|
||||
|
||||
interface Lib : Library {
|
||||
|
||||
// typedef struct WalletPtr WalletPtr_t;
|
||||
class WalletPtr_t : PointerType {
|
||||
constructor(): super()
|
||||
constructor(pointer: Pointer): super(pointer)
|
||||
// typedef struct VoidResult VoidResult_t;
|
||||
class VoidResult_t : PointerType {
|
||||
constructor() : super()
|
||||
constructor(pointer: Pointer) : super(pointer)
|
||||
}
|
||||
|
||||
// char * get_void_err (
|
||||
// VoidResult_t const * void_result);
|
||||
fun get_void_err(void_result: VoidResult_t): Pointer?
|
||||
|
||||
// void free_void_result (
|
||||
// VoidResult_t * void_result);
|
||||
fun free_void_result(void_result: VoidResult_t)
|
||||
|
||||
// typedef struct StringResult StringResult_t;
|
||||
class StringResult_t : PointerType {
|
||||
constructor() : super()
|
||||
constructor(pointer: Pointer) : super(pointer)
|
||||
}
|
||||
|
||||
// char * get_string_ok (
|
||||
// StringResult_t const * string_result);
|
||||
fun get_string_ok(string_result: StringResult_t): Pointer?
|
||||
|
||||
// char * get_string_err (
|
||||
// StringResult_t const * string_result);
|
||||
fun get_string_err(string_result: StringResult_t): Pointer?
|
||||
|
||||
// void free_string_result (
|
||||
// StringResult_t * string_result);
|
||||
fun free_string_result(string_result: StringResult_t)
|
||||
|
||||
// void free_string (
|
||||
// char * string);
|
||||
fun free_string(string: Pointer)
|
||||
fun free_string(string: Pointer?)
|
||||
|
||||
// WalletPtr_t * new_wallet (
|
||||
// typedef struct WalletResult WalletResult_t;
|
||||
class WalletResult_t : PointerType {
|
||||
constructor() : super()
|
||||
constructor(pointer: Pointer) : super(pointer)
|
||||
}
|
||||
|
||||
// WalletResult_t * new_wallet_result (
|
||||
// char const * name,
|
||||
// char const * descriptor,
|
||||
// char const * change_descriptor);
|
||||
fun new_wallet(name: String, descriptor: String, changeDescriptor: String?): WalletPtr_t
|
||||
fun new_wallet_result(
|
||||
name: String,
|
||||
descriptor: String,
|
||||
changeDescriptor: String?
|
||||
): WalletResult_t
|
||||
|
||||
// char * get_wallet_err (
|
||||
// WalletResult_t const * wallet_result);
|
||||
// TODO
|
||||
|
||||
// void sync_wallet (
|
||||
// WalletPtr_t * const * wallet);
|
||||
//fun sync_wallet(wallet: WalletPtr_t)
|
||||
fun sync_wallet(wallet: WalletPtr_t)
|
||||
// VoidResult_t * sync_wallet (
|
||||
// WalletResult_t const * wallet_result);
|
||||
fun sync_wallet(wallet_result: WalletResult_t): VoidResult_t
|
||||
|
||||
// char * new_address (
|
||||
// WalletPtr_t * const * wallet);
|
||||
fun new_address(wallet: WalletPtr_t): Pointer
|
||||
// StringResult_t * new_address (
|
||||
// WalletResult_t const * wallet_result);
|
||||
fun new_address(wallet_result: WalletResult_t): StringResult_t
|
||||
|
||||
// void free_wallet (
|
||||
// WalletPtr_t * wallet);
|
||||
fun free_wallet(wallet: WalletPtr_t)
|
||||
// void free_wallet_result (
|
||||
// WalletResult_t * wallet_result);
|
||||
fun free_wallet_result(wallet_result: WalletResult_t)
|
||||
}
|
||||
|
||||
@@ -3,6 +3,8 @@ package org.bitcoindevkit.bdk
|
||||
import com.sun.jna.Native
|
||||
import org.junit.*
|
||||
import org.junit.Assert.assertEquals
|
||||
import kotlin.test.assertNotNull
|
||||
import kotlin.test.assertNull
|
||||
|
||||
/**
|
||||
* Library test, which will execute on linux host.
|
||||
@@ -12,39 +14,56 @@ class LibTest {
|
||||
|
||||
companion object {
|
||||
private val bdkFfi: Lib = Native.load("bdk_ffi", Lib::class.java)
|
||||
private lateinit var wallet: Lib.WalletPtr_t
|
||||
private lateinit var wallet_result: Lib.WalletResult_t
|
||||
|
||||
@BeforeClass
|
||||
@JvmStatic
|
||||
fun create_wallet() {
|
||||
fun new_wallet() {
|
||||
val name = "test_wallet"
|
||||
val desc =
|
||||
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)"
|
||||
val change =
|
||||
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/1/*)"
|
||||
|
||||
wallet = bdkFfi.new_wallet(name, desc, change)
|
||||
println("wallet created")
|
||||
wallet_result = bdkFfi.new_wallet_result(name, desc, change)
|
||||
//println("wallet created")
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
@JvmStatic
|
||||
fun free_wallet() {
|
||||
bdkFfi.free_wallet(wallet)
|
||||
println("wallet freed")
|
||||
bdkFfi.free_wallet_result(wallet_result)
|
||||
//println("wallet freed")
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun wallet_sync_error() {
|
||||
val bad_wallet_result = bdkFfi.new_wallet_result("test", "bad", null)
|
||||
println("wallet result created")
|
||||
val sync_result = bdkFfi.sync_wallet(bad_wallet_result)
|
||||
val sync_err_pointer = bdkFfi.get_void_err(sync_result)
|
||||
assertNotNull(sync_err_pointer)
|
||||
val sync_err = sync_err_pointer.getString(0)
|
||||
println("wallet sync error $sync_err")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun sync() {
|
||||
bdkFfi.sync_wallet(wallet)
|
||||
val sync_result = bdkFfi.sync_wallet(wallet_result)
|
||||
assertNull(bdkFfi.get_void_err(sync_result))
|
||||
bdkFfi.free_void_result(sync_result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun new_newaddress_wallet() {
|
||||
val pointer = bdkFfi.new_address(wallet)
|
||||
val address = pointer.getString(0)
|
||||
bdkFfi.free_string(pointer)
|
||||
val address_result = bdkFfi.new_address(wallet_result)
|
||||
assertNull(bdkFfi.get_string_err(address_result))
|
||||
val address_pointer = bdkFfi.get_string_ok(address_result);
|
||||
val address = address_pointer!!.getString(0)
|
||||
|
||||
bdkFfi.free_string_result(address_result)
|
||||
bdkFfi.free_string(address_pointer)
|
||||
//println("address created from kotlin: $address")
|
||||
assertEquals(address, "tb1qzg4mckdh50nwdm9hkzq06528rsu73hjxxzem3e")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user