proxygen
LockTraitsTest.cpp File Reference

Go to the source code of this file.

Classes

class  FakeAllPowerfulAssertingMutex
 

Functions

 TEST (LockTraits, std_mutex)
 
 TEST (LockTraits, SharedMutex)
 
 TEST (LockTraits, SpinLock)
 
 TEST (LockTraits, RWSpinLock)
 
 TEST (LockTraits, boost_mutex)
 
 TEST (LockTraits, boost_recursive_mutex)
 
 TEST (LockTraits, LockPolicy)
 
 TEST (LockTraits, LockPolicyTimed)
 
 TEST (LockTraits, LockPolicyCompatibilities)
 

Variables

static constexpr auto one_ms = std::chrono::milliseconds(1)
 

Function Documentation

TEST ( LockTraits  ,
std_mutex   
)

Definition at line 107 of file LockTraitsTest.cpp.

References folly::detail::lock(), and mutex.

107  {
108  using traits = LockTraits<std::mutex>;
109  static_assert(!traits::is_timed, "std:mutex is not a timed lock");
110  static_assert(!traits::is_shared, "std:mutex is not a shared lock");
111  static_assert(!traits::is_upgrade, "std::mutex is not an upgradable lock");
112 
114  traits::lock(mutex);
115  traits::unlock(mutex);
116 }
auto lock(SynchronizedLocker...lockersIn) -> std::tuple< typename SynchronizedLocker::LockedPtr... >
Definition: Synchronized.h:871
std::mutex mutex
TEST ( LockTraits  ,
SharedMutex   
)

Definition at line 118 of file LockTraitsTest.cpp.

References EXPECT_FALSE, folly::detail::lock(), mutex, and one_ms.

118  {
119  using traits = LockTraits<SharedMutex>;
120  static_assert(traits::is_timed, "folly::SharedMutex is a timed lock");
121  static_assert(traits::is_shared, "folly::SharedMutex is a shared lock");
122  static_assert(traits::is_upgrade, "folly::SharedMutex is an upgradable lock");
123 
125  traits::lock(mutex);
126  traits::unlock(mutex);
127 
128  traits::lock_shared(mutex);
129  traits::lock_shared(mutex);
130  traits::unlock_shared(mutex);
131  traits::unlock_shared(mutex);
132 
133  traits::lock_upgrade(mutex);
134  traits::unlock_upgrade(mutex);
135 
136  // test upgrade and downgrades
137  traits::lock_upgrade(mutex);
138  traits::unlock_upgrade_and_lock(mutex);
139  bool gotLock = traits::try_lock_for(mutex, one_ms);
140  EXPECT_FALSE(gotLock) << "Should not have been able to acquire an exclusive "
141  "lock after upgrading to an exclusive lock";
142  gotLock = traits::try_lock_upgrade_for(mutex, one_ms);
143  EXPECT_FALSE(gotLock) << "Should not have been able to acquire an upgrade "
144  "lock after upgrading to an exclusive lock";
145  gotLock = traits::try_lock_shared_for(mutex, one_ms);
146  EXPECT_FALSE(gotLock) << "Should not have been able to acquire a shared "
147  "lock after upgrading to an exclusive lock";
148  traits::unlock(mutex);
149 
150  traits::lock_upgrade(mutex);
151  traits::unlock_upgrade_and_lock_shared(mutex);
152  gotLock = traits::try_lock_for(mutex, one_ms);
153  EXPECT_FALSE(gotLock) << "Should not have been able to acquire an exclusive "
154  "mutex after downgrading from an upgrade to a "
155  "shared lock";
156  traits::unlock_shared(mutex);
157 
158  traits::lock(mutex);
159  gotLock = traits::try_lock_for(mutex, one_ms);
160  EXPECT_FALSE(gotLock) << "Should not have been able to acquire an exclusive "
161  "lock after acquiring an exclusive lock";
162  gotLock = traits::try_lock_upgrade_for(mutex, one_ms);
163  EXPECT_FALSE(gotLock) << "Should not have been able to acquire an upgrade "
164  "lock after acquiring an exclusive lock";
165  gotLock = traits::try_lock_shared_for(mutex, one_ms);
166  EXPECT_FALSE(gotLock) << "Should not have been able to acquire a shared "
167  "lock after acquiring an exclusive lock";
168  traits::unlock_and_lock_upgrade(mutex);
169  gotLock = traits::try_lock_for(mutex, one_ms);
170  EXPECT_FALSE(gotLock) << "Should not have been able to acquire an exclusive "
171  "lock after downgrading to an upgrade lock";
172  traits::unlock_upgrade(mutex);
173 
174  traits::lock(mutex);
175  traits::unlock_and_lock_shared(mutex);
176  gotLock = traits::try_lock_for(mutex, one_ms);
177  EXPECT_FALSE(gotLock) << "Should not have been able to acquire an exclusive "
178  "lock after downgrading to a shared lock";
179  traits::unlock_shared(mutex);
180 }
auto lock(SynchronizedLocker...lockersIn) -> std::tuple< typename SynchronizedLocker::LockedPtr... >
Definition: Synchronized.h:871
std::mutex mutex
#define EXPECT_FALSE(condition)
Definition: gtest.h:1862
static constexpr auto one_ms
TEST ( LockTraits  ,
SpinLock   
)

