blob: 7196c932fa46489e80cffcf9e6ddccd0fa05be6d [file] [log] [blame]
// Copyright (c) 2011 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 <gtest/gtest.h>
#include "chrome/browser/extensions/extension_idle_api.h"
TEST(ExtensionIdleApiTest, CacheTest) {
double throttle_interval = ExtensionIdleCache::get_throttle_interval();
int min_threshold = ExtensionIdleCache::get_min_threshold();
double now = 10 * min_threshold;
EXPECT_EQ(IDLE_STATE_UNKNOWN,
ExtensionIdleCache::CalculateState(min_threshold, now));
ExtensionIdleCache::Update(2 * min_threshold, IDLE_STATE_IDLE, now);
EXPECT_EQ(IDLE_STATE_IDLE,
ExtensionIdleCache::CalculateState(2 * min_threshold, now));
EXPECT_EQ(IDLE_STATE_IDLE,
ExtensionIdleCache::CalculateState(2 * min_threshold,
now + 0.9 * throttle_interval));
EXPECT_EQ(IDLE_STATE_IDLE,
ExtensionIdleCache::CalculateState(min_threshold,
now + 0.1 * throttle_interval));
// Threshold exeeds idle interval boundries.
EXPECT_EQ(IDLE_STATE_UNKNOWN,
ExtensionIdleCache::CalculateState(2 * min_threshold + 1,
now + 0.1 * throttle_interval));
// It has been more than throttle interval since last query.
EXPECT_EQ(IDLE_STATE_UNKNOWN,
ExtensionIdleCache::CalculateState(min_threshold,
now + 1.1 * throttle_interval));
now += 10 * min_threshold;
// Idle interval does not overlap with previous one.
ExtensionIdleCache::Update(5 * min_threshold, IDLE_STATE_IDLE, now);
EXPECT_EQ(IDLE_STATE_UNKNOWN,
ExtensionIdleCache::CalculateState(7 * min_threshold, now));
now += min_threshold;
// Idle interval overlaps with previous one.
ExtensionIdleCache::Update(2 * min_threshold, IDLE_STATE_IDLE, now);
// Threshold exeeds last idle interval boundaries, but does not exeed union of
// two last (overlaping) idle intervals.
EXPECT_EQ(IDLE_STATE_IDLE,
ExtensionIdleCache::CalculateState(4 * min_threshold, now));
now += 0.2 * throttle_interval;
ExtensionIdleCache::Update(8 * min_threshold, IDLE_STATE_ACTIVE, now);
EXPECT_EQ(IDLE_STATE_IDLE,
ExtensionIdleCache::CalculateState(4 * min_threshold,
now + 0.3 * throttle_interval));
// If both idle and active conditions are satisfied, return ACTIVE (because
// obviously ACTIVE was reported after last idle interval).
ExtensionIdleCache::Update(3 * min_threshold, IDLE_STATE_ACTIVE, now);
EXPECT_EQ(IDLE_STATE_ACTIVE,
ExtensionIdleCache::CalculateState(4 * min_threshold,
now + 0.3 * throttle_interval));
now += 10 * min_threshold;
ExtensionIdleCache::Update(8 * min_threshold, IDLE_STATE_ACTIVE, now);
// Threshold does not exeed last active state, but the error is within
// throttle interval.
EXPECT_EQ(IDLE_STATE_ACTIVE,
ExtensionIdleCache::CalculateState(8 * min_threshold,
now + 0.3 * throttle_interval));
// The error is not within throttle interval.
EXPECT_EQ(IDLE_STATE_UNKNOWN,
ExtensionIdleCache::CalculateState(8 * min_threshold,
now + 1.1 * throttle_interval));
// We report LOCKED iff it was last reported state was LOCKED and it has
// been less than throttle_interval since last query.
now += 10 * min_threshold;
ExtensionIdleCache::Update(4 * min_threshold, IDLE_STATE_LOCKED, now);
EXPECT_EQ(IDLE_STATE_LOCKED,
ExtensionIdleCache::CalculateState(2 * min_threshold,
now + 0.3 * throttle_interval));
// More than throttle_interval since last query.
EXPECT_EQ(IDLE_STATE_UNKNOWN,
ExtensionIdleCache::CalculateState(2 * min_threshold,
now + 1.1 * throttle_interval));
now += 0.2 * throttle_interval;
ExtensionIdleCache::Update(4 * min_threshold, IDLE_STATE_ACTIVE, now);
// Last reported query was ACTIVE.
EXPECT_EQ(IDLE_STATE_UNKNOWN,
ExtensionIdleCache::CalculateState(2 * min_threshold,
now + 0.3 * throttle_interval));
now += 0.2 * throttle_interval;
ExtensionIdleCache::Update(2 * min_threshold, IDLE_STATE_LOCKED, now);
EXPECT_EQ(IDLE_STATE_LOCKED,
ExtensionIdleCache::CalculateState(5 * min_threshold,
now + 0.3 * throttle_interval));
now += 10 * min_threshold;
ExtensionIdleCache::Update(4 * min_threshold, IDLE_STATE_LOCKED, now);
now += 0.2 * throttle_interval;
ExtensionIdleCache::Update(2 * min_threshold, IDLE_STATE_IDLE, now);
// Last reported state was IDLE.
EXPECT_EQ(IDLE_STATE_UNKNOWN,
ExtensionIdleCache::CalculateState(3 * min_threshold,
now + 0.3 * throttle_interval));
now += min_threshold;
ExtensionIdleCache::Update(2 * min_threshold, IDLE_STATE_LOCKED, now);
now += 0.2 * throttle_interval;
ExtensionIdleCache::Update(4 * min_threshold, IDLE_STATE_ACTIVE, now);
// Last reported state was ACTIVE.
EXPECT_EQ(IDLE_STATE_ACTIVE,
ExtensionIdleCache::CalculateState(6 * min_threshold,
now + 0.3 * throttle_interval));
}