diff --git a/src/dc_strencode.rs b/src/dc_strencode.rs index b6d6d4e22..66f3ffb9f 100644 --- a/src/dc_strencode.rs +++ b/src/dc_strencode.rs @@ -898,4 +898,62 @@ mod tests { unsafe { print_hex(hex.as_mut_ptr(), cur) }; assert_eq!(to_string(hex.as_ptr() as *const _), "=3A"); } + + #[test] + fn test_dc_urlencode_urldecode() { + unsafe { + let buf1 = + dc_urlencode(b"Bj\xc3\xb6rn Petersen\x00" as *const u8 as *const libc::c_char); + + assert_eq!( + CStr::from_ptr(buf1 as *const libc::c_char) + .to_str() + .unwrap(), + "Bj%C3%B6rn+Petersen" + ); + + let buf2 = dc_urldecode(buf1); + + assert_eq!( + strcmp( + buf2, + b"Bj\xc3\xb6rn Petersen\x00" as *const u8 as *const libc::c_char + ), + 0 + ); + + free(buf1 as *mut libc::c_void); + free(buf2 as *mut libc::c_void); + } + } + + #[test] + fn test_dc_encode_decode_modified_utf7() { + unsafe { + let buf1 = dc_encode_modified_utf7( + b"Bj\xc3\xb6rn Petersen\x00" as *const u8 as *const libc::c_char, + 1, + ); + + assert_eq!( + CStr::from_ptr(buf1 as *const libc::c_char) + .to_str() + .unwrap(), + "Bj&APY-rn_Petersen" + ); + + let buf2 = dc_decode_modified_utf7(buf1, 1); + + assert_eq!( + strcmp( + buf2, + b"Bj\xc3\xb6rn Petersen\x00" as *const u8 as *const libc::c_char + ), + 0 + ); + + free(buf1 as *mut libc::c_void); + free(buf2 as *mut libc::c_void); + } + } } diff --git a/src/dc_tools.rs b/src/dc_tools.rs index 9379607f7..642d10cb3 100644 --- a/src/dc_tools.rs +++ b/src/dc_tools.rs @@ -1816,4 +1816,70 @@ mod tests { unsafe { free(raw as *mut _) }; } + + #[test] + fn test_dc_replace_bad_utf8_chars_1() { + unsafe { + let buf1 = strdup(b"ol\xc3\xa1 mundo <>\"\'& \xc3\xa4\xc3\x84\xc3\xb6\xc3\x96\xc3\xbc\xc3\x9c\xc3\x9f foo\xc3\x86\xc3\xa7\xc3\x87 \xe2\x99\xa6&noent;\x00" as *const u8 as *const libc::c_char); + let buf2 = strdup(buf1); + + dc_replace_bad_utf8_chars(buf2); + + assert_eq!(strcmp(buf1, buf2), 0); + + free(buf1 as *mut libc::c_void); + free(buf2 as *mut libc::c_void); + } + } + + #[test] + fn test_dc_replace_bad_utf8_chars_2() { + unsafe { + let buf1 = strdup(b"ISO-String with Ae: \xc4\x00" as *const u8 as *const libc::c_char); + let buf2 = strdup(buf1); + + dc_replace_bad_utf8_chars(buf2); + + assert_eq!( + CStr::from_ptr(buf2 as *const libc::c_char) + .to_str() + .unwrap(), + "ISO-String with Ae: _" + ); + + free(buf1 as *mut libc::c_void); + free(buf2 as *mut libc::c_void); + } + } + + #[test] + fn test_dc_replace_bad_utf8_chars_3() { + unsafe { + let buf1 = strdup(b"\x00" as *const u8 as *const libc::c_char); + let buf2 = strdup(buf1); + + dc_replace_bad_utf8_chars(buf2); + + assert_eq!(*buf2.offset(0), 0); + + free(buf1 as *mut libc::c_void); + free(buf2 as *mut libc::c_void); + } + } + + #[test] + fn test_dc_replace_bad_utf8_chars_4() { + unsafe { + dc_replace_bad_utf8_chars(0 as *mut libc::c_char); + } + } + + #[test] + fn test_dc_create_id() { + unsafe { + let buf = dc_create_id(); + assert_eq!(strlen(buf), 11); + free(buf as *mut libc::c_void); + } + } } diff --git a/tests/stress.rs b/tests/stress.rs index 213ea2156..95c4813e6 100644 --- a/tests/stress.rs +++ b/tests/stress.rs @@ -413,138 +413,6 @@ unsafe fn stress_functions(context: &Context) { free(fn0 as *mut libc::c_void); free(fn1 as *mut libc::c_void); } - - let mut buf1: *mut libc::c_char = - strdup(b"ol\xc3\xa1 mundo <>\"\'& \xc3\xa4\xc3\x84\xc3\xb6\xc3\x96\xc3\xbc\xc3\x9c\xc3\x9f foo\xc3\x86\xc3\xa7\xc3\x87 \xe2\x99\xa6&noent;\x00" - as *const u8 as *const libc::c_char); - let mut buf2: *mut libc::c_char = strdup(buf1); - dc_replace_bad_utf8_chars(buf2); - if 0 != !(strcmp(buf1, buf2) == 0i32) as usize { - __assert_rtn( - (*::std::mem::transmute::<&[u8; 17], &[libc::c_char; 17]>(b"stress_functions\x00")) - .as_ptr(), - b"../cmdline/stress.c\x00" as *const u8 as *const libc::c_char, - 512i32, - b"strcmp(buf1, buf2)==0\x00" as *const u8 as *const libc::c_char, - ); - } else { - }; - free(buf1 as *mut libc::c_void); - free(buf2 as *mut libc::c_void); - buf1 = strdup(b"ISO-String with Ae: \xc4\x00" as *const u8 as *const libc::c_char); - buf2 = strdup(buf1); - dc_replace_bad_utf8_chars(buf2); - if 0 != !(strcmp( - b"ISO-String with Ae: _\x00" as *const u8 as *const libc::c_char, - buf2, - ) == 0i32) as usize - { - __assert_rtn( - (*::std::mem::transmute::<&[u8; 17], &[libc::c_char; 17]>(b"stress_functions\x00")) - .as_ptr(), - b"../cmdline/stress.c\x00" as *const u8 as *const libc::c_char, - 517i32, - b"strcmp(\"ISO-String with Ae: _\", buf2)==0\x00" as *const u8 as *const libc::c_char, - ); - } else { - }; - free(buf1 as *mut libc::c_void); - free(buf2 as *mut libc::c_void); - buf1 = strdup(b"\x00" as *const u8 as *const libc::c_char); - buf2 = strdup(buf1); - dc_replace_bad_utf8_chars(buf2); - if 0 != !(*buf2.offset(0isize) as libc::c_int == 0i32) as usize { - __assert_rtn( - (*::std::mem::transmute::<&[u8; 17], &[libc::c_char; 17]>(b"stress_functions\x00")) - .as_ptr(), - b"../cmdline/stress.c\x00" as *const u8 as *const libc::c_char, - 522i32, - b"buf2[0]==0\x00" as *const u8 as *const libc::c_char, - ); - } else { - }; - free(buf1 as *mut libc::c_void); - free(buf2 as *mut libc::c_void); - dc_replace_bad_utf8_chars(0 as *mut libc::c_char); - buf1 = dc_urlencode(b"Bj\xc3\xb6rn Petersen\x00" as *const u8 as *const libc::c_char); - if 0 != !(strcmp( - buf1, - b"Bj%C3%B6rn+Petersen\x00" as *const u8 as *const libc::c_char, - ) == 0i32) as usize - { - __assert_rtn( - (*::std::mem::transmute::<&[u8; 17], &[libc::c_char; 17]>(b"stress_functions\x00")) - .as_ptr(), - b"../cmdline/stress.c\x00" as *const u8 as *const libc::c_char, - 528i32, - b"strcmp(buf1, \"Bj%C3%B6rn+Petersen\") == 0\x00" as *const u8 as *const libc::c_char, - ); - } else { - }; - buf2 = dc_urldecode(buf1); - if 0 != !(strcmp( - buf2, - b"Bj\xc3\xb6rn Petersen\x00" as *const u8 as *const libc::c_char, - ) == 0i32) as usize - { - __assert_rtn( - (*::std::mem::transmute::<&[u8; 17], &[libc::c_char; 17]>(b"stress_functions\x00")) - .as_ptr(), - b"../cmdline/stress.c\x00" as *const u8 as *const libc::c_char, - 530i32, - b"strcmp(buf2, \"Bj\xc3\xb6rn Petersen\") == 0\x00" as *const u8 as *const libc::c_char, - ); - } else { - }; - free(buf1 as *mut libc::c_void); - free(buf2 as *mut libc::c_void); - buf1 = dc_create_id(); - if 0 != !(strlen(buf1) == 11) as usize { - __assert_rtn( - (*::std::mem::transmute::<&[u8; 17], &[libc::c_char; 17]>(b"stress_functions\x00")) - .as_ptr(), - b"../cmdline/stress.c\x00" as *const u8 as *const libc::c_char, - 534i32, - b"strlen(buf1) == DC_CREATE_ID_LEN\x00" as *const u8 as *const libc::c_char, - ); - } else { - }; - free(buf1 as *mut libc::c_void); - buf1 = dc_encode_modified_utf7( - b"Bj\xc3\xb6rn Petersen\x00" as *const u8 as *const libc::c_char, - 1i32, - ); - if 0 != !(strcmp( - buf1, - b"Bj&APY-rn_Petersen\x00" as *const u8 as *const libc::c_char, - ) == 0i32) as usize - { - __assert_rtn( - (*::std::mem::transmute::<&[u8; 17], &[libc::c_char; 17]>(b"stress_functions\x00")) - .as_ptr(), - b"../cmdline/stress.c\x00" as *const u8 as *const libc::c_char, - 600i32, - b"strcmp(buf1, \"Bj&APY-rn_Petersen\")==0\x00" as *const u8 as *const libc::c_char, - ); - } else { - }; - buf2 = dc_decode_modified_utf7(buf1, 1i32); - if 0 != !(strcmp( - buf2, - b"Bj\xc3\xb6rn Petersen\x00" as *const u8 as *const libc::c_char, - ) == 0i32) as usize - { - __assert_rtn( - (*::std::mem::transmute::<&[u8; 17], &[libc::c_char; 17]>(b"stress_functions\x00")) - .as_ptr(), - b"../cmdline/stress.c\x00" as *const u8 as *const libc::c_char, - 602i32, - b"strcmp(buf2, \"Bj\xc3\xb6rn Petersen\")==0\x00" as *const u8 as *const libc::c_char, - ); - } else { - }; - free(buf1 as *mut libc::c_void); - free(buf2 as *mut libc::c_void); if 0 != !(2100i32 == 2100i32 || 2100i32 == 2052i32 || 2100i32 == 2055i32) as usize { __assert_rtn( (*::std::mem::transmute::<&[u8; 17], &[libc::c_char; 17]>(b"stress_functions\x00"))