| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/graphics/display/drivers/coordinator/fence.h" |
| |
| #include <lib/async-testing/test_loop.h> |
| #include <lib/async/default.h> |
| #include <lib/driver/testing/cpp/driver_runtime.h> |
| |
| #include <fbl/vector.h> |
| #include <gtest/gtest.h> |
| |
| namespace display { |
| |
| class TestCallback : public FenceCallback { |
| public: |
| void OnFenceFired(FenceReference* f) override { fired_.push_back(f); } |
| |
| void OnRefForFenceDead(Fence* fence) override { fence->OnRefDead(); } |
| |
| fbl::Vector<FenceReference*> fired_; |
| }; |
| |
| class FenceTest : public testing::Test { |
| public: |
| void SetUp() override { |
| zx::event ev; |
| zx::event::create(0, &ev); |
| constexpr EventId kEventId(1); |
| fence_ = fbl::AdoptRef(new Fence(&cb_, loop_.dispatcher(), kEventId, std::move(ev))); |
| } |
| |
| void TearDown() override { fence_->ClearRef(); } |
| |
| async::TestLoop& loop() { return loop_; } |
| fbl::RefPtr<Fence> fence() { return fence_; } |
| TestCallback& cb() { return cb_; } |
| |
| protected: |
| fdf_testing::DriverRuntime runtime_; |
| async::TestLoop loop_; |
| fbl::RefPtr<Fence> fence_; |
| TestCallback cb_; |
| }; |
| |
| TEST_F(FenceTest, MultipleRefs_OnePurpose) { |
| fence()->CreateRef(); |
| auto one = fence()->GetReference(); |
| auto two = fence()->GetReference(); |
| } |
| |
| TEST_F(FenceTest, MultipleRefs_MultiplePurposes) { |
| fence()->CreateRef(); |
| auto one = fence()->GetReference(); |
| fence()->CreateRef(); |
| auto two = fence()->GetReference(); |
| fence()->CreateRef(); |
| auto three = fence()->GetReference(); |
| two->StartReadyWait(); |
| one->StartReadyWait(); |
| |
| three->Signal(); |
| loop().RunUntilIdle(); |
| |
| three->Signal(); |
| loop().RunUntilIdle(); |
| |
| ASSERT_EQ(cb().fired_.size(), 2u); |
| EXPECT_EQ(cb().fired_[0], two.get()); |
| EXPECT_EQ(cb().fired_[1], one.get()); |
| } |
| |
| } // namespace display |