use futures::*;
use reqwest;
use reqwest::Client;
use super::formats::*;
use crate::common;
use crate::error;
use crate::prelude::{PeerId, PeerInfo};
pub(crate) async fn create_peer(
base_url: &str,
api_key: impl Into<String>,
domain: impl Into<String>,
peer_id: PeerId,
turn: bool,
) -> Result<CreatedResponse, error::Error> {
let peer_options = CreatePeerQuery {
key: api_key.into(),
domain: domain.into(),
peer_id: peer_id,
turn: turn,
};
let api_url = format!("{}/peers", base_url);
let api_call = || Client::new().post(&api_url).json(&peer_options).send();
let parser = |r: reqwest::Response| r.json::<CreatedResponse>().map_err(Into::into);
common::api_access(reqwest::StatusCode::CREATED, false, api_call, parser).await
}
pub(crate) async fn event(base_url: &str, peer_info: &PeerInfo) -> Result<EventEnum, error::Error> {
let api_url = format!(
"{}/peers/{}/events?token={}",
base_url,
peer_info.peer_id.as_str(),
peer_info.token.as_str()
);
let api_call = || {
Client::new()
.get(&api_url)
.header(
reqwest::header::CONTENT_TYPE,
reqwest::header::HeaderValue::from_static("application/json"),
)
.send()
};
let parser = |r: reqwest::Response| r.json::<EventEnum>().map_err(Into::into);
match common::api_access(reqwest::StatusCode::OK, true, api_call, parser).await {
Ok(v) => Ok(v),
Err(e) => match e {
error::Error::MyError { error: message } if message == "recv RequestTimeout" => {
Ok(EventEnum::TIMEOUT)
}
e => Err(e),
},
}
}
pub(crate) async fn delete_peer(base_url: &str, peer_info: &PeerInfo) -> Result<(), error::Error> {
let api_url = format!(
"{}/peers/{}?token={}",
base_url,
peer_info.peer_id.as_str(),
peer_info.token.as_str()
);
let api_call = || Client::new().delete(&api_url).send();
let parser = |_| future::ok(());
common::api_access(reqwest::StatusCode::NO_CONTENT, true, api_call, parser).await
}
pub(crate) async fn status(
base_url: &str,
peer_info: &PeerInfo,
) -> Result<PeerStatusMessage, error::Error> {
let api_url = format!(
"{}/peers/{}/status?token={}",
base_url,
peer_info.peer_id.as_str(),
peer_info.token.as_str()
);
let api_call = || Client::new().get(&api_url).send();
let parser = |r: reqwest::Response| r.json::<PeerStatusMessage>().map_err(Into::into);
common::api_access(reqwest::StatusCode::OK, true, api_call, parser).await
}
#[cfg(test)]
mod test_create_peer {
use futures::*;
use serde_json::json;
use crate::error;
use crate::peer::formats::CreatePeerQuery;
use crate::prelude::*;
use helper::server;
#[tokio::test]
async fn recv_201() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |mut req| async move {
if req.uri() == "/peers" && req.method() == reqwest::Method::POST {
let mut full: Vec<u8> = Vec::new();
while let Some(item) = req.body_mut().next().await {
full.extend(&*item.unwrap());
}
let peer_options: CreatePeerQuery =
serde_json::from_slice(&full).expect("PeerOptions parse error");
let json = json!({
"command_type": "PEERS_CREATE",
"params": {
"peer_id": peer_options.peer_id,
"token": Token::new("test-token"),
}
});
http::Response::builder()
.status(hyper::StatusCode::CREATED)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let task = super::create_peer(&addr, "api_key", "domain", peer_id.clone(), false);
let result = task.await.expect("CreatedResponse parse error");
assert_eq!(result.command_type, "PEERS_CREATE".to_string());
assert_eq!(result.params.peer_id, peer_id);
assert_eq!(result.params.token, token);
}
#[tokio::test]
async fn recv_201_but_from_another_webserver() {
let peer_id = PeerId::new("hoge");
let server = server::http(move |req| async move {
if req.uri() == "/peers" && req.method() == reqwest::Method::POST {
let json = json!("invalid-message");
http::Response::builder()
.status(hyper::StatusCode::CREATED)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let task = super::create_peer(&addr, "api_key", "domain", peer_id, false);
let result = task.await;
assert!(result.is_err());
if let Err(error::Error::ReqwestError { error: _e }) = result {
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_400() {
let peer_id = PeerId::new("hoge");
let server = server::http(move |req| async move {
if req.uri() == "/peers" && req.method() == reqwest::Method::POST {
let json = json!({
"command_type": "PEERS_CREATE",
"params": {
"errors": [
{
"field": "key",
"message": "key field is not specified"
}
]
}
});
http::Response::builder()
.status(hyper::StatusCode::BAD_REQUEST)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let task = super::create_peer(&addr, "api_key", "domain", peer_id, false);
let result = task.await.err().expect("parse error");
if let error::Error::MyError { error: _e } = result {
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_403() {
let peer_id = PeerId::new("hoge");
let server = server::http(move |req| async move {
if req.uri() == "/peers" && req.method() == reqwest::Method::POST {
let json = json!({});
http::Response::builder()
.status(hyper::StatusCode::FORBIDDEN)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let task = super::create_peer(&addr, "api_key", "domain", peer_id, false);
let result = task.await.err().unwrap();
if let error::Error::MyError { error: _e } = result {
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_405() {
let peer_id = PeerId::new("hoge");
let server = server::http(move |req| async move {
if req.uri() == "/peers" && req.method() == reqwest::Method::POST {
let json = json!({});
http::Response::builder()
.status(hyper::StatusCode::METHOD_NOT_ALLOWED)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let task = super::create_peer(&addr, "api_key", "domain", peer_id, false);
let result = task.await.err().expect("parse error");
if let error::Error::MyError { error: _e } = result {
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_406() {
let peer_id = PeerId::new("hoge");
let server = server::http(move |req| async move {
if req.uri() == "/peers" && req.method() == reqwest::Method::POST {
let json = json!({});
http::Response::builder()
.status(hyper::StatusCode::NOT_ACCEPTABLE)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let task = super::create_peer(&addr, "api_key", "domain", peer_id, false);
let result = task.await.err().expect("parse error");
if let error::Error::MyError { error: _e } = result {
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_408() {
let peer_id = PeerId::new("hoge");
let server = server::http(move |req| async move {
if req.uri() == "/peers" && req.method() == reqwest::Method::POST {
let json = json!({});
http::Response::builder()
.status(hyper::StatusCode::REQUEST_TIMEOUT)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let task = super::create_peer(&addr, "api_key", "domain", peer_id, false);
let result = task.await.err().expect("parse error");
if let error::Error::MyError { error: _e } = result {
} else {
unreachable!();
}
}
#[tokio::test]
async fn no_server() {
let peer_id = PeerId::new("hoge");
let task = super::create_peer("http://localhost:0", "api_key", "domain", peer_id, false);
let result = task.await;
assert!(result.is_err());
if let Err(error::Error::ReqwestError { error: _e }) = result {
} else {
unreachable!();
}
}
}
#[cfg(test)]
mod test_event {
use serde_json::json;
use crate::error;
use crate::peer::formats::*;
use helper::server;
#[tokio::test]
async fn recv_200_recv_open() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge/events?token=test-token"
&& req.method() == reqwest::Method::GET
{
let json = json!({
"event": "OPEN",
"params": {
"peer_id": PeerId::new("hoge"),
"token": Token::new("test-token"),
}
});
http::Response::builder()
.status(hyper::StatusCode::OK)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id.clone(),
token: token.clone(),
};
let task = super::event(&addr, &peer_info);
let result = task.await.expect("event parse error");
if let EventEnum::OPEN(response) = result {
assert_eq!(response.params.peer_id, peer_id);
assert_eq!(response.params.token, token);
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_200_recv_connection() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge/events?token=test-token"
&& req.method() == reqwest::Method::GET
{
let json = json!({
"event": "CONNECTION",
"data_params": {
"data_connection_id": "dc-test"
},
"params": {
"peer_id": PeerId::new("hoge"),
"token": Token::new("test-token"),
}
});
http::Response::builder()
.status(hyper::StatusCode::OK)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id.clone(),
token: token.clone(),
};
let task = super::event(&addr, &peer_info);
let result = task.await.expect("event parse error");
if let EventEnum::CONNECTION(response) = result {
assert_eq!(response.params.peer_id, peer_id);
assert_eq!(response.params.token, token);
assert_eq!(response.data_params.data_connection_id.as_str(), "dc-test");
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_200_recv_call() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge/events?token=test-token"
&& req.method() == reqwest::Method::GET
{
let json = json!({
"event": "CALL",
"call_params": {
"media_connection_id": "mc-test"
},
"params": {
"peer_id": PeerId::new("hoge"),
"token": Token::new("test-token"),
}
});
http::Response::builder()
.status(hyper::StatusCode::OK)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id.clone(),
token: token.clone(),
};
let task = super::event(&addr, &peer_info);
let result = task.await.expect("event parse error");
if let EventEnum::CALL(response) = result {
assert_eq!(response.params.peer_id, peer_id);
assert_eq!(response.params.token, token);
assert_eq!(response.call_params.media_connection_id.as_str(), "mc-test");
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_200_recv_close() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge/events?token=test-token"
&& req.method() == reqwest::Method::GET
{
let json = json!({
"event": "CLOSE",
"params": {
"peer_id": PeerId::new("hoge"),
"token": Token::new("test-token"),
}
});
http::Response::builder()
.status(hyper::StatusCode::OK)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id.clone(),
token: token.clone(),
};
let task = super::event(&addr, &peer_info);
let result = task.await.expect("event parse error");
if let EventEnum::CLOSE(response) = result {
assert_eq!(response.params.peer_id, peer_id);
assert_eq!(response.params.token, token);
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_200_recv_error() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge/events?token=test-token"
&& req.method() == reqwest::Method::GET
{
let json = json!({
"event": "ERROR",
"params": {
"peer_id": PeerId::new("hoge"),
"token": Token::new("test-token"),
},
"error_message": "error"
});
http::Response::builder()
.status(hyper::StatusCode::OK)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id.clone(),
token: token.clone(),
};
let task = super::event(&addr, &peer_info);
let result = task.await.expect("event parse error");
if let EventEnum::ERROR(response) = result {
assert_eq!(response.params.peer_id, peer_id);
assert_eq!(response.params.token, token);
assert_eq!(response.error_message, "error");
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_200_but_recv_invalid_json() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge/events?token=test-token"
&& req.method() == reqwest::Method::GET
{
let json = json!({
"event": "OPEN",
});
http::Response::builder()
.status(hyper::StatusCode::OK)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id,
token: token,
};
let task = super::event(&addr, &peer_info);
let result = task.await;
assert!(result.is_err());
}
#[tokio::test]
async fn recv_400() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge/events?token=test-token"
&& req.method() == reqwest::Method::GET
{
let json = json!({
"command_type": "PEERS_EVENTS",
"params": {
"errors": [
{
"field": "peer_id",
"message": "peer_id field is not specified"
}
]
}
});
http::Response::builder()
.status(hyper::StatusCode::BAD_REQUEST)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id,
token: token,
};
let task = super::event(&addr, &peer_info);
let result = task.await.err().expect("parse error");
if let error::Error::MyError { error: _e } = result {
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_403() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge/events?token=test-token"
&& req.method() == reqwest::Method::GET
{
let json = json!({});
http::Response::builder()
.status(hyper::StatusCode::FORBIDDEN)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id,
token: token,
};
let task = super::event(&addr, &peer_info);
let result = task.await.err().expect("parse error");
if let error::Error::MyError { error: _e } = result {
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_404() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge/events?token=test-token"
&& req.method() == reqwest::Method::GET
{
let json = json!({});
http::Response::builder()
.status(hyper::StatusCode::NOT_FOUND)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id,
token: token,
};
let task = super::event(&addr, &peer_info);
let result = task.await.err().expect("parse error");
if let error::Error::MyError { error: _e } = result {
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_405() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge/events?token=test-token"
&& req.method() == reqwest::Method::GET
{
let json = json!({});
http::Response::builder()
.status(hyper::StatusCode::METHOD_NOT_ALLOWED)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id,
token: token,
};
let task = super::event(&addr, &peer_info);
let result = task.await.err().expect("parse error");
if let error::Error::MyError { error: _e } = result {
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_406() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge/events?token=test-token"
&& req.method() == reqwest::Method::GET
{
let json = json!({});
http::Response::builder()
.status(hyper::StatusCode::NOT_ACCEPTABLE)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id,
token: token,
};
let task = super::event(&addr, &peer_info);
let result = task.await.err().expect("parse error");
if let error::Error::MyError { error: _e } = result {
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_408() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge/events?token=test-token"
&& req.method() == reqwest::Method::GET
{
let json = json!({});
http::Response::builder()
.status(hyper::StatusCode::REQUEST_TIMEOUT)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id,
token: token,
};
let task = super::event(&addr, &peer_info);
let result = task.await.expect("parse error");
assert_eq!(result, EventEnum::TIMEOUT);
}
}
#[cfg(test)]
mod test_delete_peer {
use serde_json::json;
use crate::error;
use crate::peer::api::*;
use crate::prelude::*;
use helper::server;
#[tokio::test]
async fn recv_204() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge?token=test-token"
&& req.method() == reqwest::Method::DELETE
{
let json = json!({});
http::Response::builder()
.status(hyper::StatusCode::NO_CONTENT)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id,
token: token,
};
let task = super::delete_peer(&addr, &peer_info);
let result = task.await;
assert!(result.is_ok());
}
#[tokio::test]
async fn recv_400() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge?token=test-token"
&& req.method() == reqwest::Method::DELETE
{
let json = json!({
"command_type": "PEERS_DELETE",
"params": {
"errors": [
{
"field": "key",
"message": "key field is not specified"
}
]
}
});
http::Response::builder()
.status(hyper::StatusCode::BAD_REQUEST)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id,
token: token,
};
let task = super::delete_peer(&addr, &peer_info);
let result = task.await.err().expect("parse error");
if let error::Error::MyError { error: _e } = result {
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_403() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge?token=test-token"
&& req.method() == reqwest::Method::DELETE
{
let json = json!({});
http::Response::builder()
.status(hyper::StatusCode::FORBIDDEN)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id,
token: token,
};
let task = super::delete_peer(&addr, &peer_info);
let result = task.await.err().expect("parse error");
if let error::Error::MyError { error: _e } = result {
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_404() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge?token=test-token"
&& req.method() == reqwest::Method::DELETE
{
let json = json!({});
http::Response::builder()
.status(hyper::StatusCode::NOT_FOUND)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id,
token: token,
};
let task = super::delete_peer(&addr, &peer_info);
let result = task.await.err().expect("parse error");
if let error::Error::MyError { error: _e } = result {
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_405() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge?token=test-token"
&& req.method() == reqwest::Method::DELETE
{
let json = json!({});
http::Response::builder()
.status(hyper::StatusCode::METHOD_NOT_ALLOWED)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id,
token: token,
};
let task = super::delete_peer(&addr, &peer_info);
let result = task.await.err().expect("parse error");
if let error::Error::MyError { error: _e } = result {
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_408() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge?token=test-token"
&& req.method() == reqwest::Method::DELETE
{
let json = json!({});
http::Response::builder()
.status(hyper::StatusCode::REQUEST_TIMEOUT)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id,
token: token,
};
let task = super::delete_peer(&addr, &peer_info);
let result = task.await.err().expect("parse error");
if let error::Error::MyError { error: _e } = result {
} else {
unreachable!();
}
}
}
#[cfg(test)]
mod test_status {
use serde_json::json;
use crate::error;
use crate::peer::formats::*;
use helper::server;
#[tokio::test]
async fn recv_200() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge/status?token=test-token"
&& req.method() == reqwest::Method::GET
{
let json = json!({
"peer_id": PeerId::new("hoge"),
"disconnected": false
});
http::Response::builder()
.status(hyper::StatusCode::OK)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id.clone(),
token: token.clone(),
};
let task = super::status(&addr, &peer_info);
let status: PeerStatusMessage = task.await.expect("parse error");
assert_eq!(status.peer_id, peer_id);
assert_eq!(status.disconnected, false);
}
#[tokio::test]
async fn recv_400() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge/status?token=test-token"
&& req.method() == reqwest::Method::GET
{
let json = json!({
"command_type": "PEERS_STATUS",
"params": {
"errors": [
{
"field": "peer_id",
"message": "peer_id field is not specified"
}
]
}
});
http::Response::builder()
.status(hyper::StatusCode::BAD_REQUEST)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id,
token: token,
};
let task = super::status(&addr, &peer_info);
let result = task.await.err().expect("parse error");
if let error::Error::MyError { error: _e } = result {
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_403() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge/status?token=test-token"
&& req.method() == reqwest::Method::GET
{
let json = json!({});
http::Response::builder()
.status(hyper::StatusCode::FORBIDDEN)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id,
token: token,
};
let task = super::status(&addr, &peer_info);
let result = task.await.err().expect("parse error");
if let error::Error::MyError { error: _e } = result {
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_404() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge/status?token=test-token"
&& req.method() == reqwest::Method::GET
{
let json = json!({});
http::Response::builder()
.status(hyper::StatusCode::NOT_FOUND)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id,
token: token,
};
let task = super::status(&addr, &peer_info);
let result = task.await.err().expect("parse error");
if let error::Error::MyError { error: _e } = result {
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_405() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge/status?token=test-token"
&& req.method() == reqwest::Method::GET
{
let json = json!({});
http::Response::builder()
.status(hyper::StatusCode::METHOD_NOT_ALLOWED)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id,
token: token,
};
let task = super::status(&addr, &peer_info);
let result = task.await.err().expect("parse error");
if let error::Error::MyError { error: _e } = result {
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_406() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge/status?token=test-token"
&& req.method() == reqwest::Method::GET
{
let json = json!({});
http::Response::builder()
.status(hyper::StatusCode::NOT_ACCEPTABLE)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id,
token: token,
};
let task = super::status(&addr, &peer_info);
let result = task.await.err().expect("parse error");
if let error::Error::MyError { error: _e } = result {
} else {
unreachable!();
}
}
#[tokio::test]
async fn recv_408() {
let peer_id = PeerId::new("hoge");
let token = Token::new("test-token");
let server = server::http(move |req| async move {
if req.uri() == "/peers/hoge/status?token=test-token"
&& req.method() == reqwest::Method::GET
{
let json = json!({});
http::Response::builder()
.status(hyper::StatusCode::REQUEST_TIMEOUT)
.header("Content-type", "application/json")
.body(hyper::Body::from(json.to_string()))
.unwrap()
} else {
unreachable!();
}
});
let addr = format!("http://{}", server.addr());
let peer_info = PeerInfo {
peer_id: peer_id,
token: token,
};
let task = super::status(&addr, &peer_info);
let result = task.await.err().expect("parse error");
if let error::Error::MyError { error: _e } = result {
} else {
unreachable!();
}
}
}