#[macro_use] extern crate serde; #[macro_use] extern crate tracing; #[macro_use] extern crate async_trait; use coerce::actor::system::ActorSystem; use coerce::remote::net::security::jwt::Jwt; use coerce::remote::system::RemoteActorSystem; use std::time::Duration; mod util; #[tokio::test] pub async fn test_jwt_validation() { let secret = b"secret"; let token_ttl = None; let jwt = Jwt::from_secret(secret.to_vec(), token_ttl); let token = jwt.generate_token().unwrap(); let token_validated = jwt.validate_token(&token); assert!(!token.is_empty()); assert!(token_validated); } #[tokio::test] pub async fn test_jwt_validation_with_expiry() { let secret = b"secret"; let token_ttl = Some(Duration::from_millis(100)); let jwt = Jwt::from_secret(secret.to_vec(), token_ttl); let token = jwt.generate_token().unwrap(); let token_validated = jwt.validate_token(&token); assert!(!token.is_empty()); assert!(token_validated); tokio::time::sleep(Duration::from_millis(200)).await; let token_validated = jwt.validate_token(&token); assert!(!token_validated); } #[tokio::test] pub async fn test_remote_cluster_inconsistent_secrets() { util::create_trace_logger(); let secrets = vec!["secret-1", "secret-2", "secret-3"]; let nodes = create_cluster_nodes("3102", secrets).await; let nodes_1 = nodes[0].get_nodes().await; let nodes_2 = nodes[1].get_nodes().await; let nodes_3 = nodes[2].get_nodes().await; assert_eq!(nodes_1.len(), 1); assert_eq!(nodes_2.len(), 1); assert_eq!(nodes_3.len(), 1); } #[tokio::test] pub async fn test_remote_cluster_consistent_secrets() { util::create_trace_logger(); let secrets = vec!["secret-1", "secret-1", "secret-1"]; let nodes = create_cluster_nodes("3101", secrets).await; let nodes_1 = nodes[0].get_nodes().await; let nodes_2 = nodes[1].get_nodes().await; let nodes_3 = nodes[2].get_nodes().await; assert_eq!(nodes_1.len(), 3); assert_eq!(nodes_2.len(), 3); assert_eq!(nodes_3.len(), 3); } async fn create_cluster_nodes( port_prefix: &'static str, secrets: Vec<&'static str>, ) -> Vec { let system = ActorSystem::new(); let remote = RemoteActorSystem::builder() .with_tag("remote-1") .with_id(1) .with_actor_system(system) .client_auth_jwt(secrets[0], None) .build() .await; let remote_2 = RemoteActorSystem::builder() .with_tag("remote-2") .with_id(2) .with_actor_system(ActorSystem::new()) .client_auth_jwt(secrets[1], None) .build() .await; let remote_3 = RemoteActorSystem::builder() .with_tag("remote-3") .with_id(3) .with_actor_system(ActorSystem::new()) .client_auth_jwt(secrets[2], None) .build() .await; remote .clone() .cluster_worker() .listen_addr(format!("localhost:{}1", port_prefix)) .start() .await; remote_2 .clone() .cluster_worker() .listen_addr(format!("localhost:{}2", port_prefix)) .with_seed_addr(format!("localhost:{}1", port_prefix)) .start() .await; remote_3 .clone() .cluster_worker() .listen_addr(format!("localhost:{}3", port_prefix)) .with_seed_addr(format!("localhost:{}2", port_prefix)) .start() .await; vec![remote, remote_2, remote_3] }