errors.rs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. use generational_box::{
  2. AlreadyBorrowedError, AlreadyBorrowedMutError, BorrowError, BorrowMutError, GenerationalBox,
  3. Owner, Storage, SyncStorage, UnsyncStorage, ValueDroppedError,
  4. };
  5. #[track_caller]
  6. fn read_at_location<S: Storage<i32>>(
  7. value: GenerationalBox<i32, S>,
  8. ) -> (S::Ref<'static, i32>, &'static std::panic::Location<'static>) {
  9. let location = std::panic::Location::caller();
  10. let read = value.read();
  11. (read, location)
  12. }
  13. #[track_caller]
  14. fn write_at_location<S: Storage<i32>>(
  15. value: GenerationalBox<i32, S>,
  16. ) -> (S::Mut<'static, i32>, &'static std::panic::Location<'static>) {
  17. let location = std::panic::Location::caller();
  18. let write = value.write();
  19. (write, location)
  20. }
  21. #[track_caller]
  22. fn create_at_location<S: Storage<i32>>(
  23. owner: &Owner<S>,
  24. ) -> (
  25. GenerationalBox<i32, S>,
  26. &'static std::panic::Location<'static>,
  27. ) {
  28. let location = std::panic::Location::caller();
  29. let value = owner.insert(1);
  30. (value, location)
  31. }
  32. #[test]
  33. fn read_while_writing_error() {
  34. fn read_while_writing_error_test<S: Storage<i32>>() {
  35. let owner = S::owner();
  36. let value = owner.insert(1);
  37. let (write, location) = write_at_location(value);
  38. assert_eq!(
  39. value.try_read().err(),
  40. Some(BorrowError::AlreadyBorrowedMut(
  41. AlreadyBorrowedMutError::new(location)
  42. ))
  43. );
  44. drop(write);
  45. }
  46. // For sync storage this will deadlock
  47. read_while_writing_error_test::<UnsyncStorage>();
  48. }
  49. #[test]
  50. fn read_after_dropped_error() {
  51. fn read_after_dropped_error_test<S: Storage<i32>>() {
  52. let owner = S::owner();
  53. let (value, location) = create_at_location(&owner);
  54. drop(owner);
  55. assert_eq!(
  56. value.try_read().err(),
  57. Some(BorrowError::Dropped(ValueDroppedError::new(location)))
  58. );
  59. }
  60. read_after_dropped_error_test::<UnsyncStorage>();
  61. read_after_dropped_error_test::<SyncStorage>();
  62. }
  63. #[test]
  64. fn write_while_writing_error() {
  65. fn write_while_writing_error_test<S: Storage<i32>>() {
  66. let owner = S::owner();
  67. let value = owner.insert(1);
  68. #[allow(unused)]
  69. let (write, location) = write_at_location(value);
  70. let write_result = value.try_write();
  71. assert!(write_result.is_err());
  72. #[cfg(any(debug_assertions, feature = "debug_borrows"))]
  73. assert_eq!(
  74. write_result.err(),
  75. Some(BorrowMutError::AlreadyBorrowedMut(
  76. AlreadyBorrowedMutError::new(location)
  77. ))
  78. );
  79. drop(write);
  80. }
  81. // For sync storage this will deadlock
  82. write_while_writing_error_test::<UnsyncStorage>();
  83. }
  84. #[test]
  85. fn write_while_reading_error() {
  86. fn write_while_reading_error_test<S: Storage<i32>>() {
  87. let owner = S::owner();
  88. let value = owner.insert(1);
  89. let (read, location) = read_at_location(value);
  90. assert_eq!(
  91. value.try_write().err(),
  92. Some(BorrowMutError::AlreadyBorrowed(AlreadyBorrowedError::new(
  93. vec![location]
  94. )))
  95. );
  96. drop(read);
  97. }
  98. // For sync storage this will deadlock
  99. write_while_reading_error_test::<UnsyncStorage>();
  100. }