From 48968b403b7250c9f4ccd18e5cc22e2fe3612a8e Mon Sep 17 00:00:00 2001 From: Vika Date: Wed, 5 May 2021 17:33:44 +0300 Subject: Refactored the Redis instance spawning in tests to automatically kill Redis --- src/database/mod.rs | 16 ++++++---------- src/database/redis/mod.rs | 25 ++++++++++++++++++++++--- 2 files changed, 28 insertions(+), 13 deletions(-) (limited to 'src/database') diff --git a/src/database/mod.rs b/src/database/mod.rs index d6b7dd6..943a1ad 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -6,7 +6,7 @@ use crate::indieauth::User; mod redis; pub use crate::database::redis::RedisStorage; #[cfg(test)] -pub use redis::tests::get_redis_instance; +pub use redis::tests::{RedisInstance, get_redis_instance}; #[derive(Serialize, Deserialize, PartialEq, Debug)] pub struct MicropubChannel { @@ -222,18 +222,14 @@ mod tests { #[async_std::test] async fn test_redis_storage_basic_operations() { - let (tempdir, mut redis, uri) = get_redis_instance().await; - let backend = super::RedisStorage::new(uri).await.unwrap(); + let redis_instance = get_redis_instance().await; + let backend = super::RedisStorage::new(redis_instance.uri().to_string()).await.unwrap(); test_backend_basic_operations(backend).await; - redis.kill().expect("Redis wasn't running"); - drop(tempdir); } #[async_std::test] - async fn test_redis_storage_channel_support() { - let (tempdir, mut redis, uri) = get_redis_instance().await; - let backend = super::RedisStorage::new(uri).await.unwrap(); + async fn test_redis_storage_channel_list() { + let redis_instance = get_redis_instance().await; + let backend = super::RedisStorage::new(redis_instance.uri().to_string()).await.unwrap(); test_backend_get_channel_list(backend).await; - redis.kill().expect("Redis wasn't running"); - drop(tempdir); } } diff --git a/src/database/redis/mod.rs b/src/database/redis/mod.rs index ccbf831..a3b4bf8 100644 --- a/src/database/redis/mod.rs +++ b/src/database/redis/mod.rs @@ -249,11 +249,28 @@ impl RedisStorage { #[cfg(test)] pub mod tests { - use std::{process}; + use std::process; use std::time::Duration; use mobc_redis::redis; - pub async fn get_redis_instance() -> (tempdir::TempDir, process::Child, String) { + pub struct RedisInstance { + // We just need to hold on to it so it won't get dropped and remove the socket + _tempdir: tempdir::TempDir, + uri: String, + child: std::process::Child + } + impl Drop for RedisInstance { + fn drop(&mut self) { + self.child.kill().expect("Failed to kill the child!"); + } + } + impl RedisInstance { + pub fn uri(&self) -> &str { + &self.uri + } + } + + pub async fn get_redis_instance() -> RedisInstance { let tempdir = tempdir::TempDir::new("redis").expect("failed to create tempdir"); let socket = tempdir.path().join("redis.sock"); let redis_child = process::Command::new("redis-server") @@ -282,6 +299,8 @@ pub mod tests { } } - return (tempdir, redis_child, uri) + return RedisInstance { + uri, child: redis_child, _tempdir: tempdir + } } } \ No newline at end of file -- cgit 1.4.1