summaryrefslogtreecommitdiffstats
path: root/vendor/dlmalloc/tests
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--vendor/dlmalloc/tests/global.rs31
-rw-r--r--vendor/dlmalloc/tests/smoke.rs91
2 files changed, 122 insertions, 0 deletions
diff --git a/vendor/dlmalloc/tests/global.rs b/vendor/dlmalloc/tests/global.rs
new file mode 100644
index 000000000..1e9bc66ec
--- /dev/null
+++ b/vendor/dlmalloc/tests/global.rs
@@ -0,0 +1,31 @@
+extern crate dlmalloc;
+
+use std::collections::HashMap;
+use std::thread;
+
+#[global_allocator]
+#[cfg(feature = "global")]
+static A: dlmalloc::GlobalDlmalloc = dlmalloc::GlobalDlmalloc;
+
+#[test]
+fn foo() {
+ println!("hello");
+}
+
+#[test]
+fn map() {
+ let mut m = HashMap::new();
+ m.insert(1, 2);
+ m.insert(5, 3);
+ drop(m);
+}
+
+#[test]
+fn strings() {
+ format!("foo, bar, {}", "baz");
+}
+
+#[test]
+fn threads() {
+ assert!(thread::spawn(|| panic!()).join().is_err());
+}
diff --git a/vendor/dlmalloc/tests/smoke.rs b/vendor/dlmalloc/tests/smoke.rs
new file mode 100644
index 000000000..cd69f9402
--- /dev/null
+++ b/vendor/dlmalloc/tests/smoke.rs
@@ -0,0 +1,91 @@
+extern crate dlmalloc;
+extern crate rand;
+
+use dlmalloc::Dlmalloc;
+use rand::Rng;
+use std::cmp;
+
+#[test]
+fn smoke() {
+ let mut a = Dlmalloc::new();
+ unsafe {
+ let ptr = a.malloc(1, 1);
+ assert!(!ptr.is_null());
+ *ptr = 9;
+ assert_eq!(*ptr, 9);
+ a.free(ptr, 1, 1);
+
+ let ptr = a.malloc(1, 1);
+ assert!(!ptr.is_null());
+ *ptr = 10;
+ assert_eq!(*ptr, 10);
+ a.free(ptr, 1, 1);
+ }
+}
+
+#[test]
+fn stress() {
+ let mut a = Dlmalloc::new();
+ let mut rng = rand::thread_rng();
+ let mut ptrs = Vec::new();
+ let max = if cfg!(test_lots) { 1_000_000 } else { 1_000 };
+ unsafe {
+ for _ in 0..max {
+ let free =
+ ptrs.len() > 0 && ((ptrs.len() < 10_000 && rng.gen_weighted_bool(3)) || rng.gen());
+ if free {
+ let idx = rng.gen_range(0, ptrs.len());
+ let (ptr, size, align) = ptrs.swap_remove(idx);
+ a.free(ptr, size, align);
+ continue;
+ }
+
+ if ptrs.len() > 0 && rng.gen_weighted_bool(100) {
+ let idx = rng.gen_range(0, ptrs.len());
+ let (ptr, size, align) = ptrs.swap_remove(idx);
+ let new_size = if rng.gen() {
+ rng.gen_range(size, size * 2)
+ } else if size > 10 {
+ rng.gen_range(size / 2, size)
+ } else {
+ continue;
+ };
+ let mut tmp = Vec::new();
+ for i in 0..cmp::min(size, new_size) {
+ tmp.push(*ptr.offset(i as isize));
+ }
+ let ptr = a.realloc(ptr, size, align, new_size);
+ assert!(!ptr.is_null());
+ for (i, byte) in tmp.iter().enumerate() {
+ assert_eq!(*byte, *ptr.offset(i as isize));
+ }
+ ptrs.push((ptr, new_size, align));
+ }
+
+ let size = if rng.gen() {
+ rng.gen_range(1, 128)
+ } else {
+ rng.gen_range(1, 128 * 1024)
+ };
+ let align = if rng.gen_weighted_bool(10) {
+ 1 << rng.gen_range(3, 8)
+ } else {
+ 8
+ };
+
+ let zero = rng.gen_weighted_bool(50);
+ let ptr = if zero {
+ a.calloc(size, align)
+ } else {
+ a.malloc(size, align)
+ };
+ for i in 0..size {
+ if zero {
+ assert_eq!(*ptr.offset(i as isize), 0);
+ }
+ *ptr.offset(i as isize) = 0xce;
+ }
+ ptrs.push((ptr, size, align));
+ }
+ }
+}