use {
futures::executor::block_on,
gluesql_core::prelude::{Glue, Payload, Value},
gluesql_shared_memory_storage::SharedMemoryStorage,
};
#[tokio::test]
async fn concurrent_access() {
let storage = SharedMemoryStorage::new();
let mut glue = Glue::new(storage.clone());
glue.execute("CREATE TABLE Thread (id INTEGER);")
.await
.unwrap();
let thread_1 = tokio::spawn({
let storage = storage.clone();
async {
let mut glue = Glue::new(storage);
block_on(glue.execute("INSERT INTO Thread VALUES(1)")).unwrap();
}
});
let thread_2 = tokio::spawn({
let storage = storage.clone();
async {
let mut glue = Glue::new(storage);
block_on(glue.execute("INSERT INTO Thread VALUES(2)")).unwrap();
}
});
let _ = tokio::join!(thread_1, thread_2);
let actual = glue.execute("SELECT * FROM Thread").await.unwrap();
let expected = vec![Payload::Select {
labels: vec!["id".to_owned()],
rows: vec![vec![Value::I64(1)], vec![Value::I64(2)]],
}];
assert_eq!(actual, expected);
}