blob: ebb0768f87ff77cf4ad4e94e7e6ff3c5f6ca3d1a [file] [log] [blame]
// Copyright 2018 The Fuchsia 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 "src/uploader/upload_scheduler.h"
#include <gtest/gtest.h>
namespace cobalt::uploader {
TEST(UploadScheduler, NoBackoff) {
auto scheduler = UploadScheduler(std::chrono::hours(1), std::chrono::seconds(0));
// Interval stays at 3600 seconds forever
EXPECT_EQ(scheduler.Interval(), std::chrono::seconds(3600));
EXPECT_EQ(scheduler.Interval(), std::chrono::seconds(3600));
EXPECT_EQ(scheduler.Interval(), std::chrono::seconds(3600));
EXPECT_EQ(scheduler.Interval(), std::chrono::seconds(3600));
}
TEST(UploadScheduler, QuickBackoff) {
auto scheduler = UploadScheduler(UploadScheduleConfig{
std::chrono::hours(1), std::chrono::seconds(0), std::chrono::minutes(10), 0});
auto expected_seconds = {600, 1200, 2400, 3600};
for (auto seconds : expected_seconds) {
EXPECT_EQ(scheduler.Interval(), std::chrono::seconds(seconds));
}
// Interval maxes out at 3600 seconds (1 hour)
EXPECT_EQ(scheduler.Interval(), std::chrono::seconds(3600));
EXPECT_EQ(scheduler.Interval(), std::chrono::seconds(3600));
EXPECT_EQ(scheduler.Interval(), std::chrono::seconds(3600));
EXPECT_EQ(scheduler.Interval(), std::chrono::seconds(3600));
}
TEST(UploadScheduler, LongBackoff) {
auto scheduler = UploadScheduler(UploadScheduleConfig{
std::chrono::hours(1), std::chrono::seconds(0), std::chrono::seconds(3), 0});
// Backoff should double every call to Interval, until the interval is >= 1
// hour.
auto expected_seconds = {3, 6, 12, 24, 48, 96, 192, 384, 768, 1536, 3072, 3600};
for (auto seconds : expected_seconds) {
EXPECT_EQ(scheduler.Interval(), std::chrono::seconds(seconds));
}
// Interval maxes out at 3600 seconds (1 hour)
EXPECT_EQ(scheduler.Interval(), std::chrono::seconds(3600));
EXPECT_EQ(scheduler.Interval(), std::chrono::seconds(3600));
EXPECT_EQ(scheduler.Interval(), std::chrono::seconds(3600));
EXPECT_EQ(scheduler.Interval(), std::chrono::seconds(3600));
}
TEST(UploadScheduler, JitterBounds) {
auto scheduler = UploadScheduler(UploadScheduleConfig{
std::chrono::hours(1), std::chrono::seconds(0), std::chrono::minutes(10), .1});
// Without jitter the expected intervals are {600, 1200, 2400, 3600}
// Jitter will add or subtract a random value up to 10% of the current
// interval.
auto upper_bound = {660, 1320, 2640, 3960, 3960, 3960, 3960};
auto lower_bound = {540, 1080, 2160, 3240, 3240, 3240, 3240};
for (unsigned int i = 0; i < upper_bound.size(); i++) {
std::chrono::duration test_interval = scheduler.Interval();
EXPECT_GE(test_interval, std::chrono::seconds(lower_bound.begin()[i]));
EXPECT_LT(test_interval, std::chrono::seconds(upper_bound.begin()[i]));
}
}
} // namespace cobalt::uploader