Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/tests-rs-wallet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,7 @@ jobs:
--package platform-wallet-ffi \
--package rs-unified-sdk-ffi \
--package rs-unified-sdk-jni \
--all-targets \
--all-features \
--locked \
-- --no-deps -D warnings
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/tests-rs-workspace.yml
Original file line number Diff line number Diff line change
Expand Up @@ -176,10 +176,14 @@ jobs:
- name: Verify wallet reverse-dependency closure
run: python3 .github/scripts/check-wallet-closure.py

# `--all-targets` keeps test/bench/example code in scope. Without it
# clippy only sees the lib/bin targets, so lints in `#[cfg(test)]` code
# merge unnoticed and only surface for whoever runs clippy locally.
- name: Clippy lints
run: |
cargo clippy \
--workspace \
--all-targets \
--all-features \
--locked \
-- --no-deps -D warnings
Expand Down
2 changes: 1 addition & 1 deletion packages/rs-platform-wallet-ffi/src/core_wallet_types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1982,7 +1982,7 @@ mod tests {
"ProRegTx carries a 48-byte operator BLS key"
);
assert!(
mn.payout_script.as_ref().map_or(false, |s| !s.is_empty()),
mn.payout_script.as_ref().is_some_and(|s| !s.is_empty()),
"ProRegTx carries a payout script"
);
assert!(
Expand Down
78 changes: 47 additions & 31 deletions packages/rs-platform-wallet-ffi/src/persistence.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5936,33 +5936,41 @@ mod tests {
/// callback without its registration callback must not attest pools.
#[test]
fn partially_wired_persister_attests_only_complete_pairs() {
let mut cb = PersistenceCallbacks::default();
cb.on_changeset_begin_fn = Some(noop_begin);
let cb = PersistenceCallbacks {
on_changeset_begin_fn: Some(noop_begin),
..Default::default()
};
assert_eq!(
declared_persister(cb, PersistenceCapabilities::ATOMIC_CHANGESETS)
.persistence_capabilities(),
PersistenceCapabilities::NONE
);

let mut cb = PersistenceCallbacks::default();
cb.on_changeset_begin_fn = Some(noop_begin);
cb.on_changeset_end_fn = Some(noop_end);
let cb = PersistenceCallbacks {
on_changeset_begin_fn: Some(noop_begin),
on_changeset_end_fn: Some(noop_end),
..Default::default()
};
let capabilities = declared_persister(cb, PersistenceCapabilities::ATOMIC_CHANGESETS)
.persistence_capabilities();
assert_eq!(capabilities, PersistenceCapabilities::ATOMIC_CHANGESETS);
assert!(!capabilities.contains(PersistenceCapabilities::INVITATION_CREATION));

let mut cb = PersistenceCallbacks::default();
let declaration = PersistenceCapabilities::INVITATIONS
.union(PersistenceCapabilities::ASSET_LOCK_FUNDING_INDICES);
cb.on_persist_invitations_fn = Some(noop_invitations);
cb.on_persist_account_address_pools_fn = Some(noop_pools);
let cb = PersistenceCallbacks {
on_persist_invitations_fn: Some(noop_invitations),
on_persist_account_address_pools_fn: Some(noop_pools),
..Default::default()
};
let capabilities = declared_persister(cb, declaration).persistence_capabilities();
assert_eq!(capabilities, PersistenceCapabilities::INVITATIONS);

let mut cb = PersistenceCallbacks::default();
cb.on_persist_account_registrations_fn = Some(noop_registrations);
cb.on_persist_account_address_pools_fn = Some(noop_pools);
let cb = PersistenceCallbacks {
on_persist_account_registrations_fn: Some(noop_registrations),
on_persist_account_address_pools_fn: Some(noop_pools),
..Default::default()
};
let capabilities =
declared_persister(cb, PersistenceCapabilities::ASSET_LOCK_FUNDING_INDICES)
.persistence_capabilities();
Expand Down Expand Up @@ -6003,14 +6011,16 @@ mod tests {

#[test]
fn complete_callbacks_without_declaration_attest_nothing() {
let mut cb = PersistenceCallbacks::default();
cb.on_changeset_begin_fn = Some(noop_begin);
cb.on_changeset_end_fn = Some(noop_end);
cb.on_persist_invitations_fn = Some(noop_invitations);
cb.on_persist_account_registrations_fn = Some(noop_registrations);
cb.on_persist_account_address_pools_fn = Some(noop_pools);
cb.on_load_wallet_list_fn = Some(noop_load_wallets);
cb.on_load_wallet_list_free_fn = Some(noop_free_wallets);
let cb = PersistenceCallbacks {
on_changeset_begin_fn: Some(noop_begin),
on_changeset_end_fn: Some(noop_end),
on_persist_invitations_fn: Some(noop_invitations),
on_persist_account_registrations_fn: Some(noop_registrations),
on_persist_account_address_pools_fn: Some(noop_pools),
on_load_wallet_list_fn: Some(noop_load_wallets),
on_load_wallet_list_free_fn: Some(noop_free_wallets),
..Default::default()
};
assert_eq!(
FFIPersister::new(cb).persistence_capabilities(),
PersistenceCapabilities::NONE
Expand All @@ -6019,9 +6029,11 @@ mod tests {

#[test]
fn declaration_is_intersected_with_callback_structure() {
let mut cb = PersistenceCallbacks::default();
cb.on_changeset_begin_fn = Some(noop_begin);
cb.on_changeset_end_fn = Some(noop_end);
let cb = PersistenceCallbacks {
on_changeset_begin_fn: Some(noop_begin),
on_changeset_end_fn: Some(noop_end),
..Default::default()
};
assert_eq!(
declared_persister(cb, PersistenceCapabilities::INVITATION_CREATION)
.persistence_capabilities(),
Expand Down Expand Up @@ -6274,19 +6286,23 @@ mod tests {
#[cfg(feature = "shielded")]
#[test]
fn shielded_viewing_key_capability_requires_complete_callback_triplet() {
let mut cb = PersistenceCallbacks::default();
cb.on_persist_shielded_viewing_keys_fn = Some(noop_persist_viewing_keys);
cb.on_load_shielded_viewing_keys_fn = Some(noop_load_viewing_keys);
let cb = PersistenceCallbacks {
on_persist_shielded_viewing_keys_fn: Some(noop_persist_viewing_keys),
on_load_shielded_viewing_keys_fn: Some(noop_load_viewing_keys),
..Default::default()
};
assert!(
!declared_persister(cb, PersistenceCapabilities::SHIELDED_VIEWING_KEYS)
.persistence_capabilities()
.contains(PersistenceCapabilities::SHIELDED_VIEWING_KEYS)
);

let mut cb = PersistenceCallbacks::default();
cb.on_persist_shielded_viewing_keys_fn = Some(noop_persist_viewing_keys);
cb.on_load_shielded_viewing_keys_fn = Some(noop_load_viewing_keys);
cb.on_load_shielded_viewing_keys_free_fn = Some(noop_free_viewing_keys);
let cb = PersistenceCallbacks {
on_persist_shielded_viewing_keys_fn: Some(noop_persist_viewing_keys),
on_load_shielded_viewing_keys_fn: Some(noop_load_viewing_keys),
on_load_shielded_viewing_keys_free_fn: Some(noop_free_viewing_keys),
..Default::default()
};
assert!(
declared_persister(cb, PersistenceCapabilities::SHIELDED_VIEWING_KEYS)
.persistence_capabilities()
Expand Down Expand Up @@ -6595,7 +6611,7 @@ mod tests {
assert!(
restored
.highest_generated
.map_or(false, |h| h >= RESTORED_INDEX),
.is_some_and(|h| h >= RESTORED_INDEX),
"highest_generated must advance past the pre-derived gap window"
);

Expand Down Expand Up @@ -6772,7 +6788,7 @@ mod tests {
const ECDSA_IDX: u32 = 502;
for idx in [BLS_IDX, EDDSA_IDX, ECDSA_IDX] {
assert!(
pool.addresses.get(&idx).is_none(),
!pool.addresses.contains_key(&idx),
"index {idx} must start with no pre-seeded entry"
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -582,13 +582,14 @@ mod tests {
timed_out,
PlatformWalletError::FinalityTimeout(actual) if actual == out_point
));
let broadcast = broadcaster
.transactions
.lock()
.expect("recording broadcaster mutex");
assert_eq!(broadcast.as_slice(), std::slice::from_ref(&transaction));
assert_eq!(broadcast[0].txid(), out_point.txid);
drop(broadcast);
{
let broadcast = broadcaster
.transactions
.lock()
.expect("recording broadcaster mutex");
assert_eq!(broadcast.as_slice(), std::slice::from_ref(&transaction));
assert_eq!(broadcast[0].txid(), out_point.txid);
}

// The real consume path leaves a terminal tombstone. That gives a
// same-process retry a truthful typed error, while a foreign outpoint
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ mod masternode_withdrawal_tests {
fn selects_the_matching_owner_hash160_key_over_decoys() {
let owner_hash = [0x11u8; 20];
let other_hash = [0x22u8; 20];
let keys = vec![
let keys = [
// Right hash, wrong purpose.
make_key(
0,
Expand Down Expand Up @@ -271,7 +271,7 @@ mod masternode_withdrawal_tests {
#[test]
fn returns_none_when_no_owner_key_matches() {
let owner_hash = [0x11u8; 20];
let keys = vec![
let keys = [
make_key(
0,
Purpose::TRANSFER,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,25 +165,6 @@ fn bind_known_contract(
Ok((embedded_id, Arc::new(contract)))
}

#[cfg(test)]
mod tests {
use super::*;
use dpp::tests::fixtures::get_data_contract_fixture;

#[test]
fn rejects_known_contract_under_an_alias_identifier() {
let platform_version = PlatformVersion::latest();
let contract = get_data_contract_fixture(None, 0, platform_version.protocol_version)
.data_contract_owned();
let alias = Identifier::new([0x5a; 32]);
assert_ne!(alias, contract.id());

let error = bind_known_contract(alias, contract).expect_err("alias must be rejected");

assert!(error.contains("does not match embedded contract ID"));
}
}

fn convert_proof_result_to_js(
proof_result: &StateTransitionProofResult,
) -> Result<JsValue, JsValue> {
Expand Down Expand Up @@ -269,3 +250,22 @@ fn convert_proof_result_to_js(

Ok(obj.into())
}

#[cfg(test)]
mod tests {
use super::*;
use dpp::tests::fixtures::get_data_contract_fixture;

#[test]
fn rejects_known_contract_under_an_alias_identifier() {
let platform_version = PlatformVersion::latest();
let contract = get_data_contract_fixture(None, 0, platform_version.protocol_version)
.data_contract_owned();
let alias = Identifier::new([0x5a; 32]);
assert_ne!(alias, contract.id());

let error = bind_known_contract(alias, contract).expect_err("alias must be rejected");

assert!(error.contains("does not match embedded contract ID"));
}
}
Loading