Remove unneeded test structs and functions, cleanup tests

This commit is contained in:
Steve Myers 2021-06-10 17:22:33 -07:00
parent 308d4af4f1
commit 333f694d55
3 changed files with 88 additions and 164 deletions

View File

@ -1,65 +1,36 @@
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "bdk_ffi.h"
int main (int argc, char const * const argv[])
{
// test print_string
print_string("hello 123");
// test concat_string
char const * string1 = "string1";
char const * string2 = "string2";
char * string3 = concat_string(string1, string2);
print_string(string3);
free_string(string3);
// verify free_string after free_string fails
////free_string(string3);
// test print_config with c created config
Config_t config1 = { .name = "test", .count = 101 };
print_config(&config1);
// test new_config
Config_t * config2 = new_config("test test", 202);
print_config(config2);
// test free_config
free_config(config2);
// verify print_config after free_config fails (invalid data)
////print_config(config2);
// verify free_config after free_config fails (double free detected, core dumped)
////free_config(config2);
char const * name = "test_wallet";
char const * desc = "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)";
char const * change = "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/1/*)";
//char const * change = NULL;
// test new_wallet
{
WalletPtr_t * wallet = new_wallet(name, desc, change);
assert(wallet != NULL);
// test sync_wallet
sync_wallet(wallet);
printf("after sync_wallet\n");
sync_wallet(wallet);
printf("after sync_wallet\n");
// test new_address
char * address1 = new_address(wallet);
printf("address1: %s\n", address1);
//printf("address1: %s\n", address1);
assert( 0 == strcmp(address1,"tb1qgkhp034fyxeta00h0nne9tzfm0vsxq4prduzxp"));
free_string(address1);
assert(address1 != NULL);
char * address2 = new_address(wallet);
printf("address2: %s\n", address2);
assert(address2 != NULL);
//printf("address2: %s\n", address2);
assert(0 == strcmp(address2,"tb1qd6u9q327sru2ljvwzdtfrdg36sapax7udz97wf"));
free_string(address2);
// test free_wallet
free_wallet(wallet);
printf("after free_wallet\n");
// test free_wallet NULL doesn't crash
free_wallet(NULL);

View File

@ -1,131 +1,6 @@
#![deny(unsafe_code)] /* No `unsafe` needed! */
use ::safer_ffi::prelude::*;
use bdk::bitcoin::network::constants::Network::Testnet;
use bdk::blockchain::{ElectrumBlockchain, log_progress};
use bdk::electrum_client::Client;
use bdk::sled;
use bdk::sled::Tree;
use bdk::Wallet;
use bdk::wallet::AddressIndex::New;
use safer_ffi::char_p::{char_p_ref, char_p_boxed};
use safer_ffi::boxed::Box;
#[ffi_export]
fn print_string (string: char_p_ref)
{
println!("{}", string);
}
/// Concatenate two input UTF-8 (_e.g._, ASCII) strings.
///
/// The returned string must be freed with `rust_free_string`
#[ffi_export]
fn concat_string(fst: char_p_ref, snd: char_p_ref)
-> char_p_boxed
{
let fst = fst.to_str(); // : &'_ str
let snd = snd.to_str(); // : &'_ str
let ccat = format!("{}{}", fst, snd).try_into().unwrap();
ccat
}
/// Frees a Rust-allocated string
#[ffi_export]
fn free_string (string: char_p_boxed)
{
drop(string)
}
/// A `struct` usable from both Rust and C
#[derive_ReprC]
#[repr(C)]
#[derive(Debug, Clone)]
pub struct Config {
name: char_p_boxed,
count: i64
}
/// Debug print a Point
#[ffi_export]
fn print_config(config: &Config) {
println!("{:?}", config);
}
/// Create a new Config
#[ffi_export]
fn new_config(name: char_p_ref, count: i64) -> Box<Config> {
let name = name.to_string().try_into().unwrap();
Box::new(Config { name, count })
}
#[ffi_export]
fn free_config(config: Box<Config>) {
drop(config)
}
#[derive_ReprC]
#[ReprC::opaque]
pub struct WalletPtr {
raw: Wallet<ElectrumBlockchain, Tree>,
}
impl From<Wallet<ElectrumBlockchain, Tree>> for WalletPtr {
fn from(wallet: Wallet<ElectrumBlockchain, Tree>) -> Self {
WalletPtr {
raw: wallet,
}
}
}
#[ffi_export]
fn new_wallet(
name: char_p_ref,
descriptor: char_p_ref,
change_descriptor: Option<char_p_ref>,
) -> Box<WalletPtr> {
let name = name.to_string();
let descriptor = descriptor.to_string();
let change_descriptor = change_descriptor.map(|s| s.to_string());
let database = sled::open("./wallet_db").unwrap();
let tree = database.open_tree(name.clone()).unwrap();
let descriptor: &str = descriptor.as_str();
let change_descriptor: Option<&str> = change_descriptor.as_deref();
let electrum_url = "ssl://electrum.blockstream.info:60002";
let client = Client::new(&electrum_url).unwrap();
let wallet = Wallet::new(
descriptor,
change_descriptor,
Testnet,
tree,
ElectrumBlockchain::from(client),
)
.unwrap();
println!("created wallet");
Box::new(WalletPtr::from(wallet))
}
#[ffi_export]
fn sync_wallet( wallet: &WalletPtr) {
let _r = wallet.raw.sync(log_progress(), Some(100));
}
#[ffi_export]
fn new_address( wallet: &WalletPtr) -> char_p_boxed {
let new_address = wallet.raw.get_address(New);
let new_address = new_address.unwrap();
let new_address = new_address.to_string();
new_address.try_into().unwrap()
}
#[ffi_export]
fn free_wallet( wallet: Option<Box<WalletPtr>>) {
drop(wallet)
}
mod wallet;
/// The following test function is necessary for the header generation.
#[::safer_ffi::cfg_headers]

78
src/wallet.rs Normal file
View File

@ -0,0 +1,78 @@
use ::safer_ffi::prelude::*;
use bdk::bitcoin::network::constants::Network::Testnet;
use bdk::blockchain::{
log_progress, AnyBlockchain, AnyBlockchainConfig, ConfigurableBlockchain,
ElectrumBlockchainConfig,
};
use bdk::database::{AnyDatabase, AnyDatabaseConfig, ConfigurableDatabase};
use bdk::wallet::AddressIndex::New;
use bdk::Wallet;
use safer_ffi::boxed::Box;
use safer_ffi::char_p::{char_p_boxed, char_p_ref};
#[derive_ReprC]
#[ReprC::opaque]
pub struct WalletPtr {
raw: Wallet<AnyBlockchain, AnyDatabase>,
}
impl From<Wallet<AnyBlockchain, AnyDatabase>> for WalletPtr {
fn from(wallet: Wallet<AnyBlockchain, AnyDatabase>) -> Self {
WalletPtr { raw: wallet }
}
}
#[ffi_export]
fn new_wallet(
name: char_p_ref,
descriptor: char_p_ref,
change_descriptor: Option<char_p_ref>,
) -> Box<WalletPtr> {
let network = Testnet;
let _name = name.to_string();
let descriptor = descriptor.to_string();
let change_descriptor = change_descriptor.map(|s| s.to_string());
let electrum_config = AnyBlockchainConfig::Electrum(ElectrumBlockchainConfig {
url: "ssl://electrum.blockstream.info:60002".to_string(),
socks5: None,
retry: 5,
timeout: None,
});
let blockchain_config = electrum_config;
let client = AnyBlockchain::from_config(&blockchain_config).unwrap();
let database_config = AnyDatabaseConfig::Memory(());
let database = AnyDatabase::from_config(&database_config).unwrap();
let descriptor: &str = descriptor.as_str();
let change_descriptor: Option<&str> = change_descriptor.as_deref();
let wallet = Wallet::new(descriptor, change_descriptor, network, database, client).unwrap();
Box::new(WalletPtr::from(wallet))
}
#[ffi_export]
fn sync_wallet(wallet: &WalletPtr) {
let _r = wallet.raw.sync(log_progress(), Some(100));
}
#[ffi_export]
fn new_address(wallet: &WalletPtr) -> char_p_boxed {
let new_address = wallet.raw.get_address(New);
let new_address = new_address.unwrap();
let new_address = new_address.to_string();
new_address.try_into().unwrap()
}
/// Frees a Rust-allocated string
#[ffi_export]
fn free_string(string: char_p_boxed) {
drop(string)
}
#[ffi_export]
fn free_wallet(wallet: Option<Box<WalletPtr>>) {
drop(wallet)
}