From 55b2c27a69cdb1979f5bbafed6c641059e07c956 Mon Sep 17 00:00:00 2001 From: mervyn-mccreight Date: Sat, 8 Aug 2026 04:46:49 +0200 Subject: [PATCH 1/3] test(cassandra): use cassandra image in doc example --- src/cassandra/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cassandra/mod.rs b/src/cassandra/mod.rs index fac6528..4096ee9 100644 --- a/src/cassandra/mod.rs +++ b/src/cassandra/mod.rs @@ -16,7 +16,7 @@ const TAG: &str = "5.0.6"; /// /// #[tokio::test] /// async fn default_cassandra() -> Result<(), Box> { -/// let image = ScyllaDB::default(); +/// let image = Cassandra::default().with_startup_timeout(Duration::from_secs(240)); /// let instance = image.start().await?; /// let host = instance.get_host().await?; /// let port = instance.get_host_port_ipv4(9042).await?; From 2394d429bbe87d181d6b130b49d9eda39f3a32b8 Mon Sep 17 00:00:00 2001 From: mervyn-mccreight Date: Sat, 8 Aug 2026 07:14:46 +0200 Subject: [PATCH 2/3] fix(cassandra): fix cassandra container * Fix tests * Improve start-up time of container --- Cargo.toml | 1 + src/cassandra/mod.rs | 74 ++++++++++++++++++++++++++++++-------------- 2 files changed, 52 insertions(+), 23 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 60b531c..b1be495 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -150,6 +150,7 @@ azure_storage_blobs = "0.21.0" azure_storage = "0.21.0" base64 = "0.22.1" fantoccini = "0.21" +cdrs-tokio = "9.0.2" [[example]] name = "anvil" diff --git a/src/cassandra/mod.rs b/src/cassandra/mod.rs index 4096ee9..b609214 100644 --- a/src/cassandra/mod.rs +++ b/src/cassandra/mod.rs @@ -1,3 +1,5 @@ +use std::borrow::Cow; + use testcontainers::{core::WaitFor, Image}; const NAME: &str = "cassandra"; @@ -11,27 +13,16 @@ const TAG: &str = "5.0.6"; /// ``` /// use std::time::Duration; /// -/// use scylla::client::{session::Session, session_builder::SessionBuilder}; /// use testcontainers::{runners::AsyncRunner, ImageExt}; /// /// #[tokio::test] /// async fn default_cassandra() -> Result<(), Box> { -/// let image = Cassandra::default().with_startup_timeout(Duration::from_secs(240)); +/// let image = Cassandra::default().with_startup_timeout(Duration::from_secs(120)); /// let instance = image.start().await?; /// let host = instance.get_host().await?; /// let port = instance.get_host_port_ipv4(9042).await?; /// let hostname = format!("{host}:{port}"); -/// let session: Session = SessionBuilder::new().known_node(hostname).build().await?; -/// -/// let prepared_statement = session -/// .prepare("SELECT release_version FROM system.local") -/// .await?; -/// let rows = session -/// .execute_unpaged(&prepared_statement, &[]) -/// .await? -/// .into_rows_result()?; -/// let (version,) = rows.single_row::<(String,)>()?; -/// assert_eq!(version, "5.0.6"); +/// // do something using a driver /// Ok(()) /// } /// ``` @@ -50,6 +41,22 @@ impl Image for Cassandra { TAG } + fn env_vars( + &self, + ) -> impl IntoIterator>, impl Into>)> { + [ + ( + "JVM_EXTRA_OPTS", + "-Dcassandra.skip_wait_for_gossip_to_settle=0 -Dcassandra.initial_token=0", + ), + ("CASSANDRA_DC", "dc1"), + ("CASSANDRA_SNITCH", "GossipingPropertyFileSnitch"), + ("CASSANDRA_ENDPOINT_SNITCH", "GossipingPropertyFileSnitch"), + ("HEAP_NEWSIZE", "128M"), + ("MAX_HEAP_SIZE", "1024M"), + ] + } + fn ready_conditions(&self) -> Vec { vec![WaitFor::message_on_either_std("Startup complete")] } @@ -59,28 +66,49 @@ impl Image for Cassandra { mod tests { use std::time::Duration; - use scylla::client::{session::Session, session_builder::SessionBuilder}; + use cdrs_tokio::{ + cluster::{ + session::{SessionBuilder, TcpSessionBuilder}, + NodeTcpConfigBuilder, + }, + load_balancing::RoundRobinLoadBalancingStrategy, + types::ByName, + }; use testcontainers::{runners::AsyncRunner, ImageExt}; use super::*; #[tokio::test] async fn cassandra_select_version() -> Result<(), Box> { - let image = Cassandra::default().with_startup_timeout(Duration::from_secs(240)); + pretty_env_logger::init(); + let image = Cassandra::default().with_startup_timeout(Duration::from_secs(120)); let instance = image.start().await?; let host = instance.get_host().await?; let port = instance.get_host_port_ipv4(9042).await?; let hostname = format!("{host}:{port}"); - let session: Session = SessionBuilder::new().known_node(hostname).build().await?; - let prepared_statement = session - .prepare("SELECT release_version FROM system.local") + let cluster_config = NodeTcpConfigBuilder::new() + .with_contact_point(hostname.into()) + .build() .await?; - let rows = session - .execute_unpaged(&prepared_statement, &[]) - .await? - .into_rows_result()?; - let (version,) = rows.single_row::<(String,)>()?; + + let session = + TcpSessionBuilder::new(RoundRobinLoadBalancingStrategy::new(), cluster_config) + .build() + .await?; + + let result = session + .query("SELECT release_version FROM system.local") + .await?; + + let body = result.response_body()?; + let rows = body.into_rows().unwrap(); + let version = rows + .first() + .unwrap() + .by_name::("release_version")? + .unwrap(); + assert_eq!(version, "5.0.6"); Ok(()) } From 894e3a967128e826d01ab4a4d9b988b3df9e558e Mon Sep 17 00:00:00 2001 From: mervyn-mccreight Date: Sat, 8 Aug 2026 07:30:09 +0200 Subject: [PATCH 3/3] test(cassandra): show relationship between values in test --- src/cassandra/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cassandra/mod.rs b/src/cassandra/mod.rs index b609214..182e50b 100644 --- a/src/cassandra/mod.rs +++ b/src/cassandra/mod.rs @@ -109,7 +109,7 @@ mod tests { .by_name::("release_version")? .unwrap(); - assert_eq!(version, "5.0.6"); + assert_eq!(version, TAG); Ok(()) } }