Added io errors to add_entry.
This commit is contained in:
parent
83e3b2ef9e
commit
3e203b40c0
@ -66,19 +66,24 @@ impl MoreThanText {
|
||||
})
|
||||
}
|
||||
|
||||
async fn add_entry(&self, entry: CacheEntry) -> String {
|
||||
async fn add_entry(&self, entry: CacheEntry) -> Result<String, DBError> {
|
||||
let mut id: String = "".to_string();
|
||||
let mut dup = true;
|
||||
while dup {
|
||||
id = thread_rng().sample_iter(&Alphanumeric).take(32).collect();
|
||||
dup = Path::new(&self.dir).join(&id).as_path().exists().await;
|
||||
}
|
||||
write(Path::new(&self.dir).join(&id), entry.to_bytes())
|
||||
.await
|
||||
.unwrap();
|
||||
match write(Path::new(&self.dir).join(&id), entry.to_bytes()).await {
|
||||
Ok(_) => (),
|
||||
Err(err) => {
|
||||
let mut error = DBError::new("data write");
|
||||
error.add_source(err);
|
||||
return Err(error);
|
||||
}
|
||||
};
|
||||
let mut cache = self.cache.lock().await;
|
||||
cache.insert(id.clone(), entry);
|
||||
return id;
|
||||
Ok(id)
|
||||
}
|
||||
|
||||
async fn get_entry(&self, id: &str) -> Result<CacheEntry, DBError> {
|
||||
@ -103,6 +108,7 @@ impl MoreThanText {
|
||||
#[cfg(test)]
|
||||
mod setup {
|
||||
use super::*;
|
||||
use async_std::fs::remove_dir_all;
|
||||
use tempfile::{tempdir, TempDir};
|
||||
|
||||
pub struct MTT {
|
||||
@ -118,6 +124,10 @@ mod setup {
|
||||
.unwrap();
|
||||
Self { db: db, dir: dir }
|
||||
}
|
||||
|
||||
pub async fn create_io_error(&self) {
|
||||
remove_dir_all(self.dir.path().join(DATA)).await.unwrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -151,11 +161,14 @@ mod init {
|
||||
|
||||
#[async_std::test]
|
||||
async fn bad_data_dir() {
|
||||
let msg = "could not create directory";
|
||||
match MoreThanText::new("kljsdgfhslkfrh").await {
|
||||
Ok(_) => assert!(false, "This test should fail to create a data directory"),
|
||||
Err(err) => {
|
||||
assert_eq!(err.to_string(), "failed to create data directory");
|
||||
assert!(err.source().is_some(), "Must include the source error.");
|
||||
let err_msg = err.source().unwrap().to_string();
|
||||
assert!(err_msg.contains(msg), "'{}' not in '{}'", msg, err_msg);
|
||||
}
|
||||
};
|
||||
}
|
||||
@ -165,14 +178,15 @@ mod init {
|
||||
mod cache {
|
||||
use super::*;
|
||||
use setup::MTT;
|
||||
use std::error::Error;
|
||||
|
||||
#[async_std::test]
|
||||
async fn entry_ids_are_random() {
|
||||
let mtt = MTT::new().await;
|
||||
let data1 = CacheEntry::Raw("one".to_string());
|
||||
let data2 = CacheEntry::Raw("two".to_string());
|
||||
let id1 = mtt.db.add_entry(data1).await;
|
||||
let id2 = mtt.db.add_entry(data2).await;
|
||||
let id1 = mtt.db.add_entry(data1).await.unwrap();
|
||||
let id2 = mtt.db.add_entry(data2).await.unwrap();
|
||||
assert_ne!(id1, id2, "Ids should be unique.")
|
||||
}
|
||||
|
||||
@ -181,7 +195,7 @@ mod cache {
|
||||
let mtt = MTT::new().await;
|
||||
let data = "something";
|
||||
let expected = CacheEntry::Raw(data.to_string());
|
||||
let id = mtt.db.add_entry(expected.clone()).await;
|
||||
let id = mtt.db.add_entry(expected.clone()).await.unwrap();
|
||||
let output = mtt.db.get_entry(&id).await.unwrap();
|
||||
assert_eq!(output.to_string(), data);
|
||||
let dfile = mtt.dir.path().join(DATA).join(&id);
|
||||
@ -190,6 +204,22 @@ mod cache {
|
||||
assert_eq!(content, expected.to_bytes());
|
||||
}
|
||||
|
||||
#[async_std::test]
|
||||
async fn store_bad_file() {
|
||||
let mtt = MTT::new().await;
|
||||
let msg = "could not write to file";
|
||||
mtt.create_io_error().await;
|
||||
match mtt.db.add_entry(CacheEntry::Raw("fail".to_string())).await {
|
||||
Ok(_) => assert!(false, "This test should fail."),
|
||||
Err(err) => {
|
||||
assert_eq!(err.to_string(), "data write");
|
||||
assert!(err.source().is_some(), "Must include the source error.");
|
||||
let err_msg = err.source().unwrap().to_string();
|
||||
assert!(err_msg.contains(msg), "'{}' not in '{}'", msg, err_msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[async_std::test]
|
||||
async fn retrieve_bad_id() {
|
||||
let mtt = MTT::new().await;
|
||||
@ -202,7 +232,11 @@ mod cache {
|
||||
#[async_std::test]
|
||||
async fn update_cache_entry() {
|
||||
let mtt = MTT::new().await;
|
||||
let id = mtt.db.add_entry(CacheEntry::Raw("same".to_string())).await;
|
||||
let id = mtt
|
||||
.db
|
||||
.add_entry(CacheEntry::Raw("same".to_string()))
|
||||
.await
|
||||
.unwrap();
|
||||
let expected = "different";
|
||||
mtt.db
|
||||
.update_entry(&id, CacheEntry::Raw(expected.to_string()))
|
||||
|
Loading…
Reference in New Issue
Block a user