Program tests now check signature status (#2965)
This commit is contained in:
parent
ea0837973e
commit
0174945853
|
@ -2075,6 +2075,14 @@ dependencies = [
|
||||||
"solana-sdk 0.12.0",
|
"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]]
|
[[package]]
|
||||||
name = "solana-fullnode"
|
name = "solana-fullnode"
|
||||||
version = "0.12.0"
|
version = "0.12.0"
|
||||||
|
@ -2200,6 +2208,7 @@ version = "0.12.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"solana 0.12.0",
|
"solana 0.12.0",
|
||||||
"solana-bpfloader 0.12.0",
|
"solana-bpfloader 0.12.0",
|
||||||
|
"solana-failure 0.12.0",
|
||||||
"solana-logger 0.12.0",
|
"solana-logger 0.12.0",
|
||||||
"solana-native-loader 0.12.0",
|
"solana-native-loader 0.12.0",
|
||||||
"solana-noop 0.12.0",
|
"solana-noop 0.12.0",
|
||||||
|
|
|
@ -100,6 +100,7 @@ members = [
|
||||||
"programs/native/bpf_loader",
|
"programs/native/bpf_loader",
|
||||||
"programs/native/budget",
|
"programs/native/budget",
|
||||||
"programs/native/erc20",
|
"programs/native/erc20",
|
||||||
|
"programs/native/failure",
|
||||||
"programs/native/native_loader",
|
"programs/native/native_loader",
|
||||||
"programs/native/noop",
|
"programs/native/noop",
|
||||||
"programs/native/rewards",
|
"programs/native/rewards",
|
||||||
|
|
|
@ -27,3 +27,4 @@ solana-sdk = { path = "../sdk", version = "0.12.0" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
solana-noop = { path = "native/noop", version = "0.12.0" }
|
solana-noop = { path = "native/noop", version = "0.12.0" }
|
||||||
|
solana-failure = { path = "native/failure", version = "0.12.0" }
|
||||||
|
|
|
@ -196,7 +196,7 @@ fn entrypoint(
|
||||||
let mut vm = match create_vm(prog) {
|
let mut vm = match create_vm(prog) {
|
||||||
Ok(vm) => vm,
|
Ok(vm) => vm,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
warn!("create_vm failed: {}", e);
|
warn!("Failed to create BPF VM: {}", e);
|
||||||
return Err(ProgramError::GenericError);
|
return Err(ProgramError::GenericError);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -204,11 +204,12 @@ fn entrypoint(
|
||||||
match vm.execute_program(v.as_mut_slice()) {
|
match vm.execute_program(v.as_mut_slice()) {
|
||||||
Ok(status) => {
|
Ok(status) => {
|
||||||
if 0 == status {
|
if 0 == status {
|
||||||
|
warn!("BPF program failed: {}", status);
|
||||||
return Err(ProgramError::GenericError);
|
return Err(ProgramError::GenericError);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
warn!("execute_program failed: {}", e);
|
warn!("BPF VM failed to run program: {}", e);
|
||||||
return Err(ProgramError::GenericError);
|
return Err(ProgramError::GenericError);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
[package]
|
||||||
|
name = "solana-failure"
|
||||||
|
version = "0.12.0"
|
||||||
|
description = "Solana failure program"
|
||||||
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
|
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"]
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
|
@ -1,7 +1,9 @@
|
||||||
use solana_runtime::bank::Bank;
|
use solana_runtime::bank::Bank;
|
||||||
|
use solana_runtime::bank::BankError;
|
||||||
use solana_sdk::genesis_block::GenesisBlock;
|
use solana_sdk::genesis_block::GenesisBlock;
|
||||||
use solana_sdk::loader_transaction::LoaderTransaction;
|
use solana_sdk::loader_transaction::LoaderTransaction;
|
||||||
use solana_sdk::native_loader;
|
use solana_sdk::native_loader;
|
||||||
|
use solana_sdk::native_program::ProgramError;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
use solana_sdk::system_transaction::SystemTransaction;
|
use solana_sdk::system_transaction::SystemTransaction;
|
||||||
|
@ -20,6 +22,7 @@ fn load_program(bank: &Bank, from: &Keypair, loader_id: Pubkey, program: Vec<u8>
|
||||||
0,
|
0,
|
||||||
);
|
);
|
||||||
bank.process_transaction(&tx).unwrap();
|
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 chunk_size = 256; // Size of chunk just needs to fit into tx
|
||||||
let mut offset = 0;
|
let mut offset = 0;
|
||||||
|
@ -38,6 +41,7 @@ fn load_program(bank: &Bank, from: &Keypair, loader_id: Pubkey, program: Vec<u8>
|
||||||
|
|
||||||
let tx = LoaderTransaction::new_finalize(&program_account, loader_id, bank.last_id(), 0);
|
let tx = LoaderTransaction::new_finalize(&program_account, loader_id, bank.last_id(), 0);
|
||||||
bank.process_transaction(&tx).unwrap();
|
bank.process_transaction(&tx).unwrap();
|
||||||
|
assert_eq!(bank.get_signature_status(&tx.signatures[0]), Some(Ok(())));
|
||||||
|
|
||||||
program_account.pubkey()
|
program_account.pubkey()
|
||||||
}
|
}
|
||||||
|
@ -55,6 +59,26 @@ fn test_program_native_noop() {
|
||||||
// Call user program
|
// Call user program
|
||||||
let tx = Transaction::new(&mint_keypair, &[], program_id, &1u8, bank.last_id(), 0);
|
let tx = Transaction::new(&mint_keypair, &[], program_id, &1u8, bank.last_id(), 0);
|
||||||
bank.process_transaction(&tx).unwrap();
|
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")]
|
#[cfg(feature = "bpf_c")]
|
||||||
|
@ -107,6 +131,7 @@ fn test_program_bpf_c_noop() {
|
||||||
0,
|
0,
|
||||||
);
|
);
|
||||||
bank.process_transaction(&tx).unwrap();
|
bank.process_transaction(&tx).unwrap();
|
||||||
|
assert_eq!(bank.get_signature_status(&tx.signatures[0]), Some(Ok(())));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "bpf_c")]
|
#[cfg(feature = "bpf_c")]
|
||||||
|
@ -150,6 +175,7 @@ fn test_program_bpf_c() {
|
||||||
0,
|
0,
|
||||||
);
|
);
|
||||||
bank.process_transaction(&tx).unwrap();
|
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,
|
0,
|
||||||
);
|
);
|
||||||
bank.process_transaction(&tx).unwrap();
|
bank.process_transaction(&tx).unwrap();
|
||||||
|
assert_eq!(bank.get_signature_status(&tx.signatures[0]), Some(Ok(())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue