blob: 0fd052a16eb2fb2670ea0268ffe3dd8c8495213c [file] [log] [blame]
John Park33858a32018-09-28 23:05:48 -07001#include "aos/stl_mutex/stl_mutex.h"
Brian Silvermanb073f242014-09-08 16:29:57 -04002
3#include "gtest/gtest.h"
4
Brian Silvermanf5f8d8e2015-12-06 18:39:12 -05005#include "aos/testing/test_logging.h"
John Park33858a32018-09-28 23:05:48 -07006#include "aos/die.h"
Brian Silvermanb073f242014-09-08 16:29:57 -04007
8namespace aos {
9namespace testing {
10
11class StlMutexDeathTest : public ::testing::Test {
12 protected:
13 void SetUp() override {
Brian Silvermanf5f8d8e2015-12-06 18:39:12 -050014 ::aos::testing::EnableTestLogging();
Brian Silvermanb073f242014-09-08 16:29:57 -040015 SetDieTestMode(true);
16 }
17};
18
19typedef StlMutexDeathTest StlRecursiveMutexDeathTest;
20
21// Tests that locking/unlocking without any blocking works.
22TEST(StlMutexTest, Basic) {
23 stl_mutex mutex;
24
25 mutex.lock();
26 mutex.unlock();
27
28 ASSERT_TRUE(mutex.try_lock());
29 ASSERT_FALSE(mutex.try_lock());
30 mutex.unlock();
31
32 mutex.lock();
33 ASSERT_FALSE(mutex.try_lock());
34 mutex.unlock();
35}
36
37// Tests that unlocking an unlocked mutex fails.
38TEST_F(StlMutexDeathTest, MultipleUnlock) {
39 stl_mutex mutex;
40 mutex.lock();
41 mutex.unlock();
42 EXPECT_DEATH(mutex.unlock(), ".*multiple unlock.*");
43}
44
45// Tests that locking/unlocking (including recursively) without any blocking
46// works.
47TEST(StlRecursiveMutexTest, Basic) {
48 stl_recursive_mutex mutex;
49
50 mutex.lock();
51 mutex.unlock();
52
53 ASSERT_TRUE(mutex.try_lock());
54 ASSERT_TRUE(mutex.try_lock());
55 mutex.unlock();
56 mutex.unlock();
57
58 mutex.lock();
59 ASSERT_TRUE(mutex.try_lock());
60 mutex.unlock();
61 mutex.unlock();
62}
63
64// Tests that unlocking an unlocked recursive mutex fails.
65TEST_F(StlRecursiveMutexDeathTest, MultipleUnlock) {
66 stl_recursive_mutex mutex;
67 mutex.lock();
68 mutex.unlock();
69 EXPECT_DEATH(mutex.unlock(), ".*multiple unlock.*");
70}
71
72} // namespace testing
73} // namespace aos