blob: 48443c2b1652e2bad90ac8d21bd25e07ee61946a [file] [log] [blame]
#include "third_party/blink/renderer/platform/scheduler/common/thread_load_tracker.h"
#include "base/bind.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using testing::ElementsAre;
namespace blink {
namespace scheduler {
namespace {
void AddToVector(std::vector<std::pair<base::TimeTicks, double>>* vector,
base::TimeTicks time,
double load) {
vector->push_back({time, load});
}
base::TimeTicks SecondsToTime(int seconds) {
return base::TimeTicks() + base::TimeDelta::FromSeconds(seconds);
}
base::TimeTicks MillisecondsToTime(int milliseconds) {
return base::TimeTicks() + base::TimeDelta::FromMilliseconds(milliseconds);
}
} // namespace
TEST(ThreadLoadTrackerTest, RecordTasks) {
std::vector<std::pair<base::TimeTicks, double>> result;
ThreadLoadTracker thread_load_tracker(
SecondsToTime(1),
base::BindRepeating(&AddToVector, base::Unretained(&result)),
base::TimeDelta::FromSeconds(1));
thread_load_tracker.Resume(SecondsToTime(1));
thread_load_tracker.RecordTaskTime(SecondsToTime(1), SecondsToTime(3));
thread_load_tracker.RecordTaskTime(MillisecondsToTime(4300),
MillisecondsToTime(4400));
thread_load_tracker.RecordTaskTime(MillisecondsToTime(5900),
MillisecondsToTime(6100));
thread_load_tracker.RecordTaskTime(MillisecondsToTime(6700),
MillisecondsToTime(6800));
thread_load_tracker.RecordTaskTime(MillisecondsToTime(7500),
MillisecondsToTime(8500));
thread_load_tracker.RecordIdle(MillisecondsToTime(10500));
EXPECT_THAT(result, ElementsAre(std::make_pair(SecondsToTime(2), 1.0),
std::make_pair(SecondsToTime(3), 1.0),
std::make_pair(SecondsToTime(4), 0),
std::make_pair(SecondsToTime(5), 0.1),
std::make_pair(SecondsToTime(6), 0.1),
std::make_pair(SecondsToTime(7), 0.2),
std::make_pair(SecondsToTime(8), 0.5),
std::make_pair(SecondsToTime(9), 0.5),
std::make_pair(SecondsToTime(10), 0)));
}
TEST(ThreadLoadTrackerTest, PauseAndResume) {
std::vector<std::pair<base::TimeTicks, double>> result;
ThreadLoadTracker thread_load_tracker(
SecondsToTime(1),
base::BindRepeating(&AddToVector, base::Unretained(&result)),
base::TimeDelta::FromSeconds(1));
thread_load_tracker.Resume(SecondsToTime(1));
thread_load_tracker.RecordTaskTime(SecondsToTime(2), SecondsToTime(3));
thread_load_tracker.Pause(SecondsToTime(5));
thread_load_tracker.RecordTaskTime(SecondsToTime(6), SecondsToTime(7));
thread_load_tracker.Resume(SecondsToTime(9));
thread_load_tracker.RecordTaskTime(MillisecondsToTime(10900),
MillisecondsToTime(11100));
thread_load_tracker.Pause(SecondsToTime(12));
thread_load_tracker.RecordTaskTime(MillisecondsToTime(12100),
MillisecondsToTime(12200));
thread_load_tracker.Resume(SecondsToTime(13));
thread_load_tracker.RecordTaskTime(MillisecondsToTime(13100),
MillisecondsToTime(13400));
thread_load_tracker.RecordIdle(SecondsToTime(14));
EXPECT_THAT(result, ElementsAre(std::make_pair(SecondsToTime(2), 0),
std::make_pair(SecondsToTime(3), 1.0),
std::make_pair(SecondsToTime(4), 0),
std::make_pair(SecondsToTime(5), 0),
std::make_pair(SecondsToTime(10), 0),
std::make_pair(SecondsToTime(11), 0.1),
std::make_pair(SecondsToTime(12), 0.1),
std::make_pair(SecondsToTime(14), 0.3)));
}
TEST(ThreadLoadTrackerTest, DisabledByDefault) {
std::vector<std::pair<base::TimeTicks, double>> result;
ThreadLoadTracker thread_load_tracker(
SecondsToTime(1),
base::BindRepeating(&AddToVector, base::Unretained(&result)),
base::TimeDelta::FromSeconds(1));
// ThreadLoadTracker should be disabled and these tasks should be
// ignored.
thread_load_tracker.RecordTaskTime(SecondsToTime(1), SecondsToTime(3));
thread_load_tracker.RecordTaskTime(SecondsToTime(4), SecondsToTime(7));
thread_load_tracker.Resume(SecondsToTime(8));
thread_load_tracker.RecordTaskTime(SecondsToTime(9), SecondsToTime(10));
EXPECT_THAT(result, ElementsAre(std::make_pair(SecondsToTime(9), 0),
std::make_pair(SecondsToTime(10), 1)));
}
TEST(ThreadLoadTrackerTest, Reset) {
std::vector<std::pair<base::TimeTicks, double>> result;
ThreadLoadTracker thread_load_tracker(
SecondsToTime(1),
base::BindRepeating(&AddToVector, base::Unretained(&result)),
base::TimeDelta::FromSeconds(1));
thread_load_tracker.Resume(SecondsToTime(1));
thread_load_tracker.RecordTaskTime(MillisecondsToTime(1500),
MillisecondsToTime(4500));
thread_load_tracker.Reset(SecondsToTime(100));
thread_load_tracker.RecordTaskTime(SecondsToTime(101), SecondsToTime(102));
EXPECT_THAT(result, ElementsAre(std::make_pair(SecondsToTime(2), 0.5),
std::make_pair(SecondsToTime(3), 1.0),
std::make_pair(SecondsToTime(4), 1.0),
std::make_pair(SecondsToTime(101), 0),
std::make_pair(SecondsToTime(102), 1)));
}
} // namespace scheduler
} // namespace blink