WIP binned test case
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
pub mod binnedjson;
|
pub mod binnedjson;
|
||||||
|
pub mod common;
|
||||||
pub mod eventsjson;
|
pub mod eventsjson;
|
||||||
pub mod pulseiddiff;
|
pub mod pulseiddiff;
|
||||||
|
|||||||
@@ -263,6 +263,36 @@ fn binned_d0_json_07() -> Result<(), Error> {
|
|||||||
taskrun::run(fut)
|
taskrun::run(fut)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn binned_inmem_d0_json_00() -> Result<(), Error> {
|
||||||
|
let fut = async {
|
||||||
|
let rh = require_test_hosts_running()?;
|
||||||
|
let cluster = &rh.cluster;
|
||||||
|
let jsv = get_binned_json(
|
||||||
|
Channel {
|
||||||
|
backend: "test-disk-databuffer".into(),
|
||||||
|
name: "const-regular-scalar-i32-be".into(),
|
||||||
|
series: None,
|
||||||
|
},
|
||||||
|
"1970-01-01T00:20:11.000Z",
|
||||||
|
"1970-01-01T00:30:20.000Z",
|
||||||
|
// TODO must use AggKind::TimeWeightedScalar
|
||||||
|
10,
|
||||||
|
cluster,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
debug!("Receveided a response json value: {jsv:?}");
|
||||||
|
let res: items_2::binsdim0::BinsDim0CollectedResult<i32> = serde_json::from_value(jsv)?;
|
||||||
|
// inmem was meant just for functional test, ignores the requested time range
|
||||||
|
assert_eq!(res.ts_anchor_sec(), 1200);
|
||||||
|
assert_eq!(res.len(), 11);
|
||||||
|
assert_eq!(res.range_final(), true);
|
||||||
|
assert_eq!(f32_cmp_near(res.avgs()[0], 42.0), true);
|
||||||
|
Ok(())
|
||||||
|
};
|
||||||
|
taskrun::run(fut)
|
||||||
|
}
|
||||||
|
|
||||||
async fn get_binned_json(
|
async fn get_binned_json(
|
||||||
channel: Channel,
|
channel: Channel,
|
||||||
beg_date: &str,
|
beg_date: &str,
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
use crate::err::ErrConv;
|
||||||
|
use chrono::Utc;
|
||||||
|
use err::Error;
|
||||||
|
use http::StatusCode;
|
||||||
|
use hyper::Body;
|
||||||
|
use netpod::log::*;
|
||||||
|
use netpod::AppendToUrl;
|
||||||
|
use netpod::Cluster;
|
||||||
|
use netpod::HostPort;
|
||||||
|
use netpod::APP_JSON;
|
||||||
|
use query::api4::events::PlainEventsQuery;
|
||||||
|
use serde_json::Value as JsonValue;
|
||||||
|
use url::Url;
|
||||||
|
|
||||||
|
// TODO improve by a more information-rich return type.
|
||||||
|
pub async fn fetch_events_json(query: PlainEventsQuery, cluster: &Cluster) -> Result<JsonValue, Error> {
|
||||||
|
let t1 = Utc::now();
|
||||||
|
let node0 = &cluster.nodes[0];
|
||||||
|
let hp = HostPort::from_node(node0);
|
||||||
|
let mut url = Url::parse(&format!("http://{}:{}/api/4/events", hp.host, hp.port))?;
|
||||||
|
query.append_to_url(&mut url);
|
||||||
|
let url = url;
|
||||||
|
info!("http get {}", url);
|
||||||
|
let req = hyper::Request::builder()
|
||||||
|
.method(http::Method::GET)
|
||||||
|
.uri(url.to_string())
|
||||||
|
.header(http::header::ACCEPT, APP_JSON)
|
||||||
|
.body(Body::empty())
|
||||||
|
.ec()?;
|
||||||
|
let client = hyper::Client::new();
|
||||||
|
let res = client.request(req).await.ec()?;
|
||||||
|
if res.status() != StatusCode::OK {
|
||||||
|
error!("client response {:?}", res);
|
||||||
|
return Err(Error::with_msg_no_trace(format!("bad result {res:?}")));
|
||||||
|
}
|
||||||
|
let buf = hyper::body::to_bytes(res.into_body()).await.ec()?;
|
||||||
|
let s = String::from_utf8_lossy(&buf);
|
||||||
|
let res: JsonValue = serde_json::from_str(&s)?;
|
||||||
|
let pretty = serde_json::to_string_pretty(&res)?;
|
||||||
|
info!("{pretty}");
|
||||||
|
let t2 = chrono::Utc::now();
|
||||||
|
let ms = t2.signed_duration_since(t1).num_milliseconds() as u64;
|
||||||
|
// TODO add timeout
|
||||||
|
info!("time {} ms", ms);
|
||||||
|
Ok(res)
|
||||||
|
}
|
||||||
@@ -1,24 +1,15 @@
|
|||||||
use crate::err::ErrConv;
|
|
||||||
use crate::nodes::require_test_hosts_running;
|
use crate::nodes::require_test_hosts_running;
|
||||||
|
use crate::test::api4::common::fetch_events_json;
|
||||||
use crate::test::f32_iter_cmp_near;
|
use crate::test::f32_iter_cmp_near;
|
||||||
use chrono::Utc;
|
|
||||||
use err::Error;
|
use err::Error;
|
||||||
use http::StatusCode;
|
|
||||||
use hyper::Body;
|
|
||||||
use items_0::WithLen;
|
use items_0::WithLen;
|
||||||
use items_2::eventsdim0::EventsDim0CollectorOutput;
|
use items_2::eventsdim0::EventsDim0CollectorOutput;
|
||||||
use netpod::log::*;
|
use netpod::log::*;
|
||||||
use netpod::range::evrange::NanoRange;
|
use netpod::range::evrange::NanoRange;
|
||||||
use netpod::AppendToUrl;
|
|
||||||
use netpod::Channel;
|
use netpod::Channel;
|
||||||
use netpod::Cluster;
|
|
||||||
use netpod::HostPort;
|
|
||||||
use netpod::APP_JSON;
|
|
||||||
use query::api4::events::PlainEventsQuery;
|
use query::api4::events::PlainEventsQuery;
|
||||||
use serde_json::Value as JsonValue;
|
|
||||||
use url::Url;
|
|
||||||
|
|
||||||
fn make_query<S: Into<String>>(name: S, beg_date: &str, end_date: &str) -> Result<PlainEventsQuery, Error> {
|
pub fn make_query<S: Into<String>>(name: S, beg_date: &str, end_date: &str) -> Result<PlainEventsQuery, Error> {
|
||||||
let channel = Channel {
|
let channel = Channel {
|
||||||
backend: "test-inmem".into(),
|
backend: "test-inmem".into(),
|
||||||
name: name.into(),
|
name: name.into(),
|
||||||
@@ -37,7 +28,7 @@ fn events_plain_json_00() -> Result<(), Error> {
|
|||||||
let rh = require_test_hosts_running()?;
|
let rh = require_test_hosts_running()?;
|
||||||
let cluster = &rh.cluster;
|
let cluster = &rh.cluster;
|
||||||
let query = make_query("inmem-d0-i32", "1970-01-01T00:20:04.000Z", "1970-01-01T00:21:10.000Z")?;
|
let query = make_query("inmem-d0-i32", "1970-01-01T00:20:04.000Z", "1970-01-01T00:21:10.000Z")?;
|
||||||
let jsv = events_plain_json(query, cluster).await?;
|
let jsv = fetch_events_json(query, cluster).await?;
|
||||||
let res: EventsDim0CollectorOutput<i64> = serde_json::from_value(jsv)?;
|
let res: EventsDim0CollectorOutput<i64> = serde_json::from_value(jsv)?;
|
||||||
// inmem was meant just for functional test, ignores the requested time range
|
// inmem was meant just for functional test, ignores the requested time range
|
||||||
assert_eq!(res.ts_anchor_sec(), 1204);
|
assert_eq!(res.ts_anchor_sec(), 1204);
|
||||||
@@ -46,36 +37,3 @@ fn events_plain_json_00() -> Result<(), Error> {
|
|||||||
};
|
};
|
||||||
taskrun::run(fut)
|
taskrun::run(fut)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO improve by a more information-rich return type.
|
|
||||||
async fn events_plain_json(query: PlainEventsQuery, cluster: &Cluster) -> Result<JsonValue, Error> {
|
|
||||||
let t1 = Utc::now();
|
|
||||||
let node0 = &cluster.nodes[0];
|
|
||||||
let hp = HostPort::from_node(node0);
|
|
||||||
let mut url = Url::parse(&format!("http://{}:{}/api/4/events", hp.host, hp.port))?;
|
|
||||||
query.append_to_url(&mut url);
|
|
||||||
let url = url;
|
|
||||||
info!("http get {}", url);
|
|
||||||
let req = hyper::Request::builder()
|
|
||||||
.method(http::Method::GET)
|
|
||||||
.uri(url.to_string())
|
|
||||||
.header(http::header::ACCEPT, APP_JSON)
|
|
||||||
.body(Body::empty())
|
|
||||||
.ec()?;
|
|
||||||
let client = hyper::Client::new();
|
|
||||||
let res = client.request(req).await.ec()?;
|
|
||||||
if res.status() != StatusCode::OK {
|
|
||||||
error!("client response {:?}", res);
|
|
||||||
return Err(Error::with_msg_no_trace(format!("bad result {res:?}")));
|
|
||||||
}
|
|
||||||
let buf = hyper::body::to_bytes(res.into_body()).await.ec()?;
|
|
||||||
let s = String::from_utf8_lossy(&buf);
|
|
||||||
let res: JsonValue = serde_json::from_str(&s)?;
|
|
||||||
let pretty = serde_json::to_string_pretty(&res)?;
|
|
||||||
info!("{pretty}");
|
|
||||||
let t2 = chrono::Utc::now();
|
|
||||||
let ms = t2.signed_duration_since(t1).num_milliseconds() as u64;
|
|
||||||
// TODO add timeout
|
|
||||||
info!("time {} ms", ms);
|
|
||||||
Ok(res)
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user