PIVX Core  5.6.99
P2P Digital Currency
reverselock_tests.cpp
Go to the documentation of this file.
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 BOOST_AUTO_TEST_CASE(reverselock_basics)
13 {
14  Mutex mutex;
15  WAIT_LOCK(mutex, lock);
16 
17  BOOST_CHECK(lock.owns_lock());
18  {
19  REVERSE_LOCK(lock);
20  BOOST_CHECK(!lock.owns_lock());
21  }
22  BOOST_CHECK(lock.owns_lock());
23 }
24 
25 BOOST_AUTO_TEST_CASE(reverselock_multiple)
26 {
27  Mutex mutex2;
28  Mutex mutex;
29  WAIT_LOCK(mutex2, lock2);
30  WAIT_LOCK(mutex, lock);
31 
32  // Make sure undoing two locks succeeds
33  {
34  REVERSE_LOCK(lock);
35  BOOST_CHECK(!lock.owns_lock());
36  REVERSE_LOCK(lock2);
37  BOOST_CHECK(!lock2.owns_lock());
38  }
39  BOOST_CHECK(lock.owns_lock());
40  BOOST_CHECK(lock2.owns_lock());
41 }
42 
43 BOOST_AUTO_TEST_CASE(reverselock_errors)
44 {
45  Mutex mutex2;
46  Mutex mutex;
47  WAIT_LOCK(mutex2, lock2);
48  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  lock.unlock();
61 
62  BOOST_CHECK(!lock.owns_lock());
63 
64  bool failed = false;
65  try {
66  REVERSE_LOCK(lock);
67  } catch(...) {
68  failed = true;
69  }
70 
71  BOOST_CHECK(failed);
72  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  lock.lock();
79  BOOST_CHECK(lock.owns_lock());
80  {
81  REVERSE_LOCK(lock);
82  BOOST_CHECK(!lock.owns_lock());
83  }
84 
85  BOOST_CHECK(failed);
86  BOOST_CHECK(lock.owns_lock());
87 }
88 
BOOST_AUTO_TEST_SUITE(cuckoocache_tests)
Test Suite for CuckooCache.
BOOST_AUTO_TEST_SUITE_END()
#define BOOST_CHECK(expr)
Definition: object.cpp:17
BOOST_AUTO_TEST_CASE(reverselock_basics)
#define WAIT_LOCK(cs, name)
Definition: sync.h:225
#define REVERSE_LOCK(g)
Definition: sync.h:215