@@ -2547,7 +2547,7 @@ pub(crate) mod tests {
25472547 backend:: { Backend as BTrait , BlockImportOperation as Op } ,
25482548 blockchain:: Backend as BLBTrait ,
25492549 } ;
2550- use sp_blockchain:: { lowest_common_ancestor, tree_route} ;
2550+ use sp_blockchain:: { lowest_common_ancestor, lowest_common_ancestor_multiblock , tree_route} ;
25512551 use sp_core:: H256 ;
25522552 use sp_runtime:: {
25532553 testing:: { Block as RawBlock , ExtrinsicWrapper , Header } ,
@@ -3108,6 +3108,125 @@ pub(crate) mod tests {
31083108 }
31093109 }
31103110
3111+ #[ test]
3112+ fn lowest_common_ancestors_multiblock_works ( ) {
3113+ let backend = Backend :: < Block > :: new_test ( 1000 , 100 ) ;
3114+ let blockchain = backend. blockchain ( ) ;
3115+ let block0 = insert_header ( & backend, 0 , Default :: default ( ) , None , Default :: default ( ) ) ;
3116+
3117+ // fork from genesis: 3 prong.
3118+ // block 0 -> a1 -> a2 -> a3
3119+ // |
3120+ // -> b1 -> b2 -> c1 -> c2
3121+ // |
3122+ // -> d1 -> d2
3123+ let a1 = insert_header ( & backend, 1 , block0, None , Default :: default ( ) ) ;
3124+ let a2 = insert_header ( & backend, 2 , a1, None , Default :: default ( ) ) ;
3125+ let a3 = insert_header ( & backend, 3 , a2, None , Default :: default ( ) ) ;
3126+
3127+ // fork from genesis: 2 prong.
3128+ let b1 = insert_header ( & backend, 1 , block0, None , H256 :: from ( [ 1 ; 32 ] ) ) ;
3129+ let b2 = insert_header ( & backend, 2 , b1, None , Default :: default ( ) ) ;
3130+
3131+ // fork from b2.
3132+ let c1 = insert_header ( & backend, 3 , b2, None , H256 :: from ( [ 2 ; 32 ] ) ) ;
3133+ let c2 = insert_header ( & backend, 4 , c1, None , Default :: default ( ) ) ;
3134+
3135+ // fork from b1.
3136+ let d1 = insert_header ( & backend, 2 , b1, None , H256 :: from ( [ 3 ; 32 ] ) ) ;
3137+ let d2 = insert_header ( & backend, 3 , d1, None , Default :: default ( ) ) ;
3138+ {
3139+ let lca = lowest_common_ancestor_multiblock ( blockchain, vec ! [ a3, b2] ) . unwrap ( ) . unwrap ( ) ;
3140+
3141+ assert_eq ! ( lca. hash, block0) ;
3142+ assert_eq ! ( lca. number, 0 ) ;
3143+ }
3144+
3145+ {
3146+ let lca = lowest_common_ancestor_multiblock ( blockchain, vec ! [ a1, a3] ) . unwrap ( ) . unwrap ( ) ;
3147+
3148+ assert_eq ! ( lca. hash, a1) ;
3149+ assert_eq ! ( lca. number, 1 ) ;
3150+ }
3151+
3152+ {
3153+ let lca = lowest_common_ancestor_multiblock ( blockchain, vec ! [ a3, a1] ) . unwrap ( ) . unwrap ( ) ;
3154+
3155+ assert_eq ! ( lca. hash, a1) ;
3156+ assert_eq ! ( lca. number, 1 ) ;
3157+ }
3158+
3159+ {
3160+ let lca = lowest_common_ancestor_multiblock ( blockchain, vec ! [ a2, a3] ) . unwrap ( ) . unwrap ( ) ;
3161+
3162+ assert_eq ! ( lca. hash, a2) ;
3163+ assert_eq ! ( lca. number, 2 ) ;
3164+ }
3165+
3166+ {
3167+ let lca = lowest_common_ancestor_multiblock ( blockchain, vec ! [ a2, a1] ) . unwrap ( ) . unwrap ( ) ;
3168+
3169+ assert_eq ! ( lca. hash, a1) ;
3170+ assert_eq ! ( lca. number, 1 ) ;
3171+ }
3172+
3173+ {
3174+ let lca = lowest_common_ancestor_multiblock ( blockchain, vec ! [ a2, a2] ) . unwrap ( ) . unwrap ( ) ;
3175+
3176+ assert_eq ! ( lca. hash, a2) ;
3177+ assert_eq ! ( lca. number, 2 ) ;
3178+ }
3179+
3180+ {
3181+ let lca = lowest_common_ancestor_multiblock ( blockchain, vec ! [ a3, d2, c2] )
3182+ . unwrap ( )
3183+ . unwrap ( ) ;
3184+
3185+ assert_eq ! ( lca. hash, block0) ;
3186+ assert_eq ! ( lca. number, 0 ) ;
3187+ }
3188+
3189+ {
3190+ let lca = lowest_common_ancestor_multiblock ( blockchain, vec ! [ c2, d2, b2] )
3191+ . unwrap ( )
3192+ . unwrap ( ) ;
3193+
3194+ assert_eq ! ( lca. hash, b1) ;
3195+ assert_eq ! ( lca. number, 1 ) ;
3196+ }
3197+
3198+ {
3199+ let lca = lowest_common_ancestor_multiblock ( blockchain, vec ! [ a1, a2, a3] )
3200+ . unwrap ( )
3201+ . unwrap ( ) ;
3202+
3203+ assert_eq ! ( lca. hash, a1) ;
3204+ assert_eq ! ( lca. number, 1 ) ;
3205+ }
3206+
3207+ {
3208+ let lca = lowest_common_ancestor_multiblock ( blockchain, vec ! [ b1, b2, d1] )
3209+ . unwrap ( )
3210+ . unwrap ( ) ;
3211+
3212+ assert_eq ! ( lca. hash, b1) ;
3213+ assert_eq ! ( lca. number, 1 ) ;
3214+ }
3215+
3216+ {
3217+ let lca = lowest_common_ancestor_multiblock ( blockchain, vec ! [ ] ) ;
3218+
3219+ assert_eq ! ( true , matches!( lca, Ok ( None ) ) ) ;
3220+ }
3221+
3222+ {
3223+ let lca = lowest_common_ancestor_multiblock ( blockchain, vec ! [ a1] ) . unwrap ( ) . unwrap ( ) ;
3224+
3225+ assert_eq ! ( lca. hash, a1) ;
3226+ assert_eq ! ( lca. number, 1 ) ;
3227+ }
3228+ }
3229+
31113230 #[ test]
31123231 fn test_tree_route_regression ( ) {
31133232 // NOTE: this is a test for a regression introduced in #3665, the result
0 commit comments