diff --git a/Cargo.lock b/Cargo.lock index 1f22d8f06e..aded9d1039 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2091,6 +2091,7 @@ name = "solana-failure" version = "0.12.0" dependencies = [ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-runtime 0.12.0", "solana-sdk 0.12.0", ] @@ -2211,6 +2212,7 @@ version = "0.12.0" dependencies = [ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "solana-logger 0.12.0", + "solana-runtime 0.12.0", "solana-sdk 0.12.0", ] @@ -2220,11 +2222,8 @@ 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", - "solana-runtime 0.12.0", "solana-sdk 0.12.0", ] diff --git a/programs/Cargo.toml b/programs/Cargo.toml index d6ebd156c0..de67375adf 100644 --- a/programs/Cargo.toml +++ b/programs/Cargo.toml @@ -22,9 +22,4 @@ solana = { path = "../core", version = "0.12.0" } solana-bpfloader = { path = "bpf_loader", version = "0.12.0" } solana-logger = { path = "../logger", version = "0.12.0" } solana-native-loader = { path = "native_loader", version = "0.12.0" } -solana-runtime = { path = "../runtime", version = "0.12.0" } solana-sdk = { path = "../sdk", version = "0.12.0" } - -[dev-dependencies] -solana-noop = { path = "noop", version = "0.12.0" } -solana-failure = { path = "failure", version = "0.12.0" } diff --git a/programs/failure/Cargo.toml b/programs/failure/Cargo.toml index 8433f310d1..e3a09e9112 100644 --- a/programs/failure/Cargo.toml +++ b/programs/failure/Cargo.toml @@ -12,6 +12,9 @@ edition = "2018" solana-sdk = { path = "../../sdk", version = "0.12.0" } log = "0.4.2" +[dev-dependencies] +solana-runtime = { path = "../../runtime", version = "0.12.0" } + [lib] name = "failure" crate-type = ["cdylib"] diff --git a/programs/failure/tests/failure.rs b/programs/failure/tests/failure.rs new file mode 100644 index 0000000000..d2896f9930 --- /dev/null +++ b/programs/failure/tests/failure.rs @@ -0,0 +1,30 @@ +use solana_runtime::bank::Bank; +use solana_runtime::bank::BankError; +use solana_runtime::loader_utils::load_program; +use solana_sdk::genesis_block::GenesisBlock; +use solana_sdk::native_loader; +use solana_sdk::native_program::ProgramError; +use solana_sdk::transaction::Transaction; + +#[test] +fn test_program_native_failure() { + 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_blockhash(), + 0, + ); + assert_eq!( + bank.process_transaction(&tx), + Err(BankError::ProgramError(0, ProgramError::GenericError)) + ); +} diff --git a/programs/noop/Cargo.toml b/programs/noop/Cargo.toml index 5720256572..dfd5949661 100644 --- a/programs/noop/Cargo.toml +++ b/programs/noop/Cargo.toml @@ -13,6 +13,9 @@ solana-sdk = { path = "../../sdk", version = "0.12.0" } solana-logger = { path = "../../logger", version = "0.12.0" } log = "0.4.2" +[dev-dependencies] +solana-runtime = { path = "../../runtime", version = "0.12.0" } + [lib] name = "noop" crate-type = ["cdylib"] diff --git a/programs/noop/tests/noop.rs b/programs/noop/tests/noop.rs new file mode 100644 index 0000000000..733a35cf11 --- /dev/null +++ b/programs/noop/tests/noop.rs @@ -0,0 +1,28 @@ +use solana_runtime::bank::Bank; +use solana_runtime::loader_utils::load_program; +use solana_sdk::genesis_block::GenesisBlock; +use solana_sdk::native_loader; +use solana_sdk::transaction::Transaction; + +#[test] +fn test_program_native_noop() { + solana_logger::setup(); + + let (genesis_block, mint_keypair) = GenesisBlock::new(50); + let bank = Bank::new(&genesis_block); + + let program = "noop".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_blockhash(), + 0, + ); + bank.process_transaction(&tx).unwrap(); + assert_eq!(bank.get_signature_status(&tx.signatures[0]), Some(Ok(()))); +} diff --git a/programs/tests/programs.rs b/programs/tests/programs.rs index 902f499c50..2ae46265d4 100644 --- a/programs/tests/programs.rs +++ b/programs/tests/programs.rs @@ -1,99 +1,3 @@ -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; -use solana_sdk::transaction::Transaction; - -fn load_program(bank: &Bank, from: &Keypair, loader_id: Pubkey, program: Vec) -> Pubkey { - let program_account = Keypair::new(); - - let tx = SystemTransaction::new_program_account( - from, - program_account.pubkey(), - bank.last_blockhash(), - 1, - program.len() as u64, - loader_id, - 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; - for chunk in program.chunks(chunk_size) { - let tx = LoaderTransaction::new_write( - &program_account, - loader_id, - offset, - chunk.to_vec(), - bank.last_blockhash(), - 0, - ); - bank.process_transaction(&tx).unwrap(); - offset += chunk_size as u32; - } - - let tx = LoaderTransaction::new_finalize(&program_account, loader_id, bank.last_blockhash(), 0); - bank.process_transaction(&tx).unwrap(); - assert_eq!(bank.get_signature_status(&tx.signatures[0]), Some(Ok(()))); - - program_account.pubkey() -} - -#[test] -fn test_program_native_noop() { - solana_logger::setup(); - - let (genesis_block, mint_keypair) = GenesisBlock::new(50); - let bank = Bank::new(&genesis_block); - - let program = "noop".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_blockhash(), - 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_blockhash(), - 0, - ); - assert_eq!( - bank.process_transaction(&tx), - Err(BankError::ProgramError(0, ProgramError::GenericError)) - ); -} - #[cfg(feature = "bpf_c")] use solana_sdk::bpf_loader; #[cfg(any(feature = "bpf_c", feature = "bpf_rust"))] diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 3b2e561cca..06876f3c35 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -3,6 +3,7 @@ pub mod appendvec; pub mod bank; pub mod bloom; mod hash_queue; +pub mod loader_utils; mod runtime; mod status_cache;