use faucet_conformance::{
assert_bounded_memory, assert_config_schema_valid_value, assert_errors_not_panics,
};
use faucet_core::AuthSpec;
use faucet_source_websocket::{
OnParseError, WebsocketAuth, WebsocketSource, WebsocketSourceConfig, WsMessageFormat,
};
use futures::{SinkExt, StreamExt};
use std::time::Duration;
use tokio::net::TcpListener;
use tokio_tungstenite::tungstenite::Message;
const BATCH: usize = 250;
const TOTAL: usize = 5000;
#[test]
fn conformance_config_schema_valid() {
let schema = serde_json::to_value(schemars::schema_for!(WebsocketSourceConfig)).unwrap();
assert_config_schema_valid_value(&schema, "faucet-source-websocket");
}
async fn spawn_pushing_server(count: usize) -> String {
let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
let addr = listener.local_addr().unwrap();
tokio::spawn(async move {
if let Ok((stream, _)) = listener.accept().await {
let mut ws = tokio_tungstenite::accept_async(stream).await.unwrap();
for i in 0..count {
let frame = format!("{{\"id\":{i}}}");
if ws.send(Message::Text(frame.into())).await.is_err() {
return;
}
}
loop {
if ws.next().await.is_none() {
break;
}
}
}
});
format!("ws://{addr}")
}
fn base_config(url: &str) -> WebsocketSourceConfig {
WebsocketSourceConfig {
url: url.to_string(),
auth: AuthSpec::Inline(WebsocketAuth::None),
subscribe_messages: vec![],
message_format: WsMessageFormat::Json,
on_parse_error: OnParseError::Fail,
envelope: false,
ping_interval: None,
max_messages: Some(TOTAL),
idle_timeout: Some(Duration::from_secs(30)),
reconnect: false,
reconnect_backoff: Duration::from_millis(50),
max_reconnect_attempts: None,
max_message_bytes: None,
batch_size: BATCH,
}
}
#[tokio::test(flavor = "multi_thread")]
async fn conformance_bounded_memory() {
let url = spawn_pushing_server(TOTAL).await;
let source = WebsocketSource::new(base_config(&url)).unwrap();
assert_bounded_memory(&source, BATCH, TOTAL).await;
}
#[tokio::test(flavor = "multi_thread")]
async fn conformance_errors_not_panics() {
let source = WebsocketSource::new(base_config("ws://127.0.0.1:1")).unwrap();
assert_errors_not_panics(&source).await;
}