1*61c4878aSAndroid Build Coastguard Worker // Copyright 2020 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Worker #include <chrono>
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Worker #include "pw_sync/mutex.h"
18*61c4878aSAndroid Build Coastguard Worker #include "pw_sync_private/borrow_lockable_tests.h"
19*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
20*61c4878aSAndroid Build Coastguard Worker
21*61c4878aSAndroid Build Coastguard Worker namespace pw::sync {
22*61c4878aSAndroid Build Coastguard Worker namespace {
23*61c4878aSAndroid Build Coastguard Worker
24*61c4878aSAndroid Build Coastguard Worker extern "C" {
25*61c4878aSAndroid Build Coastguard Worker
26*61c4878aSAndroid Build Coastguard Worker // Functions defined in mutex_facade_test_c.c which call the API from C.
27*61c4878aSAndroid Build Coastguard Worker void pw_sync_Mutex_CallLock(pw_sync_Mutex* mutex);
28*61c4878aSAndroid Build Coastguard Worker bool pw_sync_Mutex_CallTryLock(pw_sync_Mutex* mutex);
29*61c4878aSAndroid Build Coastguard Worker void pw_sync_Mutex_CallUnlock(pw_sync_Mutex* mutex);
30*61c4878aSAndroid Build Coastguard Worker
31*61c4878aSAndroid Build Coastguard Worker } // extern "C"
32*61c4878aSAndroid Build Coastguard Worker
33*61c4878aSAndroid Build Coastguard Worker // TODO: b/235284163 - Add real concurrency tests once we have pw::thread.
34*61c4878aSAndroid Build Coastguard Worker
TEST(Mutex,LockUnlock)35*61c4878aSAndroid Build Coastguard Worker TEST(Mutex, LockUnlock) {
36*61c4878aSAndroid Build Coastguard Worker Mutex mutex;
37*61c4878aSAndroid Build Coastguard Worker mutex.lock();
38*61c4878aSAndroid Build Coastguard Worker // TODO: b/235284163 - Ensure it fails to lock when already held.
39*61c4878aSAndroid Build Coastguard Worker // EXPECT_FALSE(mutex.try_lock());
40*61c4878aSAndroid Build Coastguard Worker mutex.unlock();
41*61c4878aSAndroid Build Coastguard Worker }
42*61c4878aSAndroid Build Coastguard Worker
43*61c4878aSAndroid Build Coastguard Worker Mutex static_mutex;
TEST(Mutex,LockUnlockStatic)44*61c4878aSAndroid Build Coastguard Worker TEST(Mutex, LockUnlockStatic) {
45*61c4878aSAndroid Build Coastguard Worker static_mutex.lock();
46*61c4878aSAndroid Build Coastguard Worker // TODO: b/235284163 - Ensure it fails to lock when already held.
47*61c4878aSAndroid Build Coastguard Worker // EXPECT_FALSE(static_mutex.try_lock());
48*61c4878aSAndroid Build Coastguard Worker static_mutex.unlock();
49*61c4878aSAndroid Build Coastguard Worker }
50*61c4878aSAndroid Build Coastguard Worker
TEST(Mutex,TryLockUnlock)51*61c4878aSAndroid Build Coastguard Worker TEST(Mutex, TryLockUnlock) {
52*61c4878aSAndroid Build Coastguard Worker Mutex mutex;
53*61c4878aSAndroid Build Coastguard Worker const bool locked = mutex.try_lock();
54*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(locked);
55*61c4878aSAndroid Build Coastguard Worker if (locked) {
56*61c4878aSAndroid Build Coastguard Worker // TODO: b/235284163 - Ensure it fails to lock when already held.
57*61c4878aSAndroid Build Coastguard Worker // EXPECT_FALSE(mutex.try_lock());
58*61c4878aSAndroid Build Coastguard Worker mutex.unlock();
59*61c4878aSAndroid Build Coastguard Worker }
60*61c4878aSAndroid Build Coastguard Worker }
61*61c4878aSAndroid Build Coastguard Worker
62*61c4878aSAndroid Build Coastguard Worker PW_SYNC_ADD_BORROWABLE_LOCK_NAMED_TESTS(BorrowableMutex, Mutex);
63*61c4878aSAndroid Build Coastguard Worker
TEST(VirtualMutex,LockUnlock)64*61c4878aSAndroid Build Coastguard Worker TEST(VirtualMutex, LockUnlock) {
65*61c4878aSAndroid Build Coastguard Worker VirtualMutex mutex;
66*61c4878aSAndroid Build Coastguard Worker mutex.lock();
67*61c4878aSAndroid Build Coastguard Worker // TODO: b/235284163 - Ensure it fails to lock when already held.
68*61c4878aSAndroid Build Coastguard Worker // EXPECT_FALSE(mutex.try_lock());
69*61c4878aSAndroid Build Coastguard Worker mutex.unlock();
70*61c4878aSAndroid Build Coastguard Worker }
71*61c4878aSAndroid Build Coastguard Worker
72*61c4878aSAndroid Build Coastguard Worker VirtualMutex static_virtual_mutex;
TEST(VirtualMutex,LockUnlockStatic)73*61c4878aSAndroid Build Coastguard Worker TEST(VirtualMutex, LockUnlockStatic) {
74*61c4878aSAndroid Build Coastguard Worker static_virtual_mutex.lock();
75*61c4878aSAndroid Build Coastguard Worker // TODO: b/235284163 - Ensure it fails to lock when already held.
76*61c4878aSAndroid Build Coastguard Worker // EXPECT_FALSE(static_virtual_mutex.try_lock());
77*61c4878aSAndroid Build Coastguard Worker static_virtual_mutex.unlock();
78*61c4878aSAndroid Build Coastguard Worker }
79*61c4878aSAndroid Build Coastguard Worker
TEST(VirtualMutex,LockUnlockExternal)80*61c4878aSAndroid Build Coastguard Worker TEST(VirtualMutex, LockUnlockExternal) {
81*61c4878aSAndroid Build Coastguard Worker VirtualMutex virtual_mutex;
82*61c4878aSAndroid Build Coastguard Worker auto& mutex = virtual_mutex.mutex();
83*61c4878aSAndroid Build Coastguard Worker mutex.lock();
84*61c4878aSAndroid Build Coastguard Worker // TODO: b/235284163 - Ensure it fails to lock when already held.
85*61c4878aSAndroid Build Coastguard Worker // EXPECT_FALSE(mutex.try_lock());
86*61c4878aSAndroid Build Coastguard Worker mutex.unlock();
87*61c4878aSAndroid Build Coastguard Worker }
88*61c4878aSAndroid Build Coastguard Worker
89*61c4878aSAndroid Build Coastguard Worker PW_SYNC_ADD_BORROWABLE_LOCK_NAMED_TESTS(BorrowableVirtualMutex, VirtualMutex);
90*61c4878aSAndroid Build Coastguard Worker
TEST(Mutex,LockUnlockInC)91*61c4878aSAndroid Build Coastguard Worker TEST(Mutex, LockUnlockInC) {
92*61c4878aSAndroid Build Coastguard Worker Mutex mutex;
93*61c4878aSAndroid Build Coastguard Worker pw_sync_Mutex_CallLock(&mutex);
94*61c4878aSAndroid Build Coastguard Worker pw_sync_Mutex_CallUnlock(&mutex);
95*61c4878aSAndroid Build Coastguard Worker }
96*61c4878aSAndroid Build Coastguard Worker
TEST(Mutex,TryLockUnlockInC)97*61c4878aSAndroid Build Coastguard Worker TEST(Mutex, TryLockUnlockInC) {
98*61c4878aSAndroid Build Coastguard Worker Mutex mutex;
99*61c4878aSAndroid Build Coastguard Worker ASSERT_TRUE(pw_sync_Mutex_CallTryLock(&mutex));
100*61c4878aSAndroid Build Coastguard Worker // TODO: b/235284163 - Ensure it fails to lock when already held.
101*61c4878aSAndroid Build Coastguard Worker // EXPECT_FALSE(pw_sync_Mutex_CallTryLock(&mutex));
102*61c4878aSAndroid Build Coastguard Worker pw_sync_Mutex_CallUnlock(&mutex);
103*61c4878aSAndroid Build Coastguard Worker }
104*61c4878aSAndroid Build Coastguard Worker
105*61c4878aSAndroid Build Coastguard Worker } // namespace
106*61c4878aSAndroid Build Coastguard Worker } // namespace pw::sync
107