Definition at line 182 of file LockTraitsTest.cpp.

References folly::detail::lock(), and mutex.

182  {
183  using traits = LockTraits<SpinLock>;
184  static_assert(!traits::is_timed, "folly::SpinLock is not a timed lock");
185  static_assert(!traits::is_shared, "folly::SpinLock is not a shared lock");
186  static_assert(
187  !traits::is_upgrade, "folly::SpinLock is not an upgradable lock");
188 
189  SpinLock mutex;
190  traits::lock(mutex);
191  traits::unlock(mutex);
192 }
auto lock(SynchronizedLocker...lockersIn) -> std::tuple< typename SynchronizedLocker::LockedPtr... >
Definition: Synchronized.h:871
std::mutex mutex
TEST ( LockTraits  ,
RWSpinLock   
)

Definition at line 194 of file LockTraitsTest.cpp.

References folly::detail::lock(), and mutex.

194  {
195  using traits = LockTraits<RWSpinLock>;
196  static_assert(!traits::is_timed, "folly::RWSpinLock is not a timed lock");
197  static_assert(traits::is_shared, "folly::RWSpinLock is a shared lock");
198  static_assert(traits::is_upgrade, "folly::RWSpinLock is an upgradable lock");
199 
201  traits::lock(mutex);
202  traits::unlock(mutex);
203 
204  traits::lock_shared(mutex);
205  traits::lock_shared(mutex);
206  traits::unlock_shared(mutex);
207  traits::unlock_shared(mutex);
208 }
auto lock(SynchronizedLocker...lockersIn) -> std::tuple< typename SynchronizedLocker::LockedPtr... >
Definition: Synchronized.h:871
std::mutex mutex
TEST ( LockTraits  ,
boost_mutex   
)

Definition at line 210 of file LockTraitsTest.cpp.

References folly::detail::lock(), and mutex.

210  {
211  using traits = LockTraits<boost::mutex>;
212  static_assert(!traits::is_timed, "boost::mutex is not a timed lock");
213  static_assert(!traits::is_shared, "boost::mutex is not a shared lock");
214  static_assert(!traits::is_upgrade, "boost::mutex is not an upgradable lock");
215 
217  traits::lock(mutex);
218  traits::unlock(mutex);
219 }
auto lock(SynchronizedLocker...lockersIn) -> std::tuple< typename SynchronizedLocker::LockedPtr... >
Definition: Synchronized.h:871
std::mutex mutex
TEST ( LockTraits  ,
boost_recursive_mutex   
)

Definition at line 221 of file LockTraitsTest.cpp.

References EXPECT_FALSE, EXPECT_TRUE, folly::detail::lock(), mutex, and folly::TEST().

221  {
222  using traits = LockTraits<boost::recursive_mutex>;
223  static_assert(
224  !traits::is_timed, "boost::recursive_mutex is not a timed lock");
225  static_assert(
226  !traits::is_shared, "boost::recursive_mutex is not a shared lock");
227  static_assert(
228  !traits::is_upgrade, "boost::recursive_mutex is not an upgradable lock");
229 
230  boost::recursive_mutex mutex;
231  traits::lock(mutex);
232  traits::lock(mutex);
233  traits::unlock(mutex);
234  traits::unlock(mutex);
235 }
auto lock(SynchronizedLocker...lockersIn) -> std::tuple< typename SynchronizedLocker::LockedPtr... >
Definition: Synchronized.h:871
std::mutex mutex
TEST ( LockTraits  ,
LockPolicy   
)

Chain the asserts from the previous test to the next lock, unlock or upgrade method calls. Each making sure that the previous was correct.

Definition at line 304 of file LockTraitsTest.cpp.

References EXPECT_EQ, folly::LockPolicyUpgrade::lock(), folly::LockPolicyFromUpgradeToExclusive::lock(), folly::LockPolicyFromExclusiveToUpgrade::lock(), folly::LockPolicyFromUpgradeToShared::lock(), folly::LockPolicyFromExclusiveToShared::lock(), mutex, Mutex, folly::detail::UnlockPolicyExclusive< LockTraits >::unlock(), folly::detail::UnlockPolicyShared< LockTraits >::unlock(), and folly::detail::UnlockPolicyUpgrade< LockTraits >::unlock().

