@@ -362,3 +362,100 @@ impl SignatureCheckCondition {
362
362
pub mod prelude {
363
363
pub use super :: { Account , AccountId , SignatureCheckCondition } ;
364
364
}
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