| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- use {
- agave_feature_set as feature_set,
- solana_instruction::{AccountMeta, Instruction},
- solana_program_test::ProgramTest,
- solana_pubkey::Pubkey,
- solana_sdk_ids::bpf_loader,
- solana_signer::Signer,
- solana_transaction::Transaction,
- test_case::test_case,
- };
- #[tokio::test]
- async fn test_add_bpf_program() {
- let program_id = Pubkey::new_unique();
- let mut program_test = ProgramTest::default();
- program_test.prefer_bpf(true);
- program_test.add_program("noop_program", program_id, None);
- let context = program_test.start_with_context().await;
- // Assert the program is a BPF Loader 2 program.
- let program_account = context
- .banks_client
- .get_account(program_id)
- .await
- .unwrap()
- .unwrap();
- assert_eq!(program_account.owner, bpf_loader::id());
- // Invoke the program.
- let instruction = Instruction::new_with_bytes(program_id, &[], Vec::new());
- let transaction = Transaction::new_signed_with_payer(
- &[instruction],
- Some(&context.payer.pubkey()),
- &[&context.payer],
- context.last_blockhash,
- );
- context
- .banks_client
- .process_transaction(transaction)
- .await
- .unwrap();
- }
- #[test_case(64, true, true; "success with 64 accounts and without feature")]
- #[test_case(65, true, false; "failure with 65 accounts and without feature")]
- #[test_case(128, false, true; "success with 128 accounts and with feature")]
- #[test_case(129, false, false; "failure with 129 accounts and with feature")]
- #[tokio::test]
- async fn test_max_accounts(num_accounts: u8, deactivate_feature: bool, expect_success: bool) {
- let program_id = Pubkey::new_unique();
- let mut program_test = ProgramTest::default();
- program_test.prefer_bpf(true);
- program_test.add_program("noop_program", program_id, None);
- if deactivate_feature {
- program_test.deactivate_feature(feature_set::increase_tx_account_lock_limit::id());
- }
- let context = program_test.start_with_context().await;
- // Subtract 2 to account for the program and fee payer
- let num_extra_accounts = num_accounts.checked_sub(2).unwrap();
- let account_metas = (0..num_extra_accounts)
- .map(|_| AccountMeta::new_readonly(Pubkey::new_unique(), false))
- .collect::<Vec<_>>();
- let instruction = Instruction::new_with_bytes(program_id, &[], account_metas);
- let transaction = Transaction::new_signed_with_payer(
- &[instruction],
- Some(&context.payer.pubkey()),
- &[&context.payer],
- context.last_blockhash,
- );
- // Invoke the program.
- if expect_success {
- context
- .banks_client
- .process_transaction(transaction)
- .await
- .unwrap();
- } else {
- context
- .banks_client
- .process_transaction(transaction)
- .await
- .unwrap_err();
- }
- }
|