LCOV - code coverage report
Current view: top level - src/test - reverselock_tests.cpp (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 44 44 100.0 %
Date: 2025-02-23 09:33:43 Functions: 6 6 100.0 %

          Line data    Source code
       1             : // Copyright (c) 2015 The Bitcoin Core developers
       2             : // Copyright (c) 2017-2022 The PIVX Core developers
       3             : // Distributed under the MIT software license, see the accompanying
       4             : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
       5             : 
       6             : #include "sync.h"
       7             : 
       8             : #include <boost/test/unit_test.hpp>
       9             : 
      10             : BOOST_AUTO_TEST_SUITE(reverselock_tests)
      11             : 
      12           2 : BOOST_AUTO_TEST_CASE(reverselock_basics)
      13             : {
      14           2 :     Mutex mutex;
      15           2 :     WAIT_LOCK(mutex, lock);
      16             : 
      17           2 :     BOOST_CHECK(lock.owns_lock());
      18           1 :     {
      19           2 :         REVERSE_LOCK(lock);
      20           2 :         BOOST_CHECK(!lock.owns_lock());
      21             :     }
      22           2 :     BOOST_CHECK(lock.owns_lock());
      23           1 : }
      24             : 
      25           2 : BOOST_AUTO_TEST_CASE(reverselock_multiple)
      26             : {
      27           2 :     Mutex mutex2;
      28           2 :     Mutex mutex;
      29           2 :     WAIT_LOCK(mutex2, lock2);
      30           2 :     WAIT_LOCK(mutex, lock);
      31             : 
      32             :     // Make sure undoing two locks succeeds
      33           1 :     {
      34           2 :         REVERSE_LOCK(lock);
      35           2 :         BOOST_CHECK(!lock.owns_lock());
      36           2 :         REVERSE_LOCK(lock2);
      37           2 :         BOOST_CHECK(!lock2.owns_lock());
      38             :     }
      39           1 :     BOOST_CHECK(lock.owns_lock());
      40           2 :     BOOST_CHECK(lock2.owns_lock());
      41           1 : }
      42             : 
      43           2 : BOOST_AUTO_TEST_CASE(reverselock_errors)
      44             : {
      45           2 :     Mutex mutex2;
      46           2 :     Mutex mutex;
      47           2 :     WAIT_LOCK(mutex2, lock2);
      48           2 :     WAIT_LOCK(mutex, lock);
      49             : 
      50             : #ifdef DEBUG_LOCKORDER
      51             :     // Make sure trying to reverse lock a previous lock fails
      52             :     try {
      53             :         REVERSE_LOCK(lock2);
      54             :         BOOST_CHECK(false); // REVERSE_LOCK(lock2) succeeded
      55             :     } catch(...) { }
      56             :     BOOST_CHECK(lock2.owns_lock());
      57             : #endif
      58             : 
      59             :     // Make sure trying to reverse lock an unlocked lock fails
      60           1 :     lock.unlock();
      61             : 
      62           2 :     BOOST_CHECK(!lock.owns_lock());
      63             : 
      64           1 :     bool failed = false;
      65           1 :     try {
      66           1 :         REVERSE_LOCK(lock);
      67           1 :     } catch(...) {
      68           1 :         failed = true;
      69             :     }
      70             : 
      71           2 :     BOOST_CHECK(failed);
      72           2 :     BOOST_CHECK(!lock.owns_lock());
      73             : 
      74             :     // Locking the original lock after it has been taken by a reverse lock
      75             :     // makes no sense. Ensure that the original lock no longer owns the lock
      76             :     // after giving it to a reverse one.
      77             : 
      78           1 :     lock.lock();
      79           2 :     BOOST_CHECK(lock.owns_lock());
      80           1 :     {
      81           2 :         REVERSE_LOCK(lock);
      82           2 :         BOOST_CHECK(!lock.owns_lock());
      83             :     }
      84             : 
      85           2 :     BOOST_CHECK(failed);
      86           2 :     BOOST_CHECK(lock.owns_lock());
      87           1 : }
      88             : 
      89             : BOOST_AUTO_TEST_SUITE_END()

Generated by: LCOV version 1.14