304  {
306  Mutex mutex;
307 
308  // test the lock and unlock functions
310  mutex.unlock_upgrade();
311  mutex.lock_upgrade();
312  LockPolicyUpgrade::unlock(mutex);
313 
314  mutex.lock_upgrade();
316  mutex.unlock();
317  mutex.lock();
318  LockPolicyFromUpgradeToExclusive::unlock(mutex);
319 
320  mutex.lock();
322  mutex.unlock_upgrade();
323  mutex.lock_upgrade();
324  LockPolicyFromExclusiveToUpgrade::unlock(mutex);
325 
326  mutex.lock_upgrade();
328  mutex.unlock_shared();
329  mutex.lock_shared();
330  LockPolicyFromUpgradeToShared::unlock(mutex);
331 
332  mutex.lock();
334  mutex.unlock_shared();
335  mutex.lock_shared();
336  LockPolicyFromExclusiveToShared::unlock(mutex);
337 
338  EXPECT_EQ(mutex.lock_state, Mutex::CurrentLockState::UNLOCKED);
339 }
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
#define Mutex
auto lock(SynchronizedLocker...lockersIn) -> std::tuple< typename SynchronizedLocker::LockedPtr... >
Definition: Synchronized.h:871
std::mutex mutex
TEST ( LockTraits  ,
LockPolicyTimed   
)

Similar to the test above but tests the timed version of the updates

Definition at line 344 of file LockTraitsTest.cpp.

References EXPECT_TRUE, mutex, Mutex, one_ms, folly::LockPolicyUpgrade::try_lock_for(), folly::LockPolicyFromUpgradeToExclusive::try_lock_for(), folly::LockPolicyFromExclusiveToUpgrade::try_lock_for(), folly::LockPolicyFromUpgradeToShared::try_lock_for(), folly::LockPolicyFromExclusiveToShared::try_lock_for(), and folly::detail::UnlockPolicyUpgrade< LockTraits >::unlock().

344  {
346  Mutex mutex;
347 
348  bool gotLock = LockPolicyUpgrade::try_lock_for(mutex, one_ms);
349  EXPECT_TRUE(gotLock) << "Should have been able to acquire the fake mutex";
350  LockPolicyUpgrade::unlock(mutex);
351 
352  mutex.lock_upgrade();
353  gotLock = LockPolicyFromUpgradeToExclusive::try_lock_for(mutex, one_ms);
354  EXPECT_TRUE(gotLock)
355  << "Should have been able to upgrade from upgrade to unique";
356  mutex.unlock();
357 
358  mutex.lock();
359  gotLock = LockPolicyFromExclusiveToUpgrade::try_lock_for(mutex, one_ms);
360  EXPECT_TRUE(gotLock) << "Should have been able to downgrade from exclusive "
361  "to upgrade";
362  mutex.unlock_upgrade();
363 
364  mutex.lock_upgrade();
365  gotLock = LockPolicyFromUpgradeToShared::try_lock_for(mutex, one_ms);
366  EXPECT_TRUE(gotLock) << "Should have been able to downgrade from upgrade to "
367  "shared";
368  mutex.unlock_shared();
369 
370  mutex.lock();
371  gotLock = LockPolicyFromExclusiveToShared::try_lock_for(mutex, one_ms);
372  EXPECT_TRUE(gotLock) << "Should have been able to downgrade from exclusive "
373  "to shared";
374  mutex.unlock_shared();
375 }
#define Mutex
#define EXPECT_TRUE(condition)
Definition: gtest.h:1859
std::mutex mutex
static constexpr auto one_ms
TEST ( LockTraits  ,
LockPolicyCompatibilities   
)

Test compatibility of the different lock policies

This should be correct because the compatibilities here are used to determine whether or not the different LockedPtr instances can be moved from each other

Definition at line 384 of file LockTraitsTest.cpp.

References EXPECT_TRUE, and folly::value().

384  {
385  EXPECT_TRUE((std::is_same<
388  EXPECT_TRUE((std::is_same<
390  LockPolicyFromUpgradeToExclusive::UnlockPolicy>::value));
391 
392  EXPECT_TRUE((std::is_same<
395  EXPECT_TRUE((std::is_same<
397  LockPolicyFromUpgradeToShared::UnlockPolicy>::value));
398  EXPECT_TRUE((std::is_same<
400  LockPolicyFromExclusiveToShared::UnlockPolicy>::value));
401 
402  EXPECT_TRUE((std::is_same<
405  EXPECT_TRUE((std::is_same<
407  LockPolicyFromExclusiveToUpgrade::UnlockPolicy>::value));
408 }
static const char *const value
Definition: Conv.cpp:50
#define EXPECT_TRUE(condition)
Definition: gtest.h:1859

Variable Documentation

constexpr auto one_ms = std::chrono::milliseconds(1)
static

Definition at line 28 of file LockTraitsTest.cpp.

Referenced by TEST().