2019-01-21 10:48:40 -08:00
|
|
|
use bincode::serialize;
|
|
|
|
use reqwest;
|
|
|
|
use reqwest::header::CONTENT_TYPE;
|
|
|
|
use serde_json::{json, Value};
|
|
|
|
use solana::bank::Bank;
|
|
|
|
use solana::cluster_info::Node;
|
2019-01-24 12:04:04 -08:00
|
|
|
use solana::db_ledger::create_tmp_ledger;
|
2019-01-21 10:48:40 -08:00
|
|
|
use solana::fullnode::Fullnode;
|
2019-01-24 12:04:04 -08:00
|
|
|
use solana::genesis_block::GenesisBlock;
|
2019-01-21 10:48:40 -08:00
|
|
|
use solana::leader_scheduler::LeaderScheduler;
|
|
|
|
use solana::rpc_request::get_rpc_request_str;
|
|
|
|
use solana::storage_stage::STORAGE_ROTATE_TEST_COUNT;
|
|
|
|
use solana::vote_signer_proxy::VoteSignerProxy;
|
|
|
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
|
|
|
use solana_sdk::system_transaction::SystemTransaction;
|
|
|
|
use solana_sdk::transaction::Transaction;
|
|
|
|
use std::fs::remove_dir_all;
|
|
|
|
use std::sync::{Arc, RwLock};
|
|
|
|
use std::thread::sleep;
|
|
|
|
use std::time::Duration;
|
|
|
|
|
|
|
|
#[test]
|
2019-01-22 19:03:50 -08:00
|
|
|
#[ignore]
|
2019-01-21 10:48:40 -08:00
|
|
|
fn test_rpc_send_tx() {
|
|
|
|
let leader_keypair = Arc::new(Keypair::new());
|
|
|
|
let leader = Node::new_localhost_with_pubkey(leader_keypair.pubkey());
|
|
|
|
|
2019-01-24 12:04:04 -08:00
|
|
|
let (genesis_block, alice) = GenesisBlock::new(10_000_000);
|
|
|
|
let mut bank = Bank::new(&genesis_block);
|
2019-01-21 10:48:40 -08:00
|
|
|
let bob_pubkey = Keypair::new().pubkey();
|
|
|
|
let leader_data = leader.info.clone();
|
2019-01-24 12:04:04 -08:00
|
|
|
let ledger_path = create_tmp_ledger("rpc_send_tx", &genesis_block);
|
2019-01-21 10:48:40 -08:00
|
|
|
|
|
|
|
let last_id = bank.last_id();
|
2019-01-24 12:04:04 -08:00
|
|
|
let tx = Transaction::system_move(&alice, bob_pubkey, 20, last_id, 0);
|
2019-01-21 10:48:40 -08:00
|
|
|
let serial_tx = serialize(&tx).unwrap();
|
|
|
|
|
|
|
|
let leader_scheduler = Arc::new(RwLock::new(LeaderScheduler::from_bootstrap_leader(
|
|
|
|
leader_data.id,
|
|
|
|
)));
|
|
|
|
bank.leader_scheduler = leader_scheduler;
|
|
|
|
|
|
|
|
let vote_account_keypair = Arc::new(Keypair::new());
|
2019-01-25 19:47:05 -07:00
|
|
|
let vote_signer = VoteSignerProxy::new_local(&vote_account_keypair);
|
2019-01-24 12:04:04 -08:00
|
|
|
let entry_height = 0;
|
2019-01-21 10:48:40 -08:00
|
|
|
let server = Fullnode::new_with_bank(
|
|
|
|
leader_keypair,
|
2019-01-23 18:05:06 -08:00
|
|
|
Some(Arc::new(vote_signer)),
|
2019-01-21 10:48:40 -08:00
|
|
|
bank,
|
2019-01-24 12:04:04 -08:00
|
|
|
&ledger_path,
|
2019-01-21 10:48:40 -08:00
|
|
|
entry_height,
|
|
|
|
&last_id,
|
|
|
|
leader,
|
|
|
|
None,
|
|
|
|
false,
|
|
|
|
None,
|
|
|
|
STORAGE_ROTATE_TEST_COUNT,
|
|
|
|
);
|
|
|
|
|
|
|
|
let client = reqwest::Client::new();
|
|
|
|
let request = json!({
|
|
|
|
"jsonrpc": "2.0",
|
|
|
|
"id": 1,
|
|
|
|
"method": "sendTransaction",
|
|
|
|
"params": json!([serial_tx])
|
|
|
|
});
|
|
|
|
let rpc_addr = leader_data.rpc;
|
|
|
|
let rpc_string = get_rpc_request_str(rpc_addr, false);
|
|
|
|
let mut response = client
|
|
|
|
.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 signature = &json["result"];
|
|
|
|
|
|
|
|
let mut confirmed_tx = false;
|
|
|
|
|
|
|
|
let client = reqwest::Client::new();
|
|
|
|
let request = json!({
|
|
|
|
"jsonrpc": "2.0",
|
|
|
|
"id": 1,
|
|
|
|
"method": "confirmTransaction",
|
|
|
|
"params": [signature],
|
|
|
|
});
|
|
|
|
|
|
|
|
for _ in 0..5 {
|
|
|
|
let mut response = client
|
|
|
|
.post(&rpc_string)
|
|
|
|
.header(CONTENT_TYPE, "application/json")
|
|
|
|
.body(request.to_string())
|
|
|
|
.send()
|
|
|
|
.unwrap();
|
|
|
|
let response_json_text = response.text().unwrap();
|
|
|
|
let json: Value = serde_json::from_str(&response_json_text).unwrap();
|
|
|
|
|
|
|
|
if true == json["result"] {
|
|
|
|
confirmed_tx = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
sleep(Duration::from_millis(250));
|
|
|
|
}
|
|
|
|
|
|
|
|
assert_eq!(confirmed_tx, true);
|
|
|
|
|
|
|
|
server.close().unwrap();
|
|
|
|
remove_dir_all(ledger_path).unwrap();
|
|
|
|
}
|