about summary refs log tree commit diff
diff options
context:
space:
mode:
authorStein Somers <git@steinsomers.be>2021-08-16 17:29:35 +0200
committerStein Somers <git@steinsomers.be>2021-08-16 17:29:35 +0200
commit923212e3e8fd39a7ef68db12bc4196c8ea41390e (patch)
tree3c786f39d5ce2cf2a3407afaf084ef9ab7b423f5
parent23461b210f1b0a121592a18fc4fb666106006668 (diff)
downloadrust-923212e3e8fd39a7ef68db12bc4196c8ea41390e.tar.gz
rust-923212e3e8fd39a7ef68db12bc4196c8ea41390e.zip
BTree: toughen panicky test of clone()
-rw-r--r--library/alloc/src/collections/btree/map/tests.rs55
-rw-r--r--library/alloc/src/collections/btree/testing/crash_test.rs2
2 files changed, 32 insertions, 25 deletions
diff --git a/library/alloc/src/collections/btree/map/tests.rs b/library/alloc/src/collections/btree/map/tests.rs
index 17e53848343..234410b1c05 100644
--- a/library/alloc/src/collections/btree/map/tests.rs
+++ b/library/alloc/src/collections/btree/map/tests.rs
@@ -1494,33 +1494,40 @@ fn test_clone() {
     map.check();
 }
 
-#[test]
-fn test_clone_panic_leak() {
-    let a = CrashTestDummy::new(0);
-    let b = CrashTestDummy::new(1);
-    let c = CrashTestDummy::new(2);
+fn test_clone_panic_leak(size: usize) {
+    for i in 0..size {
+        let dummies: Vec<CrashTestDummy> = (0..size).map(|id| CrashTestDummy::new(id)).collect();
+        let map: BTreeMap<_, ()> = dummies
+            .iter()
+            .map(|dummy| {
+                let panic = if dummy.id == i { Panic::InClone } else { Panic::Never };
+                (dummy.spawn(panic), ())
+            })
+            .collect();
 
-    let mut map = BTreeMap::new();
-    map.insert(a.spawn(Panic::Never), ());
-    map.insert(b.spawn(Panic::InClone), ());
-    map.insert(c.spawn(Panic::Never), ());
+        catch_unwind(|| map.clone()).unwrap_err();
+        for d in &dummies {
+            assert_eq!(d.cloned(), if d.id <= i { 1 } else { 0 }, "id={}/{}", d.id, i);
+            assert_eq!(d.dropped(), if d.id < i { 1 } else { 0 }, "id={}/{}", d.id, i);
+        }
+        assert_eq!(map.len(), size);
 
-    catch_unwind(|| map.clone()).unwrap_err();
-    assert_eq!(a.cloned(), 1);
-    assert_eq!(b.cloned(), 1);
-    assert_eq!(c.cloned(), 0);
-    assert_eq!(a.dropped(), 1);
-    assert_eq!(b.dropped(), 0);
-    assert_eq!(c.dropped(), 0);
-    assert_eq!(map.len(), 3);
+        drop(map);
+        for d in &dummies {
+            assert_eq!(d.cloned(), if d.id <= i { 1 } else { 0 }, "id={}/{}", d.id, i);
+            assert_eq!(d.dropped(), if d.id < i { 2 } else { 1 }, "id={}/{}", d.id, i);
+        }
+    }
+}
 
-    drop(map);
-    assert_eq!(a.cloned(), 1);
-    assert_eq!(b.cloned(), 1);
-    assert_eq!(c.cloned(), 0);
-    assert_eq!(a.dropped(), 2);
-    assert_eq!(b.dropped(), 1);
-    assert_eq!(c.dropped(), 1);
+#[test]
+fn test_clone_panic_leak_height_0() {
+    test_clone_panic_leak(3)
+}
+
+#[test]
+fn test_clone_panic_leak_height_1() {
+    test_clone_panic_leak(MIN_INSERTS_HEIGHT_1)
 }
 
 #[test]
diff --git a/library/alloc/src/collections/btree/testing/crash_test.rs b/library/alloc/src/collections/btree/testing/crash_test.rs
index b2527b95f5b..488eaa07a95 100644
--- a/library/alloc/src/collections/btree/testing/crash_test.rs
+++ b/library/alloc/src/collections/btree/testing/crash_test.rs
@@ -11,7 +11,7 @@ use std::sync::atomic::{AtomicUsize, Ordering::SeqCst};
 /// on anything defined in the crate, apart from the `Debug` trait.
 #[derive(Debug)]
 pub struct CrashTestDummy {
-    id: usize,
+    pub id: usize,
     cloned: AtomicUsize,
     dropped: AtomicUsize,
     queried: AtomicUsize,