#include "config.h"
#include "CCFrameRateController.h"
#include "CCSchedulerTestCommon.h"
#include <gtest/gtest.h>
using namespace cc;
using namespace WebKitTests;
using namespace WTF;
namespace {
class FakeCCFrameRateControllerClient : public cc::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;
base::TimeDelta interval = base::TimeDelta::FromMicroseconds(base::Time::kMicrosecondsPerSecond / 60);
RefPtr<FakeCCDelayBasedTimeSource> timeSource = FakeCCDelayBasedTimeSource::create(interval, &thread);
CCFrameRateController controller(timeSource);
controller.setClient(&client);
controller.setActive(true);
base::TimeTicks elapsed;
elapsed += base::TimeDelta::FromMilliseconds(thread.pendingDelayMs());
timeSource->setNow(elapsed);
thread.runPendingTask();
EXPECT_TRUE(client.vsyncTicked());
client.reset();
controller.didBeginFrame();
timeSource->setNow(timeSource->now() + base::TimeDelta::FromMilliseconds(5));
controller.didFinishFrame();
elapsed += base::TimeDelta::FromMilliseconds(thread.pendingDelayMs());
EXPECT_TRUE(elapsed >= timeSource->now());
timeSource->setNow(elapsed);
thread.runPendingTask();
EXPECT_TRUE(client.vsyncTicked());
}
TEST(CCFrameRateControllerTest, TestFrameThrottling_TwoFramesInFlight)
{
FakeCCThread thread;
FakeCCFrameRateControllerClient client;
base::TimeDelta interval = base::TimeDelta::FromMicroseconds(base::Time::kMicrosecondsPerSecond / 60);
RefPtr<FakeCCDelayBasedTimeSource> timeSource = FakeCCDelayBasedTimeSource::create(interval, &thread);
CCFrameRateController controller(timeSource);
controller.setClient(&client);
controller.setActive(true);
controller.setMaxFramesPending(2);
base::TimeTicks elapsed;
elapsed += base::TimeDelta::FromMilliseconds(thread.pendingDelayMs());
timeSource->setNow(elapsed);
thread.runPendingTask();
EXPECT_TRUE(client.vsyncTicked());
client.reset();
controller.didBeginFrame();
elapsed += base::TimeDelta::FromMilliseconds(thread.pendingDelayMs());
EXPECT_TRUE(elapsed >= timeSource->now());
timeSource->setNow(elapsed);
thread.runPendingTask();
EXPECT_TRUE(client.vsyncTicked());
client.reset();
controller.didBeginFrame();
elapsed += base::TimeDelta::FromMilliseconds(thread.pendingDelayMs());
EXPECT_TRUE(elapsed >= timeSource->now());
timeSource->setNow(elapsed);
thread.runPendingTask();
EXPECT_FALSE(client.vsyncTicked());
timeSource->setNow(timeSource->now() + base::TimeDelta::FromMilliseconds(5));
controller.didFinishFrame();
EXPECT_FALSE(client.vsyncTicked());
elapsed += base::TimeDelta::FromMilliseconds(thread.pendingDelayMs());
EXPECT_TRUE(elapsed >= timeSource->now());
timeSource->setNow(elapsed);
thread.runPendingTask();
EXPECT_TRUE(client.vsyncTicked());
}
TEST(CCFrameRateControllerTest, TestFrameThrottling_Unthrottled)
{
FakeCCThread thread;
FakeCCFrameRateControllerClient client;
CCFrameRateController controller(&thread);
controller.setClient(&client);
controller.setMaxFramesPending(2);
controller.setActive(true);
thread.runPendingTask();
EXPECT_TRUE(client.vsyncTicked());
client.reset();
thread.runPendingTask();
EXPECT_TRUE(client.vsyncTicked());
client.reset();
thread.runPendingTask();
EXPECT_TRUE(client.vsyncTicked());
client.reset();
controller.didBeginFrame();
thread.runPendingTask();
EXPECT_TRUE(client.vsyncTicked());
client.reset();
controller.didBeginFrame();
thread.runPendingTask();
EXPECT_FALSE(client.vsyncTicked());
client.reset();
EXPECT_FALSE(thread.hasPendingTask());
controller.didFinishFrame();
thread.runPendingTask();
EXPECT_TRUE(client.vsyncTicked());
}
}