mirror of
https://github.com/logos-blockchain/logos-execution-zone.git
synced 2026-08-09 14:33:18 +00:00
feat(integration_tests): added integration tests for wallet ffi
This commit is contained in:
parent
860746dac9
commit
fade3b488a
@ -16,6 +16,7 @@ use std::{
|
|||||||
ffi::{CStr, CString, c_char},
|
ffi::{CStr, CString, c_char},
|
||||||
io::Write as _,
|
io::Write as _,
|
||||||
path::Path,
|
path::Path,
|
||||||
|
str::FromStr as _,
|
||||||
time::Duration,
|
time::Duration,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -30,9 +31,11 @@ use log::info;
|
|||||||
use tempfile::tempdir;
|
use tempfile::tempdir;
|
||||||
use wallet::{account::HumanReadableAccount, program_facades::vault::Vault};
|
use wallet::{account::HumanReadableAccount, program_facades::vault::Vault};
|
||||||
use wallet_ffi::{
|
use wallet_ffi::{
|
||||||
FfiAccount, FfiAccountIdentity, FfiAccountList, FfiBytes32, FfiPrivateAccountKeys,
|
FfiAccount, FfiAccountIdWithPrivacy, FfiAccountIdentity, FfiAccountList, FfiBytes32,
|
||||||
FfiProgramId, FfiPublicAccountKey, FfiTransferResult, FfiU128, WalletHandle, error,
|
FfiPrivateAccountKeys, FfiProgramId, FfiPublicAccountKey, FfiTransferResult, FfiU128,
|
||||||
|
WalletHandle, error,
|
||||||
generic_transaction::{FfiProgramWithDependencies, FfiTransactionResult},
|
generic_transaction::{FfiProgramWithDependencies, FfiTransactionResult},
|
||||||
|
label::{AccountIdResolvedFromLabel, LabelAvailability, LabelList},
|
||||||
wallet::FfiCreateWalletOutput,
|
wallet::FfiCreateWalletOutput,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -257,6 +260,29 @@ unsafe extern "C" {
|
|||||||
fn wallet_ffi_free_transaction_result(result: *mut FfiTransactionResult);
|
fn wallet_ffi_free_transaction_result(result: *mut FfiTransactionResult);
|
||||||
|
|
||||||
fn wallet_ffi_free_account_identity(account_identity: *mut FfiAccountIdentity);
|
fn wallet_ffi_free_account_identity(account_identity: *mut FfiAccountIdentity);
|
||||||
|
|
||||||
|
fn wallet_ffi_check_label_available(
|
||||||
|
handle: *mut WalletHandle,
|
||||||
|
label: *const c_char,
|
||||||
|
) -> LabelAvailability;
|
||||||
|
|
||||||
|
fn wallet_ffi_add_label(
|
||||||
|
handle: *mut WalletHandle,
|
||||||
|
label: *const c_char,
|
||||||
|
account_id_with_privacy: FfiAccountIdWithPrivacy,
|
||||||
|
) -> error::WalletFfiError;
|
||||||
|
|
||||||
|
fn wallet_ffi_resolve_label(
|
||||||
|
handle: *mut WalletHandle,
|
||||||
|
label: *const c_char,
|
||||||
|
) -> AccountIdResolvedFromLabel;
|
||||||
|
|
||||||
|
fn wallet_ffi_get_all_labels_for_account(
|
||||||
|
handle: *mut WalletHandle,
|
||||||
|
account_id_with_privacy: FfiAccountIdWithPrivacy,
|
||||||
|
) -> LabelList;
|
||||||
|
|
||||||
|
fn wallet_ffi_free_label_list(label_list: *mut LabelList) -> error::WalletFfiError;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn new_wallet_ffi_with_test_context_config(
|
fn new_wallet_ffi_with_test_context_config(
|
||||||
@ -1926,3 +1952,125 @@ fn test_wallet_ffi_vault_balance_and_claim_private() -> Result<()> {
|
|||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_wallet_ffi_single_label() -> Result<()> {
|
||||||
|
let ctx = BlockingTestContext::new()?;
|
||||||
|
let home = tempfile::tempdir()?;
|
||||||
|
let FfiCreateWalletOutput {
|
||||||
|
wallet: wallet_ffi_handle,
|
||||||
|
mnemonic: _,
|
||||||
|
} = new_wallet_ffi_with_test_context_config(&ctx, home.path())?;
|
||||||
|
|
||||||
|
let mut out_account_id_1 = FfiBytes32::from_bytes([0; 32]);
|
||||||
|
unsafe {
|
||||||
|
wallet_ffi_create_account_public(wallet_ffi_handle, &raw mut out_account_id_1).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
info!("Waiting for next block creation");
|
||||||
|
std::thread::sleep(Duration::from_secs(TIME_TO_WAIT_FOR_BLOCK_SECONDS));
|
||||||
|
|
||||||
|
let lab_1 = CString::from_str("LABEL1").unwrap().into_raw();
|
||||||
|
|
||||||
|
let lab_1_availability = unsafe { wallet_ffi_check_label_available(wallet_ffi_handle, lab_1) };
|
||||||
|
|
||||||
|
assert_eq!(lab_1_availability.error, error::WalletFfiError::Success);
|
||||||
|
assert!(lab_1_availability.is_available);
|
||||||
|
|
||||||
|
let acc_1_id_with_privacy = FfiAccountIdWithPrivacy {
|
||||||
|
account_id: out_account_id_1,
|
||||||
|
is_private: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
let err = unsafe { wallet_ffi_add_label(wallet_ffi_handle, lab_1, acc_1_id_with_privacy) };
|
||||||
|
|
||||||
|
assert_eq!(err, error::WalletFfiError::Success);
|
||||||
|
|
||||||
|
let lab_1_availability = unsafe { wallet_ffi_check_label_available(wallet_ffi_handle, lab_1) };
|
||||||
|
|
||||||
|
assert!(!lab_1_availability.is_available);
|
||||||
|
|
||||||
|
let acc_resolved = unsafe { wallet_ffi_resolve_label(wallet_ffi_handle, lab_1) };
|
||||||
|
|
||||||
|
assert_eq!(acc_resolved.account_id, acc_1_id_with_privacy);
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
wallet_ffi_free_string(lab_1);
|
||||||
|
wallet_ffi_destroy(wallet_ffi_handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_wallet_ffi_more_labels() -> Result<()> {
|
||||||
|
let ctx = BlockingTestContext::new()?;
|
||||||
|
let home = tempfile::tempdir()?;
|
||||||
|
let FfiCreateWalletOutput {
|
||||||
|
wallet: wallet_ffi_handle,
|
||||||
|
mnemonic: _,
|
||||||
|
} = new_wallet_ffi_with_test_context_config(&ctx, home.path())?;
|
||||||
|
|
||||||
|
let mut out_account_id_1 = FfiBytes32::from_bytes([0; 32]);
|
||||||
|
unsafe {
|
||||||
|
wallet_ffi_create_account_public(wallet_ffi_handle, &raw mut out_account_id_1).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
info!("Waiting for next block creation");
|
||||||
|
std::thread::sleep(Duration::from_secs(TIME_TO_WAIT_FOR_BLOCK_SECONDS));
|
||||||
|
|
||||||
|
let lab_1 = CString::from_str("LABEL1").unwrap().into_raw();
|
||||||
|
let lab_2 = CString::from_str("LABEL2").unwrap().into_raw();
|
||||||
|
let lab_3 = CString::from_str("LABEL3").unwrap().into_raw();
|
||||||
|
|
||||||
|
let acc_1_id_with_privacy = FfiAccountIdWithPrivacy {
|
||||||
|
account_id: out_account_id_1,
|
||||||
|
is_private: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
let err = unsafe { wallet_ffi_add_label(wallet_ffi_handle, lab_1, acc_1_id_with_privacy) };
|
||||||
|
|
||||||
|
assert_eq!(err, error::WalletFfiError::Success);
|
||||||
|
|
||||||
|
let err = unsafe { wallet_ffi_add_label(wallet_ffi_handle, lab_2, acc_1_id_with_privacy) };
|
||||||
|
|
||||||
|
assert_eq!(err, error::WalletFfiError::Success);
|
||||||
|
|
||||||
|
let err = unsafe { wallet_ffi_add_label(wallet_ffi_handle, lab_3, acc_1_id_with_privacy) };
|
||||||
|
|
||||||
|
assert_eq!(err, error::WalletFfiError::Success);
|
||||||
|
|
||||||
|
let mut label_list_for_out_acc =
|
||||||
|
unsafe { wallet_ffi_get_all_labels_for_account(wallet_ffi_handle, acc_1_id_with_privacy) };
|
||||||
|
|
||||||
|
assert_eq!(label_list_for_out_acc.error, error::WalletFfiError::Success);
|
||||||
|
assert_eq!(label_list_for_out_acc.labels_size, 3);
|
||||||
|
|
||||||
|
let lab_ref_1 = unsafe { &*label_list_for_out_acc.labels_data.add(0) };
|
||||||
|
let lab_ref_c_str_1 = unsafe { CStr::from_ptr(*lab_ref_1) };
|
||||||
|
|
||||||
|
assert_eq!(lab_ref_c_str_1.to_str().unwrap(), "LABEL1");
|
||||||
|
|
||||||
|
let lab_ref_2 = unsafe { &*label_list_for_out_acc.labels_data.add(1) };
|
||||||
|
let lab_ref_c_str_2 = unsafe { CStr::from_ptr(*lab_ref_2) };
|
||||||
|
|
||||||
|
assert_eq!(lab_ref_c_str_2.to_str().unwrap(), "LABEL2");
|
||||||
|
|
||||||
|
let lab_ref_3 = unsafe { &*label_list_for_out_acc.labels_data.add(2) };
|
||||||
|
let lab_ref_c_str_3 = unsafe { CStr::from_ptr(*lab_ref_3) };
|
||||||
|
|
||||||
|
assert_eq!(lab_ref_c_str_3.to_str().unwrap(), "LABEL3");
|
||||||
|
|
||||||
|
let err = unsafe { wallet_ffi_free_label_list(&raw mut label_list_for_out_acc) };
|
||||||
|
|
||||||
|
assert_eq!(err, error::WalletFfiError::Success);
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
wallet_ffi_free_string(lab_1);
|
||||||
|
wallet_ffi_free_string(lab_2);
|
||||||
|
wallet_ffi_free_string(lab_3);
|
||||||
|
wallet_ffi_destroy(wallet_ffi_handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|||||||
@ -12,8 +12,8 @@ use crate::{
|
|||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct LabelAvailability {
|
pub struct LabelAvailability {
|
||||||
is_available: bool,
|
pub is_available: bool,
|
||||||
error: WalletFfiError,
|
pub error: WalletFfiError,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LabelAvailability {
|
impl LabelAvailability {
|
||||||
@ -35,9 +35,10 @@ impl LabelAvailability {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
pub struct AccountIdResolvedFromLabel {
|
pub struct AccountIdResolvedFromLabel {
|
||||||
account_id: FfiAccountIdWithPrivacy,
|
pub account_id: FfiAccountIdWithPrivacy,
|
||||||
error: WalletFfiError,
|
pub error: WalletFfiError,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AccountIdResolvedFromLabel {
|
impl AccountIdResolvedFromLabel {
|
||||||
@ -60,9 +61,9 @@ impl AccountIdResolvedFromLabel {
|
|||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct LabelList {
|
pub struct LabelList {
|
||||||
labels_data: *mut *const c_char,
|
pub labels_data: *mut *const c_char,
|
||||||
labels_size: usize,
|
pub labels_size: usize,
|
||||||
error: WalletFfiError,
|
pub error: WalletFfiError,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LabelList {
|
impl LabelList {
|
||||||
|
|||||||
@ -24,7 +24,7 @@ pub struct WalletHandle {
|
|||||||
|
|
||||||
/// 32-byte array type for `AccountId`, keys, hashes, etc.
|
/// 32-byte array type for `AccountId`, keys, hashes, etc.
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Clone, Copy, Default)]
|
#[derive(Clone, Copy, Default, Debug, PartialEq, Eq)]
|
||||||
pub struct FfiBytes32 {
|
pub struct FfiBytes32 {
|
||||||
pub data: [u8; 32],
|
pub data: [u8; 32],
|
||||||
}
|
}
|
||||||
@ -594,7 +594,7 @@ impl From<FfiProgramId> for ProgramId {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Default)]
|
#[derive(Default, PartialEq, Eq, Debug, Clone, Copy)]
|
||||||
pub struct FfiAccountIdWithPrivacy {
|
pub struct FfiAccountIdWithPrivacy {
|
||||||
pub account_id: FfiBytes32,
|
pub account_id: FfiBytes32,
|
||||||
pub is_private: bool,
|
pub is_private: bool,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user