From f4214637a9a444aed8c7801d47e6ded317e6ee5e Mon Sep 17 00:00:00 2001 From: Jon Cinque Date: Thu, 22 Apr 2021 16:44:54 +0200 Subject: [PATCH] program-test: Add large bootstrap stake for realistic warmups (#16739) --- Cargo.lock | 1 + program-test/Cargo.toml | 1 + program-test/src/lib.rs | 3 ++- program-test/tests/warp.rs | 36 ++++++++++++++++++++++++++++++++++-- 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ef0ee87b4..0a0e58ada 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4941,6 +4941,7 @@ dependencies = [ name = "solana-program-test" version = "1.7.0" dependencies = [ + "assert_matches", "async-trait", "base64 0.12.3", "bincode", diff --git a/program-test/Cargo.toml b/program-test/Cargo.toml index db9116e9e..5734842a0 100644 --- a/program-test/Cargo.toml +++ b/program-test/Cargo.toml @@ -28,4 +28,5 @@ thiserror = "1.0" tokio = { version = "1", features = ["full"] } [dev-dependencies] +assert_matches = "1.3.0" solana-stake-program = { path = "../programs/stake", version = "=1.7.0" } diff --git a/program-test/src/lib.rs b/program-test/src/lib.rs index 13d1acc4d..1399a47d1 100644 --- a/program-test/src/lib.rs +++ b/program-test/src/lib.rs @@ -672,7 +672,8 @@ impl ProgramTest { let rent = Rent::default(); let fee_rate_governor = FeeRateGovernor::default(); let bootstrap_validator_pubkey = Pubkey::new_unique(); - let bootstrap_validator_stake_lamports = rent.minimum_balance(VoteState::size_of()); + let bootstrap_validator_stake_lamports = + rent.minimum_balance(VoteState::size_of()) + sol_to_lamports(1_000_000.0); let mint_keypair = Keypair::new(); let voting_keypair = Keypair::new(); diff --git a/program-test/tests/warp.rs b/program-test/tests/warp.rs index 197b071ee..9ed46aac1 100644 --- a/program-test/tests/warp.rs +++ b/program-test/tests/warp.rs @@ -1,5 +1,7 @@ #![allow(clippy::integer_arithmetic)] use { + assert_matches::assert_matches, + bincode::deserialize, solana_program_test::{processor, ProgramTest, ProgramTestError}, solana_sdk::{ account_info::{next_account_info, AccountInfo}, @@ -11,12 +13,16 @@ use { rent::Rent, signature::{Keypair, Signer}, system_instruction, system_program, - sysvar::{clock, Sysvar}, + sysvar::{ + clock, + stake_history::{self, StakeHistory}, + Sysvar, + }, transaction::{Transaction, TransactionError}, }, solana_stake_program::{ stake_instruction, - stake_state::{Authorized, Lockup}, + stake_state::{Authorized, Lockup, StakeState}, }, solana_vote_program::{ vote_instruction, @@ -248,4 +254,30 @@ async fn stake_rewards_from_warp() { .expect("account exists") .unwrap(); assert!(account.lamports > stake_lamports); + + // check that stake is fully active + let stake_history_account = context + .banks_client + .get_account(stake_history::id()) + .await + .expect("account exists") + .unwrap(); + + let clock_account = context + .banks_client + .get_account(clock::id()) + .await + .expect("account exists") + .unwrap(); + + let stake_state: StakeState = deserialize(&account.data).unwrap(); + let stake_history: StakeHistory = deserialize(&stake_history_account.data).unwrap(); + let clock: Clock = deserialize(&clock_account.data).unwrap(); + let stake = stake_state.stake().unwrap(); + assert_matches!( + stake + .delegation + .stake_activating_and_deactivating(clock.epoch, Some(&stake_history), true,), + (_, 0, 0) + ); }