2019-01-21 10:48:40 -08:00
|
|
|
use bincode::serialize;
|
2019-01-29 17:03:32 -08:00
|
|
|
use log::*;
|
2019-09-24 14:10:59 -06:00
|
|
|
use reqwest::{self, header::CONTENT_TYPE};
|
2019-01-21 10:48:40 -08:00
|
|
|
use serde_json::{json, Value};
|
2019-03-16 22:37:20 -07:00
|
|
|
use solana_client::rpc_client::get_rpc_request_str;
|
2019-08-21 10:23:33 -07:00
|
|
|
use solana_core::validator::new_validator_for_tests;
|
2019-01-29 17:03:32 -08:00
|
|
|
use solana_sdk::hash::Hash;
|
2019-03-30 21:37:33 -06:00
|
|
|
use solana_sdk::pubkey::Pubkey;
|
2019-04-03 09:45:57 -06:00
|
|
|
use solana_sdk::system_transaction;
|
2019-01-21 10:48:40 -08:00
|
|
|
use std::fs::remove_dir_all;
|
|
|
|
use std::thread::sleep;
|
|
|
|
use std::time::Duration;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_rpc_send_tx() {
|
2019-01-29 17:03:32 -08:00
|
|
|
solana_logger::setup();
|
|
|
|
|
2019-05-23 22:05:16 -07:00
|
|
|
let (server, leader_data, alice, ledger_path) = new_validator_for_tests();
|
2019-03-30 21:37:33 -06:00
|
|
|
let bob_pubkey = Pubkey::new_rand();
|
2019-01-21 10:48:40 -08:00
|
|
|
|
2020-01-08 13:31:43 -07:00
|
|
|
let client = reqwest::blocking::Client::new();
|
2019-01-29 17:03:32 -08:00
|
|
|
let request = json!({
|
|
|
|
"jsonrpc": "2.0",
|
|
|
|
"id": 1,
|
2019-03-02 10:25:16 -08:00
|
|
|
"method": "getRecentBlockhash",
|
2019-01-29 17:03:32 -08:00
|
|
|
"params": json!([])
|
|
|
|
});
|
|
|
|
let rpc_addr = leader_data.rpc;
|
|
|
|
let rpc_string = get_rpc_request_str(rpc_addr, false);
|
2020-01-08 13:31:43 -07:00
|
|
|
let response = client
|
2019-01-29 17:03:32 -08:00
|
|
|
.post(&rpc_string)
|
2019-09-24 14:10:59 -06:00
|
|
|
.header(CONTENT_TYPE, "application/json")
|
|
|
|
.body(request.to_string())
|
|
|
|
.send()
|
|
|
|
.unwrap();
|
|
|
|
let json: Value = serde_json::from_str(&response.text().unwrap()).unwrap();
|
2020-01-15 00:25:45 -07:00
|
|
|
let blockhash: Hash = json["result"]["value"]["blockhash"]
|
2019-11-12 14:49:41 -05:00
|
|
|
.as_str()
|
|
|
|
.unwrap()
|
|
|
|
.parse()
|
|
|
|
.unwrap();
|
2019-01-29 17:03:32 -08:00
|
|
|
|
2019-03-02 10:25:16 -08:00
|
|
|
info!("blockhash: {:?}", blockhash);
|
2019-05-20 10:03:19 -07:00
|
|
|
let tx = system_transaction::transfer(&alice, &bob_pubkey, 20, blockhash);
|
2020-01-21 22:16:07 -07:00
|
|
|
let serialized_encoded_tx = bs58::encode(serialize(&tx).unwrap()).into_string();
|
2019-01-21 10:48:40 -08:00
|
|
|
|
2020-01-08 13:31:43 -07:00
|
|
|
let client = reqwest::blocking::Client::new();
|
2019-01-21 10:48:40 -08:00
|
|
|
let request = json!({
|
|
|
|
"jsonrpc": "2.0",
|
|
|
|
"id": 1,
|
|
|
|
"method": "sendTransaction",
|
2020-01-21 22:16:07 -07:00
|
|
|
"params": json!([serialized_encoded_tx])
|
2019-01-21 10:48:40 -08:00
|
|
|
});
|
|
|
|
let rpc_addr = leader_data.rpc;
|
|
|
|
let rpc_string = get_rpc_request_str(rpc_addr, false);
|
2020-01-08 13:31:43 -07:00
|
|
|
let response = client
|
2019-01-21 10:48:40 -08:00
|
|
|
.post(&rpc_string)
|
2019-09-24 14:10:59 -06:00
|
|
|
.header(CONTENT_TYPE, "application/json")
|
|
|
|
.body(request.to_string())
|
|
|
|
.send()
|
|
|
|
.unwrap();
|
|
|
|
let json: Value = serde_json::from_str(&response.text().unwrap()).unwrap();
|
2019-01-21 10:48:40 -08:00
|
|
|
let signature = &json["result"];
|
|
|
|
|
|
|
|
let mut confirmed_tx = false;
|
|
|
|
|
2020-01-08 13:31:43 -07:00
|
|
|
let client = reqwest::blocking::Client::new();
|
2019-01-21 10:48:40 -08:00
|
|
|
let request = json!({
|
|
|
|
"jsonrpc": "2.0",
|
|
|
|
"id": 1,
|
|
|
|
"method": "confirmTransaction",
|
|
|
|
"params": [signature],
|
|
|
|
});
|
|
|
|
|
2019-09-06 14:30:56 -07:00
|
|
|
for _ in 0..solana_sdk::clock::DEFAULT_TICKS_PER_SLOT {
|
2020-01-08 13:31:43 -07:00
|
|
|
let response = client
|
2019-01-21 10:48:40 -08:00
|
|
|
.post(&rpc_string)
|
2019-09-24 14:10:59 -06:00
|
|
|
.header(CONTENT_TYPE, "application/json")
|
|
|
|
.body(request.to_string())
|
|
|
|
.send()
|
|
|
|
.unwrap();
|
|
|
|
let response_json_text = response.text().unwrap();
|
2019-01-21 10:48:40 -08:00
|
|
|
let json: Value = serde_json::from_str(&response_json_text).unwrap();
|
|
|
|
|
2019-11-12 14:49:41 -05:00
|
|
|
if true == json["result"]["value"] {
|
2019-01-21 10:48:40 -08:00
|
|
|
confirmed_tx = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2019-01-29 17:03:32 -08:00
|
|
|
sleep(Duration::from_millis(500));
|
2019-01-21 10:48:40 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
assert_eq!(confirmed_tx, true);
|
|
|
|
|
2019-03-03 16:44:06 -08:00
|
|
|
server.close().unwrap();
|
2019-01-21 10:48:40 -08:00
|
|
|
remove_dir_all(ledger_path).unwrap();
|
|
|
|
}
|
2019-11-14 11:41:26 -05:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_rpc_invalid_requests() {
|
|
|
|
solana_logger::setup();
|
|
|
|
|
|
|
|
let (server, leader_data, _alice, ledger_path) = new_validator_for_tests();
|
|
|
|
let bob_pubkey = Pubkey::new_rand();
|
|
|
|
|
|
|
|
// test invalid get_balance request
|
2020-01-08 13:31:43 -07:00
|
|
|
let client = reqwest::blocking::Client::new();
|
2019-11-14 11:41:26 -05:00
|
|
|
let request = json!({
|
|
|
|
"jsonrpc": "2.0",
|
|
|
|
"id": 1,
|
|
|
|
"method": "getBalance",
|
|
|
|
"params": json!(["invalid9999"])
|
|
|
|
});
|
|
|
|
let rpc_addr = leader_data.rpc;
|
|
|
|
let rpc_string = get_rpc_request_str(rpc_addr, false);
|
2020-01-08 13:31:43 -07:00
|
|
|
let response = client
|
2019-11-14 11:41:26 -05:00
|
|
|
.post(&rpc_string)
|
|
|
|
.header(CONTENT_TYPE, "application/json")
|
|
|
|
.body(request.to_string())
|
|
|
|
.send()
|
|
|
|
.unwrap();
|
|
|
|
let json: Value = serde_json::from_str(&response.text().unwrap()).unwrap();
|
|
|
|
let the_error = json["error"]["message"].as_str().unwrap();
|
|
|
|
assert_eq!(the_error, "Invalid request");
|
|
|
|
|
|
|
|
// test invalid get_account_info request
|
2020-01-08 13:31:43 -07:00
|
|
|
let client = reqwest::blocking::Client::new();
|
2019-11-14 11:41:26 -05:00
|
|
|
let request = json!({
|
|
|
|
"jsonrpc": "2.0",
|
|
|
|
"id": 1,
|
|
|
|
"method": "getAccountInfo",
|
|
|
|
"params": json!(["invalid9999"])
|
|
|
|
});
|
|
|
|
let rpc_addr = leader_data.rpc;
|
|
|
|
let rpc_string = get_rpc_request_str(rpc_addr, false);
|
2020-01-08 13:31:43 -07:00
|
|
|
let response = client
|
2019-11-14 11:41:26 -05:00
|
|
|
.post(&rpc_string)
|
|
|
|
.header(CONTENT_TYPE, "application/json")
|
|
|
|
.body(request.to_string())
|
|
|
|
.send()
|
|
|
|
.unwrap();
|
|
|
|
let json: Value = serde_json::from_str(&response.text().unwrap()).unwrap();
|
|
|
|
let the_error = json["error"]["message"].as_str().unwrap();
|
|
|
|
assert_eq!(the_error, "Invalid request");
|
|
|
|
|
|
|
|
// test invalid get_account_info request
|
2020-01-08 13:31:43 -07:00
|
|
|
let client = reqwest::blocking::Client::new();
|
2019-11-14 11:41:26 -05:00
|
|
|
let request = json!({
|
|
|
|
"jsonrpc": "2.0",
|
|
|
|
"id": 1,
|
|
|
|
"method": "getAccountInfo",
|
|
|
|
"params": json!([bob_pubkey.to_string()])
|
|
|
|
});
|
|
|
|
let rpc_addr = leader_data.rpc;
|
|
|
|
let rpc_string = get_rpc_request_str(rpc_addr, false);
|
2020-01-08 13:31:43 -07:00
|
|
|
let response = client
|
2019-11-14 11:41:26 -05:00
|
|
|
.post(&rpc_string)
|
|
|
|
.header(CONTENT_TYPE, "application/json")
|
|
|
|
.body(request.to_string())
|
|
|
|
.send()
|
|
|
|
.unwrap();
|
|
|
|
let json: Value = serde_json::from_str(&response.text().unwrap()).unwrap();
|
|
|
|
let the_value = &json["result"]["value"];
|
|
|
|
assert!(the_value.is_null());
|
|
|
|
|
|
|
|
server.close().unwrap();
|
|
|
|
remove_dir_all(ledger_path).unwrap();
|
|
|
|
}
|