Restore status check to bubble up TransactionError (#7383)

automerge
This commit is contained in:
Tyera Eulberg 2019-12-09 20:35:34 -07:00 committed by Grimes
parent d4d246bfd1
commit ed9cf3566c
4 changed files with 33 additions and 7 deletions

1
Cargo.lock generated
View File

@ -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)",

View File

@ -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" }

View File

@ -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<transaction::Result<()>> = 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 {

View File

@ -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]