1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
// Copyright 2014 The Chromium 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 "config.h"
#include "platform/scheduler/Scheduler.h"
#include "platform/RuntimeEnabledFeatures.h"
#include "platform/TestingPlatformSupport.h"
#include "platform/TraceLocation.h"
#include "public/platform/Platform.h"
#include "public/platform/WebScheduler.h"
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <string>
#include <vector>
using blink::Scheduler;
using blink::WebScheduler;
using blink::WebTraceLocation;
namespace {
class SchedulerForTest : public Scheduler {
public:
SchedulerForTest(WebScheduler* webScheduler):
Scheduler(webScheduler)
{
}
};
class WebSchedulerForTest : public WebScheduler {
public:
WebSchedulerForTest()
: m_shouldYieldForHighPriorityWork(false)
, m_didShutdown(false)
{
}
// WebScheduler implementation:
void shutdown() override
{
m_didShutdown = true;
}
bool shouldYieldForHighPriorityWork() override
{
return m_shouldYieldForHighPriorityWork;
}
void postIdleTask(const WebTraceLocation&, IdleTask* task) override
{
m_latestIdleTask = adoptPtr(task);
}
bool didShutdown() const
{
return m_didShutdown;
}
void setShouldYieldForHighPriorityWork(bool shouldYieldForHighPriorityWork)
{
m_shouldYieldForHighPriorityWork = shouldYieldForHighPriorityWork;
}
void runLatestIdleTask(double deadlineSeconds)
{
m_latestIdleTask->run(deadlineSeconds);
m_latestIdleTask.clear();
}
protected:
bool m_shouldYieldForHighPriorityWork;
bool m_didShutdown;
OwnPtr<WebScheduler::IdleTask> m_latestIdleTask;
};
class SchedulerTest : public testing::Test {
public:
SchedulerTest()
{
blink::RuntimeEnabledFeatures::setBlinkSchedulerEnabled(true);
m_webScheduler = adoptPtr(new WebSchedulerForTest());
m_scheduler = adoptPtr(new SchedulerForTest(m_webScheduler.get()));
}
protected:
OwnPtr<WebSchedulerForTest> m_webScheduler;
OwnPtr<SchedulerForTest> m_scheduler;
};
TEST_F(SchedulerTest, TestShutdown)
{
EXPECT_FALSE(m_webScheduler->didShutdown());
m_scheduler.clear();
EXPECT_TRUE(m_webScheduler->didShutdown());
}
TEST_F(SchedulerTest, TestShouldYield)
{
EXPECT_FALSE(m_scheduler->shouldYieldForHighPriorityWork());
m_webScheduler->setShouldYieldForHighPriorityWork(true);
EXPECT_TRUE(m_scheduler->shouldYieldForHighPriorityWork());
}
void idleTestTask(double expectedDeadline, double deadlineSeconds)
{
EXPECT_EQ(expectedDeadline, deadlineSeconds);
}
TEST_F(SchedulerTest, TestIdleTasks)
{
double deadline = 1.1;
m_scheduler->postIdleTask(FROM_HERE, WTF::bind<double>(&idleTestTask, deadline));
m_webScheduler->runLatestIdleTask(deadline);
}
} // namespace
|