#include "components/sync/engine/cycle/commit_quota.h"
#include "base/test/task_environment.h"
#include "base/time/time.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace syncer {
namespace {
class CommitQuotaTest : public ::testing::Test {
public:
CommitQuotaTest() = default;
void ConsumeTokensAndExpectDepleted(CommitQuota* quota, int n) {
while (n > 0) {
EXPECT_TRUE(quota->HasTokensAvailable());
quota->ConsumeToken();
--n;
}
EXPECT_FALSE(quota->HasTokensAvailable());
}
protected:
base::test::SingleThreadTaskEnvironment task_environment_{
base::test::TaskEnvironment::TimeSource::MOCK_TIME};
};
TEST_F(CommitQuotaTest, NoTokensAvailableWhenDepleted) {
CommitQuota quota(2, base::Seconds(1));
ConsumeTokensAndExpectDepleted("a, 2);
}
TEST_F(CommitQuotaTest, TokensRefill) {
CommitQuota quota(2, base::Seconds(1));
ConsumeTokensAndExpectDepleted("a, 2);
task_environment_.FastForwardBy(base::Milliseconds(1500));
ConsumeTokensAndExpectDepleted("a, 1);
task_environment_.FastForwardBy(base::Milliseconds(501));
ConsumeTokensAndExpectDepleted("a, 1);
}
TEST_F(CommitQuotaTest, TokensCannotGetBelowZero) {
CommitQuota quota(2, base::Seconds(1));
ConsumeTokensAndExpectDepleted("a, 2);
quota.ConsumeToken();
task_environment_.FastForwardBy(base::Milliseconds(1001));
ConsumeTokensAndExpectDepleted("a, 1);
}
TEST_F(CommitQuotaTest, RefillPostponedWhenConsumingAtZero) {
CommitQuota quota(2, base::Seconds(1));
ConsumeTokensAndExpectDepleted("a, 2);
task_environment_.FastForwardBy(base::Milliseconds(501));
EXPECT_FALSE(quota.HasTokensAvailable());
quota.ConsumeToken();
task_environment_.FastForwardBy(base::Milliseconds(501));
EXPECT_FALSE(quota.HasTokensAvailable());
task_environment_.FastForwardBy(base::Milliseconds(501));
ConsumeTokensAndExpectDepleted("a, 1);
}
TEST_F(CommitQuotaTest, TokensRefillUpToInitialTokens) {
CommitQuota quota(2, base::Seconds(1));
ConsumeTokensAndExpectDepleted("a, 2);
task_environment_.FastForwardBy(base::Milliseconds(3001));
ConsumeTokensAndExpectDepleted("a, 2);
}
TEST_F(CommitQuotaTest, TokensStayAtInitialTokens) {
CommitQuota quota(2, base::Seconds(1));
task_environment_.FastForwardBy(base::Days(1));
ConsumeTokensAndExpectDepleted("a, 2);
task_environment_.FastForwardBy(base::Milliseconds(1001));
ConsumeTokensAndExpectDepleted("a, 1);
}
}
}