// Copyright 2021 The Pigweed Authors // // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. #include "pw_sync/borrow.h" #include "pw_sync/lock_testing.h" #include "pw_sync/timed_borrow_testing.h" #include "pw_unit_test/framework.h" using namespace std::chrono_literals; namespace pw::sync::test { namespace { // We can't control the SystemClock's period configuration, so just in case // duration cannot be accurately expressed in integer ticks, round the // duration up. constexpr chrono::SystemClock::duration kRoundedArbitraryDuration = chrono::SystemClock::for_at_least(42ms); TEST(BorrowedPointerTest, MoveConstruct) { Derived derived(1); FakeBasicLockable lock; Borrowable borrowable(derived, lock); BorrowedPointer borrowed(borrowable.acquire()); EXPECT_EQ(borrowed->value(), 1); } TEST(BorrowedPointerTest, MoveAssign) { Derived derived(2); FakeBasicLockable lock; Borrowable borrowable(derived, lock); BorrowedPointer borrowed = borrowable.acquire(); EXPECT_EQ(borrowed->value(), 2); } // Unit tests for a `Borrowable`that uses a `FakeBasicLockable` as its lock. using FakeBasicLockableBorrowTest = BorrowTest; TEST_F(FakeBasicLockableBorrowTest, Acquire) { TestAcquire(); } TEST_F(FakeBasicLockableBorrowTest, ConstAcquire) { TestConstAcquire(); } TEST_F(FakeBasicLockableBorrowTest, RepeatedAcquire) { TestRepeatedAcquire(); } TEST_F(FakeBasicLockableBorrowTest, Moveable) { TestMoveable(); } TEST_F(FakeBasicLockableBorrowTest, Copyable) { TestCopyable(); } TEST_F(FakeBasicLockableBorrowTest, CopyableCovariant) { TestCopyableCovariant(); } // Unit tests for a `Borrowable`that uses a `FakeLockable` as its lock. using FakeLockableBorrowTest = BorrowTest; TEST_F(FakeLockableBorrowTest, Acquire) { TestAcquire(); } TEST_F(FakeLockableBorrowTest, ConstAcquire) { TestConstAcquire(); } TEST_F(FakeLockableBorrowTest, RepeatedAcquire) { TestRepeatedAcquire(); } TEST_F(FakeLockableBorrowTest, Moveable) { TestMoveable(); } TEST_F(FakeLockableBorrowTest, Copyable) { TestCopyable(); } TEST_F(FakeLockableBorrowTest, CopyableCovariant) { TestCopyableCovariant(); } TEST_F(FakeLockableBorrowTest, TryAcquireSuccess) { TestTryAcquireSuccess(); } TEST_F(FakeLockableBorrowTest, TryAcquireFailure) { TestTryAcquireFailure(); } // Unit tests for a `Borrowable`that uses a `FakeTimedLockable` as its lock. using FakeTimedLockableBorrowTest = TimedBorrowTest; TEST_F(FakeTimedLockableBorrowTest, Acquire) { TestAcquire(); } TEST_F(FakeTimedLockableBorrowTest, ConstAcquire) { TestConstAcquire(); } TEST_F(FakeTimedLockableBorrowTest, RepeatedAcquire) { TestRepeatedAcquire(); } TEST_F(FakeTimedLockableBorrowTest, Moveable) { TestMoveable(); } TEST_F(FakeTimedLockableBorrowTest, Copyable) { TestCopyable(); } TEST_F(FakeTimedLockableBorrowTest, CopyableCovariant) { TestCopyableCovariant(); } TEST_F(FakeTimedLockableBorrowTest, TryAcquireSuccess) { TestTryAcquireSuccess(); } TEST_F(FakeTimedLockableBorrowTest, TryAcquireFailure) { TestTryAcquireFailure(); } TEST_F(FakeTimedLockableBorrowTest, TryAcquireForSuccess) { TestTryAcquireForSuccess(kRoundedArbitraryDuration); } TEST_F(FakeTimedLockableBorrowTest, TryAcquireForFailure) { TestTryAcquireForFailure(kRoundedArbitraryDuration); } TEST_F(FakeTimedLockableBorrowTest, TryAcquireUntilSuccess) { TestTryAcquireUntilSuccess(kRoundedArbitraryDuration); } TEST_F(FakeTimedLockableBorrowTest, TryAcquireUntilFailure) { TestTryAcquireUntilFailure(kRoundedArbitraryDuration); } } // namespace } // namespace pw::sync::test