use std::error::Error; use std::process::{Child, Command}; use indradb::ijson; use tokio::time::{sleep, Duration}; #[cfg(target_os = "macos")] static LIBRARY_EXTENSION: &str = "dylib"; #[cfg(target_os = "linux")] static LIBRARY_EXTENSION: &str = "so"; struct Server { child: Child, } impl Server { pub fn start(plugins_dest_path: &str) -> Result> { let child = Command::new("../target/debug/indradb-server") .args(["-p", plugins_dest_path, "memory"]) .env("RUST_BACKTRACE", "1") .spawn()?; Ok(Server { child }) } } impl Drop for Server { fn drop(&mut self) { self.child.kill().expect("failed to kill server"); } } async fn get_client() -> Result { let mut client = indradb_proto::Client::new("grpc://127.0.0.1:27615".try_into().unwrap()).await?; client.ping().await?; Ok(client) } async fn get_client_retrying() -> Result { let mut retry_count = 10u8; let mut last_err = Option::::None; while retry_count > 0 { match get_client().await { Ok(client) => return Ok(client), Err(err) => { last_err = Some(err); if retry_count == 0 { break; } else { sleep(Duration::from_secs(1)).await; retry_count -= 1; } } } } Err(last_err.unwrap()) } #[tokio::test] pub async fn plugins() { let _server = Server::start(&format!("../target/debug/libindradb_plugin_*.{}", LIBRARY_EXTENSION)).unwrap(); let mut client = get_client_retrying().await.unwrap(); assert_eq!( client .execute_plugin("hello_world", ijson!("plugin tester")) .await .unwrap(), ijson!("hello, \"plugin tester\"") ); assert_eq!( client.execute_plugin("naive_vertex_count", ijson!(null)).await.unwrap(), ijson!(0) ); client .bulk_insert(vec![ indradb::BulkInsertItem::Vertex(indradb::Vertex::new(indradb::Identifier::new("1").unwrap())), indradb::BulkInsertItem::Vertex(indradb::Vertex::new(indradb::Identifier::new("2").unwrap())), indradb::BulkInsertItem::Vertex(indradb::Vertex::new(indradb::Identifier::new("3").unwrap())), indradb::BulkInsertItem::Vertex(indradb::Vertex::new(indradb::Identifier::new("4").unwrap())), indradb::BulkInsertItem::Vertex(indradb::Vertex::new(indradb::Identifier::new("5").unwrap())), indradb::BulkInsertItem::Vertex(indradb::Vertex::new(indradb::Identifier::new("6").unwrap())), indradb::BulkInsertItem::Vertex(indradb::Vertex::new(indradb::Identifier::new("7").unwrap())), indradb::BulkInsertItem::Vertex(indradb::Vertex::new(indradb::Identifier::new("8").unwrap())), indradb::BulkInsertItem::Vertex(indradb::Vertex::new(indradb::Identifier::new("9").unwrap())), indradb::BulkInsertItem::Vertex(indradb::Vertex::new(indradb::Identifier::new("10").unwrap())), indradb::BulkInsertItem::Vertex(indradb::Vertex::new(indradb::Identifier::new("11").unwrap())), ]) .await .unwrap(); assert_eq!( client.execute_plugin("naive_vertex_count", ijson!(null)).await.unwrap(), ijson!(11) ); }