rust/pyo3-sharedref/tests/test_sharedref.rs
author Pierre-Yves David <pierre-yves.david@octobus.net>
Tue, 11 Mar 2025 02:29:42 +0100
branchstable
changeset 53042 cdd7bf612c7b
parent 52613 ac0cb3c334a1
permissions -rw-r--r--
bundle-spec: properly format boolean parameter (issue6960) This was breaking automatic clone bundle generation. This changeset fixes it and add a test to catch it in the future.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
     1
use pyo3::prelude::*;
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
     2
use pyo3_sharedref::*;
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
     3
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
     4
#[pyclass]
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
     5
struct Owner {
52610
c25d345f5aa5 rust-pyo3-sharedref: renamed PySharedRefCell to PyShareable
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52609
diff changeset
     6
    string: PyShareable<String>,
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
     7
}
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
     8
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
     9
#[pymethods]
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    10
impl Owner {
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    11
    #[new]
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    12
    fn new(s: String) -> Self {
52608
d85514a88706 rust-pyo3-sharedref: reworked constructors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52607
diff changeset
    13
        Self { string: s.into() }
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    14
    }
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    15
}
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    16
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    17
fn with_setup(
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    18
    test: impl FnOnce(Python<'_>, &Bound<'_, Owner>) -> PyResult<()>,
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    19
) -> PyResult<()> {
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    20
    pyo3::prepare_freethreaded_python();
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    21
    Python::with_gil(|py| {
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    22
        let owner = Bound::new(py, Owner::new("new".to_owned()))?;
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    23
        test(py, &owner)
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    24
    })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    25
}
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    26
52611
4a73eb3923ac rust-pyo3-sharedref: renamed UnsafePyLeaked to SharedByPyObject
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52610
diff changeset
    27
/// "leak" in the sense of `SharedByPyObject` the `string` data field,
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    28
/// taking care of all the boilerplate
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    29
fn share_string(
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    30
    owner: &Bound<'_, Owner>,
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    31
) -> SharedByPyObject<&'static String> {
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    32
    let shareable = &owner.borrow().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    33
    unsafe { shareable.share(owner) }
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    34
}
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    35
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    36
fn try_share_string(
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    37
    owner: &Bound<'_, Owner>,
52611
4a73eb3923ac rust-pyo3-sharedref: renamed UnsafePyLeaked to SharedByPyObject
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52610
diff changeset
    38
) -> Result<SharedByPyObject<&'static String>, TryShareError> {
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    39
    let shareable = &owner.borrow().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    40
    unsafe { shareable.try_share(owner) }
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    41
}
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    42
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    43
/// Mutate the `string` field of `owner` as would be done from Python code
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    44
///
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    45
/// This is to simulate normal mutation of the owner object from
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    46
/// the Python interpreter. This could be replaced by methods of [`Owner`]
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    47
/// (wih closure replaced by a small fixed operations)
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    48
/// and perhaps will, once we are done converting the original tests
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    49
/// from rust-cpython
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    50
fn mutate_string<'py>(
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    51
    owner: &'py Bound<'py, Owner>,
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    52
    f: impl FnOnce(&mut String),
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    53
) -> () {
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    54
    let shareable = &owner.borrow_mut().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    55
    let shared_ref = unsafe { shareable.borrow_with_owner(owner) };
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
    56
    f(&mut shared_ref.write());
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    57
}
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    58
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    59
#[test]
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    60
fn test_shared_borrow() -> PyResult<()> {
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    61
    with_setup(|py, owner| {
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    62
        let shared = share_string(owner);
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    63
        let shared_ref = unsafe { shared.try_borrow(py) }.unwrap();
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    64
        assert_eq!(*shared_ref, "new");
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    65
        Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    66
    })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    67
}
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    68
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    69
#[test]
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    70
fn test_shared_borrow_mut() -> PyResult<()> {
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    71
    with_setup(|py, owner| {
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    72
        let shared = share_string(owner);
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    73
        let mut shared_iter = unsafe { shared.map(py, |s| s.chars()) };
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    74
        let mut shared_ref =
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    75
            unsafe { shared_iter.try_borrow_mut(py) }.unwrap();
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    76
        assert_eq!(shared_ref.next(), Some('n'));
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    77
        assert_eq!(shared_ref.next(), Some('e'));
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    78
        assert_eq!(shared_ref.next(), Some('w'));
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    79
        assert_eq!(shared_ref.next(), None);
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    80
        Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    81
    })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    82
}
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    83
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    84
#[test]
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    85
fn test_shared_borrow_after_mut() -> PyResult<()> {
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    86
    with_setup(|py, owner| {
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    87
        let shared = share_string(owner);
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    88
        mutate_string(owner, String::clear);
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    89
        assert!(unsafe { shared.try_borrow(py) }.is_err());
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    90
        Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    91
    })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    92
}
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    93
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    94
#[test]
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    95
fn test_shared_borrow_mut_after_mut() -> PyResult<()> {
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    96
    with_setup(|py, owner| {
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    97
        let shared = share_string(owner);
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
    98
        let mut shared_iter = unsafe { shared.map(py, |s| s.chars()) };
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
    99
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   100
        mutate_string(owner, String::clear);
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   101
        assert!(unsafe { shared_iter.try_borrow_mut(py) }.is_err());
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   102
        Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   103
    })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   104
}
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   105
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   106
#[test]
52611
4a73eb3923ac rust-pyo3-sharedref: renamed UnsafePyLeaked to SharedByPyObject
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52610
diff changeset
   107
