blob: f58deaf0ee7600b90673fd78169bf33cb451d4d9 [file]
// 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/test/lock_testing.h"
#include "pw_sync/test/timed_borrow_testing.h"
#include "pw_unit_test/framework.h"
using namespace std::chrono_literals;
using pw::chrono::SystemClock;
using pw::sync::Borrowable;
using pw::sync::BorrowedPointer;
using pw::sync::VirtualBasicLockable;
using pw::sync::test::BaseObj;
using pw::sync::test::BorrowTest;
using pw::sync::test::Derived;
using pw::sync::test::FakeBasicLockable;
using pw::sync::test::FakeLockable;
using pw::sync::test::FakeTimedLockable;
using pw::sync::test::TimedBorrowTest;
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 SystemClock::duration kRoundedArbitraryDuration =
SystemClock::for_at_least(42ms);
TEST(BorrowedPointerTest, MoveConstruct) {
Derived derived(1);
FakeBasicLockable lock;
Borrowable<Derived, FakeBasicLockable> borrowable(derived, lock);
BorrowedPointer<BaseObj, VirtualBasicLockable> borrowed(borrowable.acquire());
EXPECT_EQ(borrowed->value(), 1);
}
TEST(BorrowedPointerTest, MoveAssign) {
Derived derived(2);
FakeBasicLockable lock;
Borrowable<Derived, FakeBasicLockable> borrowable(derived, lock);
BorrowedPointer<BaseObj, VirtualBasicLockable> borrowed =
borrowable.acquire();
EXPECT_EQ(borrowed->value(), 2);
}
// Unit tests for a `Borrowable`that uses a `FakeBasicLockable` as its lock.
using FakeBasicLockableBorrowTest = BorrowTest<FakeBasicLockable>;
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<FakeLockable>;
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<FakeTimedLockable>;
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