extern crate jsonrpc;
extern crate futures;
extern crate serde;
#[macro_use] extern crate log;
extern crate env_logger;
mod tests_sample_types;
use jsonrpc::method_types::MethodResult;
use jsonrpc::EndpointHandler;
use jsonrpc::Endpoint;
use jsonrpc::RequestFuture;
use jsonrpc::NullRequestHandler;
use jsonrpc::map_request_handler::MapRequestHandler;
use jsonrpc::output_agent::OutputAgent;
use jsonrpc::service_util::{WriteLineMessageWriter, ReadLineMessageReader};
use std::thread;
use std::net::{TcpStream, TcpListener};
use std::io::BufReader;
use futures::Future;
use tests_sample_types::Point;
use log::LogLevelFilter;
use env_logger::LogBuilder;
fn my_method(params: Point) -> MethodResult<String, ()> {
Ok(format!("Got params: x: {}, y: {}.", params.x, params.y))
}
#[test]
pub fn test_client_server_communication() {
init_logger(LogLevelFilter::Info);
info!("Running example...");
let listener = TcpListener::bind(("127.0.0.1", 0)).unwrap();
let local_addr = listener.local_addr().unwrap();
thread::spawn(|| {
run_server_listener(listener)
});
let stream = TcpStream::connect(local_addr).unwrap();
let msg_writer = WriteLineMessageWriter(stream.try_clone().expect("Failed to clone stream"));
let output_agent = OutputAgent::start_with_provider(|| msg_writer);
let mut endpoint = Endpoint::start_with(output_agent);
let endpoint2 = endpoint.clone();
thread::spawn(|| {
let request_handler = NullRequestHandler{};
let endpoint = EndpointHandler::create(endpoint2, Box::new(request_handler));
let mut msg_reader = ReadLineMessageReader(BufReader::new(stream));
endpoint.run_message_read_loop(&mut msg_reader).ok();
});
let params = Point{ x: 10, y: 20};
let future = endpoint.send_request("my_method", params);
let future : RequestFuture<String, ()> = future.expect("Failed to send RPC request to for `my_method`.");
let response_result = future.wait().unwrap();
let result : String = response_result.unwrap_result().unwrap();
assert_eq!(result, "Got params: x: 10, y: 20.".to_string());
endpoint.shutdown_and_join();
}
fn run_server_listener(listener: TcpListener) {
for stream in listener.incoming() {
let stream = stream.expect("TCP listen error.");
thread::spawn(move|| handle_server_connection(stream));
break; }
drop(listener);
}
fn handle_server_connection(stream: TcpStream) {
let mut request_handler = MapRequestHandler::new();
request_handler.add_request("my_method", Box::new(my_method));
let msg_writer = WriteLineMessageWriter(stream.try_clone().expect("Failed to clone stream"));
let endpoint = EndpointHandler::create_with_writer(msg_writer, Box::new(request_handler));
let mut msg_reader = ReadLineMessageReader(BufReader::new(stream));
endpoint.run_message_read_loop(&mut msg_reader).ok();
}
fn init_logger(level: LogLevelFilter) {
let mut builder = LogBuilder::new();
builder.filter(None, level);
if let Ok(rustlog_env_var) = std::env::var("RUST_LOG") {
builder.parse(&rustlog_env_var);
}
builder.init().unwrap();
}