1 // Copyright 2021 The Pigweed Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
5 // the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
13 // the License.
14
15 #include "pw_sync/borrow.h"
16
17 #include "pw_sync/lock_testing.h"
18 #include "pw_sync/timed_borrow_testing.h"
19 #include "pw_unit_test/framework.h"
20
21 using namespace std::chrono_literals;
22
23 namespace pw::sync::test {
24 namespace {
25
26 // We can't control the SystemClock's period configuration, so just in case
27 // duration cannot be accurately expressed in integer ticks, round the
28 // duration up.
29 constexpr chrono::SystemClock::duration kRoundedArbitraryDuration =
30 chrono::SystemClock::for_at_least(42ms);
31
TEST(BorrowedPointerTest,MoveConstruct)32 TEST(BorrowedPointerTest, MoveConstruct) {
33 Derived derived(1);
34 FakeBasicLockable lock;
35 Borrowable<Derived, FakeBasicLockable> borrowable(derived, lock);
36 BorrowedPointer<BaseObj, VirtualBasicLockable> borrowed(borrowable.acquire());
37 EXPECT_EQ(borrowed->value(), 1);
38 }
39
TEST(BorrowedPointerTest,MoveAssign)40 TEST(BorrowedPointerTest, MoveAssign) {
41 Derived derived(2);
42 FakeBasicLockable lock;
43 Borrowable<Derived, FakeBasicLockable> borrowable(derived, lock);
44 BorrowedPointer<BaseObj, VirtualBasicLockable> borrowed =
45 borrowable.acquire();
46 EXPECT_EQ(borrowed->value(), 2);
47 }
48
49 // Unit tests for a `Borrowable`that uses a `FakeBasicLockable` as its lock.
50 using FakeBasicLockableBorrowTest = BorrowTest<FakeBasicLockable>;
51
TEST_F(FakeBasicLockableBorrowTest,Acquire)52 TEST_F(FakeBasicLockableBorrowTest, Acquire) { TestAcquire(); }
53
TEST_F(FakeBasicLockableBorrowTest,ConstAcquire)54 TEST_F(FakeBasicLockableBorrowTest, ConstAcquire) { TestConstAcquire(); }
55
TEST_F(FakeBasicLockableBorrowTest,RepeatedAcquire)56 TEST_F(FakeBasicLockableBorrowTest, RepeatedAcquire) { TestRepeatedAcquire(); }
57
TEST_F(FakeBasicLockableBorrowTest,Moveable)58 TEST_F(FakeBasicLockableBorrowTest, Moveable) { TestMoveable(); }
59
TEST_F(FakeBasicLockableBorrowTest,Copyable)60 TEST_F(FakeBasicLockableBorrowTest, Copyable) { TestCopyable(); }
61
TEST_F(FakeBasicLockableBorrowTest,CopyableCovariant)62 TEST_F(FakeBasicLockableBorrowTest, CopyableCovariant) {
63 TestCopyableCovariant();
64 }
65
66 // Unit tests for a `Borrowable`that uses a `FakeLockable` as its lock.
67 using FakeLockableBorrowTest = BorrowTest<FakeLockable>;
68
TEST_F(FakeLockableBorrowTest,Acquire)69 TEST_F(FakeLockableBorrowTest, Acquire) { TestAcquire(); }
70
TEST_F(FakeLockableBorrowTest,ConstAcquire)71 TEST_F(FakeLockableBorrowTest, ConstAcquire) { TestConstAcquire(); }
72
TEST_F(FakeLockableBorrowTest,RepeatedAcquire)73 TEST_F(FakeLockableBorrowTest, RepeatedAcquire) { TestRepeatedAcquire(); }
74
TEST_F(FakeLockableBorrowTest,Moveable)75 TEST_F(FakeLockableBorrowTest, Moveable) { TestMoveable(); }
76
TEST_F(FakeLockableBorrowTest,Copyable)77 TEST_F(FakeLockableBorrowTest, Copyable) { TestCopyable(); }
78
TEST_F(FakeLockableBorrowTest,CopyableCovariant)79 TEST_F(FakeLockableBorrowTest, CopyableCovariant) { TestCopyableCovariant(); }
80
TEST_F(FakeLockableBorrowTest,TryAcquireSuccess)81 TEST_F(FakeLockableBorrowTest, TryAcquireSuccess) { TestTryAcquireSuccess(); }
82
TEST_F(FakeLockableBorrowTest,TryAcquireFailure)83 TEST_F(FakeLockableBorrowTest, TryAcquireFailure) { TestTryAcquireFailure(); }
84
85 // Unit tests for a `Borrowable`that uses a `FakeTimedLockable` as its lock.
86 using FakeTimedLockableBorrowTest = TimedBorrowTest<FakeTimedLockable>;
87
TEST_F(FakeTimedLockableBorrowTest,Acquire)88 TEST_F(FakeTimedLockableBorrowTest, Acquire) { TestAcquire(); }
89
TEST_F(FakeTimedLockableBorrowTest,ConstAcquire)90 TEST_F(FakeTimedLockableBorrowTest, ConstAcquire) { TestConstAcquire(); }
91
TEST_F(FakeTimedLockableBorrowTest,RepeatedAcquire)92 TEST_F(FakeTimedLockableBorrowTest, RepeatedAcquire) { TestRepeatedAcquire(); }
93
TEST_F(FakeTimedLockableBorrowTest,Moveable)94 TEST_F(FakeTimedLockableBorrowTest, Moveable) { TestMoveable(); }
95
TEST_F(FakeTimedLockableBorrowTest,Copyable)96 TEST_F(FakeTimedLockableBorrowTest, Copyable) { TestCopyable(); }
97
TEST_F(FakeTimedLockableBorrowTest,CopyableCovariant)98 TEST_F(FakeTimedLockableBorrowTest, CopyableCovariant) {
99 TestCopyableCovariant();
100 }
101
TEST_F(FakeTimedLockableBorrowTest,TryAcquireSuccess)102 TEST_F(FakeTimedLockableBorrowTest, TryAcquireSuccess) {
103 TestTryAcquireSuccess();
104 }
105
TEST_F(FakeTimedLockableBorrowTest,TryAcquireFailure)106 TEST_F(FakeTimedLockableBorrowTest, TryAcquireFailure) {
107 TestTryAcquireFailure();
108 }
109
TEST_F(FakeTimedLockableBorrowTest,TryAcquireForSuccess)110 TEST_F(FakeTimedLockableBorrowTest, TryAcquireForSuccess) {
111 TestTryAcquireForSuccess(kRoundedArbitraryDuration);
112 }
113
TEST_F(FakeTimedLockableBorrowTest,TryAcquireForFailure)114 TEST_F(FakeTimedLockableBorrowTest, TryAcquireForFailure) {
115 TestTryAcquireForFailure(kRoundedArbitraryDuration);
116 }
117
TEST_F(FakeTimedLockableBorrowTest,TryAcquireUntilSuccess)118 TEST_F(FakeTimedLockableBorrowTest, TryAcquireUntilSuccess) {
119 TestTryAcquireUntilSuccess(kRoundedArbitraryDuration);
120 }
121
TEST_F(FakeTimedLockableBorrowTest,TryAcquireUntilFailure)122 TEST_F(FakeTimedLockableBorrowTest, TryAcquireUntilFailure) {
123 TestTryAcquireUntilFailure(kRoundedArbitraryDuration);
124 }
125
126 } // namespace
127 } // namespace pw::sync::test
128