Newer
Older
assert_eq!(Slots::is_in_progress(), true);
assert_eq!(Slots::is_ending(System::block_number()), None);
});
}
#[test]
fn auction_proceeds_correctly() {
new_test_ext().execute_with(|| {
assert_ok!(Slots::new_auction(Origin::ROOT, 5, 1));
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
assert_eq!(Slots::auction_counter(), 1);
assert_eq!(Slots::is_in_progress(), true);
assert_eq!(Slots::is_ending(System::block_number()), None);
run_to_block(2);
assert_eq!(Slots::is_in_progress(), true);
assert_eq!(Slots::is_ending(System::block_number()), None);
run_to_block(3);
assert_eq!(Slots::is_in_progress(), true);
assert_eq!(Slots::is_ending(System::block_number()), None);
run_to_block(4);
assert_eq!(Slots::is_in_progress(), true);
assert_eq!(Slots::is_ending(System::block_number()), None);
run_to_block(5);
assert_eq!(Slots::is_in_progress(), true);
assert_eq!(Slots::is_ending(System::block_number()), None);
run_to_block(6);
assert_eq!(Slots::is_in_progress(), true);
assert_eq!(Slots::is_ending(System::block_number()), Some(0));
run_to_block(7);
assert_eq!(Slots::is_in_progress(), true);
assert_eq!(Slots::is_ending(System::block_number()), Some(1));
run_to_block(8);
assert_eq!(Slots::is_in_progress(), true);
assert_eq!(Slots::is_ending(System::block_number()), Some(2));
run_to_block(9);
assert_eq!(Slots::is_in_progress(), false);
assert_eq!(Slots::is_ending(System::block_number()), None);
});
}
#[test]
fn can_win_auction() {
new_test_ext().execute_with(|| {
assert_ok!(Slots::new_auction(Origin::ROOT, 5, 1));
assert_ok!(Slots::bid(Origin::signed(1), 0, 1, 1, 4, 1));
assert_eq!(Balances::reserved_balance(&1), 1);
assert_eq!(Balances::free_balance(&1), 9);
run_to_block(9);
assert_eq!(Slots::onboard_queue(1), vec![0.into()]);
Some((1, IncomingParachain::Unset(NewBidder { who: 1, sub: 0 })))
);
assert_eq!(Slots::deposit_held(&0.into()), 1);
assert_eq!(Balances::reserved_balance(&1), 0);
assert_eq!(Balances::free_balance(&1), 9);
});
}
#[test]
fn offboarding_works() {
new_test_ext().execute_with(|| {
run_to_block(1);
assert_ok!(Slots::new_auction(Origin::ROOT, 5, 1));
assert_ok!(Slots::bid(Origin::signed(1), 0, 1, 1, 4, 1));
assert_eq!(Balances::free_balance(&1), 9);
run_to_block(9);
assert_eq!(Slots::deposit_held(&0.into()), 1);
run_to_block(50);
assert_eq!(Slots::deposit_held(&0.into()), 0);
assert_eq!(Balances::free_balance(&1), 10);
});
}
#[test]
fn set_offboarding_works() {
new_test_ext().execute_with(|| {
assert_ok!(Slots::new_auction(Origin::ROOT, 5, 1));
assert_ok!(Slots::bid(Origin::signed(1), 0, 1, 1, 4, 1));
run_to_block(9);
assert_eq!(Slots::deposit_held(&0.into()), 1);
run_to_block(49);
assert_eq!(Slots::deposit_held(&0.into()), 1);
assert_ok!(Slots::set_offboarding(Origin::signed(ParaId::from(0).into_account()), 10));
run_to_block(50);
assert_eq!(Slots::deposit_held(&0.into()), 0);
assert_eq!(Balances::free_balance(&10), 1);
});
}
#[test]
fn onboarding_works() {
new_test_ext().execute_with(|| {
assert_ok!(Slots::new_auction(Origin::ROOT, 5, 1));
assert_ok!(Slots::bid(Origin::signed(1), 0, 1, 1, 4, 1));
run_to_block(9);
let h = BlakeTwo256::hash(&[42u8][..]);
assert_ok!(Slots::fix_deploy_data(Origin::signed(1), 0, 0.into(), h, vec![69]));
assert_ok!(Slots::elaborate_deploy_data(Origin::signed(0), 0.into(), vec![42]));
run_to_block(10);
with_parachains(|p| {
assert_eq!(p.len(), 1);
assert_eq!(p[&0], (vec![42], vec![69]));
});
});
}
#[test]
fn late_onboarding_works() {
new_test_ext().execute_with(|| {
assert_ok!(Slots::new_auction(Origin::ROOT, 5, 1));
assert_ok!(Slots::bid(Origin::signed(1), 0, 1, 1, 4, 1));
run_to_block(10);
with_parachains(|p| {
assert_eq!(p.len(), 0);
});
run_to_block(11);
let h = BlakeTwo256::hash(&[42u8][..]);
assert_ok!(Slots::fix_deploy_data(Origin::signed(1), 0, 0.into(), h, vec![69]));
assert_ok!(Slots::elaborate_deploy_data(Origin::signed(0), 0.into(), vec![42]));
with_parachains(|p| {
assert_eq!(p.len(), 1);
assert_eq!(p[&0], (vec![42], vec![69]));
});
});
}
#[test]
fn under_bidding_works() {
new_test_ext().execute_with(|| {
assert_ok!(Slots::new_auction(Origin::ROOT, 5, 1));
assert_ok!(Slots::bid(Origin::signed(1), 0, 1, 1, 4, 5));
assert_ok!(Slots::bid(Origin::signed(2), 0, 1, 1, 4, 1));
assert_eq!(Balances::reserved_balance(&2), 0);
assert_eq!(Balances::free_balance(&2), 20);
assert_eq!(
Slots::winning(0).unwrap()[SlotRange::ZeroThree as u8 as usize],
Some((Bidder::New(NewBidder{who: 1, sub: 0}), 5))
);
});
}
#[test]
fn should_choose_best_combination() {
new_test_ext().execute_with(|| {
assert_ok!(Slots::new_auction(Origin::ROOT, 5, 1));
assert_ok!(Slots::bid(Origin::signed(1), 0, 1, 1, 1, 1));
assert_ok!(Slots::bid(Origin::signed(2), 0, 1, 2, 3, 1));
assert_ok!(Slots::bid(Origin::signed(3), 0, 1, 4, 4, 2));
assert_ok!(Slots::bid(Origin::signed(1), 1, 1, 1, 4, 1));
run_to_block(9);
assert_eq!(Slots::onboard_queue(1), vec![0.into()]);
assert_eq!(
Some((1, IncomingParachain::Unset(NewBidder { who: 1, sub: 0 })))
);
assert_eq!(Slots::onboard_queue(2), vec![1.into()]);
assert_eq!(
Some((2, IncomingParachain::Unset(NewBidder { who: 2, sub: 0 })))
);
assert_eq!(Slots::onboard_queue(4), vec![2.into()]);
assert_eq!(
Some((4, IncomingParachain::Unset(NewBidder { who: 3, sub: 0 })))
);
});
}
#[test]
fn independent_bids_should_fail() {
new_test_ext().execute_with(|| {
assert_ok!(Slots::new_auction(Origin::ROOT, 1, 1));
assert_ok!(Slots::bid(Origin::signed(1), 0, 1, 1, 2, 1));
assert_ok!(Slots::bid(Origin::signed(1), 0, 1, 2, 4, 1));
assert_ok!(Slots::bid(Origin::signed(1), 0, 1, 2, 2, 1));
assert_noop!(
Slots::bid(Origin::signed(1), 0, 1, 3, 3, 1),
"bidder winning non-intersecting range"
);
});
}
#[test]
fn multiple_onboards_offboards_should_work() {
new_test_ext().execute_with(|| {
assert_ok!(Slots::new_auction(Origin::ROOT, 1, 1));
assert_ok!(Slots::bid(Origin::signed(1), 0, 1, 1, 1, 1));
assert_ok!(Slots::bid(Origin::signed(2), 0, 1, 2, 3, 1));
assert_ok!(Slots::bid(Origin::signed(3), 0, 1, 4, 4, 1));
run_to_block(5);
assert_ok!(Slots::new_auction(Origin::ROOT, 1, 1));
assert_ok!(Slots::bid(Origin::signed(4), 1, 2, 1, 2, 1));
assert_ok!(Slots::bid(Origin::signed(5), 1, 2, 3, 4, 1));
run_to_block(9);
assert_eq!(Slots::onboard_queue(1), vec![0.into(), 3.into()]);
assert_eq!(
Some((1, IncomingParachain::Unset(NewBidder { who: 1, sub: 0 })))
);
assert_eq!(
Some((1, IncomingParachain::Unset(NewBidder { who: 4, sub: 1 })))
);
assert_eq!(Slots::onboard_queue(2), vec![1.into()]);
assert_eq!(
Some((2, IncomingParachain::Unset(NewBidder { who: 2, sub: 0 })))
);
assert_eq!(Slots::onboard_queue(3), vec![4.into()]);
assert_eq!(
Some((3, IncomingParachain::Unset(NewBidder { who: 5, sub: 1 })))
);
assert_eq!(Slots::onboard_queue(4), vec![2.into()]);
assert_eq!(
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
Some((4, IncomingParachain::Unset(NewBidder { who: 3, sub: 0 })))
);
for &(para, sub, acc) in &[(0, 0, 1), (1, 0, 2), (2, 0, 3), (3, 1, 4), (4, 1, 5)] {
let h = BlakeTwo256::hash(&[acc][..]);
assert_ok!(Slots::fix_deploy_data(Origin::signed(acc as _), sub, para.into(), h, vec![acc]));
assert_ok!(Slots::elaborate_deploy_data(Origin::signed(0), para.into(), vec![acc]));
}
run_to_block(10);
with_parachains(|p| {
assert_eq!(p.len(), 2);
assert_eq!(p[&0], (vec![1], vec![1]));
assert_eq!(p[&3], (vec![4], vec![4]));
});
run_to_block(20);
with_parachains(|p| {
assert_eq!(p.len(), 2);
assert_eq!(p[&1], (vec![2], vec![2]));
assert_eq!(p[&3], (vec![4], vec![4]));
});
run_to_block(30);
with_parachains(|p| {
assert_eq!(p.len(), 2);
assert_eq!(p[&1], (vec![2], vec![2]));
assert_eq!(p[&4], (vec![5], vec![5]));
});
run_to_block(40);
with_parachains(|p| {
assert_eq!(p.len(), 2);
assert_eq!(p[&2], (vec![3], vec![3]));
assert_eq!(p[&4], (vec![5], vec![5]));
});
run_to_block(50);
with_parachains(|p| {
assert_eq!(p.len(), 0);
});
});
}
#[test]
fn extensions_should_work() {
new_test_ext().execute_with(|| {
assert_ok!(Slots::new_auction(Origin::ROOT, 5, 1));
assert_ok!(Slots::bid(Origin::signed(1), 0, 1, 1, 1, 1));
run_to_block(9);
assert_eq!(Slots::onboard_queue(1), vec![0.into()]);
run_to_block(10);
let h = BlakeTwo256::hash(&[1u8][..]);
assert_ok!(Slots::fix_deploy_data(Origin::signed(1), 0, 0.into(), h, vec![1]));
assert_ok!(Slots::elaborate_deploy_data(Origin::signed(0), 0.into(), vec![1]));
assert_ok!(Slots::new_auction(Origin::ROOT, 5, 2));
assert_ok!(Slots::bid_renew(Origin::signed(ParaId::from(0).into_account()), 2, 2, 2, 1));
with_parachains(|p| {
assert_eq!(p.len(), 1);
assert_eq!(p[&0], (vec![1], vec![1]));
});
run_to_block(20);
with_parachains(|p| {
assert_eq!(p.len(), 1);
assert_eq!(p[&0], (vec![1], vec![1]));
});
assert_ok!(Slots::new_auction(Origin::ROOT, 5, 2));
assert_ok!(Balances::transfer(Origin::signed(1), ParaId::from(0).into_account(), 1));
assert_ok!(Slots::bid_renew(Origin::signed(ParaId::from(0).into_account()), 3, 3, 3, 2));
run_to_block(30);
with_parachains(|p| {
assert_eq!(p.len(), 1);
assert_eq!(p[&0], (vec![1], vec![1]));
});
run_to_block(40);
with_parachains(|p| {
assert_eq!(p.len(), 0);
});
});
}
#[test]
fn renewal_with_lower_value_should_work() {
new_test_ext().execute_with(|| {
assert_ok!(Slots::new_auction(Origin::ROOT, 5, 1));
assert_ok!(Slots::bid(Origin::signed(1), 0, 1, 1, 1, 5));
run_to_block(9);
assert_eq!(Slots::onboard_queue(1), vec![0.into()]);
run_to_block(10);
let h = BlakeTwo256::hash(&[1u8][..]);
assert_ok!(Slots::fix_deploy_data(Origin::signed(1), 0, 0.into(), h, vec![1]));
assert_ok!(Slots::elaborate_deploy_data(Origin::signed(0), 0.into(), vec![1]));
assert_ok!(Slots::new_auction(Origin::ROOT, 5, 2));
assert_ok!(Slots::bid_renew(Origin::signed(ParaId::from(0).into_account()), 2, 2, 2, 3));
run_to_block(20);
assert_eq!(Balances::free_balance::<u64>(ParaId::from(0).into_account()), 2);
assert_ok!(Slots::new_auction(Origin::ROOT, 5, 2));
assert_ok!(Slots::bid_renew(Origin::signed(ParaId::from(0).into_account()), 3, 3, 3, 4));
run_to_block(30);
assert_eq!(Balances::free_balance::<u64>(ParaId::from(0).into_account()), 1);
});
}
#[test]
fn can_win_incomplete_auction() {
new_test_ext().execute_with(|| {
assert_ok!(Slots::new_auction(Origin::ROOT, 5, 1));
assert_ok!(Slots::bid(Origin::signed(1), 0, 1, 4, 4, 5));
run_to_block(9);
assert_eq!(Slots::onboard_queue(1), vec![]);
assert_eq!(Slots::onboard_queue(2), vec![]);
assert_eq!(Slots::onboard_queue(3), vec![]);
assert_eq!(Slots::onboard_queue(4), vec![0.into()]);
Some((4, IncomingParachain::Unset(NewBidder { who: 1, sub: 0 })))
);
assert_eq!(Slots::deposit_held(&0.into()), 5);
});
}
#[test]
fn multiple_bids_work_pre_ending() {
new_test_ext().execute_with(|| {
assert_ok!(Slots::new_auction(Origin::ROOT, 5, 1));
for i in 1..6 {
run_to_block(i);
assert_ok!(Slots::bid(Origin::signed(i), 0, 1, 1, 4, i));
for j in 1..6 {
assert_eq!(Balances::reserved_balance(&j), if j == i { j } else { 0 });
assert_eq!(Balances::free_balance(&j), if j == i { j * 9 } else { j * 10 });
}
}
run_to_block(9);
assert_eq!(Slots::onboard_queue(1), vec![0.into()]);
assert_eq!(
Some((1, IncomingParachain::Unset(NewBidder { who: 5, sub: 0 })))
);
assert_eq!(Slots::deposit_held(&0.into()), 5);
assert_eq!(Balances::reserved_balance(&5), 0);
assert_eq!(Balances::free_balance(&5), 45);
});
}
#[test]
fn multiple_bids_work_post_ending() {
new_test_ext().execute_with(|| {
assert_ok!(Slots::new_auction(Origin::ROOT, 5, 1));
for i in 1..6 {
run_to_block(i + 3);
assert_ok!(Slots::bid(Origin::signed(i), 0, 1, 1, 4, i));
for j in 1..6 {
assert_eq!(Balances::reserved_balance(&j), if j == i { j } else { 0 });
assert_eq!(Balances::free_balance(&j), if j == i { j * 9 } else { j * 10 });
}
}
run_to_block(9);
assert_eq!(Slots::onboard_queue(1), vec![0.into()]);
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
Some((1, IncomingParachain::Unset(NewBidder { who: 3, sub: 0 })))
);
assert_eq!(Slots::deposit_held(&0.into()), 3);
assert_eq!(Balances::reserved_balance(&3), 0);
assert_eq!(Balances::free_balance(&3), 27);
});
}
#[test]
fn incomplete_calculate_winners_works() {
let winning = [
None,
None,
None,
None,
None,
None,
None,
None,
None,
Some((Bidder::New(NewBidder{who: 1, sub: 0}), 1)),
];
let winners = vec![
(Some(NewBidder{who: 1, sub: 0}), 0.into(), 1, SlotRange::ThreeThree)
];
assert_eq!(Slots::calculate_winners(winning, TestParachains::new_id), winners);
}
#[test]
fn first_incomplete_calculate_winners_works() {
let winning = [
Some((Bidder::New(NewBidder{who: 1, sub: 0}), 1)),
None,
None,
None,
None,
None,
None,
None,
None,
None,
];
let winners = vec![
(Some(NewBidder{who: 1, sub: 0}), 0.into(), 1, SlotRange::ZeroZero)
];
assert_eq!(Slots::calculate_winners(winning, TestParachains::new_id), winners);
}
#[test]
fn calculate_winners_works() {
let mut winning = [
/*0..0*/
Some((Bidder::New(NewBidder{who: 2, sub: 0}), 2)),
/*0..1*/
None,
/*0..2*/
None,
/*0..3*/
Some((Bidder::New(NewBidder{who: 1, sub: 0}), 1)),
/*1..1*/
Some((Bidder::New(NewBidder{who: 3, sub: 0}), 1)),
/*1..2*/
None,
/*1..3*/
None,
/*2..2*/
//Some((Bidder::New(NewBidder{who: 4, sub: 0}), 1)),
Some((Bidder::New(NewBidder{who: 1, sub: 0}), 53)),
/*2..3*/
None,
/*3..3*/
Some((Bidder::New(NewBidder{who: 5, sub: 0}), 1)),
];
let winners = vec![
(Some(NewBidder{who: 2,sub: 0}), 0.into(), 2, SlotRange::ZeroZero),
(Some(NewBidder{who: 3,sub: 0}), 1.into(), 1, SlotRange::OneOne),
(Some(NewBidder{who: 1,sub: 0}), 2.into(), 53, SlotRange::TwoTwo),
(Some(NewBidder{who: 5,sub: 0}), 3.into(), 1, SlotRange::ThreeThree)
];
assert_eq!(Slots::calculate_winners(winning.clone(), TestParachains::new_id), winners);
reset_count();
winning[SlotRange::ZeroThree as u8 as usize] = Some((Bidder::New(NewBidder{who: 1, sub: 0}), 2));
let winners = vec![
(Some(NewBidder{who: 2,sub: 0}), 0.into(), 2, SlotRange::ZeroZero),
(Some(NewBidder{who: 3,sub: 0}), 1.into(), 1, SlotRange::OneOne),
(Some(NewBidder{who: 1,sub: 0}), 2.into(), 53, SlotRange::TwoTwo),
(Some(NewBidder{who: 5,sub: 0}), 3.into(), 1, SlotRange::ThreeThree)
];
assert_eq!(Slots::calculate_winners(winning.clone(), TestParachains::new_id), winners);
reset_count();
winning[SlotRange::ZeroOne as u8 as usize] = Some((Bidder::New(NewBidder{who: 4, sub: 0}), 3));
let winners = vec![
(Some(NewBidder{who: 4,sub: 0}), 0.into(), 3, SlotRange::ZeroOne),
(Some(NewBidder{who: 1,sub: 0}), 1.into(), 53, SlotRange::TwoTwo),
(Some(NewBidder{who: 5,sub: 0}), 2.into(), 1, SlotRange::ThreeThree)
];
assert_eq!(Slots::calculate_winners(winning.clone(), TestParachains::new_id), winners);
}
}