diff --git a/daqbufp2/src/test/api4.rs b/daqbufp2/src/test/api4.rs index 151dc7f..db060e0 100644 --- a/daqbufp2/src/test/api4.rs +++ b/daqbufp2/src/test/api4.rs @@ -1,3 +1,4 @@ pub mod binnedjson; +pub mod common; pub mod eventsjson; pub mod pulseiddiff; diff --git a/daqbufp2/src/test/api4/binnedjson.rs b/daqbufp2/src/test/api4/binnedjson.rs index a581f68..c09c801 100644 --- a/daqbufp2/src/test/api4/binnedjson.rs +++ b/daqbufp2/src/test/api4/binnedjson.rs @@ -263,6 +263,36 @@ fn binned_d0_json_07() -> Result<(), Error> { 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 = 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( channel: Channel, beg_date: &str, diff --git a/daqbufp2/src/test/api4/common.rs b/daqbufp2/src/test/api4/common.rs new file mode 100644 index 0000000..7be2641 --- /dev/null +++ b/daqbufp2/src/test/api4/common.rs @@ -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 { + 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) +} diff --git a/daqbufp2/src/test/api4/pulseiddiff.rs b/daqbufp2/src/test/api4/pulseiddiff.rs index 08c1bb8..b22ba56 100644 --- a/daqbufp2/src/test/api4/pulseiddiff.rs +++ b/daqbufp2/src/test/api4/pulseiddiff.rs @@ -1,24 +1,15 @@ -use crate::err::ErrConv; use crate::nodes::require_test_hosts_running; +use crate::test::api4::common::fetch_events_json; use crate::test::f32_iter_cmp_near; -use chrono::Utc; use err::Error; -use http::StatusCode; -use hyper::Body; use items_0::WithLen; use items_2::eventsdim0::EventsDim0CollectorOutput; use netpod::log::*; use netpod::range::evrange::NanoRange; -use netpod::AppendToUrl; use netpod::Channel; -use netpod::Cluster; -use netpod::HostPort; -use netpod::APP_JSON; use query::api4::events::PlainEventsQuery; -use serde_json::Value as JsonValue; -use url::Url; -fn make_query>(name: S, beg_date: &str, end_date: &str) -> Result { +pub fn make_query>(name: S, beg_date: &str, end_date: &str) -> Result { let channel = Channel { backend: "test-inmem".into(), name: name.into(), @@ -37,7 +28,7 @@ fn events_plain_json_00() -> Result<(), Error> { let rh = require_test_hosts_running()?; let cluster = &rh.cluster; 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 = serde_json::from_value(jsv)?; // inmem was meant just for functional test, ignores the requested time range assert_eq!(res.ts_anchor_sec(), 1204); @@ -46,36 +37,3 @@ fn events_plain_json_00() -> Result<(), Error> { }; taskrun::run(fut) } - -// TODO improve by a more information-rich return type. -async fn events_plain_json(query: PlainEventsQuery, cluster: &Cluster) -> Result { - 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) -}