From e97f6acccd31673fa96a1b2fc4f302388103af0f Mon Sep 17 00:00:00 2001 From: Lars-Magnus Skog Date: Fri, 7 Jun 2019 19:42:05 +0200 Subject: [PATCH 1/6] test: move test_arr_to_string() to dc_array.rs --- src/dc_array.rs | 15 ++++++++++++++- tests/stress.rs | 14 -------------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/dc_array.rs b/src/dc_array.rs index be10d86ec2..a079dc03cc 100644 --- a/src/dc_array.rs +++ b/src/dc_array.rs @@ -404,6 +404,20 @@ mod tests { use super::*; use std::ffi::CStr; + #[test] + fn test_dc_arr_to_string() { + let arr2: [uint32_t; 4] = [ + 0i32 as uint32_t, + 12i32 as uint32_t, + 133i32 as uint32_t, + 1999999i32 as uint32_t, + ]; + + let str_0 = unsafe { dc_arr_to_string(arr2.as_ptr(), 4i32) }; + assert_eq!(to_string(str_0), "0,12,133,1999999"); + unsafe { free(str_0 as *mut _) }; + } + #[test] fn test_dc_array() { unsafe { @@ -491,5 +505,4 @@ mod tests { dc_array_unref(arr); } } - } diff --git a/tests/stress.rs b/tests/stress.rs index cb245e21e5..5a7b6eaba2 100644 --- a/tests/stress.rs +++ b/tests/stress.rs @@ -952,17 +952,3 @@ fn test_stress_tests() { stress_functions(&context.ctx); } } - -#[test] -fn test_arr_to_string() { - let arr2: [uint32_t; 4] = [ - 0i32 as uint32_t, - 12i32 as uint32_t, - 133i32 as uint32_t, - 1999999i32 as uint32_t, - ]; - - let str_0 = unsafe { dc_arr_to_string(arr2.as_ptr(), 4i32) }; - assert_eq!(to_string(str_0), "0,12,133,1999999"); - unsafe { free(str_0 as *mut _) }; -} From a1e790b91b66149df25ea2cc5391b0657ed2de0d Mon Sep 17 00:00:00 2001 From: Lars-Magnus Skog Date: Fri, 7 Jun 2019 21:03:30 +0200 Subject: [PATCH 2/6] test: add test for dc_get_abs_path() --- tests/stress.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/stress.rs b/tests/stress.rs index 5a7b6eaba2..ecbaea04e4 100644 --- a/tests/stress.rs +++ b/tests/stress.rs @@ -2,6 +2,7 @@ use std::collections::HashSet; use std::ffi::{CStr, CString}; +use std::path::PathBuf; use mmime::mailimf_types::*; use tempfile::{tempdir, TempDir}; @@ -945,6 +946,23 @@ fn test_dc_get_oauth2_token() { assert_eq!(res, None); } +#[test] +fn test_dc_get_abs_path() { + let ctx = unsafe { create_test_context() }; + + let blobdir_c = unsafe { dc_get_blobdir(&ctx.ctx) }; + let mut image_path = PathBuf::from(to_string(blobdir_c)); + image_path.push("image.png"); + + let mut image_path_2 = PathBuf::from("$BLOBDIR"); + image_path_2.push("image.png"); + + let image_c = CString::new(image_path_2.to_str().unwrap()).unwrap(); + let abs_path = unsafe { dc_get_abs_path(&ctx.ctx, image_c.as_ptr()) }; + + assert_eq!(to_string(abs_path), image_path.to_str().unwrap()); +} + #[test] fn test_stress_tests() { unsafe { From fd4de4dd2fefc08e608a896f57ed315f6741dfbc Mon Sep 17 00:00:00 2001 From: Lars-Magnus Skog Date: Fri, 7 Jun 2019 21:17:45 +0200 Subject: [PATCH 3/6] chore: dc_is_blobdir_path() -> bool --- src/dc_chat.rs | 5 ++--- src/dc_tools.rs | 14 ++++---------- tests/stress.rs | 24 +++++++++--------------- 3 files changed, 15 insertions(+), 28 deletions(-) diff --git a/src/dc_chat.rs b/src/dc_chat.rs index 77f6aebbd7..3eef11e868 100644 --- a/src/dc_chat.rs +++ b/src/dc_chat.rs @@ -443,7 +443,7 @@ unsafe fn prepare_msg_common<'a>( (*msg).type_0 as libc::c_int, ); current_block = 2171833246886114521; - } else if (*msg).state == 18i32 && 0 == dc_is_blobdir_path(context, pathNfilename) { + } else if (*msg).state == 18i32 && !dc_is_blobdir_path(context, pathNfilename) { dc_log_error( context, 0i32, @@ -1105,8 +1105,7 @@ unsafe fn set_draft_raw(context: &Context, chat_id: uint32_t, msg: *mut dc_msg_t pathNfilename = dc_param_get((*msg).param, 'f' as i32, 0 as *const libc::c_char); if pathNfilename.is_null() { current_block = 14513523936503887211; - } else if 0 != dc_msg_is_increation(msg) - && 0 == dc_is_blobdir_path(context, pathNfilename) + } else if 0 != dc_msg_is_increation(msg) && !dc_is_blobdir_path(context, pathNfilename) { current_block = 14513523936503887211; } else if 0 == dc_make_rel_and_copy(context, &mut pathNfilename) { diff --git a/src/dc_tools.rs b/src/dc_tools.rs index 48fb75aa3a..59cc0c2f88 100644 --- a/src/dc_tools.rs +++ b/src/dc_tools.rs @@ -1386,15 +1386,9 @@ pub unsafe fn dc_get_fine_pathNfilename( ret } -// TODO should return bool /rtn -pub unsafe fn dc_is_blobdir_path(context: &Context, path: *const libc::c_char) -> libc::c_int { - if strncmp(path, context.get_blobdir(), strlen(context.get_blobdir())) == 0i32 - || strncmp(path, b"$BLOBDIR\x00" as *const u8 as *const libc::c_char, 8) == 0i32 - { - return 1i32; - } - - 0 +pub unsafe fn dc_is_blobdir_path(context: &Context, path: *const libc::c_char) -> bool { + (strncmp(path, context.get_blobdir(), strlen(context.get_blobdir())) == 0 + || strncmp(path, b"$BLOBDIR\x00" as *const u8 as *const libc::c_char, 8) == 0) } pub unsafe fn dc_make_rel_path(context: &Context, path: *mut *mut libc::c_char) { @@ -1416,7 +1410,7 @@ pub unsafe fn dc_make_rel_and_copy(context: &Context, path: *mut *mut libc::c_ch let mut filename: *mut libc::c_char = 0 as *mut libc::c_char; let mut blobdir_path: *mut libc::c_char = 0 as *mut libc::c_char; if !(path.is_null() || (*path).is_null()) { - if 0 != dc_is_blobdir_path(context, *path) { + if dc_is_blobdir_path(context, *path) { dc_make_rel_path(context, path); success = 1i32 } else { diff --git a/tests/stress.rs b/tests/stress.rs index ecbaea04e4..3a1457fed0 100644 --- a/tests/stress.rs +++ b/tests/stress.rs @@ -122,21 +122,15 @@ unsafe fn stress_functions(context: &Context) { context.get_blobdir(), b"foobar\x00" as *const u8 as *const libc::c_char, ); - assert_ne!(0, dc_is_blobdir_path(context, abs_path)); - assert_ne!( - 0, - dc_is_blobdir_path( - context, - b"$BLOBDIR/fofo\x00" as *const u8 as *const libc::c_char, - ) - ); - assert_eq!( - 0, - dc_is_blobdir_path( - context, - b"/BLOBDIR/fofo\x00" as *const u8 as *const libc::c_char, - ) - ); + assert!(dc_is_blobdir_path(context, abs_path)); + assert!(dc_is_blobdir_path( + context, + b"$BLOBDIR/fofo\x00" as *const u8 as *const libc::c_char, + )); + assert!(!dc_is_blobdir_path( + context, + b"/BLOBDIR/fofo\x00" as *const u8 as *const libc::c_char, + )); assert_ne!(0, dc_file_exist(context, abs_path)); free(abs_path as *mut libc::c_void); assert_ne!( From e7afcc35401eb05e30ad0472f4a57ddd86915cf8 Mon Sep 17 00:00:00 2001 From: Lars-Magnus Skog Date: Fri, 7 Jun 2019 22:48:24 +0200 Subject: [PATCH 4/6] test: test selfavatar config --- tests/fixtures/delta-logo.png | Bin 0 -> 27597 bytes tests/stress.rs | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 tests/fixtures/delta-logo.png diff --git a/tests/fixtures/delta-logo.png b/tests/fixtures/delta-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9408ad90b4379065e4353a3e2c00a7e93014b29c GIT binary patch literal 27597 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 literal 0 HcmV?d00001 diff --git a/tests/stress.rs b/tests/stress.rs index 3a1457fed0..8b424e6332 100644 --- a/tests/stress.rs +++ b/tests/stress.rs @@ -1,6 +1,7 @@ //! Stress some functions for testing; if used as a lib, this file is obsolete. use std::collections::HashSet; +use std::env::current_dir; use std::ffi::{CStr, CString}; use std::path::PathBuf; @@ -957,6 +958,38 @@ fn test_dc_get_abs_path() { assert_eq!(to_string(abs_path), image_path.to_str().unwrap()); } +#[test] +fn test_selfavatar_config() { + let ctx = unsafe { create_test_context() }; + + let mut logo_path = current_dir().unwrap(); + logo_path.push("tests"); + logo_path.push("fixtures"); + logo_path.push("delta-logo.png"); + + let logo_path_c = CString::new(logo_path.to_str().unwrap()).unwrap(); + unsafe { + dc_set_config( + &ctx.ctx, + b"selfavatar\x00" as *const u8 as *const libc::c_char, + logo_path_c.as_ptr(), + ); + } + + let selfavatar = unsafe { + dc_get_config( + &ctx.ctx, + b"selfavatar\x00" as *const u8 as *const libc::c_char, + ) + }; + + let blobdir_c = unsafe { dc_get_blobdir(&ctx.ctx) }; + let mut image_path = PathBuf::from(to_string(blobdir_c)); + image_path.push("delta-logo.png"); + + assert_eq!(to_string(selfavatar), image_path.to_str().unwrap()); +} + #[test] fn test_stress_tests() { unsafe { From bc521a28860a58b0821002a8a90731b68fd26c48 Mon Sep 17 00:00:00 2001 From: Lars-Magnus Skog Date: Sat, 8 Jun 2019 00:14:27 +0200 Subject: [PATCH 5/6] refactor: dc_make_rel_and_copy() -> bool --- src/context.rs | 2 +- src/dc_chat.rs | 6 +++--- src/dc_tools.rs | 9 ++++----- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/context.rs b/src/context.rs index 2079c79121..9a45770c9c 100644 --- a/src/context.rs +++ b/src/context.rs @@ -367,7 +367,7 @@ pub unsafe fn dc_set_config( } if strcmp(key, b"selfavatar\x00" as *const u8 as *const libc::c_char) == 0 && !value.is_null() { rel_path = dc_strdup(value); - if !(0 == dc_make_rel_and_copy(context, &mut rel_path)) { + if dc_make_rel_and_copy(context, &mut rel_path) { ret = dc_sqlite3_set_config(context, &context.sql.clone().read().unwrap(), key, rel_path) } diff --git a/src/dc_chat.rs b/src/dc_chat.rs index 3eef11e868..4463b0a59f 100644 --- a/src/dc_chat.rs +++ b/src/dc_chat.rs @@ -451,7 +451,7 @@ unsafe fn prepare_msg_common<'a>( as *const libc::c_char, ); current_block = 2171833246886114521; - } else if 0 == dc_make_rel_and_copy(context, &mut pathNfilename) { + } else if !dc_make_rel_and_copy(context, &mut pathNfilename) { current_block = 2171833246886114521; } else { dc_param_set((*msg).param, 'f' as i32, pathNfilename); @@ -1108,7 +1108,7 @@ unsafe fn set_draft_raw(context: &Context, chat_id: uint32_t, msg: *mut dc_msg_t } else if 0 != dc_msg_is_increation(msg) && !dc_is_blobdir_path(context, pathNfilename) { current_block = 14513523936503887211; - } else if 0 == dc_make_rel_and_copy(context, &mut pathNfilename) { + } else if !dc_make_rel_and_copy(context, &mut pathNfilename) { current_block = 14513523936503887211; } else { dc_param_set((*msg).param, 'f' as i32, pathNfilename); @@ -2067,7 +2067,7 @@ pub unsafe fn dc_set_chat_profile_image( /* we shoud respect this - whatever we send to the group, it gets discarded anyway! */ if !new_image.is_null() { new_image_rel = dc_strdup(new_image); - if 0 == dc_make_rel_and_copy(context, &mut new_image_rel) { + if !dc_make_rel_and_copy(context, &mut new_image_rel) { current_block = 14766584022300871387; } else { current_block = 1856101646708284338; diff --git a/src/dc_tools.rs b/src/dc_tools.rs index 59cc0c2f88..aa7736a7b6 100644 --- a/src/dc_tools.rs +++ b/src/dc_tools.rs @@ -1404,15 +1404,14 @@ pub unsafe fn dc_make_rel_path(context: &Context, path: *mut *mut libc::c_char) }; } -// TODO should return bool /rtn -pub unsafe fn dc_make_rel_and_copy(context: &Context, path: *mut *mut libc::c_char) -> libc::c_int { - let mut success: libc::c_int = 0i32; +pub unsafe fn dc_make_rel_and_copy(context: &Context, path: *mut *mut libc::c_char) -> bool { + let mut success: bool = false; let mut filename: *mut libc::c_char = 0 as *mut libc::c_char; let mut blobdir_path: *mut libc::c_char = 0 as *mut libc::c_char; if !(path.is_null() || (*path).is_null()) { if dc_is_blobdir_path(context, *path) { dc_make_rel_path(context, path); - success = 1i32 + success = true; } else { filename = dc_get_filename(*path); if !(filename.is_null() @@ -1430,7 +1429,7 @@ pub unsafe fn dc_make_rel_and_copy(context: &Context, path: *mut *mut libc::c_ch *path = blobdir_path; blobdir_path = 0 as *mut libc::c_char; dc_make_rel_path(context, path); - success = 1i32 + success = true; } } } From acc48055b248d0639406c2a4dbb8867ce25e8c89 Mon Sep 17 00:00:00 2001 From: Lars-Magnus Skog Date: Sun, 9 Jun 2019 11:00:18 +0200 Subject: [PATCH 6/6] test: assert that both fixture and selfavatar exists --- tests/stress.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/stress.rs b/tests/stress.rs index 8b424e6332..1e4181a464 100644 --- a/tests/stress.rs +++ b/tests/stress.rs @@ -2,7 +2,7 @@ use std::collections::HashSet; use std::env::current_dir; -use std::ffi::{CStr, CString}; +use std::ffi::CString; use std::path::PathBuf; use mmime::mailimf_types::*; @@ -966,6 +966,7 @@ fn test_selfavatar_config() { logo_path.push("tests"); logo_path.push("fixtures"); logo_path.push("delta-logo.png"); + assert!(logo_path.as_path().exists()); let logo_path_c = CString::new(logo_path.to_str().unwrap()).unwrap(); unsafe { @@ -987,6 +988,7 @@ fn test_selfavatar_config() { let mut image_path = PathBuf::from(to_string(blobdir_c)); image_path.push("delta-logo.png"); + assert!(image_path.as_path().exists()); assert_eq!(to_string(selfavatar), image_path.to_str().unwrap()); }