#![recursion_limit = "256"]
mod helpers;
use anyhow::Result;
use helpers::new_ds;
use surrealdb_core::dbs::Session;
#[tokio::test]
#[ignore]
async fn concurrency() -> Result<()> {
const MILLIS: usize = 50;
const TIMEOUT: usize = MILLIS * 19 / 10;
fn query(count: usize, millis: usize) -> String {
format!(
"SELECT foo FROM [[{}]] TIMEOUT {TIMEOUT}ms;",
(0..count)
.map(|i| format!("{{[sleep({millis}ms), {{foo: {i}}}]}}"))
.collect::<Vec<_>>()
.join(", ")
)
}
async fn test_limit(limit: usize) -> Result<bool> {
let sql = query(limit, MILLIS);
let (_, dbs) = new_ds("test", "test", false).await?;
let ses = Session::owner().with_ns("test").with_db("test");
let res = dbs.execute(&sql, &ses, None).await;
match res {
Err(err) => {
if err.to_string().contains("timeout") || err.to_string().contains("Timeout") {
Ok(false)
} else {
Err(err.into())
}
}
Ok(res) => {
assert_eq!(res.len(), 1);
let res = res.into_iter().next().unwrap();
let elapsed = res.time.as_millis() as usize;
Ok(elapsed < TIMEOUT)
}
}
}
assert!(test_limit(3).await?);
#[cfg(not(debug_assertions))]
assert!(!test_limit(64 + 1).await?);
Ok(())
}