use qail_pg::driver::PgConnection;
use std::time::Duration;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("๐งช Test 7: Zombie Client");
println!("{}", "โ".repeat(40));
let mut driver = PgConnection::connect("localhost", 5432, "orion", "postgres").await?;
println!(" Starting transaction with locks...");
driver.execute_simple("BEGIN").await?;
driver
.execute_simple("LOCK TABLE zombie_test IN ACCESS EXCLUSIVE MODE")
.await?;
println!(" โ Exclusive lock acquired on zombie_test");
let mut check_driver = PgConnection::connect("localhost", 5432, "orion", "postgres").await?;
check_driver.execute_simple("SELECT relation::regclass, mode FROM pg_locks WHERE relation::regclass::text = 'zombie_test'").await?;
println!(" โ Lock confirmed in pg_locks");
println!(" Simulating connection drop (no COMMIT)...");
drop(driver);
tokio::time::sleep(Duration::from_millis(100)).await;
println!(" Verifying lock cleanup...");
check_driver
.execute_simple(
"SELECT COUNT(*) FROM pg_locks WHERE relation::regclass::text = 'zombie_test' AND mode = 'AccessExclusiveLock'",
)
.await?;
let mut verify_driver = PgConnection::connect("localhost", 5432, "orion", "postgres").await?;
verify_driver.execute_simple("BEGIN").await?;
verify_driver
.execute_simple("LOCK TABLE zombie_test IN ACCESS EXCLUSIVE MODE NOWAIT")
.await?;
verify_driver.execute_simple("ROLLBACK").await?;
println!(" โ Lock released - new exclusive lock acquired successfully");
println!();
println!("โ Zombie Client Test PASSED!");
println!(" Postgres correctly cleaned up locks when connection dropped.");
Ok(())
}