Index: components/password_manager/core/browser/facet_manager_unittest.cc |
diff --git a/components/password_manager/core/browser/facet_manager_unittest.cc b/components/password_manager/core/browser/facet_manager_unittest.cc |
deleted file mode 100644 |
index 7bb7c718eeb10680c35d1aed5067c93af38fda29..0000000000000000000000000000000000000000 |
--- a/components/password_manager/core/browser/facet_manager_unittest.cc |
+++ /dev/null |
@@ -1,1522 +0,0 @@ |
-// Copyright 2015 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 "components/password_manager/core/browser/facet_manager.h" |
- |
-#include <stddef.h> |
- |
-#include <memory> |
- |
-#include "base/bind.h" |
-#include "base/bind_helpers.h" |
-#include "base/location.h" |
-#include "base/macros.h" |
-#include "base/memory/ref_counted.h" |
-#include "base/rand_util.h" |
-#include "base/test/test_mock_time_task_runner.h" |
-#include "base/test/test_simple_task_runner.h" |
-#include "base/time/clock.h" |
-#include "base/time/time.h" |
-#include "components/password_manager/core/browser/facet_manager_host.h" |
-#include "components/password_manager/core/browser/mock_affiliation_consumer.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace password_manager { |
- |
-// Helpers -------------------------------------------------------------------- |
- |
-namespace { |
- |
-using StrategyOnCacheMiss = FacetManager::StrategyOnCacheMiss; |
-enum class NotificationAccuracy { PERFECT, TOO_LATE, TOO_EARLY, NEVER_CALLED }; |
- |
-// Helper class to post callbacks to FacetManager::NotifyAtRequestedTime(), |
-// delayed by the requested time plus/minus a configurable error term to |
-// simulate a real-life task runner. |
-class TestFacetManagerNotifier { |
- public: |
- TestFacetManagerNotifier( |
- scoped_refptr<base::TestMockTimeTaskRunner> task_runner, |
- base::TimeDelta too_late_delay) |
- : accuracy_(NotificationAccuracy::PERFECT), |
- too_late_delay_(too_late_delay), |
- task_runner_(task_runner), |
- facet_manager_(nullptr) {} |
- |
- void Notify(base::Time time) { |
- base::TimeDelta delay = time - task_runner_->Now(); |
- if (accuracy_ == NotificationAccuracy::TOO_LATE) { |
- delay += too_late_delay_; |
- } else if (accuracy_ == NotificationAccuracy::TOO_EARLY) { |
- // This formula is a simple stateless solution for notifying FacetManagers |
- // prematurely multiple times in a row while also ensuring that the tests |
- // are still fast, with no more than log2(delay.InSeconds()) repetitions. |
- delay = std::min(delay, delay / 2 + base::TimeDelta::FromSeconds(1)); |
- } else if (accuracy_ == NotificationAccuracy::NEVER_CALLED) { |
- return; |
- } |
- task_runner_->PostDelayedTask( |
- FROM_HERE, base::Bind(&FacetManager::NotifyAtRequestedTime, |
- base::Unretained(facet_manager_)), |
- delay); |
- } |
- |
- void set_accuracy(NotificationAccuracy accuracy) { accuracy_ = accuracy; } |
- void set_facet_manager(FacetManager* facet_manager_under_test) { |
- facet_manager_ = facet_manager_under_test; |
- } |
- |
- private: |
- NotificationAccuracy accuracy_; |
- const base::TimeDelta too_late_delay_; |
- scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; |
- FacetManager* facet_manager_; |
- |
- DISALLOW_COPY_AND_ASSIGN(TestFacetManagerNotifier); |
-}; |
- |
-// Stub/mock implementation for FacetManagerHost. |
-class MockFacetManagerHost : public FacetManagerHost { |
- public: |
- explicit MockFacetManagerHost(TestFacetManagerNotifier* notifier) |
- : notifier_(notifier), signaled_need_network_request_(false) {} |
- |
- ~MockFacetManagerHost() override {} |
- |
- // Sets the |facet_uri| that will be expected to appear in calls coming from |
- // the FacetManager under test. |
- void set_expected_facet_uri(const FacetURI& facet_uri) { |
- expected_facet_uri_ = facet_uri; |
- } |
- |
- // Sets up fake |database_content| as the canned response to be returned to |
- // the FacetManager every time it calls ReadAffiliationsFromDatabase(). |
- void set_fake_database_content( |
- const AffiliatedFacetsWithUpdateTime& database_content) { |
- fake_database_content_ = database_content; |
- } |
- |
- void clear_fake_database_content() { |
- fake_database_content_.last_update_time = base::Time(); |
- } |
- |
- // Returns whether SignalNeedNetworkRequest() has been called at least once. |
- size_t signaled_need_network_request() const { |
- return signaled_need_network_request_; |
- } |
- |
- void reset_need_network_request() { signaled_need_network_request_ = false; } |
- |
- private: |
- // FacetManagerHost: |
- bool ReadAffiliationsFromDatabase( |
- const FacetURI& facet_uri, |
- AffiliatedFacetsWithUpdateTime* affiliations) override { |
- EXPECT_EQ(expected_facet_uri_, facet_uri); |
- if (fake_database_content_.last_update_time.is_null()) |
- return false; |
- *affiliations = fake_database_content_; |
- return true; |
- } |
- |
- void SignalNeedNetworkRequest() override { |
- signaled_need_network_request_ = true; |
- } |
- |
- void RequestNotificationAtTime(const FacetURI& facet_uri, |
- base::Time time) override { |
- EXPECT_EQ(expected_facet_uri_, facet_uri); |
- // The absolute timing of notification requests is not all that interesting, |
- // only the ability to perturb it slightly, which is done by the notifier. |
- notifier_->Notify(time); |
- } |
- |
- TestFacetManagerNotifier* notifier_; |
- |
- FacetURI expected_facet_uri_; |
- AffiliatedFacetsWithUpdateTime fake_database_content_; |
- bool signaled_need_network_request_; |
- |
- DISALLOW_COPY_AND_ASSIGN(MockFacetManagerHost); |
-}; |
- |
-const bool kFalseTrue[] = {false, true}; |
- |
-const char kTestFacetURI1[] = "https://one.example.com"; |
-const char kTestFacetURI2[] = "https://two.example.com"; |
-const char kTestFacetURI3[] = "https://three.example.com"; |
- |
-AffiliatedFacets GetTestEquivalenceClass() { |
- AffiliatedFacets affiliated_facets; |
- affiliated_facets.push_back(FacetURI::FromCanonicalSpec(kTestFacetURI1)); |
- affiliated_facets.push_back(FacetURI::FromCanonicalSpec(kTestFacetURI2)); |
- affiliated_facets.push_back(FacetURI::FromCanonicalSpec(kTestFacetURI3)); |
- return affiliated_facets; |
-} |
- |
-AffiliatedFacetsWithUpdateTime GetTestEquivalenceClassWithUpdateTime( |
- base::Time last_update_time) { |
- AffiliatedFacetsWithUpdateTime affiliation; |
- affiliation.last_update_time = last_update_time; |
- affiliation.facets = GetTestEquivalenceClass(); |
- return affiliation; |
-} |
- |
-base::TimeDelta GetCacheHardExpiryPeriod() { |
- return base::TimeDelta::FromHours(FacetManager::kCacheHardExpiryInHours); |
-} |
- |
-base::TimeDelta GetCacheSoftExpiryPeriod() { |
- return base::TimeDelta::FromHours(FacetManager::kCacheSoftExpiryInHours); |
-} |
- |
-base::TimeDelta GetShortTestPeriod() { |
- return base::TimeDelta::FromHours(1); |
-} |
- |
-// Returns a smallest time difference that this test cares about. |
-base::TimeDelta Epsilon() { |
- return base::TimeDelta::FromMicroseconds(1); |
-} |
- |
-// Returns |time| + |delay| or the maximum time if |delay| is the maximum delta. |
-base::Time SafeAdd(base::Time time, base::TimeDelta delay) { |
- if (delay == base::TimeDelta::Max()) |
- return base::Time::Max(); |
- return time + delay; |
-} |
- |
-// Subdivides a time interval of a given |duration| into zero or more intervals |
-// that lend themselves to be used for sampling a quantity every that often. |
-// More specifically, returns the minimum number of intervals so that each |
-// sub-interval is at most GetTestShortInterval() long, and that the last of the |
-// sub-intervals (if any) is exactly Epsilon() long. No intervals are returned |
-// if |duration| is of length zero. |
-std::vector<base::TimeDelta> SamplingPoints(base::TimeDelta duration) { |
- std::vector<base::TimeDelta> deltas; |
- if (duration > base::TimeDelta()) { |
- while (duration > Epsilon()) { |
- deltas.push_back(std::min(GetShortTestPeriod(), duration - Epsilon())); |
- duration -= deltas.back(); |
- } |
- deltas.push_back(Epsilon()); |
- } |
- return deltas; |
-} |
- |
-} // namespace |
- |
-// Test framework ------------------------------------------------------------- |
- |
-class FacetManagerTest : public testing::Test { |
- public: |
- FacetManagerTest() |
- : consumer_task_runner_(new base::TestSimpleTaskRunner), |
- main_task_runner_(new base::TestMockTimeTaskRunner), |
- main_clock_(main_task_runner_->GetMockClock()), |
- facet_manager_notifier_(main_task_runner_, GetShortTestPeriod()), |
- facet_manager_host_(&facet_manager_notifier_) {} |
- |
- protected: |
- struct ExpectedFetchDetails { |
- // The expected time of the fetch being triggered. |
- base::Time time; |
- |
- // A simulated delay after which the fetch will be completed. |
- // base::TimeDelta::Max() means that the fetch will be left hanging. |
- base::TimeDelta completion_delay; |
- }; |
- |
- void CreateFacetManager() { |
- // The order is important: FacetManager will read the DB in its constructor. |
- facet_manager_host_.set_expected_facet_uri( |
- FacetURI::FromCanonicalSpec(kTestFacetURI1)); |
- facet_manager_.reset( |
- new FacetManager(FacetURI::FromCanonicalSpec(kTestFacetURI1), |
- fake_facet_manager_host(), main_clock_.get())); |
- facet_manager_notifier_.set_facet_manager(facet_manager_.get()); |
- facet_manager_creation_ = Now(); |
- } |
- |
- void DestroyFacetManager() { |
- main_task_runner_->ClearPendingTasks(); |
- facet_manager_host_.set_expected_facet_uri(FacetURI()); |
- facet_manager_notifier_.set_facet_manager(nullptr); |
- facet_manager_.reset(); |
- } |
- |
- void AdvanceTime(base::TimeDelta delta) { |
- main_task_runner_->FastForwardBy(delta); |
- } |
- |
- base::Time Now() { return main_task_runner_->Now(); } |
- |
- // Returns the elapsed time since CreateFacetManager() was last called. |
- base::TimeDelta DeltaNow() { return Now() - facet_manager_creation_; } |
- |
- void GetAffiliations(StrategyOnCacheMiss cache_miss_strategy) { |
- facet_manager()->GetAffiliations(cache_miss_strategy, |
- mock_consumer()->GetResultCallback(), |
- consumer_task_runner()); |
- } |
- |
- void Prefetch(base::Time until) { facet_manager()->Prefetch(until); } |
- void CancelPrefetch(base::Time until) { |
- facet_manager()->CancelPrefetch(until); |
- } |
- |
- void SchedulePrefetch(base::Time start, base::Time end) { |
- main_task_runner_->PostDelayedTask( |
- FROM_HERE, base::Bind(&FacetManager::Prefetch, |
- base::Unretained(facet_manager()), end), |
- start - Now()); |
- } |
- |
- void ScheduleCancelPrefetch(base::Time cancellation_time, |
- base::Time original_end_of_prefetch) { |
- main_task_runner_->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FacetManager::CancelPrefetch, |
- base::Unretained(facet_manager()), original_end_of_prefetch), |
- cancellation_time - Now()); |
- } |
- |
- // Advances time |until_time|, and verifies that a Prefetch() request has the |
- // expected effects now and then (but not at |until_time|), namely that: |
- // * the FacetManager cannot be discarded, and |
- // * requests are served from the cache; |
- // and that no fetches are triggered in this interval. |
- void AdvanceTimeAndVerifyPrefetch(base::Time until_time) { |
- for (base::TimeDelta step : SamplingPoints(until_time - Now())) { |
- SCOPED_TRACE(testing::Message() << "dT: " << DeltaNow()); |
- EXPECT_FALSE(facet_manager()->CanBeDiscarded()); |
- EXPECT_FALSE(facet_manager()->CanCachedDataBeDiscarded()); |
- ExpectRequestsServedFromCache(); |
- ExpectNoFetchNeeded(); |
- AdvanceTime(step); |
- } |
- } |
- |
- // Advances time |until_time|, and verifies that between now and then, the |
- // FacetManager cannot be discarded, and a fetch is needed all the time. |
- void AdvanceTimeAndExpectFetchNeeded(base::Time until_time) { |
- for (base::TimeDelta step : SamplingPoints(until_time - Now())) { |
- SCOPED_TRACE(testing::Message() << "dT: " << DeltaNow()); |
- EXPECT_FALSE(facet_manager()->CanBeDiscarded()); |
- ASSERT_NO_FATAL_FAILURE(ExpectFetchNeeded()); |
- AdvanceTime(step); |
- } |
- } |
- |
- // Advances time |until_time|, and verifies that a Prefetch() request has the |
- // expected effects between now and then (but not at |until_time|), namely: |
- // * the FacetManager cannot be discarded, and |
- // * requests are served from the cache; |
- // and that no fetches are made exactly as prescribed in |expected_fetches|. |
- void AdvanceTimeAndVerifyPrefetchWithFetchesAt( |
- base::Time until_time, |
- const std::vector<ExpectedFetchDetails>& expected_fetches) { |
- for (const auto& next_fetch : expected_fetches) { |
- AdvanceTimeAndVerifyPrefetch(next_fetch.time); |
- ASSERT_NO_FATAL_FAILURE(AdvanceTimeAndExpectFetchNeeded( |
- std::min(until_time, SafeAdd(Now(), next_fetch.completion_delay)))); |
- if (next_fetch.completion_delay < base::TimeDelta::Max()) |
- CompleteFetch(); |
- } |
- AdvanceTimeAndVerifyPrefetch(until_time); |
- } |
- |
- void ExpectFetchNeeded() { |
- ASSERT_TRUE(facet_manager()->DoesRequireFetch()); |
- ASSERT_TRUE(fake_facet_manager_host()->signaled_need_network_request()); |
- } |
- |
- void ExpectNoFetchNeeded() { |
- ASSERT_FALSE(facet_manager()->DoesRequireFetch()); |
- ASSERT_FALSE(fake_facet_manager_host()->signaled_need_network_request()); |
- } |
- |
- void CompleteFetch() { |
- AffiliatedFacetsWithUpdateTime fetch_result( |
- GetTestEquivalenceClassWithUpdateTime(Now())); |
- fake_facet_manager_host()->set_fake_database_content(fetch_result); |
- fake_facet_manager_host()->reset_need_network_request(); |
- facet_manager()->OnFetchSucceeded(fetch_result); |
- |
- main_task_runner_->RunUntilIdle(); |
- ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded()); |
- ASSERT_TRUE(facet_manager()->IsCachedDataFresh()); |
- } |
- |
- void ExpectConsumerSuccessCallback() { |
- mock_consumer()->ExpectSuccessWithResult(GetTestEquivalenceClass()); |
- consumer_task_runner()->RunUntilIdle(); |
- testing::Mock::VerifyAndClearExpectations(mock_consumer()); |
- } |
- |
- void ExpectConsumerFailureCallback() { |
- mock_consumer()->ExpectFailure(); |
- consumer_task_runner()->RunUntilIdle(); |
- testing::Mock::VerifyAndClearExpectations(mock_consumer()); |
- } |
- |
- void ExpectRequestsServedFromCache() { |
- EXPECT_TRUE(facet_manager()->IsCachedDataFresh()); |
- GetAffiliations(StrategyOnCacheMiss::FAIL); |
- ExpectConsumerSuccessCallback(); |
- } |
- |
- MockAffiliationConsumer* mock_consumer() { return &mock_consumer_; } |
- |
- base::TestSimpleTaskRunner* consumer_task_runner() { |
- return consumer_task_runner_.get(); |
- } |
- |
- base::TestMockTimeTaskRunner* main_task_runner() { |
- return main_task_runner_.get(); |
- } |
- |
- MockFacetManagerHost* fake_facet_manager_host() { |
- return &facet_manager_host_; |
- } |
- |
- TestFacetManagerNotifier* facet_manager_notifier() { |
- return &facet_manager_notifier_; |
- } |
- |
- FacetManager* facet_manager() { return facet_manager_.get(); } |
- |
- private: |
- // testing::Test: |
- void SetUp() override { |
- ASSERT_LT(3 * GetShortTestPeriod(), GetCacheSoftExpiryPeriod()); |
- ASSERT_LT(GetShortTestPeriod(), |
- GetCacheHardExpiryPeriod() - GetCacheSoftExpiryPeriod()); |
- } |
- |
- void TearDown() override { DestroyFacetManager(); } |
- |
- MockAffiliationConsumer mock_consumer_; |
- scoped_refptr<base::TestSimpleTaskRunner> consumer_task_runner_; |
- scoped_refptr<base::TestMockTimeTaskRunner> main_task_runner_; |
- std::unique_ptr<base::Clock> main_clock_; |
- TestFacetManagerNotifier facet_manager_notifier_; |
- MockFacetManagerHost facet_manager_host_; |
- |
- std::unique_ptr<FacetManager> facet_manager_; |
- base::Time facet_manager_creation_; |
- |
- DISALLOW_COPY_AND_ASSIGN(FacetManagerTest); |
-}; |
- |
-// Tests ---------------------------------------------------------------------- |
- |
-TEST_F(FacetManagerTest, NewInstanceCanBeDiscarded) { |
- CreateFacetManager(); |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- EXPECT_TRUE(facet_manager()->CanCachedDataBeDiscarded()); |
- EXPECT_FALSE(facet_manager()->DoesRequireFetch()); |
- EXPECT_FALSE(main_task_runner()->HasPendingTask()); |
-} |
- |
-// Both cached-only and on-demand GetAffiliations() requests should be served |
-// from cache if it contains fresh data. Nothing should happen on cache expiry. |
-TEST_F(FacetManagerTest, GetAffiliationsServedFromCache) { |
- fake_facet_manager_host()->set_fake_database_content( |
- GetTestEquivalenceClassWithUpdateTime(Now())); |
- AdvanceTime(GetCacheHardExpiryPeriod() - Epsilon()); |
- |
- CreateFacetManager(); |
- EXPECT_TRUE(facet_manager()->IsCachedDataFresh()); |
- |
- GetAffiliations(StrategyOnCacheMiss::FAIL); |
- ExpectConsumerSuccessCallback(); |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded()); |
- |
- GetAffiliations(StrategyOnCacheMiss::FETCH_OVER_NETWORK); |
- ExpectConsumerSuccessCallback(); |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded()); |
- |
- AdvanceTime(Epsilon()); |
- |
- EXPECT_FALSE(facet_manager()->IsCachedDataFresh()); |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded()); |
- EXPECT_FALSE(main_task_runner()->HasPendingTask()); |
-} |
- |
-// On-demand GetAffiliations() requests should trigger a fetch if the cache has |
-// already stale data, or no corresponding data whatsoever. Nothing should |
-// happen once the newly fetched data expires. |
-TEST_F(FacetManagerTest, OnDemandGetAffiliationsRequestTriggersFetch) { |
- for (const bool cache_initially_has_stale_data : kFalseTrue) { |
- SCOPED_TRACE(cache_initially_has_stale_data); |
- |
- if (cache_initially_has_stale_data) { |
- fake_facet_manager_host()->set_fake_database_content( |
- GetTestEquivalenceClassWithUpdateTime(Now())); |
- AdvanceTime(GetCacheHardExpiryPeriod()); |
- } else { |
- fake_facet_manager_host()->clear_fake_database_content(); |
- } |
- |
- CreateFacetManager(); |
- EXPECT_FALSE(facet_manager()->IsCachedDataFresh()); |
- |
- GetAffiliations(StrategyOnCacheMiss::FETCH_OVER_NETWORK); |
- ASSERT_NO_FATAL_FAILURE(ExpectFetchNeeded()); |
- EXPECT_FALSE(facet_manager()->CanBeDiscarded()); |
- ASSERT_NO_FATAL_FAILURE(CompleteFetch()); |
- ExpectConsumerSuccessCallback(); |
- |
- AdvanceTime(GetCacheHardExpiryPeriod() - Epsilon()); |
- EXPECT_TRUE(facet_manager()->IsCachedDataFresh()); |
- |
- GetAffiliations(StrategyOnCacheMiss::FAIL); |
- ExpectConsumerSuccessCallback(); |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded()); |
- |
- GetAffiliations(StrategyOnCacheMiss::FETCH_OVER_NETWORK); |
- ExpectConsumerSuccessCallback(); |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded()); |
- |
- AdvanceTime(Epsilon()); |
- |
- ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded()); |
- EXPECT_FALSE(facet_manager()->IsCachedDataFresh()); |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- EXPECT_FALSE(main_task_runner()->HasPendingTask()); |
- } |
-} |
- |
-TEST_F(FacetManagerTest, CachedOnlyGetAffiliationsFailsDueToStaleCache) { |
- CreateFacetManager(); |
- EXPECT_FALSE(facet_manager()->IsCachedDataFresh()); |
- |
- GetAffiliations(StrategyOnCacheMiss::FAIL); |
- ExpectConsumerFailureCallback(); |
- ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded()); |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- EXPECT_FALSE(main_task_runner()->HasPendingTask()); |
-} |
- |
-TEST_F(FacetManagerTest, GetAffiliationsFailureCallbackInvokedOnDestruction) { |
- CreateFacetManager(); |
- EXPECT_FALSE(facet_manager()->IsCachedDataFresh()); |
- |
- GetAffiliations(StrategyOnCacheMiss::FETCH_OVER_NETWORK); |
- ASSERT_NO_FATAL_FAILURE(ExpectFetchNeeded()); |
- EXPECT_FALSE(facet_manager()->CanBeDiscarded()); |
- |
- // Leave the fetch hanging and destroy the facet manager. |
- DestroyFacetManager(); |
- |
- ExpectConsumerFailureCallback(); |
- fake_facet_manager_host()->reset_need_network_request(); |
-} |
- |
-// The following tests verify both typical and edge case behavior of Prefetch() |
-// requests: they should prevent the FacetManager from being discarded, and keep |
-// the data fresh by initial fetches and refetches (scheduled as described in |
-// facet_manager.cc). |
-// |
-// Legend: |
-// [---): Interval representing a finite Prefetch request (open from right). |
-// The data should be kept fresh, the FacetManager not discarded. |
-// [--->: Interval representing a indefinite Prefetch request. |
-// The data should be kept fresh, the FacetManager not discarded. |
-// F: Fetch (initial or refetch) should take place here. |
-// Fn: The time of the n-th fetch (starting from 1). |
-// D: Time interval equal to GetShortTestPeriod(). |
-// N: Fetch is signaled to be needed here. |
-// X: A corresponding CancelPrefetch call is placed here. |
-// S: |kCacheSoftExpiryInHours| hours |
-// H: |kCacheHardExpiryInHours| hours |
-// |
-// Note: It is guaranteed that S < H and that H < 2*S. |
-// |
-// Prefetches with the cache is initially stale/empty: |
-// |
-// t=0 S H F2+S F2+H |
-// / / / / / |
-// ---o--------------------------o-------o---------------o-------o---------> t |
-// : : : : : |
-// [) : : : : |
-// [F--) : : : : |
-// [F------------------------): : : : |
-// [F--------------------------------): : : |
-// [F-------------------------F----------) : : |
-// [F-------------------------F----------------------): : |
-// [F-------------------------F------------------------------): |
-// [F-------------------------F-----------------------F------------------> |
-// |
-TEST_F(FacetManagerTest, PrefetchWithEmptyOrStaleCache) { |
- struct { |
- base::TimeDelta prefetch_length; |
- size_t expected_num_fetches; |
- } const kTestCases[] = { |
- // Note: Zero length prefetches are tested later. |
- {GetShortTestPeriod(), 1}, |
- {GetCacheSoftExpiryPeriod(), 1}, |
- {GetCacheHardExpiryPeriod(), 1}, |
- {GetCacheHardExpiryPeriod() + GetShortTestPeriod(), 2}, |
- {GetCacheSoftExpiryPeriod() + GetCacheSoftExpiryPeriod(), 2}, |
- {GetCacheHardExpiryPeriod() + GetCacheSoftExpiryPeriod(), 2}, |
- {base::TimeDelta::Max(), 3}}; |
- |
- const base::TimeDelta kExpectedFetchTimes[] = { |
- base::TimeDelta(), |
- GetCacheSoftExpiryPeriod(), |
- 2 * GetCacheSoftExpiryPeriod()}; |
- |
- const base::TimeDelta kMaximumTestDuration = 2 * GetCacheHardExpiryPeriod(); |
- |
- for (const bool cache_initially_stale : kFalseTrue) { |
- for (size_t i = 0; i < arraysize(kTestCases); ++i) { |
- SCOPED_TRACE(testing::Message() << "Test case: #" << i); |
- SCOPED_TRACE(cache_initially_stale ? "Cache initially stale" |
- : "Cache initially empty"); |
- |
- if (cache_initially_stale) { |
- fake_facet_manager_host()->set_fake_database_content( |
- GetTestEquivalenceClassWithUpdateTime(Now())); |
- AdvanceTime(GetCacheHardExpiryPeriod()); |
- } else { |
- fake_facet_manager_host()->clear_fake_database_content(); |
- } |
- |
- std::vector<ExpectedFetchDetails> expected_fetches; |
- expected_fetches.resize(kTestCases[i].expected_num_fetches); |
- for (size_t f = 0; f < kTestCases[i].expected_num_fetches; ++f) |
- expected_fetches[f].time = Now() + kExpectedFetchTimes[f]; |
- |
- CreateFacetManager(); |
- Prefetch(SafeAdd(Now(), kTestCases[i].prefetch_length)); |
- ASSERT_NO_FATAL_FAILURE(AdvanceTimeAndVerifyPrefetchWithFetchesAt( |
- Now() + std::min(kTestCases[i].prefetch_length, kMaximumTestDuration), |
- expected_fetches)); |
- ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded()); |
- if (kTestCases[i].prefetch_length < base::TimeDelta::Max()) { |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- EXPECT_FALSE(main_task_runner()->HasPendingTask()); |
- } else { |
- EXPECT_FALSE(facet_manager()->CanBeDiscarded()); |
- } |
- |
- DestroyFacetManager(); |
- } |
- } |
-} |
- |
-// Prefetches with cached affiliation data that is fresh to some extent: |
-// |
-// Suppose an unrelated fetch at t=0 has resulted in affiliation information |
-// being stored into the cache (freshness interval marked with '='). See legend |
-// above. |
-// |
-// t=0 S H F2+S F2+H |
-// / / / / / |
-// ---o--------------------------o-------o---------------o-------o-----> t |
-// [F================================): : : |
-// : : : : : |
-// [) : : : : |
-// [--) : : : : |
-// [-------------------------): : : : |
-// [---------------------------------): : : |
-// [--------------------------F-----------) : : |
-// [--------------------------F----------------------): : |
-// [--------------------------F------------------------------): |
-// [--------------------------F-----------------------F-------------> |
-// : : : : |
-// [) : : : : |
-// [--) : : : : |
-// [---------------------): : : : |
-// [-----------------------------): : : |
-// [----------------------F-----------) : : |
-// [----------------------F----------------------): : |
-// [----------------------F------------------------------): |
-// [----------------------F-----------------------F-------------> |
-// : : : : |
-// [) : : : |
-// [----) : : : |
-// [------): : : |
-// [F----------) : : |
-// [F---------------------): : |
-// [F-----------------------------): |
-// [F----------------------F-------------> |
-// |
-// t=0 S S+D H F2+S F2+H |
-// / \ / / \ / |
-// ---o--------------------------o-o-----o-----------------o-------o-----> t |
-// [F================================): : : |
-// : : : : |
-// : [) : : : |
-// : [----): : : |
-// : [F------) : : |
-// : [F---------------------): : |
-// : [F-----------------------------): |
-// : [F----------------------F-------------> |
-// |
-TEST_F(FacetManagerTest, PrefetchTriggeredFetchSchedulingAfterNonEmptyCache) { |
- struct { |
- base::TimeDelta prefetch_start; |
- base::TimeDelta prefetch_end; |
- size_t expected_num_fetches; |
- } const kTestCases[] = { |
- // Note: Zero length prefetches are tested later. |
- |
- // Prefetch starts at the exact time the data was incidentally fetched. |
- {base::TimeDelta(), GetShortTestPeriod(), 0}, |
- {base::TimeDelta(), GetCacheSoftExpiryPeriod(), 0}, |
- {base::TimeDelta(), GetCacheHardExpiryPeriod(), 0}, |
- {base::TimeDelta(), GetCacheHardExpiryPeriod() + GetShortTestPeriod(), 1}, |
- {base::TimeDelta(), 2 * GetCacheSoftExpiryPeriod(), 1}, |
- {base::TimeDelta(), |
- GetCacheSoftExpiryPeriod() + GetCacheHardExpiryPeriod(), |
- 1}, |
- {base::TimeDelta(), base::TimeDelta::Max(), 2}, |
- |
- // Prefetch starts a short time after the unrelated fetch. |
- {GetShortTestPeriod(), 2 * GetShortTestPeriod(), 0}, |
- {GetShortTestPeriod(), GetCacheSoftExpiryPeriod(), 0}, |
- {GetShortTestPeriod(), GetCacheHardExpiryPeriod(), 0}, |
- {GetShortTestPeriod(), |
- GetCacheHardExpiryPeriod() + GetShortTestPeriod(), |
- 1}, |
- {GetShortTestPeriod(), 2 * GetCacheSoftExpiryPeriod(), 1}, |
- {GetShortTestPeriod(), |
- GetCacheSoftExpiryPeriod() + GetCacheHardExpiryPeriod(), |
- 1}, |
- {GetShortTestPeriod(), base::TimeDelta::Max(), 2}, |
- |
- // Prefetch starts at the soft expiry time of the unrelated fetch. |
- {GetCacheSoftExpiryPeriod(), |
- GetCacheSoftExpiryPeriod() + GetShortTestPeriod(), |
- 0}, |
- {GetCacheSoftExpiryPeriod(), GetCacheHardExpiryPeriod(), 0}, |
- {GetShortTestPeriod(), |
- GetCacheHardExpiryPeriod() + GetShortTestPeriod(), |
- 1}, |
- {GetCacheSoftExpiryPeriod(), 2 * GetCacheSoftExpiryPeriod(), 1}, |
- {GetCacheSoftExpiryPeriod(), |
- GetCacheSoftExpiryPeriod() + GetCacheHardExpiryPeriod(), |
- 1}, |
- {GetCacheSoftExpiryPeriod(), base::TimeDelta::Max(), 2}}; |
- |
- const base::TimeDelta kExpectedFetchTimes[] = { |
- GetCacheSoftExpiryPeriod(), 2 * GetCacheSoftExpiryPeriod()}; |
- |
- const base::TimeDelta kMaximumTestDuration = 2 * GetCacheHardExpiryPeriod(); |
- |
- for (size_t i = 0; i < arraysize(kTestCases); ++i) { |
- SCOPED_TRACE(testing::Message() << "Test case: #" << i); |
- |
- fake_facet_manager_host()->set_fake_database_content( |
- GetTestEquivalenceClassWithUpdateTime(Now())); |
- |
- const base::Time prefetch_end = SafeAdd(Now(), kTestCases[i].prefetch_end); |
- const base::Time testing_end = |
- std::min(prefetch_end, Now() + kMaximumTestDuration); |
- |
- std::vector<ExpectedFetchDetails> expected_fetches; |
- expected_fetches.resize(kTestCases[i].expected_num_fetches); |
- for (size_t f = 0; f < kTestCases[i].expected_num_fetches; ++f) |
- expected_fetches[f].time = Now() + kExpectedFetchTimes[f]; |
- |
- AdvanceTime(kTestCases[i].prefetch_start); |
- |
- CreateFacetManager(); |
- Prefetch(prefetch_end); |
- ASSERT_NO_FATAL_FAILURE(AdvanceTimeAndVerifyPrefetchWithFetchesAt( |
- testing_end, expected_fetches)); |
- ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded()); |
- if (kTestCases[i].prefetch_end < base::TimeDelta::Max()) { |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- EXPECT_FALSE(main_task_runner()->HasPendingTask()); |
- } else { |
- EXPECT_FALSE(facet_manager()->CanBeDiscarded()); |
- } |
- DestroyFacetManager(); |
- } |
-} |
- |
-// Last block of tests from above. |
-TEST_F(FacetManagerTest, PrefetchTriggeredFetchSchedulingAfterNonEmptyCache2) { |
- struct { |
- base::TimeDelta prefetch_start; |
- base::TimeDelta prefetch_end; |
- size_t expected_num_fetches; |
- } const kTestCases[] = { |
- // Note: Zero length prefetches are tested later. |
- |
- // Prefetch starts between the soft and hard expiry time. |
- {GetCacheSoftExpiryPeriod() + GetShortTestPeriod(), |
- GetCacheHardExpiryPeriod(), |
- 0}, |
- {GetCacheSoftExpiryPeriod() + GetShortTestPeriod(), |
- GetCacheHardExpiryPeriod() + GetShortTestPeriod(), |
- 1}, |
- {GetCacheSoftExpiryPeriod() + GetShortTestPeriod(), |
- 2 * GetCacheSoftExpiryPeriod() + GetShortTestPeriod(), |
- 1}, |
- {GetCacheSoftExpiryPeriod() + GetShortTestPeriod(), |
- GetCacheHardExpiryPeriod() + GetCacheSoftExpiryPeriod() + |
- GetShortTestPeriod(), |
- 1}, |
- {GetCacheSoftExpiryPeriod() + GetShortTestPeriod(), |
- base::TimeDelta::Max(), |
- 2}}; |
- |
- const base::TimeDelta kExpectedFetchTimes[] = { |
- GetCacheSoftExpiryPeriod() + GetShortTestPeriod(), |
- 2 * GetCacheSoftExpiryPeriod() + GetShortTestPeriod()}; |
- |
- const base::TimeDelta kMaximumTestDuration = 2 * GetCacheHardExpiryPeriod(); |
- |
- for (size_t i = 0; i < arraysize(kTestCases); ++i) { |
- SCOPED_TRACE(testing::Message() << "Test case: #" << i); |
- |
- fake_facet_manager_host()->set_fake_database_content( |
- GetTestEquivalenceClassWithUpdateTime(Now())); |
- |
- const base::Time prefetch_end = SafeAdd(Now(), kTestCases[i].prefetch_end); |
- const base::Time testing_end = |
- std::min(prefetch_end, Now() + kMaximumTestDuration); |
- |
- std::vector<ExpectedFetchDetails> expected_fetches; |
- expected_fetches.resize(kTestCases[i].expected_num_fetches); |
- for (size_t f = 0; f < kTestCases[i].expected_num_fetches; ++f) |
- expected_fetches[f].time = Now() + kExpectedFetchTimes[f]; |
- |
- AdvanceTime(kTestCases[i].prefetch_start); |
- |
- CreateFacetManager(); |
- Prefetch(prefetch_end); |
- ASSERT_NO_FATAL_FAILURE(AdvanceTimeAndVerifyPrefetchWithFetchesAt( |
- testing_end, expected_fetches)); |
- ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded()); |
- if (kTestCases[i].prefetch_end < base::TimeDelta::Max()) { |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- EXPECT_FALSE(main_task_runner()->HasPendingTask()); |
- } else { |
- EXPECT_FALSE(facet_manager()->CanBeDiscarded()); |
- } |
- DestroyFacetManager(); |
- } |
-} |
- |
-// Prefetches from above that have zero length. |
-TEST_F(FacetManagerTest, ExpiredPrefetchDoesNothing) { |
- base::TimeDelta kPrefetchStart[] = {base::TimeDelta(), |
- GetShortTestPeriod(), |
- GetCacheSoftExpiryPeriod(), |
- GetCacheHardExpiryPeriod(), |
- base::TimeDelta::Max()}; |
- |
- for (base::TimeDelta prefetch_start : kPrefetchStart) { |
- SCOPED_TRACE(testing::Message() << "Prefetch start: " << prefetch_start); |
- |
- if (prefetch_start < base::TimeDelta::Max()) { |
- fake_facet_manager_host()->set_fake_database_content( |
- GetTestEquivalenceClassWithUpdateTime(Now())); |
- AdvanceTime(prefetch_start); |
- } else { |
- fake_facet_manager_host()->clear_fake_database_content(); |
- } |
- |
- CreateFacetManager(); |
- Prefetch(Now()); |
- ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded()); |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- EXPECT_FALSE(main_task_runner()->HasPendingTask()); |
- DestroyFacetManager(); |
- } |
-} |
- |
-// Nested prefetches. See legend above. |
-// |
-// t=0 S H F2+S F2+H |
-// / / / / / |
-// ---o--------------------------o-------o---------------o-------o---------> t |
-// : : : : : |
-// [F=========================F==============================): |
-// [F=========================F=======================F===========> |
-// [--) : : : : |
-// : [--) : : : : |
-// : [----------------------): : : : |
-// : [------------------------------): : : |
-// : [----------------------------------------------): : |
-// : [------------------------------------------------------): |
-// : [------): : : |
-// : [----------------------): : |
-// : [------------------------------): |
-// : : [----): : : |
-// : : [--------------------): : |
-// : : [----------------------------): |
-// : : [------): |
-// : : : [----): |
-// |
-TEST_F(FacetManagerTest, NestedPrefetches) { |
- struct { |
- base::TimeDelta prefetch_length; |
- size_t expected_num_fetches; |
- } const kFirstPrefetchParams[] = { |
- {GetCacheHardExpiryPeriod() + GetCacheSoftExpiryPeriod(), 2}, |
- {base::TimeDelta::Max(), 3}, |
- }; |
- |
- struct { |
- base::TimeDelta second_prefetch_start; |
- base::TimeDelta second_prefetch_end; |
- } const kSecondPrefetchParams[] = { |
- {base::TimeDelta(), GetShortTestPeriod()}, |
- {GetShortTestPeriod(), 2 * GetShortTestPeriod()}, |
- {GetShortTestPeriod(), GetCacheSoftExpiryPeriod()}, |
- {GetShortTestPeriod(), GetCacheHardExpiryPeriod()}, |
- {GetShortTestPeriod(), 2 * GetCacheSoftExpiryPeriod()}, |
- {GetShortTestPeriod(), |
- GetCacheSoftExpiryPeriod() + GetCacheHardExpiryPeriod()}, |
- {GetCacheSoftExpiryPeriod(), GetCacheHardExpiryPeriod()}, |
- {GetCacheSoftExpiryPeriod(), 2 * GetCacheSoftExpiryPeriod()}, |
- {GetCacheSoftExpiryPeriod(), |
- GetCacheSoftExpiryPeriod() + GetCacheHardExpiryPeriod()}, |
- {GetCacheSoftExpiryPeriod() + GetShortTestPeriod(), |
- GetCacheHardExpiryPeriod()}, |
- {GetCacheSoftExpiryPeriod() + GetShortTestPeriod(), |
- 2 * GetCacheSoftExpiryPeriod()}, |
- {GetCacheSoftExpiryPeriod() + GetShortTestPeriod(), |
- GetCacheSoftExpiryPeriod() + GetCacheHardExpiryPeriod()}, |
- {2 * GetCacheSoftExpiryPeriod(), |
- GetCacheHardExpiryPeriod() + GetCacheSoftExpiryPeriod()}, |
- {2 * GetCacheSoftExpiryPeriod() + GetShortTestPeriod(), |
- GetCacheHardExpiryPeriod() + GetCacheSoftExpiryPeriod()}}; |
- |
- const base::TimeDelta kExpectedFetchTimes[] = { |
- base::TimeDelta(), |
- GetCacheSoftExpiryPeriod(), |
- 2 * GetCacheSoftExpiryPeriod()}; |
- |
- const base::TimeDelta kTestDuration = |
- GetCacheSoftExpiryPeriod() + GetCacheHardExpiryPeriod(); |
- |
- for (size_t j = 0; j < arraysize(kFirstPrefetchParams); ++j) { |
- for (size_t i = 0; i < arraysize(kSecondPrefetchParams); ++i) { |
- SCOPED_TRACE(testing::Message() << "Test case: #" << j << "." << i); |
- |
- fake_facet_manager_host()->clear_fake_database_content(); |
- |
- std::vector<ExpectedFetchDetails> expected_fetches; |
- expected_fetches.resize(kFirstPrefetchParams[j].expected_num_fetches); |
- for (size_t f = 0; f < kFirstPrefetchParams[j].expected_num_fetches; ++f) |
- expected_fetches[f].time = Now() + kExpectedFetchTimes[f]; |
- |
- CreateFacetManager(); |
- Prefetch(SafeAdd(Now(), kFirstPrefetchParams[j].prefetch_length)); |
- SchedulePrefetch(Now() + kSecondPrefetchParams[i].second_prefetch_start, |
- Now() + kSecondPrefetchParams[i].second_prefetch_end); |
- ASSERT_NO_FATAL_FAILURE(AdvanceTimeAndVerifyPrefetchWithFetchesAt( |
- Now() + kTestDuration, expected_fetches)); |
- ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded()); |
- if (kFirstPrefetchParams[j].prefetch_length < base::TimeDelta::Max()) { |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- EXPECT_FALSE(main_task_runner()->HasPendingTask()); |
- } else { |
- EXPECT_FALSE(facet_manager()->CanBeDiscarded()); |
- } |
- |
- DestroyFacetManager(); |
- } |
- } |
-} |
- |
-// Overlapping prefetches. See legend above. |
-// |
-// t=0 S H F2+S F2+H |
-// / / / / / |
-// ---o--------------------------o-------o---------------o-------o---------> t |
-// : : : : : |
-// [F================================): : : |
-// : [--------------------F------------------------------): |
-// : [--------------------F-----------------------F-----------> |
-// : [F-----------------------------): |
-// : [F----------------------F-----------> |
-// |
-TEST_F(FacetManagerTest, OverlappingPrefetches) { |
- struct { |
- base::TimeDelta second_prefetch_start; |
- base::TimeDelta second_prefetch_end; |
- size_t expected_num_fetches; |
- } const kTestCases[] = { |
- {GetShortTestPeriod(), |
- GetCacheSoftExpiryPeriod() + GetCacheHardExpiryPeriod(), |
- 2}, |
- {GetShortTestPeriod(), base::TimeDelta::Max(), 3}, |
- {GetCacheSoftExpiryPeriod(), |
- GetCacheSoftExpiryPeriod() + GetCacheHardExpiryPeriod(), |
- 2}, |
- {GetCacheSoftExpiryPeriod(), base::TimeDelta::Max(), 3}}; |
- |
- const base::TimeDelta kExpectedFetchTimes[] = { |
- base::TimeDelta(), |
- GetCacheSoftExpiryPeriod(), |
- 2 * GetCacheSoftExpiryPeriod()}; |
- |
- const base::TimeDelta kTestDuration = |
- GetCacheSoftExpiryPeriod() + GetCacheHardExpiryPeriod(); |
- |
- for (size_t i = 0; i < arraysize(kTestCases); ++i) { |
- SCOPED_TRACE(testing::Message() << "Test case: #" << i); |
- |
- fake_facet_manager_host()->clear_fake_database_content(); |
- |
- std::vector<ExpectedFetchDetails> expected_fetches; |
- expected_fetches.resize(kTestCases[i].expected_num_fetches); |
- for (size_t f = 0; f < kTestCases[i].expected_num_fetches; ++f) |
- expected_fetches[f].time = Now() + kExpectedFetchTimes[f]; |
- |
- CreateFacetManager(); |
- Prefetch(SafeAdd(Now(), GetCacheHardExpiryPeriod())); |
- SchedulePrefetch(Now() + kTestCases[i].second_prefetch_start, |
- SafeAdd(Now(), kTestCases[i].second_prefetch_end)); |
- ASSERT_NO_FATAL_FAILURE(AdvanceTimeAndVerifyPrefetchWithFetchesAt( |
- Now() + kTestDuration, expected_fetches)); |
- ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded()); |
- if (kTestCases[i].second_prefetch_end < base::TimeDelta::Max()) { |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- EXPECT_FALSE(main_task_runner()->HasPendingTask()); |
- } else { |
- EXPECT_FALSE(facet_manager()->CanBeDiscarded()); |
- } |
- |
- DestroyFacetManager(); |
- } |
-} |
- |
-// Prefetches with network fetches taking non-zero time. See legend above. |
-// |
-// t=0 S S+D H S+H S+H+2*D |
-// / \ / / \ / |
-// ---o--------------------------o-o-----o-----------------------o-o-o-----> t |
-// : : : : : : : |
-// [NNF------------------------------): : : : |
-// [F-------------------------NNF----------------------------): : : |
-// [NNNNNNNNNNNNNNNNNNNNNNNNNNF------------------------------): : : |
-// : : : : : : : |
-// [NNF----------------------------------) : : : |
-// [F-------------------------NNF------------------------------): : |
-// [NNNNNNNNNNNNNNNNNNNNNNNNNNNNF------------------------------): : |
-// [NNF-------------------------NNF------------------------------): |
-// : : : : : |
-// [NNN) : : : : |
-// [NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN): : |
-// [F-------------------------NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN): |
-// [NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN): |
-// [NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN... |
-// |
-TEST_F(FacetManagerTest, PrefetchWithNonInstantFetches) { |
- struct { |
- base::TimeDelta prefetch_length; |
- base::TimeDelta expected_fetch_time1; |
- base::TimeDelta fetch_completion_delay1; |
- base::TimeDelta expected_fetch_time2; |
- base::TimeDelta fetch_completion_delay2; |
- } const kTestCases[] = { |
- {GetCacheHardExpiryPeriod(), |
- base::TimeDelta(), |
- GetShortTestPeriod(), |
- base::TimeDelta::Max(), |
- base::TimeDelta::Max()}, |
- {GetCacheHardExpiryPeriod() + GetCacheSoftExpiryPeriod(), |
- base::TimeDelta(), |
- base::TimeDelta(), |
- GetCacheSoftExpiryPeriod(), |
- GetCacheSoftExpiryPeriod() + GetShortTestPeriod()}, |
- {GetCacheHardExpiryPeriod() + GetCacheSoftExpiryPeriod(), |
- base::TimeDelta(), |
- GetCacheSoftExpiryPeriod(), |
- base::TimeDelta::Max(), |
- base::TimeDelta::Max()}, |
- {GetCacheHardExpiryPeriod() + GetShortTestPeriod(), |
- base::TimeDelta(), |
- GetShortTestPeriod(), |
- base::TimeDelta::Max(), |
- base::TimeDelta::Max()}, |
- {GetCacheHardExpiryPeriod() + GetCacheSoftExpiryPeriod() + |
- GetShortTestPeriod(), |
- base::TimeDelta(), |
- base::TimeDelta(), |
- GetCacheSoftExpiryPeriod(), |
- GetCacheSoftExpiryPeriod() + GetShortTestPeriod()}, |
- {GetCacheHardExpiryPeriod() + GetCacheSoftExpiryPeriod() + |
- GetShortTestPeriod(), |
- base::TimeDelta(), |
- GetCacheSoftExpiryPeriod() + GetShortTestPeriod(), |
- base::TimeDelta::Max(), |
- base::TimeDelta::Max()}, |
- {GetCacheHardExpiryPeriod() + GetCacheSoftExpiryPeriod() + |
- 2 * GetShortTestPeriod(), |
- base::TimeDelta(), |
- GetShortTestPeriod(), |
- GetCacheSoftExpiryPeriod() + GetShortTestPeriod(), |
- GetCacheSoftExpiryPeriod() + 2 * GetShortTestPeriod()}, |
- {GetShortTestPeriod(), |
- base::TimeDelta(), |
- base::TimeDelta::Max(), |
- base::TimeDelta::Max(), |
- base::TimeDelta::Max()}, |
- {GetCacheHardExpiryPeriod(), |
- base::TimeDelta(), |
- base::TimeDelta::Max(), |
- base::TimeDelta::Max(), |
- base::TimeDelta::Max()}, |
- {GetCacheSoftExpiryPeriod() + GetCacheHardExpiryPeriod(), |
- base::TimeDelta(), |
- base::TimeDelta(), |
- GetCacheSoftExpiryPeriod(), |
- base::TimeDelta::Max()}, |
- {GetCacheSoftExpiryPeriod() + GetCacheHardExpiryPeriod(), |
- base::TimeDelta(), |
- base::TimeDelta::Max(), |
- base::TimeDelta::Max(), |
- base::TimeDelta::Max()}, |
- {base::TimeDelta::Max(), |
- base::TimeDelta(), |
- base::TimeDelta::Max(), |
- base::TimeDelta::Max(), |
- base::TimeDelta::Max()}}; |
- |
- const base::TimeDelta kMaximumTestDuration = GetCacheSoftExpiryPeriod() + |
- GetCacheHardExpiryPeriod() + |
- 2 * GetShortTestPeriod(); |
- |
- for (size_t i = 0; i < arraysize(kTestCases); ++i) { |
- SCOPED_TRACE(testing::Message() << "Test case: #" << i); |
- |
- fake_facet_manager_host()->clear_fake_database_content(); |
- |
- const base::Time testing_end = |
- Now() + std::min(kTestCases[i].prefetch_length, kMaximumTestDuration); |
- |
- std::vector<ExpectedFetchDetails> expected_fetches(1); |
- expected_fetches[0].time = Now() + kTestCases[i].expected_fetch_time1, |
- expected_fetches[0].completion_delay = |
- kTestCases[i].fetch_completion_delay1; |
- if (kTestCases[i].expected_fetch_time2 != base::TimeDelta::Max()) { |
- expected_fetches.resize(2); |
- expected_fetches[1].time = Now() + kTestCases[i].expected_fetch_time2, |
- expected_fetches[1].completion_delay = |
- kTestCases[i].fetch_completion_delay2; |
- } |
- |
- CreateFacetManager(); |
- Prefetch(SafeAdd(Now(), kTestCases[i].prefetch_length)); |
- ASSERT_NO_FATAL_FAILURE(AdvanceTimeAndVerifyPrefetchWithFetchesAt( |
- testing_end, expected_fetches)); |
- if (kTestCases[i].prefetch_length < base::TimeDelta::Max()) { |
- EXPECT_FALSE(facet_manager()->DoesRequireFetch()); |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- EXPECT_FALSE(main_task_runner()->HasPendingTask()); |
- } else { |
- ASSERT_NO_FATAL_FAILURE(ExpectFetchNeeded()); |
- EXPECT_FALSE(facet_manager()->CanBeDiscarded()); |
- } |
- DestroyFacetManager(); |
- } |
-} |
- |
-// Canceling prefetches. See legend above. |
-// |
-// t=0 S H F2+S F2+H |
-// / / / / / |
-// ---o--------------------------o-------o---------------o-------o---------> t |
-// : : : : : |
-// [F--X- - - - - - - - - - - - - - -): : : |
-// [F-------------------------X - - -): : : |
-// [F----------------------------X- -): : : |
-// [F--X- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -> |
-// [F-------------------------X - - - - - - - - - - - - - - - - - -> |
-// [F-------------------------F--X- - - - - - - - - - - - - - - - -> |
-// [F-------------------------F----------X- - - - - - - - - - - - -> |
-// [F-------------------------F-----------------------X - - - - - -> |
-// [F-------------------------F-----------------------F--X- - - - -> |
-// |
-TEST_F(FacetManagerTest, CancelPrefetch) { |
- struct { |
- base::TimeDelta prefetch_length; |
- base::TimeDelta cancel_time; |
- size_t expected_num_fetches; |
- } const kTestCases[] = { |
- {GetCacheHardExpiryPeriod(), GetShortTestPeriod(), 1}, |
- {GetCacheHardExpiryPeriod(), GetCacheSoftExpiryPeriod(), 1}, |
- {GetCacheHardExpiryPeriod(), |
- GetCacheSoftExpiryPeriod() + GetShortTestPeriod(), |
- 1}, |
- {base::TimeDelta::Max(), GetShortTestPeriod(), 1}, |
- {base::TimeDelta::Max(), GetCacheSoftExpiryPeriod(), 1}, |
- {base::TimeDelta::Max(), |
- GetCacheSoftExpiryPeriod() + GetShortTestPeriod(), |
- 2}, |
- {base::TimeDelta::Max(), |
- GetCacheHardExpiryPeriod() + GetShortTestPeriod(), |
- 2}, |
- {base::TimeDelta::Max(), 2 * GetCacheSoftExpiryPeriod(), 2}, |
- {base::TimeDelta::Max(), |
- 2 * GetCacheSoftExpiryPeriod() + GetShortTestPeriod(), |
- 3}}; |
- |
- const base::TimeDelta kExpectedFetchTimes[] = { |
- base::TimeDelta(), |
- GetCacheSoftExpiryPeriod(), |
- 2 * GetCacheSoftExpiryPeriod()}; |
- |
- for (size_t i = 0; i < arraysize(kTestCases); ++i) { |
- SCOPED_TRACE(testing::Message() << "Test case: #" << i); |
- |
- fake_facet_manager_host()->clear_fake_database_content(); |
- |
- std::vector<ExpectedFetchDetails> expected_fetches; |
- expected_fetches.resize(kTestCases[i].expected_num_fetches); |
- for (size_t f = 0; f < kTestCases[i].expected_num_fetches; ++f) |
- expected_fetches[f].time = Now() + kExpectedFetchTimes[f]; |
- |
- CreateFacetManager(); |
- Prefetch(SafeAdd(Now(), kTestCases[i].prefetch_length)); |
- ScheduleCancelPrefetch(Now() + kTestCases[i].cancel_time, |
- SafeAdd(Now(), kTestCases[i].prefetch_length)); |
- ASSERT_NO_FATAL_FAILURE(AdvanceTimeAndVerifyPrefetchWithFetchesAt( |
- Now() + kTestCases[i].cancel_time, expected_fetches)); |
- ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded()); |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- AdvanceTime(GetCacheHardExpiryPeriod()); |
- EXPECT_FALSE(main_task_runner()->HasPendingTask()); |
- DestroyFacetManager(); |
- } |
-} |
- |
-// Canceling in case of multiple nested prefetches. See legend above. |
-// |
-// t=0 S H F2+S F2+H |
-// / / / / / |
-// ---o--------------------------o-------o---------------o-------o---------> t |
-// : : : : : |
-// [F-------------------------F---------------------------X- ): |
-// [---------------------------------X- - - - - - - - - - - -) |
-// [--X- - - - - - - - - - - - - - - - - - - - - - - - - - -) |
-// |
-TEST_F(FacetManagerTest, CancelNestedPrefetches) { |
- const base::TimeDelta kPrefetchLength = |
- GetCacheSoftExpiryPeriod() + GetCacheHardExpiryPeriod(); |
- const base::TimeDelta kTestDuration = |
- kPrefetchLength + 2 * GetShortTestPeriod(); |
- const base::TimeDelta kLastCancelTime = |
- 2 * GetCacheSoftExpiryPeriod() + GetShortTestPeriod(); |
- |
- std::vector<ExpectedFetchDetails> expected_fetches(2); |
- expected_fetches[0].time = Now(); |
- expected_fetches[1].time = Now() + GetCacheSoftExpiryPeriod(); |
- |
- CreateFacetManager(); |
- Prefetch(Now() + kPrefetchLength); |
- SchedulePrefetch(Now() + GetShortTestPeriod(), |
- Now() + kPrefetchLength + GetShortTestPeriod()); |
- SchedulePrefetch(Now() + 2 * GetShortTestPeriod(), |
- Now() + kPrefetchLength + 2 * GetShortTestPeriod()); |
- ScheduleCancelPrefetch(Now() + 3 * GetShortTestPeriod(), |
- Now() + 2 * GetShortTestPeriod() + kPrefetchLength); |
- ScheduleCancelPrefetch( |
- Now() + GetCacheHardExpiryPeriod() + GetShortTestPeriod(), |
- Now() + kPrefetchLength + GetShortTestPeriod()); |
- ScheduleCancelPrefetch(Now() + kLastCancelTime, Now() + kPrefetchLength); |
- ASSERT_NO_FATAL_FAILURE(AdvanceTimeAndVerifyPrefetchWithFetchesAt( |
- Now() + kLastCancelTime, expected_fetches)); |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded()); |
- AdvanceTime(kTestDuration - kLastCancelTime); |
- EXPECT_FALSE(main_task_runner()->HasPendingTask()); |
- DestroyFacetManager(); |
-} |
- |
-// Canceling in case of duplicate prefetches with the same |until| value. See |
-// legend above. |
-// |
-// t=0 S H F2+S F2+H |
-// / / / / / |
-// ---o--------------------------o-------o---------------o-------o---------> t |
-// : : : : : |
-// [F-------------------------F-----------------------F--X- - - - -> |
-// [--------------------------X - - - - - - - - - - - - - - - - - -> |
-// [--X - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -> |
-// |
-TEST_F(FacetManagerTest, CancelNestedPrefetchesWithMultiplicity) { |
- const base::TimeDelta kTestPeriod = 3 * GetCacheSoftExpiryPeriod(); |
- const base::TimeDelta kLastCancelTime = |
- 2 * GetCacheSoftExpiryPeriod() + GetShortTestPeriod(); |
- |
- std::vector<ExpectedFetchDetails> expected_fetches(3); |
- expected_fetches[0].time = Now(); |
- expected_fetches[1].time = Now() + GetCacheSoftExpiryPeriod(); |
- expected_fetches[2].time = Now() + 2 * GetCacheSoftExpiryPeriod(); |
- |
- CreateFacetManager(); |
- Prefetch(base::Time::Max()); |
- SchedulePrefetch(Now() + GetShortTestPeriod(), base::Time::Max()); |
- SchedulePrefetch(Now() + 2 * GetShortTestPeriod(), base::Time::Max()); |
- ScheduleCancelPrefetch(Now() + GetShortTestPeriod(), base::Time::Max()); |
- ScheduleCancelPrefetch(Now() + GetCacheSoftExpiryPeriod(), base::Time::Max()); |
- ScheduleCancelPrefetch(Now() + kLastCancelTime, base::Time::Max()); |
- ASSERT_NO_FATAL_FAILURE(AdvanceTimeAndVerifyPrefetchWithFetchesAt( |
- Now() + kLastCancelTime, expected_fetches)); |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded()); |
- AdvanceTime(kTestPeriod - kLastCancelTime); |
- EXPECT_FALSE(main_task_runner()->HasPendingTask()); |
- DestroyFacetManager(); |
-} |
- |
-TEST_F(FacetManagerTest, CancelingNonexistentPrefetchesIsSilentlyIgnored) { |
- const base::TimeDelta kPrefetchLength = |
- GetCacheSoftExpiryPeriod() + GetCacheHardExpiryPeriod(); |
- |
- std::vector<ExpectedFetchDetails> expected_fetches(2); |
- expected_fetches[0].time = Now(); |
- expected_fetches[1].time = Now() + GetCacheSoftExpiryPeriod(); |
- |
- CreateFacetManager(); |
- CancelPrefetch(Now() + GetShortTestPeriod()); |
- CancelPrefetch(base::Time::Max()); |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded()); |
- EXPECT_FALSE(main_task_runner()->HasPendingTask()); |
- |
- Prefetch(Now() + kPrefetchLength); |
- ScheduleCancelPrefetch(Now() + GetShortTestPeriod(), |
- Now() + GetShortTestPeriod()); |
- ScheduleCancelPrefetch(Now() + GetShortTestPeriod(), base::Time::Max()); |
- ASSERT_NO_FATAL_FAILURE(AdvanceTimeAndVerifyPrefetchWithFetchesAt( |
- Now() + kPrefetchLength, expected_fetches)); |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded()); |
- EXPECT_FALSE(main_task_runner()->HasPendingTask()); |
- DestroyFacetManager(); |
-} |
- |
-TEST_F(FacetManagerTest, CachedDataCannotBeDiscarded) { |
- CreateFacetManager(); |
- |
- const base::TimeDelta kPrefetchLength = |
- 2 * GetCacheSoftExpiryPeriod() + GetCacheHardExpiryPeriod(); |
- |
- facet_manager_notifier()->set_accuracy(NotificationAccuracy::NEVER_CALLED); |
- |
- const base::Time prefetch_end = Now() + kPrefetchLength; |
- std::vector<ExpectedFetchDetails> expected_fetches(1); |
- expected_fetches[0].time = Now(); |
- |
- Prefetch(prefetch_end); |
- ASSERT_NO_FATAL_FAILURE(AdvanceTimeAndVerifyPrefetchWithFetchesAt( |
- Now() + GetCacheSoftExpiryPeriod(), expected_fetches)); |
- for (base::TimeDelta step : SamplingPoints(prefetch_end - Now())) { |
- SCOPED_TRACE(testing::Message() << "dT: " << DeltaNow()); |
- EXPECT_FALSE(facet_manager()->CanBeDiscarded()); |
- ASSERT_TRUE(facet_manager()->DoesRequireFetch()); |
- if (DeltaNow() < GetCacheHardExpiryPeriod()) |
- ExpectRequestsServedFromCache(); |
- AdvanceTime(step); |
- } |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- EXPECT_FALSE(main_task_runner()->HasPendingTask()); |
- DestroyFacetManager(); |
-} |
- |
-// RequestNotificationAtTime() ends up calling NotifyAtRequestedTime() always |
-// a bit earlier than needed. This should result in NotifyAtRequestedTime() |
-// being called repeatedly until the callback is finally on time, but should |
-// not otherwise result in a change of behavior. |
-TEST_F(FacetManagerTest, RequestedNotificationsComeTooEarly) { |
- const base::TimeDelta kTestPeriod = |
- 2 * GetCacheSoftExpiryPeriod() + GetCacheHardExpiryPeriod(); |
- |
- facet_manager_notifier()->set_accuracy(NotificationAccuracy::TOO_EARLY); |
- |
- std::vector<ExpectedFetchDetails> expected_fetches(3); |
- expected_fetches[0].time = Now(); |
- expected_fetches[1].time = Now() + GetCacheSoftExpiryPeriod(); |
- expected_fetches[2].time = Now() + 2 * GetCacheSoftExpiryPeriod(); |
- |
- CreateFacetManager(); |
- Prefetch(Now() + kTestPeriod); |
- ASSERT_NO_FATAL_FAILURE(AdvanceTimeAndVerifyPrefetchWithFetchesAt( |
- Now() + kTestPeriod, expected_fetches)); |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- EXPECT_FALSE(main_task_runner()->HasPendingTask()); |
- DestroyFacetManager(); |
-} |
- |
-// RequestNotificationAtTime() ends up calling NotifyAtRequestedTime() always |
-// a short time after desired. This may result in SignalNeedNetworkRequest() |
-// coming in late, but DoesRequireFetch() should get set at the correct time. |
-TEST_F(FacetManagerTest, RequestedNotificationsComeTooLate) { |
- const base::TimeDelta kPrefetchLength = |
- 2 * GetCacheSoftExpiryPeriod() + GetCacheHardExpiryPeriod(); |
- |
- facet_manager_notifier()->set_accuracy(NotificationAccuracy::TOO_LATE); |
- |
- const base::Time prefetch_end = Now() + kPrefetchLength; |
- std::vector<ExpectedFetchDetails> expected_fetches(1); |
- expected_fetches[0].time = Now(); |
- |
- CreateFacetManager(); |
- Prefetch(prefetch_end); |
- ASSERT_NO_FATAL_FAILURE(AdvanceTimeAndVerifyPrefetchWithFetchesAt( |
- Now() + GetCacheSoftExpiryPeriod(), expected_fetches)); |
- |
- for (int cycle = 0; cycle < 2; ++cycle) { |
- for (base::TimeDelta step : SamplingPoints(GetShortTestPeriod())) { |
- SCOPED_TRACE(testing::Message() << "dT: " << DeltaNow()); |
- EXPECT_FALSE(facet_manager()->CanBeDiscarded()); |
- ASSERT_TRUE(facet_manager()->DoesRequireFetch()); |
- ExpectRequestsServedFromCache(); |
- AdvanceTime(step); |
- } |
- |
- ASSERT_NO_FATAL_FAILURE(ExpectFetchNeeded()); |
- CompleteFetch(); |
- |
- const base::TimeDelta idle_period = |
- cycle ? prefetch_end - Now() : GetCacheSoftExpiryPeriod(); |
- for (base::TimeDelta step : SamplingPoints(idle_period)) { |
- SCOPED_TRACE(testing::Message() << "dT: " << DeltaNow()); |
- EXPECT_FALSE(facet_manager()->CanBeDiscarded()); |
- ExpectNoFetchNeeded(); |
- ExpectRequestsServedFromCache(); |
- AdvanceTime(step); |
- } |
- } |
- |
- ASSERT_EQ(kPrefetchLength, DeltaNow()); |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- AdvanceTime(GetShortTestPeriod()); |
- EXPECT_FALSE(main_task_runner()->HasPendingTask()); |
- DestroyFacetManager(); |
-} |
- |
-// RequestNotificationAtTime() ends up not calling NotifyAtRequestedTime() at |
-// all. This should result in SignalNeedNetworkRequest() not being called, but |
-// DoesRequireFetch() should be set as long as the prefetch is active. |
-TEST_F(FacetManagerTest, RequestedNotificationsNeverCome) { |
- const base::TimeDelta kPrefetchLength = |
- 2 * GetCacheSoftExpiryPeriod() + GetCacheHardExpiryPeriod(); |
- |
- facet_manager_notifier()->set_accuracy(NotificationAccuracy::NEVER_CALLED); |
- |
- const base::Time prefetch_end = Now() + kPrefetchLength; |
- std::vector<ExpectedFetchDetails> expected_fetches(1); |
- expected_fetches[0].time = Now(); |
- |
- CreateFacetManager(); |
- Prefetch(prefetch_end); |
- ASSERT_NO_FATAL_FAILURE(AdvanceTimeAndVerifyPrefetchWithFetchesAt( |
- Now() + GetCacheSoftExpiryPeriod(), expected_fetches)); |
- for (base::TimeDelta step : SamplingPoints(prefetch_end - Now())) { |
- SCOPED_TRACE(testing::Message() << "dT: " << DeltaNow()); |
- EXPECT_FALSE(facet_manager()->CanBeDiscarded()); |
- ASSERT_TRUE(facet_manager()->DoesRequireFetch()); |
- if (DeltaNow() < GetCacheHardExpiryPeriod()) |
- ExpectRequestsServedFromCache(); |
- AdvanceTime(step); |
- } |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- EXPECT_FALSE(main_task_runner()->HasPendingTask()); |
- DestroyFacetManager(); |
-} |
- |
-TEST_F(FacetManagerTest, StaleCachedDataBeCanDiscardedWhilePendingFetch) { |
- CreateFacetManager(); |
- ASSERT_FALSE(facet_manager()->IsCachedDataFresh()); |
- |
- GetAffiliations(StrategyOnCacheMiss::FETCH_OVER_NETWORK); |
- ASSERT_NO_FATAL_FAILURE(ExpectFetchNeeded()); |
- EXPECT_FALSE(facet_manager()->CanBeDiscarded()); |
- EXPECT_TRUE(facet_manager()->CanCachedDataBeDiscarded()); |
- |
- fake_facet_manager_host()->reset_need_network_request(); |
-} |
- |
-TEST_F(FacetManagerTest, CachedDataBeCanDiscardedAfterOnDemandGetAffiliatons) { |
- CreateFacetManager(); |
- ASSERT_FALSE(facet_manager()->IsCachedDataFresh()); |
- |
- GetAffiliations(StrategyOnCacheMiss::FETCH_OVER_NETWORK); |
- ASSERT_NO_FATAL_FAILURE(ExpectFetchNeeded()); |
- ASSERT_NO_FATAL_FAILURE(CompleteFetch()); |
- ExpectConsumerSuccessCallback(); |
- |
- EXPECT_TRUE(facet_manager()->IsCachedDataFresh()); |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- EXPECT_TRUE(facet_manager()->CanCachedDataBeDiscarded()); |
-} |
- |
-// The cached data can be discarded (indicated by 'd') if and only if it is no |
-// longer needed to be kept fresh, or if it already stale. |
-// |
-// t=0 S H F2+S F2+H |
-// / / / / / |
-// ---o--------------------------o-------o------------------o-------o------> t |
-// : : : |
-// [F-------------------------NNNNNNNNNNNF---) |
-// ddd ddd... |
-// |
-TEST_F(FacetManagerTest, |
- CachedDataCanBeDiscardedAfterAndSometimesDuringPrefetch) { |
- CreateFacetManager(); |
- Prefetch(Now() + GetCacheHardExpiryPeriod() + 2 * GetShortTestPeriod()); |
- ASSERT_NO_FATAL_FAILURE(ExpectFetchNeeded()); |
- ASSERT_NO_FATAL_FAILURE(CompleteFetch()); |
- |
- for (base::TimeDelta step : SamplingPoints(GetCacheHardExpiryPeriod())) { |
- SCOPED_TRACE(testing::Message() << "dT: " << DeltaNow()); |
- EXPECT_FALSE(facet_manager()->CanCachedDataBeDiscarded()); |
- AdvanceTime(step); |
- } |
- |
- for (base::TimeDelta step : SamplingPoints(GetShortTestPeriod())) { |
- SCOPED_TRACE(testing::Message() << "dT: " << DeltaNow()); |
- EXPECT_TRUE(facet_manager()->CanCachedDataBeDiscarded()); |
- AdvanceTime(step); |
- } |
- |
- ASSERT_NO_FATAL_FAILURE(ExpectFetchNeeded()); |
- ASSERT_NO_FATAL_FAILURE(CompleteFetch()); |
- |
- for (base::TimeDelta step : SamplingPoints(GetShortTestPeriod())) { |
- SCOPED_TRACE(testing::Message() << "dT: " << DeltaNow()); |
- EXPECT_FALSE(facet_manager()->CanCachedDataBeDiscarded()); |
- AdvanceTime(step); |
- } |
- |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- EXPECT_TRUE(facet_manager()->CanCachedDataBeDiscarded()); |
-} |
- |
-TEST_F(FacetManagerTest, CachedDataBeCanDiscardedAfterCancelledPrefetch) { |
- CreateFacetManager(); |
- Prefetch(base::Time::Max()); |
- ASSERT_NO_FATAL_FAILURE(ExpectFetchNeeded()); |
- ASSERT_NO_FATAL_FAILURE(CompleteFetch()); |
- |
- EXPECT_FALSE(facet_manager()->CanCachedDataBeDiscarded()); |
- |
- AdvanceTime(GetShortTestPeriod()); |
- CancelPrefetch(base::Time::Max()); |
- |
- EXPECT_TRUE(facet_manager()->CanBeDiscarded()); |
- EXPECT_TRUE(facet_manager()->CanCachedDataBeDiscarded()); |
-} |
- |
-} // namespace password_manager |