basic.rs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. use generational_box::{GenerationalBox, Storage, SyncStorage, UnsyncStorage};
  2. /// # Example
  3. ///
  4. /// ```compile_fail
  5. /// let data = String::from("hello world");
  6. /// let owner = UnsyncStorage::owner();
  7. /// let key = owner.insert(&data);
  8. /// drop(data);
  9. /// assert_eq!(*key.read(), "hello world");
  10. /// ```
  11. #[allow(unused)]
  12. fn compile_fail() {}
  13. #[test]
  14. fn reused() {
  15. fn reused_test<S: Storage<i32>>() {
  16. let first_ptr;
  17. {
  18. let owner = S::owner();
  19. first_ptr = owner.insert(1).raw_ptr();
  20. drop(owner);
  21. }
  22. {
  23. let owner = S::owner();
  24. let second_ptr = owner.insert(1234).raw_ptr();
  25. assert_eq!(first_ptr, second_ptr);
  26. drop(owner);
  27. }
  28. }
  29. reused_test::<UnsyncStorage>();
  30. reused_test::<SyncStorage>();
  31. }
  32. #[test]
  33. fn leaking_is_ok() {
  34. fn leaking_is_ok_test<S: Storage<String>>() {
  35. let data = String::from("hello world");
  36. let key;
  37. {
  38. // create an owner
  39. let owner = S::owner();
  40. // insert data into the store
  41. key = owner.insert(data);
  42. // don't drop the owner
  43. std::mem::forget(owner);
  44. }
  45. assert_eq!(
  46. key.try_read().as_deref().unwrap(),
  47. &"hello world".to_string()
  48. );
  49. }
  50. leaking_is_ok_test::<UnsyncStorage>();
  51. leaking_is_ok_test::<SyncStorage>();
  52. }
  53. #[test]
  54. fn drops() {
  55. fn drops_test<S: Storage<String>>() {
  56. let data = String::from("hello world");
  57. let key;
  58. {
  59. // create an owner
  60. let owner = S::owner();
  61. // insert data into the store
  62. key = owner.insert(data);
  63. // drop the owner
  64. }
  65. assert!(key.try_read().is_err());
  66. }
  67. drops_test::<UnsyncStorage>();
  68. drops_test::<SyncStorage>();
  69. }
  70. #[test]
  71. fn works() {
  72. fn works_test<S: Storage<i32>>() {
  73. let owner = S::owner();
  74. let key = owner.insert(1);
  75. assert_eq!(*key.read(), 1);
  76. }
  77. works_test::<UnsyncStorage>();
  78. works_test::<SyncStorage>();
  79. }
  80. #[test]
  81. fn insert_while_reading() {
  82. fn insert_while_reading_test<S: Storage<String> + Storage<&'static i32>>() {
  83. let owner = S::owner();
  84. let key;
  85. {
  86. let data: String = "hello world".to_string();
  87. key = owner.insert(data);
  88. }
  89. let value = key.read();
  90. owner.insert(&1);
  91. assert_eq!(*value, "hello world");
  92. }
  93. insert_while_reading_test::<UnsyncStorage>();
  94. insert_while_reading_test::<SyncStorage>();
  95. }
  96. #[test]
  97. #[should_panic]
  98. fn panics() {
  99. fn panics_test<S: Storage<i32>>() {
  100. let owner = S::owner();
  101. let key = owner.insert(1);
  102. drop(owner);
  103. assert_eq!(*key.read(), 1);
  104. }
  105. panics_test::<UnsyncStorage>();
  106. panics_test::<SyncStorage>();
  107. }
  108. #[test]
  109. fn fuzz() {
  110. fn maybe_owner_scope<S: Storage<String>>(
  111. valid_keys: &mut Vec<GenerationalBox<String, S>>,
  112. invalid_keys: &mut Vec<GenerationalBox<String, S>>,
  113. path: &mut Vec<u8>,
  114. ) {
  115. let branch_cutoff = 5;
  116. let children = if path.len() < branch_cutoff {
  117. rand::random::<u8>() % 4
  118. } else {
  119. rand::random::<u8>() % 2
  120. };
  121. for i in 0..children {
  122. let owner = S::owner();
  123. let key = owner.insert(format!("hello world {path:?}"));
  124. println!("created new box {key:?}");
  125. valid_keys.push(key);
  126. path.push(i);
  127. // read all keys
  128. println!("{:?}", path);
  129. for key in valid_keys.iter() {
  130. println!("reading {key:?}");
  131. let value = key.read();
  132. println!("{:?}", &*value);
  133. assert!(value.starts_with("hello world"));
  134. }
  135. for key in invalid_keys.iter() {
  136. println!("reading invalid {key:?}");
  137. assert!(key.try_read().is_err());
  138. }
  139. maybe_owner_scope(valid_keys, invalid_keys, path);
  140. let invalid = valid_keys.pop().unwrap();
  141. println!("popping {invalid:?}");
  142. invalid_keys.push(invalid);
  143. path.pop();
  144. }
  145. }
  146. for _ in 0..10 {
  147. maybe_owner_scope::<UnsyncStorage>(&mut Vec::new(), &mut Vec::new(), &mut Vec::new());
  148. }
  149. for _ in 0..10 {
  150. maybe_owner_scope::<SyncStorage>(&mut Vec::new(), &mut Vec::new(), &mut Vec::new());
  151. }
  152. }