CCFrameRateControllerTest.cpp [plain text]
#include "config.h"
#include "cc/CCFrameRateController.h"
#include "CCSchedulerTestCommon.h"
#include <gtest/gtest.h>
using namespace WTF;
using namespace WebCore;
using namespace WebKitTests;
namespace {
class FakeCCFrameRateControllerClient : public WebCore::CCFrameRateControllerClient {
public:
FakeCCFrameRateControllerClient() { reset(); }
void reset() { m_vsyncTicked = false; }
bool vsyncTicked() const { return m_vsyncTicked; }
virtual void vsyncTick() { m_vsyncTicked = true; }
protected:
bool m_vsyncTicked;
};
TEST(CCFrameRateControllerTest, TestFrameThrottling_ImmediateAck)
{
FakeCCThread thread;
FakeCCFrameRateControllerClient client;
RefPtr<FakeCCDelayBasedTimeSource> timeSource = FakeCCDelayBasedTimeSource::create(1.0 / 60.0, &thread);
CCFrameRateController controller(timeSource);
controller.setClient(&client);
controller.setActive(true);
double elapsed = 0;
elapsed += thread.pendingDelayMs() / 1000.0;
timeSource->setMonotonicallyIncreasingTime(elapsed);
thread.runPendingTask();
EXPECT_TRUE(client.vsyncTicked());
client.reset();
controller.didBeginFrame();
timeSource->setMonotonicallyIncreasingTime(timeSource->monotonicallyIncreasingTime() + 0.005);
controller.didFinishFrame();
elapsed += thread.pendingDelayMs() / 1000.0;
EXPECT_TRUE(elapsed >= timeSource->monotonicallyIncreasingTime()); timeSource->setMonotonicallyIncreasingTime(elapsed);
thread.runPendingTask();
EXPECT_TRUE(client.vsyncTicked());
}
TEST(CCFrameRateControllerTest, TestFrameThrottling_TwoFramesInFlight)
{
FakeCCThread thread;
FakeCCFrameRateControllerClient client;
RefPtr<FakeCCDelayBasedTimeSource> timeSource = FakeCCDelayBasedTimeSource::create(1.0 / 60.0, &thread);
CCFrameRateController controller(timeSource);
controller.setClient(&client);
controller.setActive(true);
controller.setMaxFramesPending(2);
double elapsed = 0;
elapsed += thread.pendingDelayMs() / 1000.0;
timeSource->setMonotonicallyIncreasingTime(elapsed);
thread.runPendingTask();
EXPECT_TRUE(client.vsyncTicked());
client.reset();
controller.didBeginFrame();
elapsed += thread.pendingDelayMs() / 1000.0;
EXPECT_TRUE(elapsed >= timeSource->monotonicallyIncreasingTime()); timeSource->setMonotonicallyIncreasingTime(elapsed);
thread.runPendingTask();
EXPECT_TRUE(client.vsyncTicked());
client.reset();
controller.didBeginFrame();
elapsed += thread.pendingDelayMs() / 1000.0;
EXPECT_TRUE(elapsed >= timeSource->monotonicallyIncreasingTime()); timeSource->setMonotonicallyIncreasingTime(elapsed);
thread.runPendingTask();
EXPECT_FALSE(client.vsyncTicked());
timeSource->setMonotonicallyIncreasingTime(timeSource->monotonicallyIncreasingTime() + 0.005);
controller.didFinishFrame();
EXPECT_FALSE(client.vsyncTicked());
elapsed += thread.pendingDelayMs() / 1000.0;
EXPECT_TRUE(elapsed >= timeSource->monotonicallyIncreasingTime()); timeSource->setMonotonicallyIncreasingTime(elapsed);
thread.runPendingTask();
EXPECT_TRUE(client.vsyncTicked());
}
}