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