blob: c01c4aebad816927c30306ce4471957a73e98975 [file] [log] [blame]
//
// Copyright 2014 The ANGLE Project 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 "gmock/gmock.h"
#include "gtest/gtest.h"
#include "libANGLE/Fence.h"
#include "libANGLE/renderer/FenceNVImpl.h"
#include "libANGLE/renderer/SyncImpl.h"
#include "tests/angle_unittests_utils.h"
using namespace testing;
namespace
{
//
// FenceNV tests
//
class MockFenceNVImpl : public rx::FenceNVImpl
{
public:
virtual ~MockFenceNVImpl() { destroy(); }
MOCK_METHOD1(onDestroy, void(const gl::Context *context));
MOCK_METHOD2(set, angle::Result(const gl::Context *, GLenum));
MOCK_METHOD2(test, angle::Result(const gl::Context *, GLboolean *));
MOCK_METHOD1(finish, angle::Result(const gl::Context *));
MOCK_METHOD0(destroy, void());
};
class FenceNVTest : public Test
{
protected:
void SetUp() override
{
mImpl = new MockFenceNVImpl;
EXPECT_CALL(factory, createFenceNV()).WillOnce(Return(mImpl));
EXPECT_CALL(*mImpl, destroy());
mFence = new gl::FenceNV(&factory);
}
void TearDown() override { delete mFence; }
NiceMock<rx::MockGLFactory> factory;
MockFenceNVImpl *mImpl;
gl::FenceNV *mFence;
};
TEST_F(FenceNVTest, SetAndTestBehavior)
{
EXPECT_CALL(*mImpl, set(_, _)).WillOnce(Return(angle::Result::Continue)).RetiresOnSaturation();
EXPECT_FALSE(mFence->isSet());
EXPECT_EQ(angle::Result::Continue, mFence->set(nullptr, GL_ALL_COMPLETED_NV));
EXPECT_TRUE(mFence->isSet());
// Fake the behavior of testing the fence before and after it's passed.
EXPECT_CALL(*mImpl, test(_, _))
.WillOnce(DoAll(SetArgumentPointee<1>(static_cast<GLboolean>(GL_FALSE)),
Return(angle::Result::Continue)))
.WillOnce(DoAll(SetArgumentPointee<1>(static_cast<GLboolean>(GL_TRUE)),
Return(angle::Result::Continue)))
.RetiresOnSaturation();
GLboolean out;
EXPECT_EQ(angle::Result::Continue, mFence->test(nullptr, &out));
EXPECT_EQ(GL_FALSE, out);
EXPECT_EQ(angle::Result::Continue, mFence->test(nullptr, &out));
EXPECT_EQ(GL_TRUE, out);
}
//
// Sync tests
//
class MockSyncImpl : public rx::SyncImpl
{
public:
virtual ~MockSyncImpl() { destroy(); }
MOCK_METHOD3(set, angle::Result(const gl::Context *, GLenum, GLbitfield));
MOCK_METHOD4(clientWait, angle::Result(const gl::Context *, GLbitfield, GLuint64, GLenum *));
MOCK_METHOD3(serverWait, angle::Result(const gl::Context *, GLbitfield, GLuint64));
MOCK_METHOD2(getStatus, angle::Result(const gl::Context *, GLint *));
MOCK_METHOD0(destroy, void());
};
class FenceSyncTest : public Test
{
protected:
void SetUp() override
{
mImpl = new MockSyncImpl;
EXPECT_CALL(factory, createSync()).WillOnce(Return(mImpl));
mFence = new gl::Sync(&factory, 1);
EXPECT_CALL(*mImpl, destroy());
mFence->addRef();
}
void TearDown() override { mFence->release(nullptr); }
NiceMock<rx::MockGLFactory> factory;
MockSyncImpl *mImpl;
gl::Sync *mFence;
};
TEST_F(FenceSyncTest, SetAndGetStatusBehavior)
{
EXPECT_CALL(*mImpl, set(_, _, _))
.WillOnce(Return(angle::Result::Continue))
.RetiresOnSaturation();
EXPECT_EQ(angle::Result::Continue, mFence->set(nullptr, GL_SYNC_GPU_COMMANDS_COMPLETE, 0));
EXPECT_EQ(static_cast<GLenum>(GL_SYNC_GPU_COMMANDS_COMPLETE), mFence->getCondition());
// Fake the behavior of testing the fence before and after it's passed.
EXPECT_CALL(*mImpl, getStatus(_, _))
.WillOnce(DoAll(SetArgumentPointee<1>(GL_UNSIGNALED), Return(angle::Result::Continue)))
.WillOnce(DoAll(SetArgumentPointee<1>(GL_SIGNALED), Return(angle::Result::Continue)))
.RetiresOnSaturation();
GLint out;
EXPECT_EQ(angle::Result::Continue, mFence->getStatus(nullptr, &out));
EXPECT_EQ(GL_UNSIGNALED, out);
EXPECT_EQ(angle::Result::Continue, mFence->getStatus(nullptr, &out));
EXPECT_EQ(GL_SIGNALED, out);
}
} // namespace