Skip to content

Commit 4c7ef1f

Browse files
DCNick36r1d
authored andcommitted
[refactor] #3526: Add signature check condition unit tests
Signed-off-by: Nikita Strygin <dcnick3@users.noreply.github.com>
1 parent c680543 commit 4c7ef1f

File tree

1 file changed

+97
-0
lines changed

1 file changed

+97
-0
lines changed

data_model/src/account.rs

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,3 +362,100 @@ impl SignatureCheckCondition {
362362
pub mod prelude {
363363
pub use super::{Account, AccountId, SignatureCheckCondition};
364364
}
365+
366+
#[cfg(test)]
367+
mod tests {
368+
use iroha_crypto::{KeyPair, PublicKey};
369+
370+
use super::SignatureCheckCondition;
371+
372+
fn make_key() -> PublicKey {
373+
KeyPair::generate().unwrap().public_key().clone()
374+
}
375+
376+
fn check_signature_check_condition(
377+
condition: &SignatureCheckCondition,
378+
account_signatories: &[&PublicKey],
379+
tx_signatories: &[&PublicKey],
380+
result: bool,
381+
) {
382+
let account_signatories = account_signatories.iter().copied().cloned().collect();
383+
let tx_signatories = tx_signatories.iter().copied().cloned().collect();
384+
385+
assert_eq!(
386+
condition.check(&account_signatories, &tx_signatories,).0,
387+
result
388+
);
389+
}
390+
391+
#[test]
392+
fn signature_check_condition_default() {
393+
let key1 = make_key();
394+
let key2 = make_key();
395+
let key3 = make_key();
396+
let condition = SignatureCheckCondition::default();
397+
398+
check_signature_check_condition(&condition, &[], &[], false);
399+
check_signature_check_condition(&condition, &[&key1], &[], false);
400+
check_signature_check_condition(&condition, &[], &[&key1], false);
401+
check_signature_check_condition(&condition, &[&key1], &[&key1], true);
402+
check_signature_check_condition(&condition, &[&key1], &[&key2], false);
403+
check_signature_check_condition(&condition, &[&key1, &key2, &key3], &[&key1], true);
404+
check_signature_check_condition(&condition, &[&key1, &key2, &key3], &[&key2], true);
405+
check_signature_check_condition(&condition, &[&key1, &key2, &key3], &[&key3], true);
406+
}
407+
408+
#[test]
409+
fn signature_check_condition_all() {
410+
let key1 = make_key();
411+
let key2 = make_key();
412+
let key3 = make_key();
413+
let condition = SignatureCheckCondition::all_account_signatures();
414+
415+
// technically, `\forall x \in \emptyset, check(x)` is true for any `check`, so this evaluate to true
416+
// maybe not the logic we want?
417+
check_signature_check_condition(&condition, &[], &[], true);
418+
check_signature_check_condition(&condition, &[], &[&key1], true);
419+
420+
check_signature_check_condition(&condition, &[&key1], &[], false);
421+
check_signature_check_condition(&condition, &[&key1], &[&key1], true);
422+
check_signature_check_condition(&condition, &[&key1], &[&key2], false);
423+
check_signature_check_condition(&condition, &[&key1, &key2, &key3], &[&key1], false);
424+
check_signature_check_condition(&condition, &[&key1, &key2, &key3], &[&key2], false);
425+
check_signature_check_condition(&condition, &[&key1, &key2, &key3], &[&key3], false);
426+
check_signature_check_condition(&condition, &[&key1, &key2], &[&key1, &key2, &key3], true);
427+
check_signature_check_condition(&condition, &[&key1, &key2], &[&key1, &key2], true);
428+
check_signature_check_condition(&condition, &[&key1, &key2], &[&key2, &key3], false);
429+
}
430+
431+
#[test]
432+
fn signature_check_condition_any_or() {
433+
let key1 = make_key();
434+
let key2 = make_key();
435+
let key3 = make_key();
436+
let condition = SignatureCheckCondition::AnyAccountSignatureOr(vec![key3.clone()].into());
437+
438+
check_signature_check_condition(&condition, &[], &[], false);
439+
check_signature_check_condition(&condition, &[], &[&key3], true);
440+
check_signature_check_condition(&condition, &[], &[&key2], false);
441+
check_signature_check_condition(&condition, &[], &[&key1, &key2], false);
442+
check_signature_check_condition(&condition, &[&key2], &[&key2], true);
443+
check_signature_check_condition(&condition, &[&key2, &key3], &[&key2], true);
444+
check_signature_check_condition(&condition, &[&key1, &key2], &[&key2], true);
445+
}
446+
447+
#[test]
448+
fn signature_check_condition_all_and() {
449+
let key1 = make_key();
450+
let key2 = make_key();
451+
let key3 = make_key();
452+
let condition = SignatureCheckCondition::AllAccountSignaturesAnd(vec![key3.clone()].into());
453+
454+
check_signature_check_condition(&condition, &[], &[], false);
455+
check_signature_check_condition(&condition, &[], &[&key3], true);
456+
check_signature_check_condition(&condition, &[&key1], &[&key3], false);
457+
check_signature_check_condition(&condition, &[&key1], &[&key1, &key3], true);
458+
check_signature_check_condition(&condition, &[&key2], &[&key1, &key3], false);
459+
check_signature_check_condition(&condition, &[&key2], &[&key1, &key2, &key3], true);
460+
}
461+
}

0 commit comments

Comments
 (0)