aboutsummaryrefslogtreecommitdiff
path: root/src/rust/tor_util/tests/rust_string.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/rust/tor_util/tests/rust_string.rs')
-rw-r--r--src/rust/tor_util/tests/rust_string.rs37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/rust/tor_util/tests/rust_string.rs b/src/rust/tor_util/tests/rust_string.rs
new file mode 100644
index 0000000000..1ff605a43c
--- /dev/null
+++ b/src/rust/tor_util/tests/rust_string.rs
@@ -0,0 +1,37 @@
+extern crate tor_util;
+extern crate libc;
+
+use std::ffi::CString;
+use tor_util::RustString;
+
+#[test]
+fn rust_string_conversions_preserve_c_string() {
+ let s = CString::new("asdf foo").unwrap();
+ let r = RustString::from(s.clone());
+ let r2 = RustString::from(s.clone());
+ let c = r2.as_ptr();
+ assert_eq!(unsafe { libc::strlen(c) }, 8);
+ let c_str = r.into();
+ assert_eq!(s, c_str);
+}
+
+#[test]
+fn empty_string() {
+ let s = CString::new("").unwrap();
+ let r = RustString::from(s.clone());
+ let c = r.as_ptr();
+ assert_eq!(unsafe { libc::strlen(c) }, 0);
+ let c_str = r.into();
+ assert_eq!(s, c_str);
+}
+
+#[test]
+fn c_string_with_unicode() {
+ // The euro sign is three bytes
+ let s = CString::new("asd€asd").unwrap();
+ let r = RustString::from(s.clone());
+ let c = r.as_ptr();
+ assert_eq!(unsafe { libc::strlen(c) }, 9);
+ let c_str = r.into();
+ assert_eq!(s, c_str);
+}