mod test;
use zookeeper_async::KeeperState;
use zookeeper_async::{Acl, CreateMode, WatchedEvent, ZooKeeper};
use test::ZkCluster;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;
use std::thread;
use std::time::Duration;
use tracing::*;
#[tokio::test]
async fn zk_test() {
let mut cluster = ZkCluster::start(3);
let disconnects = Arc::new(AtomicUsize::new(0));
let disconnects_watcher = disconnects.clone();
let zk = ZooKeeper::connect(
&cluster.connect_string,
Duration::from_secs(10),
move |event: WatchedEvent| {
info!("{:?}", event);
if event.keeper_state == KeeperState::Disconnected {
disconnects_watcher.fetch_add(1, Ordering::Relaxed);
}
},
)
.await
.unwrap();
let create = zk
.create(
"/test",
vec![8, 8],
Acl::open_unsafe().clone(),
CreateMode::Ephemeral,
)
.await;
assert_eq!(create.ok(), Some("/test".to_owned()));
let exists = zk.exists("/test", true).await;
assert!(exists.is_ok());
thread::sleep(Duration::from_secs(8));
let data = vec![7; 1024 * 1000];
let set_data = zk.set_data("/test", data.clone(), None).await;
assert!(set_data.is_ok());
let get_data = zk.get_data("/test", false).await;
assert!(get_data.is_ok());
assert_eq!(get_data.unwrap().0, data);
let children = zk.get_children("/", true).await;
assert!(children.is_ok());
let children = zk
.get_children_w("/", |event: WatchedEvent| println!("Custom {:?}", event))
.await;
assert!(children.is_ok());
let delete = zk.delete("/test", None).await;
assert!(delete.is_ok());
let mut sorted_children = children.unwrap();
sorted_children.sort();
assert_eq!(
sorted_children,
vec!["test".to_owned(), "zookeeper".to_owned()]
);
assert_eq!(disconnects.load(Ordering::Relaxed), 0);
cluster.kill_an_instance();
thread::sleep(Duration::from_secs(1));
zk.close().await.unwrap();
let exists = zk.exists("/test", true).await;
assert!(exists.is_err());
cluster.shutdown();
}