diff options
Diffstat (limited to 'vendor/dlmalloc/tests/smoke.rs')
-rw-r--r-- | vendor/dlmalloc/tests/smoke.rs | 91 |
1 files changed, 91 insertions, 0 deletions
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)); + } + } +} |