From ed9cf3566c496e5a8710fb32b8ba2fdb11447c14 Mon Sep 17 00:00:00 2001 From: Tyera Eulberg Date: Mon, 9 Dec 2019 20:35:34 -0700 Subject: [PATCH] Restore status check to bubble up TransactionError (#7383) automerge --- Cargo.lock | 1 + client/Cargo.toml | 1 + client/src/mock_rpc_client_request.rs | 6 +++++ client/src/rpc_client.rs | 32 +++++++++++++++++++++------ 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ecfdbaa5b..63e634a69 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3290,6 +3290,7 @@ dependencies = [ name = "solana-client" version = "0.22.0" dependencies = [ + "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "bincode 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "bs58 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 14.0.5 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/client/Cargo.toml b/client/Cargo.toml index 1fb94a6da..58e7d9ef2 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -23,6 +23,7 @@ solana-net-utils = { path = "../net-utils", version = "0.22.0" } solana-sdk = { path = "../sdk", version = "0.22.0" } [dev-dependencies] +assert_matches = "1.3.0" jsonrpc-core = "14.0.5" jsonrpc-http-server = "14.0.5" solana-logger = { path = "../logger", version = "0.22.0" } diff --git a/client/src/mock_rpc_client_request.rs b/client/src/mock_rpc_client_request.rs index a29e7c273..bca3ddcd1 100644 --- a/client/src/mock_rpc_client_request.rs +++ b/client/src/mock_rpc_client_request.rs @@ -7,6 +7,7 @@ use serde_json::{Number, Value}; use solana_sdk::{ commitment_config::CommitmentConfig, fee_calculator::FeeCalculator, + instruction::InstructionError, transaction::{self, TransactionError}, }; @@ -64,6 +65,11 @@ impl GenericRpcClientRequest for MockRpcClientRequest { RpcRequest::GetSignatureStatus => { let response: Option> = if self.url == "account_in_use" { Some(Err(TransactionError::AccountInUse)) + } else if self.url == "instruction_error" { + Some(Err(TransactionError::InstructionError( + 0, + InstructionError::UninitializedAccount, + ))) } else if self.url == "sig_not_found" { None } else { diff --git a/client/src/rpc_client.rs b/client/src/rpc_client.rs index 4154c4e6b..25106606b 100644 --- a/client/src/rpc_client.rs +++ b/client/src/rpc_client.rs @@ -343,11 +343,15 @@ impl RpcClient { send_retries - 1 }; if send_retries == 0 { - return Err(io::Error::new( - io::ErrorKind::Other, - format!("Transaction {:?} failed: {:?}", signature_str, status), - ) - .into()); + if let Some(err) = status { + return Err(err.unwrap_err().into()); + } else { + return Err(io::Error::new( + io::ErrorKind::Other, + format!("Transaction {:?} failed: {:?}", signature_str, status), + ) + .into()); + } } } } @@ -1014,11 +1018,13 @@ pub fn get_rpc_request_str(rpc_addr: SocketAddr, tls: bool) -> String { mod tests { use super::*; use crate::mock_rpc_client_request::{PUBKEY, SIGNATURE}; + use assert_matches::assert_matches; use jsonrpc_core::{Error, IoHandler, Params}; use jsonrpc_http_server::{AccessControlAllowOrigin, DomainsValidation, ServerBuilder}; use serde_json::Number; use solana_logger; use solana_sdk::{ + instruction::InstructionError, signature::{Keypair, KeypairUtil}, system_transaction, transaction::TransactionError, @@ -1188,9 +1194,21 @@ mod tests { let result = rpc_client.send_and_confirm_transaction(&mut tx, &[&key]); assert!(result.is_err()); - let rpc_client = RpcClient::new_mock("fails".to_string()); + let rpc_client = RpcClient::new_mock("instruction_error".to_string()); let result = rpc_client.send_and_confirm_transaction(&mut tx, &[&key]); - assert!(result.is_err()); + assert_matches!( + result.unwrap_err(), + ClientError::TransactionError(TransactionError::InstructionError( + 0, + InstructionError::UninitializedAccount + )) + ); + + let rpc_client = RpcClient::new_mock("sig_not_found".to_string()); + let result = rpc_client.send_and_confirm_transaction(&mut tx, &[&key]); + if let ClientError::Io(err) = result.unwrap_err() { + assert_eq!(err.kind(), io::ErrorKind::Other); + } } #[test]