mirror of
https://github.com/chatmail/core.git
synced 2026-05-02 21:06:31 +03:00
fix and cleanup tests
This commit is contained in:
committed by
holger krekel
parent
03979fdc51
commit
fd69ebfd1f
152
src/dc_tools.rs
152
src/dc_tools.rs
@@ -51,75 +51,6 @@ pub unsafe fn dc_strdup(s: *const libc::c_char) -> *mut libc::c_char {
|
|||||||
ret
|
ret
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn dc_ltrim(buf: *mut libc::c_char) {
|
|
||||||
let mut len: libc::size_t;
|
|
||||||
let mut cur: *const libc::c_uchar;
|
|
||||||
if !buf.is_null() && 0 != *buf as libc::c_int {
|
|
||||||
len = strlen(buf);
|
|
||||||
cur = buf as *const libc::c_uchar;
|
|
||||||
while 0 != *cur as libc::c_int && 0 != libc::isspace(*cur as libc::c_int) {
|
|
||||||
cur = cur.offset(1isize);
|
|
||||||
len = len.wrapping_sub(1)
|
|
||||||
}
|
|
||||||
if buf as *const libc::c_uchar != cur {
|
|
||||||
libc::memmove(
|
|
||||||
buf as *mut libc::c_void,
|
|
||||||
cur as *const libc::c_void,
|
|
||||||
len.wrapping_add(1),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe fn dc_rtrim(buf: *mut libc::c_char) {
|
|
||||||
let mut len: libc::size_t;
|
|
||||||
let mut cur: *mut libc::c_uchar;
|
|
||||||
if !buf.is_null() && 0 != *buf as libc::c_int {
|
|
||||||
len = strlen(buf);
|
|
||||||
cur = (buf as *mut libc::c_uchar)
|
|
||||||
.offset(len as isize)
|
|
||||||
.offset(-1isize);
|
|
||||||
while cur != buf as *mut libc::c_uchar && 0 != libc::isspace(*cur as libc::c_int) {
|
|
||||||
cur = cur.offset(-1isize);
|
|
||||||
len = len.wrapping_sub(1)
|
|
||||||
}
|
|
||||||
*cur.offset(
|
|
||||||
(if 0 != libc::isspace(*cur as libc::c_int) {
|
|
||||||
0
|
|
||||||
} else {
|
|
||||||
1
|
|
||||||
}) as isize,
|
|
||||||
) = '\u{0}' as i32 as libc::c_uchar
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) unsafe fn dc_trim(buf: *mut libc::c_char) {
|
|
||||||
dc_ltrim(buf);
|
|
||||||
dc_rtrim(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* remove all \r characters from string */
|
|
||||||
pub(crate) unsafe fn dc_remove_cr_chars(buf: *mut libc::c_char) {
|
|
||||||
/* search for first `\r` */
|
|
||||||
let mut p1: *const libc::c_char = buf;
|
|
||||||
while 0 != *p1 {
|
|
||||||
if *p1 as libc::c_int == '\r' as i32 {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
p1 = p1.offset(1isize)
|
|
||||||
}
|
|
||||||
/* p1 is `\r` or null-byte; start removing `\r` */
|
|
||||||
let mut p2: *mut libc::c_char = p1 as *mut libc::c_char;
|
|
||||||
while 0 != *p1 {
|
|
||||||
if *p1 as libc::c_int != '\r' as i32 {
|
|
||||||
*p2 = *p1;
|
|
||||||
p2 = p2.offset(1isize)
|
|
||||||
}
|
|
||||||
p1 = p1.offset(1isize)
|
|
||||||
}
|
|
||||||
*p2 = 0 as libc::c_char;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Shortens a string to a specified length and adds "..." or "[...]" to the end of
|
/// Shortens a string to a specified length and adds "..." or "[...]" to the end of
|
||||||
/// the shortened string.
|
/// the shortened string.
|
||||||
pub(crate) fn dc_truncate(buf: &str, approx_chars: usize, do_unwrap: bool) -> Cow<str> {
|
pub(crate) fn dc_truncate(buf: &str, approx_chars: usize, do_unwrap: bool) -> Cow<str> {
|
||||||
@@ -631,26 +562,6 @@ pub(crate) fn dc_get_next_backup_path(
|
|||||||
}
|
}
|
||||||
bail!("could not create backup file, disk full?");
|
bail!("could not create backup file, disk full?");
|
||||||
}
|
}
|
||||||
pub(crate) fn dc_get_fine_path_filename(
|
|
||||||
context: &Context,
|
|
||||||
folder: impl AsRef<Path>,
|
|
||||||
backup_time: i64,
|
|
||||||
) -> Result<PathBuf, Error> {
|
|
||||||
let folder = PathBuf::from(folder.as_ref());
|
|
||||||
let stem = chrono::NaiveDateTime::from_timestamp(backup_time, 0)
|
|
||||||
.format("delta-chat-%Y-%m-%d")
|
|
||||||
.to_string();
|
|
||||||
|
|
||||||
// 64 backup files per day should be enough for everyone
|
|
||||||
for i in 0..64 {
|
|
||||||
let mut path = folder.clone();
|
|
||||||
path.push(format!("{}-{}.bak", stem, i));
|
|
||||||
if !path.exists() {
|
|
||||||
return Ok(path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bail!("could not create backup file, disk full?");
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn dc_is_blobdir_path(context: &Context, path: impl AsRef<str>) -> bool {
|
pub(crate) fn dc_is_blobdir_path(context: &Context, path: impl AsRef<str>) -> bool {
|
||||||
context
|
context
|
||||||
@@ -1044,54 +955,6 @@ mod tests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_dc_ltrim() {
|
|
||||||
unsafe {
|
|
||||||
let html: *const libc::c_char =
|
|
||||||
b"\r\r\nline1<br>\r\n\r\n\r\rline2\n\r\x00" as *const u8 as *const libc::c_char;
|
|
||||||
let out: *mut libc::c_char = strndup(html, strlen(html) as libc::c_ulong);
|
|
||||||
|
|
||||||
dc_ltrim(out);
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
CStr::from_ptr(out as *const libc::c_char).to_str().unwrap(),
|
|
||||||
"line1<br>\r\n\r\n\r\rline2\n\r"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_dc_rtrim() {
|
|
||||||
unsafe {
|
|
||||||
let html: *const libc::c_char =
|
|
||||||
b"\r\r\nline1<br>\r\n\r\n\r\rline2\n\r\x00" as *const u8 as *const libc::c_char;
|
|
||||||
let out: *mut libc::c_char = strndup(html, strlen(html) as libc::c_ulong);
|
|
||||||
|
|
||||||
dc_rtrim(out);
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
CStr::from_ptr(out as *const libc::c_char).to_str().unwrap(),
|
|
||||||
"\r\r\nline1<br>\r\n\r\n\r\rline2"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_dc_trim() {
|
|
||||||
unsafe {
|
|
||||||
let html: *const libc::c_char =
|
|
||||||
b"\r\r\nline1<br>\r\n\r\n\r\rline2\n\r\x00" as *const u8 as *const libc::c_char;
|
|
||||||
let out: *mut libc::c_char = strndup(html, strlen(html) as libc::c_ulong);
|
|
||||||
|
|
||||||
dc_trim(out);
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
CStr::from_ptr(out as *const libc::c_char).to_str().unwrap(),
|
|
||||||
"line1<br>\r\n\r\n\r\rline2"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_rust_ftoa() {
|
fn test_rust_ftoa() {
|
||||||
assert_eq!("1.22", format!("{}", 1.22));
|
assert_eq!("1.22", format!("{}", 1.22));
|
||||||
@@ -1560,19 +1423,4 @@ mod tests {
|
|||||||
let listflags: u32 = DC_GCL_VERIFIED_ONLY.try_into().unwrap();
|
let listflags: u32 = DC_GCL_VERIFIED_ONLY.try_into().unwrap();
|
||||||
assert!(listflags_has(listflags, DC_GCL_ADD_SELF) == false);
|
assert!(listflags_has(listflags, DC_GCL_ADD_SELF) == false);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_dc_remove_cr_chars() {
|
|
||||||
unsafe {
|
|
||||||
let input = "foo\r\nbar".strdup();
|
|
||||||
dc_remove_cr_chars(input);
|
|
||||||
assert_eq!("foo\nbar", to_string_lossy(input));
|
|
||||||
free(input.cast());
|
|
||||||
|
|
||||||
let input = "\rfoo\r\rbar\r".strdup();
|
|
||||||
dc_remove_cr_chars(input);
|
|
||||||
assert_eq!("foobar", to_string_lossy(input));
|
|
||||||
free(input.cast());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -319,7 +319,7 @@ fn set_self_key(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn decrypt_setup_file<T: std::io::Read + std::io::Seek>(
|
fn decrypt_setup_file<T: std::io::Read + std::io::Seek>(
|
||||||
context: &Context,
|
_context: &Context,
|
||||||
passphrase: &str,
|
passphrase: &str,
|
||||||
file: T,
|
file: T,
|
||||||
) -> Result<String> {
|
) -> Result<String> {
|
||||||
@@ -592,7 +592,6 @@ fn import_self_keys(context: &Context, dir: impl AsRef<Path>) -> Result<()> {
|
|||||||
Maybe we should make the "default" key handlong also a little bit smarter
|
Maybe we should make the "default" key handlong also a little bit smarter
|
||||||
(currently, the last imported key is the standard key unless it contains the string "legacy" in its name) */
|
(currently, the last imported key is the standard key unless it contains the string "legacy" in its name) */
|
||||||
let mut set_default: bool;
|
let mut set_default: bool;
|
||||||
let mut key: String;
|
|
||||||
let mut imported_cnt = 0;
|
let mut imported_cnt = 0;
|
||||||
|
|
||||||
let dir_name = dir.as_ref().to_string_lossy();
|
let dir_name = dir.as_ref().to_string_lossy();
|
||||||
@@ -806,7 +805,7 @@ mod tests {
|
|||||||
|
|
||||||
assert!(!base64.is_empty());
|
assert!(!base64.is_empty());
|
||||||
|
|
||||||
let mut setup_file = S_EM_SETUPFILE.to_string();
|
let setup_file = S_EM_SETUPFILE.to_string();
|
||||||
let decrypted = decrypt_setup_file(
|
let decrypted = decrypt_setup_file(
|
||||||
context,
|
context,
|
||||||
S_EM_SETUPCODE,
|
S_EM_SETUPCODE,
|
||||||
@@ -814,7 +813,7 @@ mod tests {
|
|||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let (typ, headers, base64) = split_armored_data(&buf_1).unwrap();
|
let (typ, headers, _base64) = split_armored_data(decrypted.as_bytes()).unwrap();
|
||||||
|
|
||||||
assert_eq!(typ, BlockType::PrivateKey);
|
assert_eq!(typ, BlockType::PrivateKey);
|
||||||
assert_eq!(headers.get(HEADER_AUTOCRYPT), Some(&"mutual".to_string()));
|
assert_eq!(headers.get(HEADER_AUTOCRYPT), Some(&"mutual".to_string()));
|
||||||
|
|||||||
36
src/pgp.rs
36
src/pgp.rs
@@ -40,7 +40,7 @@ pub fn split_armored_data(
|
|||||||
let headers = dearmor
|
let headers = dearmor
|
||||||
.headers
|
.headers
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(key, value)| (key.to_lowercase(), value))
|
.map(|(key, value)| (key.trim().to_lowercase(), value.trim().to_string()))
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
Ok((typ, headers, bytes))
|
Ok((typ, headers, bytes))
|
||||||
@@ -218,7 +218,7 @@ mod tests {
|
|||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_split_armored_data() {
|
fn test_split_armored_data_1() {
|
||||||
let (typ, _headers, base64) = split_armored_data(
|
let (typ, _headers, base64) = split_armored_data(
|
||||||
b"-----BEGIN PGP MESSAGE-----\nNoVal:\n\naGVsbG8gd29ybGQ=\n-----END PGP MESSAGE----",
|
b"-----BEGIN PGP MESSAGE-----\nNoVal:\n\naGVsbG8gd29ybGQ=\n-----END PGP MESSAGE----",
|
||||||
)
|
)
|
||||||
@@ -230,36 +230,12 @@ mod tests {
|
|||||||
std::string::String::from_utf8(base64).unwrap(),
|
std::string::String::from_utf8(base64).unwrap(),
|
||||||
"hello world"
|
"hello world"
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
let (typ, _headers, base64) =
|
#[test]
|
||||||
split_armored_data(b"-----BEGIN PGP MESSAGE-----\n\ndat1\n-----END PGP MESSAGE-----\n-----BEGIN PGP MESSAGE-----\n\ndat2\n-----END PGP MESSAGE-----")
|
fn test_split_armored_data_2() {
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
assert_eq!(typ, BlockType::Message);
|
|
||||||
assert!(!base64.is_empty());
|
|
||||||
|
|
||||||
let (typ, _headers, base64) = split_armored_data(
|
|
||||||
b"foo \n -----BEGIN PGP MESSAGE----- \n base64-123 \n -----END PGP MESSAGE-----",
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
assert_eq!(typ, BlockType::Message);
|
|
||||||
assert!(!base64.is_empty());
|
|
||||||
|
|
||||||
assert!(split_armored_data(b"foo-----BEGIN PGP MESSAGE-----",).is_err());
|
|
||||||
|
|
||||||
let (typ, headers, base64) = split_armored_data(
|
let (typ, headers, base64) = split_armored_data(
|
||||||
b"foo \n -----BEGIN PGP MESSAGE-----\n Passphrase-BeGIN : 23 \n \n base64-567 \r\n abc \n -----END PGP MESSAGE-----\n\n\n",
|
b"-----BEGIN PGP PRIVATE KEY BLOCK-----\nAutocrypt-Prefer-Encrypt: mutual \n\nbase64\n-----END PGP PRIVATE KEY BLOCK-----"
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
assert_eq!(typ, BlockType::Message);
|
|
||||||
assert!(!base64.is_empty());
|
|
||||||
|
|
||||||
assert_eq!(headers.get(HEADER_SETUPCODE), Some(&"23".to_string()));
|
|
||||||
|
|
||||||
let (typ, headers, base64) = split_armored_data(
|
|
||||||
b"-----BEGIN PGP PRIVATE KEY BLOCK-----\n Autocrypt-Prefer-Encrypt : mutual \n\nbase64\n-----END PGP PRIVATE KEY BLOCK-----"
|
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user