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