diff --git a/src/dc_sqlite3.rs b/src/dc_sqlite3.rs index 692731251..24c573536 100644 --- a/src/dc_sqlite3.rs +++ b/src/dc_sqlite3.rs @@ -1614,3 +1614,61 @@ unsafe fn maybe_add_from_param( sqlite3_finalize(stmt); dc_param_unref(param); } + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_maybe_add_file() { + let mut files = Default::default(); + unsafe { maybe_add_file(&mut files, b"$BLOBDIR/hello\x00" as *const u8 as *const _) }; + unsafe { + maybe_add_file( + &mut files, + b"$BLOBDIR/world.txt\x00" as *const u8 as *const _, + ) + }; + unsafe { maybe_add_file(&mut files, b"world2.txt\x00" as *const u8 as *const _) }; + + assert!(files.contains("hello")); + assert!(files.contains("world.txt")); + assert!(!files.contains("world2.txt")); + } + + #[test] + fn test_is_file_in_use() { + let mut files = Default::default(); + unsafe { maybe_add_file(&mut files, b"$BLOBDIR/hello\x00" as *const u8 as *const _) }; + unsafe { + maybe_add_file( + &mut files, + b"$BLOBDIR/world.txt\x00" as *const u8 as *const _, + ) + }; + unsafe { maybe_add_file(&mut files, b"world2.txt\x00" as *const u8 as *const _) }; + + println!("{:?}", files); + assert!(unsafe { + is_file_in_use( + &mut files, + std::ptr::null(), + b"hello\x00" as *const u8 as *const _, + ) + }); + assert!(!unsafe { + is_file_in_use( + &mut files, + b".txt\x00" as *const u8 as *const _, + b"hello\x00" as *const u8 as *const _, + ) + }); + assert!(unsafe { + is_file_in_use( + &mut files, + b"-suffix\x00" as *const u8 as *const _, + b"world.txt-suffix\x00" as *const u8 as *const _, + ) + }); + } +} diff --git a/src/dc_tools.rs b/src/dc_tools.rs index 7c9bb1d9f..d6b1f6933 100644 --- a/src/dc_tools.rs +++ b/src/dc_tools.rs @@ -1323,11 +1323,14 @@ pub unsafe fn dc_get_filebytes( return 0; } - let filebytes = { - let p = std::ffi::CStr::from_ptr(pathNfilename_abs) - .to_str() - .unwrap(); - fs::metadata(p).unwrap().len() + let p = std::ffi::CStr::from_ptr(pathNfilename_abs) + .to_str() + .unwrap(); + let filebytes = match fs::metadata(p) { + Ok(meta) => meta.len(), + Err(_err) => { + return 0; + } }; free(pathNfilename_abs as *mut libc::c_void);