#[should_panic(expected = "map() over invalidated shared reference")]
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   108
fn test_shared_map_after_mut() {
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   109
    with_setup(|py, owner| {
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   110
        let shared = share_string(owner);
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   111
        mutate_string(owner, String::clear);
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   112
        let _shared_iter = unsafe { shared.map(py, |s| s.chars()) };
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   113
        Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   114
    })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   115
    .expect("should already have panicked")
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   116
}
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   117
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   118
/// run `try_borrow_mut` on the `string` field and assert it is not an error
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   119
///
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   120
/// Simply returning the `Result` is not possible, because that is
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   121
/// returning a reference to data owned by the function
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   122
fn assert_try_write_string_ok(owner: &Bound<'_, Owner>) {
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   123
    let shareable = &owner.borrow().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   124
    let shared_ref = unsafe { shareable.borrow_with_owner(owner) };
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   125
    assert!(shared_ref.try_write().is_ok());
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   126
}
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   127
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   128
fn assert_try_write_string_err(owner: &Bound<'_, Owner>) {
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   129
    let shareable = &owner.borrow().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   130
    let shared_ref = unsafe { shareable.borrow_with_owner(owner) };
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   131
    assert!(shared_ref.try_write().is_err());
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   132
}
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   133
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   134
fn assert_try_read_string_err(owner: &Bound<'_, Owner>) {
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   135
    let shareable = &owner.borrow().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   136
    let shared_ref = unsafe { shareable.borrow_with_owner(owner) };
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   137
    assert!(shared_ref.try_read().is_err());
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   138
}
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   139
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   140
#[test]
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   141
fn test_try_write_while_shared_ref() -> PyResult<()> {
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   142
    with_setup(|py, owner| {
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   143
        assert_try_write_string_ok(owner);
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   144
        let shared = share_string(owner);
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   145
        {
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   146
            let _shared_ref = unsafe { shared.try_borrow(py) }.unwrap();
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   147
            assert_try_write_string_err(owner);
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   148
            {
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   149
                let _shared_ref2 = unsafe { shared.try_borrow(py) }.unwrap();
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   150
                assert_try_write_string_err(owner);
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   151
            }
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   152
            assert_try_write_string_err(owner);
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   153
        }
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   154
        assert_try_write_string_ok(owner);
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   155
        Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   156
    })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   157
}
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   158
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   159
#[test]
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   160
fn test_try_write_while_shared_ref_mut() -> PyResult<()> {
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   161
    with_setup(|py, owner| {
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   162
        assert_try_write_string_ok(owner);
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   163
        let shared = share_string(owner);
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   164
        let mut shared_iter = unsafe { shared.map(py, |s| s.chars()) };
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   165
        {
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   166
            let _shared_ref =
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   167
                unsafe { shared_iter.try_borrow_mut(py) }.unwrap();
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   168
            assert_try_write_string_err(owner);
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   169
        }
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   170
        assert_try_write_string_ok(owner);
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   171
        Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   172
    })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   173
}
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   174
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   175
#[test]
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   176
fn test_try_share_while_write() -> PyResult<()> {
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   177
    with_setup(|_py, owner| {
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   178
        let shareable = &owner.borrow().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   179
        let shared_ref = unsafe { shareable.borrow_with_owner(owner) };
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   180
        let _mut_ref = shared_ref.write();
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   181
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   182
        assert!(try_share_string(owner).is_err());
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   183
        Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   184
    })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   185
}
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   186
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   187
#[test]
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   188
#[should_panic(expected = "already mutably borrowed")]
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   189
fn test_share_while_write() {
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   190
    with_setup(|_py, owner| {
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   191
        let shareable = &owner.borrow().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   192
        let shared_ref = unsafe { shareable.borrow_with_owner(owner) };
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   193
        let _mut_ref = shared_ref.write();
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   194
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   195
        share_string(owner);
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   196
        Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   197
    })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   198
    .expect("should already have panicked")
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   199
}
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   200
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   201
#[test]
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   202
fn test_try_write_while_borrow() -> PyResult<()> {
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   203
    with_setup(|_py, owner| {
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   204
        let shareable = &owner.borrow().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   205
        let shared_ref = unsafe { shareable.borrow_with_owner(owner) };
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   206
        let _ref = shared_ref.read();
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   207
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   208
        assert_try_write_string_err(owner);
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   209
        Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   210
    })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   211
}
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   212
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   213
#[test]
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   214
#[should_panic(expected = "already borrowed")]
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   215
fn test_write_while_borrow() {
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   216
    with_setup(|_py, owner| {
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   217
        let shareable = &owner.borrow().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   218
        let shared_ref = unsafe { shareable.borrow_with_owner(owner) };
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   219
        let _ref = shared_ref.read();
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   220
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   221
        let shared_ref2 = unsafe { shareable.borrow_with_owner(owner) };
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   222
        let _mut_ref = shared_ref2.write();
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   223
        Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   224
    })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   225
    .expect("should already have panicked")
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   226
}
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   227
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   228
#[test]
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   229
fn test_try_borrow_while_write() -> PyResult<()> {
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   230
    with_setup(|_py, owner| {
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   231
        let shareable = &owner.borrow().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   232
        let shared_ref = unsafe { shareable.borrow_with_owner(owner) };
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   233
        let _mut_ref = shared_ref.write();
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   234
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   235
        assert_try_read_string_err(owner);
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   236
        Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   237
    })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   238
}
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   239
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   240
#[test]
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   241
#[should_panic(expected = "already mutably borrowed")]
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   242
fn test_borrow_while_write() {
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   243
    with_setup(|_py, owner| {
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   244
        let shareable = &owner.borrow().string;
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   245
        let shared_ref = unsafe { shareable.borrow_with_owner(owner) };
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   246
        let _mut_ref = shared_ref.write();
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   247
52613
ac0cb3c334a1 rust-pyo3-sharedref: renamings in test
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52612
diff changeset
   248
        let shared_ref2 = unsafe { shareable.borrow_with_owner(owner) };
52609
d1e304025b90 rust-pyo3-sharedref: replaced borrow/borrow_mut with RwLock namings
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52608
diff changeset
   249
        let _ref = shared_ref2.read();
52607
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   250
        Ok(())
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   251
    })
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   252
    .expect("should already have panicked")
a7d2529ed6dd rust-pyo3-sharedref: converted integration tests from rust-cpython
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
   253
}