Improve TestValidator instantiation (#13627)
* Add TestValidator::new_with_fees constructor, and warning for low bootstrap_validator_lamports * Add logging to solana-tokens integration test to help catch low bootstrap_validator_lamports in the future * Reasonable TestValidator mint_lamports
This commit is contained in:
parent
bde1e3d004
commit
ef99689592
|
@ -4964,6 +4964,7 @@ dependencies = [
|
|||
"solana-cli-config",
|
||||
"solana-client",
|
||||
"solana-core",
|
||||
"solana-logger 1.5.0",
|
||||
"solana-remote-wallet",
|
||||
"solana-runtime",
|
||||
"solana-sdk",
|
||||
|
|
|
@ -10,7 +10,7 @@ use solana_client::{
|
|||
rpc_client::RpcClient,
|
||||
};
|
||||
use solana_core::contact_info::ContactInfo;
|
||||
use solana_core::test_validator::{TestValidator, TestValidatorOptions};
|
||||
use solana_core::test_validator::TestValidator;
|
||||
use solana_faucet::faucet::run_local_faucet;
|
||||
use solana_sdk::{
|
||||
commitment_config::CommitmentConfig,
|
||||
|
@ -231,17 +231,14 @@ fn full_battery_tests(
|
|||
|
||||
#[test]
|
||||
fn test_create_account_with_seed() {
|
||||
solana_logger::setup();
|
||||
let TestValidator {
|
||||
server,
|
||||
leader_data,
|
||||
alice: mint_keypair,
|
||||
ledger_path,
|
||||
..
|
||||
} = TestValidator::run_with_options(TestValidatorOptions {
|
||||
fees: 1,
|
||||
bootstrap_validator_lamports: 42_000,
|
||||
..TestValidatorOptions::default()
|
||||
});
|
||||
} = TestValidator::run_with_fees(1);
|
||||
|
||||
let (sender, receiver) = channel();
|
||||
run_local_faucet(mint_keypair, sender, None);
|
||||
|
|
|
@ -9,7 +9,7 @@ use solana_client::{
|
|||
nonce_utils,
|
||||
rpc_client::RpcClient,
|
||||
};
|
||||
use solana_core::test_validator::{TestValidator, TestValidatorOptions};
|
||||
use solana_core::test_validator::TestValidator;
|
||||
use solana_faucet::faucet::run_local_faucet;
|
||||
use solana_sdk::{
|
||||
account_utils::StateMut,
|
||||
|
@ -848,11 +848,7 @@ fn test_stake_authorize_with_fee_payer() {
|
|||
alice,
|
||||
ledger_path,
|
||||
..
|
||||
} = TestValidator::run_with_options(TestValidatorOptions {
|
||||
fees: SIG_FEE,
|
||||
bootstrap_validator_lamports: 42_000,
|
||||
..TestValidatorOptions::default()
|
||||
});
|
||||
} = TestValidator::run_with_fees(SIG_FEE);
|
||||
let (sender, receiver) = channel();
|
||||
run_local_faucet(alice, sender, None);
|
||||
let faucet_addr = receiver.recv().unwrap();
|
||||
|
@ -985,11 +981,7 @@ fn test_stake_split() {
|
|||
alice,
|
||||
ledger_path,
|
||||
..
|
||||
} = TestValidator::run_with_options(TestValidatorOptions {
|
||||
fees: 1,
|
||||
bootstrap_validator_lamports: 42_000,
|
||||
..TestValidatorOptions::default()
|
||||
});
|
||||
} = TestValidator::run_with_fees(1);
|
||||
let (sender, receiver) = channel();
|
||||
run_local_faucet(alice, sender, None);
|
||||
let faucet_addr = receiver.recv().unwrap();
|
||||
|
@ -1140,11 +1132,7 @@ fn test_stake_set_lockup() {
|
|||
alice,
|
||||
ledger_path,
|
||||
..
|
||||
} = TestValidator::run_with_options(TestValidatorOptions {
|
||||
fees: 1,
|
||||
bootstrap_validator_lamports: 42_000,
|
||||
..TestValidatorOptions::default()
|
||||
});
|
||||
} = TestValidator::run_with_fees(1);
|
||||
let (sender, receiver) = channel();
|
||||
run_local_faucet(alice, sender, None);
|
||||
let faucet_addr = receiver.recv().unwrap();
|
||||
|
|
|
@ -9,7 +9,7 @@ use solana_client::{
|
|||
nonce_utils,
|
||||
rpc_client::RpcClient,
|
||||
};
|
||||
use solana_core::test_validator::{TestValidator, TestValidatorOptions};
|
||||
use solana_core::test_validator::TestValidator;
|
||||
use solana_faucet::faucet::run_local_faucet;
|
||||
use solana_sdk::{
|
||||
commitment_config::CommitmentConfig,
|
||||
|
@ -21,17 +21,14 @@ use std::{fs::remove_dir_all, sync::mpsc::channel};
|
|||
|
||||
#[test]
|
||||
fn test_transfer() {
|
||||
solana_logger::setup();
|
||||
let TestValidator {
|
||||
server,
|
||||
leader_data,
|
||||
alice: mint_keypair,
|
||||
ledger_path,
|
||||
..
|
||||
} = TestValidator::run_with_options(TestValidatorOptions {
|
||||
fees: 1,
|
||||
bootstrap_validator_lamports: 42_000,
|
||||
..TestValidatorOptions::default()
|
||||
});
|
||||
} = TestValidator::run_with_fees(1);
|
||||
|
||||
let (sender, receiver) = channel();
|
||||
run_local_faucet(mint_keypair, sender, None);
|
||||
|
@ -252,17 +249,14 @@ fn test_transfer() {
|
|||
|
||||
#[test]
|
||||
fn test_transfer_multisession_signing() {
|
||||
solana_logger::setup();
|
||||
let TestValidator {
|
||||
server,
|
||||
leader_data,
|
||||
alice: mint_keypair,
|
||||
ledger_path,
|
||||
..
|
||||
} = TestValidator::run_with_options(TestValidatorOptions {
|
||||
fees: 1,
|
||||
bootstrap_validator_lamports: 42_000,
|
||||
..TestValidatorOptions::default()
|
||||
});
|
||||
} = TestValidator::run_with_fees(1);
|
||||
|
||||
let (sender, receiver) = channel();
|
||||
run_local_faucet(mint_keypair, sender, None);
|
||||
|
@ -382,17 +376,14 @@ fn test_transfer_multisession_signing() {
|
|||
|
||||
#[test]
|
||||
fn test_transfer_all() {
|
||||
solana_logger::setup();
|
||||
let TestValidator {
|
||||
server,
|
||||
leader_data,
|
||||
alice: mint_keypair,
|
||||
ledger_path,
|
||||
..
|
||||
} = TestValidator::run_with_options(TestValidatorOptions {
|
||||
fees: 1,
|
||||
bootstrap_validator_lamports: 42_000,
|
||||
..TestValidatorOptions::default()
|
||||
});
|
||||
} = TestValidator::run_with_fees(1);
|
||||
|
||||
let (sender, receiver) = channel();
|
||||
run_local_faucet(mint_keypair, sender, None);
|
||||
|
|
|
@ -6,7 +6,9 @@ use crate::{
|
|||
};
|
||||
use solana_ledger::create_new_tmp_ledger;
|
||||
use solana_sdk::{
|
||||
clock::DEFAULT_DEV_SLOTS_PER_EPOCH,
|
||||
hash::Hash,
|
||||
native_token::sol_to_lamports,
|
||||
pubkey::Pubkey,
|
||||
signature::{Keypair, Signer},
|
||||
};
|
||||
|
@ -33,7 +35,7 @@ impl Default for TestValidatorOptions {
|
|||
TestValidatorOptions {
|
||||
fees: 0,
|
||||
bootstrap_validator_lamports: BOOTSTRAP_VALIDATOR_LAMPORTS,
|
||||
mint_lamports: 1_000_000,
|
||||
mint_lamports: sol_to_lamports(1_000_000.0),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -43,6 +45,23 @@ impl TestValidator {
|
|||
Self::run_with_options(TestValidatorOptions::default())
|
||||
}
|
||||
|
||||
/// Instantiates a TestValidator with custom fees. The bootstrap_validator_lamports will
|
||||
/// default to enough to cover 1 epoch of votes. This is an abitrary value based on current and
|
||||
/// foreseen uses of TestValidator. May need to be bumped if uses change in the future.
|
||||
pub fn run_with_fees(fees: u64) -> Self {
|
||||
let bootstrap_validator_lamports = fees * DEFAULT_DEV_SLOTS_PER_EPOCH * 5;
|
||||
Self::run_with_options(TestValidatorOptions {
|
||||
fees,
|
||||
bootstrap_validator_lamports,
|
||||
..TestValidatorOptions::default()
|
||||
})
|
||||
}
|
||||
|
||||
/// Instantiates a TestValidator with completely customized options.
|
||||
///
|
||||
/// Note: if `fees` are non-zero, be sure to set a value for `bootstrap_validator_lamports`
|
||||
/// that can cover enough vote transaction fees for the test. TestValidatorOptions::default()
|
||||
/// may not be sufficient.
|
||||
pub fn run_with_options(options: TestValidatorOptions) -> Self {
|
||||
use solana_ledger::genesis_utils::{
|
||||
create_genesis_config_with_leader_ex, GenesisConfigInfo,
|
||||
|
@ -58,6 +77,14 @@ impl TestValidator {
|
|||
let node = Node::new_localhost_with_pubkey(&node_keypair.pubkey());
|
||||
let contact_info = node.info.clone();
|
||||
|
||||
if fees > 0 && bootstrap_validator_lamports < fees * DEFAULT_DEV_SLOTS_PER_EPOCH {
|
||||
warn!(
|
||||
"TestValidator::bootstrap_validator_lamports less than one epoch. \
|
||||
Only enough to cover {:?} slots",
|
||||
bootstrap_validator_lamports / fees
|
||||
);
|
||||
}
|
||||
|
||||
let GenesisConfigInfo {
|
||||
mut genesis_config,
|
||||
mint_keypair,
|
||||
|
|
|
@ -12,7 +12,8 @@ use solana_runtime::{
|
|||
genesis_utils::{create_genesis_config, GenesisConfigInfo},
|
||||
};
|
||||
use solana_sdk::{
|
||||
commitment_config::CommitmentConfig, rpc_port, signature::Signer, system_transaction,
|
||||
commitment_config::CommitmentConfig, native_token::sol_to_lamports, rpc_port,
|
||||
signature::Signer, system_transaction,
|
||||
};
|
||||
use std::{
|
||||
fs::remove_dir_all,
|
||||
|
@ -50,11 +51,14 @@ fn test_rpc_client() {
|
|||
|
||||
assert_eq!(client.get_balance(&bob_pubkey).unwrap(), 0);
|
||||
|
||||
assert_eq!(client.get_balance(&alice.pubkey()).unwrap(), 1_000_000);
|
||||
assert_eq!(
|
||||
client.get_balance(&alice.pubkey()).unwrap(),
|
||||
sol_to_lamports(1_000_000.0)
|
||||
);
|
||||
|
||||
let (blockhash, _fee_calculator) = client.get_recent_blockhash().unwrap();
|
||||
|
||||
let tx = system_transaction::transfer(&alice, &bob_pubkey, 20, blockhash);
|
||||
let tx = system_transaction::transfer(&alice, &bob_pubkey, sol_to_lamports(20.0), blockhash);
|
||||
let signature = client.send_transaction(&tx).unwrap();
|
||||
|
||||
let mut confirmed_tx = false;
|
||||
|
@ -75,8 +79,14 @@ fn test_rpc_client() {
|
|||
|
||||
assert!(confirmed_tx);
|
||||
|
||||
assert_eq!(client.get_balance(&bob_pubkey).unwrap(), 20);
|
||||
assert_eq!(client.get_balance(&alice.pubkey()).unwrap(), 999_980);
|
||||
assert_eq!(
|
||||
client.get_balance(&bob_pubkey).unwrap(),
|
||||
sol_to_lamports(20.0)
|
||||
);
|
||||
assert_eq!(
|
||||
client.get_balance(&alice.pubkey()).unwrap(),
|
||||
sol_to_lamports(999_980.0)
|
||||
);
|
||||
|
||||
server.close().unwrap();
|
||||
remove_dir_all(ledger_path).unwrap();
|
||||
|
|
|
@ -35,4 +35,5 @@ url = "2.1"
|
|||
bincode = "1.3.1"
|
||||
solana-banks-server = { path = "../banks-server", version = "1.5.0" }
|
||||
solana-core = { path = "../core", version = "1.5.0" }
|
||||
solana-logger = { path = "../logger", version = "1.5.0" }
|
||||
solana-runtime = { path = "../runtime", version = "1.5.0" }
|
||||
|
|
|
@ -1,22 +1,19 @@
|
|||
use solana_banks_client::start_tcp_client;
|
||||
use solana_core::test_validator::{TestValidator, TestValidatorOptions};
|
||||
use solana_sdk::native_token::sol_to_lamports;
|
||||
use solana_core::test_validator::TestValidator;
|
||||
use solana_tokens::commands::test_process_distribute_tokens_with_client;
|
||||
use std::fs::remove_dir_all;
|
||||
use tokio::runtime::Runtime;
|
||||
|
||||
#[test]
|
||||
fn test_process_distribute_with_rpc_client() {
|
||||
solana_logger::setup();
|
||||
let TestValidator {
|
||||
server,
|
||||
leader_data,
|
||||
alice,
|
||||
ledger_path,
|
||||
..
|
||||
} = TestValidator::run_with_options(TestValidatorOptions {
|
||||
mint_lamports: sol_to_lamports(9_000_000.0),
|
||||
..TestValidatorOptions::default()
|
||||
});
|
||||
} = TestValidator::run();
|
||||
|
||||
Runtime::new().unwrap().block_on(async {
|
||||
let mut banks_client = start_tcp_client(leader_data.rpc_banks).await.unwrap();
|
||||
|
|
Loading…
Reference in New Issue