• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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