blob: bbbb2f537271000e50e18d4bcb332c97f8b17f39 [file] [log] [blame]
// Copyright 2017 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 "gtest/gtest.h"
#include "lib/escher/flib/fence.h"
#include "lib/escher/flib/fence_set_listener.h"
#include "lib/escher/impl/command_buffer_sequencer.h"
#include "lib/escher/test/flib/util.h"
#include "lib/gtest/test_loop_fixture.h"
namespace escher {
namespace test {
class FenceSetListenerTest : public gtest::TestLoopFixture {};
TEST_F(FenceSetListenerTest, EmptySet) {
// Create an empty FenceSetListener.
::std::vector<zx::event> fence_listeners;
FenceSetListener fence_set_listener(std::move(fence_listeners));
// Start waiting for signal events.
bool signalled = false;
fence_set_listener.WaitReadyAsync([&signalled]() { signalled = true; });
// Assert that the set is signalled.
ASSERT_TRUE(fence_set_listener.ready());
RunLoopUntilIdle();
EXPECT_TRUE(signalled);
}
TEST_F(FenceSetListenerTest, ReadyStateSignalled) {
// Create an FenceSetListener.
::std::vector<zx::event> fence_listeners;
zx::event fence1;
ASSERT_EQ(ZX_OK, zx::event::create(0, &fence1));
fence_listeners.push_back(CopyEvent(fence1));
zx::event fence2;
ASSERT_EQ(ZX_OK, zx::event::create(0, &fence2));
fence_listeners.push_back(CopyEvent(fence2));
zx::event fence3;
ASSERT_EQ(ZX_OK, zx::event::create(0, &fence3));
fence_listeners.push_back(CopyEvent(fence3));
FenceSetListener fence_set_listener(std::move(fence_listeners));
// Start waiting for signal events.
bool signalled = false;
fence_set_listener.WaitReadyAsync([&signalled]() { signalled = true; });
// Expect that the set is not ready initially. Briefly pump the message loop,
// although we don't expect anything to be handled.
RunLoopUntilIdle();
ASSERT_FALSE(fence_set_listener.ready());
ASSERT_FALSE(signalled);
// Signal one fence.
fence1.signal(0u, kFenceSignalled);
// Briefly pump the message loop, but we expect that the set is still not
// ready.
RunLoopUntilIdle();
ASSERT_FALSE(fence_set_listener.ready());
ASSERT_FALSE(signalled);
// Signal the second and third fence.
fence2.signal(0u, kFenceSignalled);
fence3.signal(0u, kFenceSignalled);
// Assert that the set is now signalled.
RunLoopUntilIdle();
EXPECT_TRUE(fence_set_listener.ready());
ASSERT_TRUE(signalled);
}
TEST_F(FenceSetListenerTest, DestroyWhileWaiting) {
// Create an FenceSetListener.
::std::vector<zx::event> fence_listeners;
zx::event fence1;
ASSERT_EQ(ZX_OK, zx::event::create(0, &fence1));
fence_listeners.push_back(CopyEvent(fence1));
zx::event fence2;
ASSERT_EQ(ZX_OK, zx::event::create(0, &fence2));
fence_listeners.push_back(CopyEvent(fence2));
{
FenceSetListener fence_set_listener(std::move(fence_listeners));
// Start waiting for signal events.
bool signalled = false;
fence_set_listener.WaitReadyAsync([&signalled]() { signalled = true; });
// Expect that the set is not ready initially. Briefly pump the message
// loop, although we don't expect anything to be handled.
RunLoopUntilIdle();
ASSERT_FALSE(fence_set_listener.ready());
ASSERT_FALSE(signalled);
// Signal one fence.
fence1.signal(0u, kFenceSignalled);
// Briefly pump the message loop, but we expect that the set is still not
// ready.
RunLoopUntilIdle();
ASSERT_FALSE(fence_set_listener.ready());
ASSERT_FALSE(signalled);
}
// We expect there to be no errors while tearing down |fence_set_listener|.
}
} // namespace test
} // namespace escher