blob: 5e88c5666b9b5743b568cc264cb1828006e11f3b [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
Austin Schuh60e77942022-05-16 17:48:24 -07003#include "gtest/gtest.h"
Brian Silvermanb073f242014-09-08 16:29:57 -04004
Philipp Schrader790cb542023-07-05 21:06:52 -07005#include "aos/die.h"
6
Brian Silvermanb073f242014-09-08 16:29:57 -04007namespace aos {
8namespace testing {
9
10class StlMutexDeathTest : public ::testing::Test {
11 protected:
Austin Schuha0c41ba2020-09-10 22:59:14 -070012 void SetUp() override { SetDieTestMode(true); }
Brian Silvermanb073f242014-09-08 16:29:57 -040013};
14
15typedef StlMutexDeathTest StlRecursiveMutexDeathTest;
16
17// Tests that locking/unlocking without any blocking works.
18TEST(StlMutexTest, Basic) {
19 stl_mutex mutex;
20
21 mutex.lock();
22 mutex.unlock();
23
24 ASSERT_TRUE(mutex.try_lock());
25 ASSERT_FALSE(mutex.try_lock());
26 mutex.unlock();
27
28 mutex.lock();
29 ASSERT_FALSE(mutex.try_lock());
30 mutex.unlock();
31}
32
33// Tests that unlocking an unlocked mutex fails.
34TEST_F(StlMutexDeathTest, MultipleUnlock) {
35 stl_mutex mutex;
36 mutex.lock();
37 mutex.unlock();
38 EXPECT_DEATH(mutex.unlock(), ".*multiple unlock.*");
39}
40
41// Tests that locking/unlocking (including recursively) without any blocking
42// works.
43TEST(StlRecursiveMutexTest, Basic) {
44 stl_recursive_mutex mutex;
45
46 mutex.lock();
47 mutex.unlock();
48
49 ASSERT_TRUE(mutex.try_lock());
50 ASSERT_TRUE(mutex.try_lock());
51 mutex.unlock();
52 mutex.unlock();
53
54 mutex.lock();
55 ASSERT_TRUE(mutex.try_lock());
56 mutex.unlock();
Austin Schuha0c41ba2020-09-10 22:59:14 -070057 mutex.unlock();
Brian Silvermanb073f242014-09-08 16:29:57 -040058}
59
60// Tests that unlocking an unlocked recursive mutex fails.
61TEST_F(StlRecursiveMutexDeathTest, MultipleUnlock) {
62 stl_recursive_mutex mutex;
63 mutex.lock();
64 mutex.unlock();
65 EXPECT_DEATH(mutex.unlock(), ".*multiple unlock.*");
66}
67
68} // namespace testing
69} // namespace aos