From 0174945853b8da90dea8bb1414eefcf9195220a6 Mon Sep 17 00:00:00 2001 From: Jack May Date: Tue, 26 Feb 2019 17:09:57 -0800 Subject: [PATCH] Program tests now check signature status (#2965) --- Cargo.lock | 9 +++++++++ Cargo.toml | 1 + programs/Cargo.toml | 1 + programs/native/bpf_loader/src/lib.rs | 5 +++-- programs/native/failure/Cargo.toml | 18 ++++++++++++++++++ programs/native/failure/src/lib.rs | 14 ++++++++++++++ programs/tests/programs.rs | 27 +++++++++++++++++++++++++++ 7 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 programs/native/failure/Cargo.toml create mode 100644 programs/native/failure/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 89bdab5d9..76808ecbb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2075,6 +2075,14 @@ dependencies = [ "solana-sdk 0.12.0", ] +[[package]] +name = "solana-failure" +version = "0.12.0" +dependencies = [ + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-sdk 0.12.0", +] + [[package]] name = "solana-fullnode" version = "0.12.0" @@ -2200,6 +2208,7 @@ version = "0.12.0" dependencies = [ "solana 0.12.0", "solana-bpfloader 0.12.0", + "solana-failure 0.12.0", "solana-logger 0.12.0", "solana-native-loader 0.12.0", "solana-noop 0.12.0", diff --git a/Cargo.toml b/Cargo.toml index fb36bd07a..cfec51dc6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -100,6 +100,7 @@ members = [ "programs/native/bpf_loader", "programs/native/budget", "programs/native/erc20", + "programs/native/failure", "programs/native/native_loader", "programs/native/noop", "programs/native/rewards", diff --git a/programs/Cargo.toml b/programs/Cargo.toml index 6322dfa1a..95cb5d7e3 100644 --- a/programs/Cargo.toml +++ b/programs/Cargo.toml @@ -27,3 +27,4 @@ solana-sdk = { path = "../sdk", version = "0.12.0" } [dev-dependencies] solana-noop = { path = "native/noop", version = "0.12.0" } +solana-failure = { path = "native/failure", version = "0.12.0" } diff --git a/programs/native/bpf_loader/src/lib.rs b/programs/native/bpf_loader/src/lib.rs index face02c81..93784a17e 100644 --- a/programs/native/bpf_loader/src/lib.rs +++ b/programs/native/bpf_loader/src/lib.rs @@ -196,7 +196,7 @@ fn entrypoint( let mut vm = match create_vm(prog) { Ok(vm) => vm, Err(e) => { - warn!("create_vm failed: {}", e); + warn!("Failed to create BPF VM: {}", e); return Err(ProgramError::GenericError); } }; @@ -204,11 +204,12 @@ fn entrypoint( match vm.execute_program(v.as_mut_slice()) { Ok(status) => { if 0 == status { + warn!("BPF program failed: {}", status); return Err(ProgramError::GenericError); } } Err(e) => { - warn!("execute_program failed: {}", e); + warn!("BPF VM failed to run program: {}", e); return Err(ProgramError::GenericError); } } diff --git a/programs/native/failure/Cargo.toml b/programs/native/failure/Cargo.toml new file mode 100644 index 000000000..ef0896e5b --- /dev/null +++ b/programs/native/failure/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "solana-failure" +version = "0.12.0" +description = "Solana failure program" +authors = ["Solana Maintainers "] +repository = "https://github.com/solana-labs/solana" +license = "Apache-2.0" +homepage = "https://solana.com/" +edition = "2018" + +[dependencies] +solana-sdk = { path = "../../../sdk", version = "0.12.0" } +log = "0.4.2" + +[lib] +name = "failure" +crate-type = ["cdylib"] + diff --git a/programs/native/failure/src/lib.rs b/programs/native/failure/src/lib.rs new file mode 100644 index 000000000..0dae8a34e --- /dev/null +++ b/programs/native/failure/src/lib.rs @@ -0,0 +1,14 @@ +use solana_sdk::account::KeyedAccount; +use solana_sdk::native_program::ProgramError; +use solana_sdk::pubkey::Pubkey; +use solana_sdk::solana_entrypoint; + +solana_entrypoint!(entrypoint); +fn entrypoint( + _program_id: &Pubkey, + _keyed_accounts: &mut [KeyedAccount], + _data: &[u8], + _tick_height: u64, +) -> Result<(), ProgramError> { + Err(ProgramError::GenericError) +} diff --git a/programs/tests/programs.rs b/programs/tests/programs.rs index 56fa12a2b..ee9592147 100644 --- a/programs/tests/programs.rs +++ b/programs/tests/programs.rs @@ -1,7 +1,9 @@ use solana_runtime::bank::Bank; +use solana_runtime::bank::BankError; use solana_sdk::genesis_block::GenesisBlock; use solana_sdk::loader_transaction::LoaderTransaction; use solana_sdk::native_loader; +use solana_sdk::native_program::ProgramError; use solana_sdk::pubkey::Pubkey; use solana_sdk::signature::{Keypair, KeypairUtil}; use solana_sdk::system_transaction::SystemTransaction; @@ -20,6 +22,7 @@ fn load_program(bank: &Bank, from: &Keypair, loader_id: Pubkey, program: Vec 0, ); bank.process_transaction(&tx).unwrap(); + assert_eq!(bank.get_signature_status(&tx.signatures[0]), Some(Ok(()))); let chunk_size = 256; // Size of chunk just needs to fit into tx let mut offset = 0; @@ -38,6 +41,7 @@ fn load_program(bank: &Bank, from: &Keypair, loader_id: Pubkey, program: Vec let tx = LoaderTransaction::new_finalize(&program_account, loader_id, bank.last_id(), 0); bank.process_transaction(&tx).unwrap(); + assert_eq!(bank.get_signature_status(&tx.signatures[0]), Some(Ok(()))); program_account.pubkey() } @@ -55,6 +59,26 @@ fn test_program_native_noop() { // Call user program let tx = Transaction::new(&mint_keypair, &[], program_id, &1u8, bank.last_id(), 0); bank.process_transaction(&tx).unwrap(); + assert_eq!(bank.get_signature_status(&tx.signatures[0]), Some(Ok(()))); +} + +#[test] +fn test_program_native_failure() { + solana_logger::setup(); + + let (genesis_block, mint_keypair) = GenesisBlock::new(50); + let bank = Bank::new(&genesis_block); + + let program = "failure".as_bytes().to_vec(); + let program_id = load_program(&bank, &mint_keypair, native_loader::id(), program); + + // Call user program + let tx = Transaction::new(&mint_keypair, &[], program_id, &1u8, bank.last_id(), 0); + bank.process_transaction(&tx).unwrap(); + assert_eq!( + bank.get_signature_status(&tx.signatures[0]), + Some(Err(BankError::ProgramError(0, ProgramError::GenericError))) + ); } #[cfg(feature = "bpf_c")] @@ -107,6 +131,7 @@ fn test_program_bpf_c_noop() { 0, ); bank.process_transaction(&tx).unwrap(); + assert_eq!(bank.get_signature_status(&tx.signatures[0]), Some(Ok(()))); } #[cfg(feature = "bpf_c")] @@ -150,6 +175,7 @@ fn test_program_bpf_c() { 0, ); bank.process_transaction(&tx).unwrap(); + assert_eq!(bank.get_signature_status(&tx.signatures[0]), Some(Ok(()))); } } @@ -189,5 +215,6 @@ fn test_program_bpf_rust() { 0, ); bank.process_transaction(&tx).unwrap(); + assert_eq!(bank.get_signature_status(&tx.signatures[0]), Some(Ok(()))); } }