CCDelayBasedTimeSourceTest.cpp [plain text]
#include "config.h"
#include "cc/CCDelayBasedTimeSource.h"
#include "CCSchedulerTestCommon.h"
#include "cc/CCThread.h"
#include <gtest/gtest.h>
#include <wtf/RefPtr.h>
using namespace WTF;
using namespace WebCore;
using namespace WebKitTests;
namespace {
TEST(CCDelayBasedTimeSourceTest, TaskPostedAndTickCalled)
{
FakeCCThread thread;
FakeCCTimeSourceClient client;
RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(1.0 / 60.0, &thread);
timer->setClient(&client);
timer->setMonotonicallyIncreasingTime(0);
timer->setActive(true);
EXPECT_TRUE(timer->active());
EXPECT_TRUE(thread.hasPendingTask());
timer->setMonotonicallyIncreasingTime(0.016);
thread.runPendingTask();
EXPECT_TRUE(timer->active());
EXPECT_TRUE(client.tickCalled());
}
TEST(CCDelayBasedTimeSource, TickNotCalledWithTaskPosted)
{
FakeCCThread thread;
FakeCCTimeSourceClient client;
RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(1.0 / 60.0, &thread);
timer->setClient(&client);
timer->setActive(true);
EXPECT_TRUE(thread.hasPendingTask());
timer->setActive(false);
thread.runPendingTask();
EXPECT_FALSE(client.tickCalled());
}
TEST(CCDelayBasedTimeSource, StartTwiceEnqueuesOneTask)
{
FakeCCThread thread;
FakeCCTimeSourceClient client;
RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(1.0 / 60.0, &thread);
timer->setClient(&client);
timer->setActive(true);
EXPECT_TRUE(thread.hasPendingTask());
thread.reset();
timer->setActive(true);
EXPECT_FALSE(thread.hasPendingTask());
}
TEST(CCDelayBasedTimeSource, StartWhenRunningDoesntTick)
{
FakeCCThread thread;
FakeCCTimeSourceClient client;
RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(1.0 / 60.0, &thread);
timer->setClient(&client);
timer->setActive(true);
thread.runPendingTask();
thread.reset();
timer->setActive(true);
EXPECT_FALSE(thread.hasPendingTask());
}
TEST(CCDelayBasedTimeSource, NextDelaySaneWhenExactlyOnRequestedTime)
{
FakeCCThread thread;
FakeCCTimeSourceClient client;
double interval = 1.0 / 60.0;
RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(interval, &thread);
timer->setClient(&client);
timer->setActive(true);
thread.runPendingTask();
EXPECT_EQ(16, thread.pendingDelayMs());
timer->setMonotonicallyIncreasingTime(interval);
thread.runPendingTask();
EXPECT_EQ(16, thread.pendingDelayMs());
}
TEST(CCDelayBasedTimeSource, NextDelaySaneWhenSlightlyAfterRequestedTime)
{
FakeCCThread thread;
FakeCCTimeSourceClient client;
double interval = 1.0 / 60.0;
RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(interval, &thread);
timer->setClient(&client);
timer->setActive(true);
thread.runPendingTask();
EXPECT_EQ(16, thread.pendingDelayMs());
timer->setMonotonicallyIncreasingTime(interval + 0.0000001);
thread.runPendingTask();
EXPECT_EQ(16, thread.pendingDelayMs());
}
TEST(CCDelayBasedTimeSource, NextDelaySaneWhenExactlyTwiceAfterRequestedTime)
{
FakeCCThread thread;
FakeCCTimeSourceClient client;
double interval = 1.0 / 60.0;
RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(interval, &thread);
timer->setClient(&client);
timer->setActive(true);
thread.runPendingTask();
EXPECT_EQ(16, thread.pendingDelayMs());
timer->setMonotonicallyIncreasingTime(2*interval);
thread.runPendingTask();
EXPECT_EQ(16, thread.pendingDelayMs());
}
TEST(CCDelayBasedTimeSource, NextDelaySaneWhenSlightlyAfterTwiceRequestedTime)
{
FakeCCThread thread;
FakeCCTimeSourceClient client;
double interval = 1.0 / 60.0;
RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(interval, &thread);
timer->setClient(&client);
timer->setActive(true);
thread.runPendingTask();
EXPECT_EQ(16, thread.pendingDelayMs());
timer->setMonotonicallyIncreasingTime(2*interval + 0.0000001);
thread.runPendingTask();
EXPECT_EQ(16, thread.pendingDelayMs());
}
TEST(CCDelayBasedTimeSource, NextDelaySaneWhenHalfAfterRequestedTime)
{
FakeCCThread thread;
FakeCCTimeSourceClient client;
double interval = 1.0 / 60.0;
RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(interval, &thread);
timer->setClient(&client);
timer->setActive(true);
thread.runPendingTask();
EXPECT_EQ(16, thread.pendingDelayMs());
timer->setMonotonicallyIncreasingTime(interval + interval * 0.5);
thread.runPendingTask();
EXPECT_EQ(8, thread.pendingDelayMs());
}
TEST(CCDelayBasedTimeSourceTest, AchievesTargetRateWithNoNoise)
{
int numIterations = 1000;
FakeCCThread thread;
FakeCCTimeSourceClient client;
RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(1.0 / 60.0, &thread);
timer->setClient(&client);
timer->setActive(true);
double totalFrameTime = 0;
for (int i = 0; i < numIterations; ++i) {
long long delayMs = thread.pendingDelayMs();
totalFrameTime += delayMs / 1000.0;
double now = timer->monotonicallyIncreasingTime() + delayMs / 1000.0;
timer->setMonotonicallyIncreasingTime(now);
thread.runPendingTask();
}
double averageInterval = totalFrameTime / static_cast<double>(numIterations);
EXPECT_NEAR(1.0 / 60.0, averageInterval, 0.1);
}
TEST(CCDelayBasedTimeSource, TestDeactivateWhilePending)
{
FakeCCThread thread;
FakeCCTimeSourceClient client;
RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(1.0 / 60.0, &thread);
timer->setClient(&client);
timer->setActive(true); timer->setActive(false);
timer.clear();
thread.runPendingTask(); }
TEST(CCDelayBasedTimeSource, TestDeactivateAndReactivateBeforeNextTickTime)
{
FakeCCThread thread;
FakeCCTimeSourceClient client;
RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(1.0 / 60.0, &thread);
timer->setClient(&client);
timer->setActive(true);
timer->setMonotonicallyIncreasingTime(0);
thread.runPendingTask();
timer->setActive(false);
thread.runPendingTask();
timer->setMonotonicallyIncreasingTime(0.004);
timer->setActive(true);
EXPECT_EQ(12, thread.pendingDelayMs());
}
TEST(CCDelayBasedTimeSource, TestDeactivateAndReactivateAfterNextTickTime)
{
FakeCCThread thread;
FakeCCTimeSourceClient client;
RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(1.0 / 60.0, &thread);
timer->setClient(&client);
timer->setActive(true);
timer->setMonotonicallyIncreasingTime(0);
thread.runPendingTask();
timer->setActive(false);
thread.runPendingTask();
timer->setMonotonicallyIncreasingTime(0.02);
timer->setActive(true);
EXPECT_EQ(13, thread.pendingDelayMs());
}
}