@@ -25,6 +25,7 @@ use mock::{
25
25
SESSION_CHANGED , TEST_SESSION_CHANGED , authorities, force_new_session,
26
26
set_next_validators, set_session_length, session_changed, Origin , System , Session ,
27
27
reset_before_session_end_called, before_session_end_called, new_test_ext,
28
+ PreUpgradeMockSessionKeys ,
28
29
} ;
29
30
30
31
fn initialize_block ( block : u64 ) {
@@ -308,3 +309,97 @@ fn return_true_if_more_than_third_is_disabled() {
308
309
assert_eq ! ( Session :: disable_index( 3 ) , true ) ;
309
310
} ) ;
310
311
}
312
+
313
+ #[ test]
314
+ fn upgrade_keys ( ) {
315
+ use frame_support:: storage;
316
+ use mock:: Test ;
317
+ use sp_core:: crypto:: key_types:: DUMMY ;
318
+
319
+ // This test assumes certain mocks.
320
+ assert_eq ! ( mock:: NEXT_VALIDATORS . with( |l| l. borrow( ) . clone( ) ) , vec![ 1 , 2 , 3 ] ) ;
321
+ assert_eq ! ( mock:: VALIDATORS . with( |l| l. borrow( ) . clone( ) ) , vec![ 1 , 2 , 3 ] ) ;
322
+
323
+ new_test_ext ( ) . execute_with ( || {
324
+ let pre_one = PreUpgradeMockSessionKeys {
325
+ a : [ 1u8 ; 32 ] ,
326
+ b : [ 1u8 ; 64 ] ,
327
+ } ;
328
+
329
+ let pre_two = PreUpgradeMockSessionKeys {
330
+ a : [ 2u8 ; 32 ] ,
331
+ b : [ 2u8 ; 64 ] ,
332
+ } ;
333
+
334
+ let pre_three = PreUpgradeMockSessionKeys {
335
+ a : [ 3u8 ; 32 ] ,
336
+ b : [ 3u8 ; 64 ] ,
337
+ } ;
338
+
339
+ let val_keys = vec ! [
340
+ ( 1u64 , pre_one) ,
341
+ ( 2u64 , pre_two) ,
342
+ ( 3u64 , pre_three) ,
343
+ ] ;
344
+
345
+ // Set `QueuedKeys`.
346
+ {
347
+ let storage_key = <super :: QueuedKeys < Test > >:: hashed_key ( ) ;
348
+ assert ! ( storage:: unhashed:: exists( & storage_key) ) ;
349
+ storage:: unhashed:: put ( & storage_key, & val_keys) ;
350
+ }
351
+
352
+ // Set `NextKeys`.
353
+ {
354
+ for & ( i, ref keys) in val_keys. iter ( ) {
355
+ let storage_key = <super :: NextKeys < Test > >:: hashed_key_for ( i) ;
356
+ assert ! ( storage:: unhashed:: exists( & storage_key) ) ;
357
+ storage:: unhashed:: put ( & storage_key, keys) ;
358
+ }
359
+ }
360
+
361
+ // Set `KeyOwner`.
362
+ {
363
+ for & ( i, ref keys) in val_keys. iter ( ) {
364
+ // clear key owner for `UintAuthorityId` keys set in genesis.
365
+ let presumed = UintAuthorityId ( i) ;
366
+ let raw_prev = presumed. as_ref ( ) ;
367
+
368
+ assert_eq ! ( Session :: key_owner( DUMMY , raw_prev) , Some ( i) ) ;
369
+ Session :: clear_key_owner ( DUMMY , raw_prev) ;
370
+
371
+ Session :: put_key_owner ( mock:: KEY_ID_A , keys. get_raw ( mock:: KEY_ID_A ) , & i) ;
372
+ Session :: put_key_owner ( mock:: KEY_ID_B , keys. get_raw ( mock:: KEY_ID_B ) , & i) ;
373
+ }
374
+ }
375
+
376
+ // Do the upgrade and check sanity.
377
+ let mock_keys_for = |val| mock:: MockSessionKeys { dummy : UintAuthorityId ( val) } ;
378
+ Session :: upgrade_keys :: < PreUpgradeMockSessionKeys , _ > (
379
+ |val, _old_keys| mock_keys_for ( val) ,
380
+ ) ;
381
+
382
+ // Check key ownership.
383
+ for ( i, ref keys) in val_keys. iter ( ) {
384
+ assert ! ( Session :: key_owner( mock:: KEY_ID_A , keys. get_raw( mock:: KEY_ID_A ) ) . is_none( ) ) ;
385
+ assert ! ( Session :: key_owner( mock:: KEY_ID_B , keys. get_raw( mock:: KEY_ID_B ) ) . is_none( ) ) ;
386
+
387
+ let migrated_key = UintAuthorityId ( * i) ;
388
+ assert_eq ! ( Session :: key_owner( DUMMY , migrated_key. as_ref( ) ) , Some ( * i) ) ;
389
+ }
390
+
391
+ // Check queued keys.
392
+ assert_eq ! (
393
+ Session :: queued_keys( ) ,
394
+ vec![
395
+ ( 1 , mock_keys_for( 1 ) ) ,
396
+ ( 2 , mock_keys_for( 2 ) ) ,
397
+ ( 3 , mock_keys_for( 3 ) ) ,
398
+ ] ,
399
+ ) ;
400
+
401
+ for i in 1u64 ..4 {
402
+ assert_eq ! ( <super :: NextKeys <Test >>:: get( & i) , Some ( mock_keys_for( i) ) ) ;
403
+ }
404
+ } )
405
+ }
0 commit comments