| Index: components/password_manager/core/browser/android_affiliation/affiliation_backend_unittest.cc
|
| diff --git a/components/password_manager/core/browser/android_affiliation/affiliation_backend_unittest.cc b/components/password_manager/core/browser/android_affiliation/affiliation_backend_unittest.cc
|
| deleted file mode 100644
|
| index b02cd72f6d1e29b3e070039ced4ea0ca0aba64dd..0000000000000000000000000000000000000000
|
| --- a/components/password_manager/core/browser/android_affiliation/affiliation_backend_unittest.cc
|
| +++ /dev/null
|
| @@ -1,925 +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/android_affiliation/affiliation_backend.h"
|
| -
|
| -#include <stddef.h>
|
| -
|
| -#include <memory>
|
| -
|
| -#include "base/files/file_path.h"
|
| -#include "base/files/file_util.h"
|
| -#include "base/macros.h"
|
| -#include "base/memory/ptr_util.h"
|
| -#include "base/memory/ref_counted.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/tick_clock.h"
|
| -#include "components/password_manager/core/browser/android_affiliation/affiliation_database.h"
|
| -#include "components/password_manager/core/browser/android_affiliation/affiliation_fetch_throttler.h"
|
| -#include "components/password_manager/core/browser/android_affiliation/affiliation_fetch_throttler_delegate.h"
|
| -#include "components/password_manager/core/browser/android_affiliation/facet_manager.h"
|
| -#include "components/password_manager/core/browser/android_affiliation/fake_affiliation_api.h"
|
| -#include "components/password_manager/core/browser/android_affiliation/mock_affiliation_consumer.h"
|
| -#include "net/url_request/url_request_context_getter.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace password_manager {
|
| -
|
| -namespace {
|
| -
|
| -using StrategyOnCacheMiss = AffiliationBackend::StrategyOnCacheMiss;
|
| -
|
| -// Mock fetch throttler that has some extra logic to accurately portray the real
|
| -// AffiliationFetchThrottler in how it ignores SignalNetworkRequestNeeded()
|
| -// requests when a request is already known to be needed or one is already in
|
| -// flight, and in how it goes back to the idle state afterwards.
|
| -class MockAffiliationFetchThrottler : public AffiliationFetchThrottler {
|
| - public:
|
| - MockAffiliationFetchThrottler(AffiliationFetchThrottlerDelegate* delegate)
|
| - : AffiliationFetchThrottler(delegate, nullptr, nullptr),
|
| - signaled_network_request_needed_(false) {
|
| - EXPECT_CALL(*this, OnInformOfNetworkRequestComplete(testing::_)).Times(0);
|
| - }
|
| -
|
| - ~MockAffiliationFetchThrottler() {
|
| - EXPECT_FALSE(signaled_network_request_needed_);
|
| - }
|
| -
|
| - // Expects that InformOfNetworkRequestComplete() will be called to indicate
|
| - // either success or failure, depending on |expected_success|.
|
| - void ExpectInformOfNetworkRequestComplete(bool expected_success) {
|
| - EXPECT_CALL(*this, OnInformOfNetworkRequestComplete(expected_success));
|
| - }
|
| -
|
| - // Informs the |delegate_| that it can send the needed network request.
|
| - // Returns true if the |delegate_| reported that it actually ended up issuing
|
| - // a request.
|
| - bool LetNetworkRequestBeSent() {
|
| - EXPECT_TRUE(has_signaled_network_request_needed());
|
| - if (!delegate_->OnCanSendNetworkRequest()) {
|
| - reset_signaled_network_request_needed();
|
| - return false;
|
| - }
|
| - return true;
|
| - }
|
| -
|
| - // Whether or not the throttler is 'signaled', meaning that the real throttler
|
| - // would eventually call OnCanSendNetworkRequest() on the |delegate_|.
|
| - bool has_signaled_network_request_needed() const {
|
| - return signaled_network_request_needed_;
|
| - }
|
| -
|
| - // Forces the mock throttler back to 'non-signaled' state. Normally, this does
|
| - // not need to be manually called, as this is done by the mock automatically.
|
| - void reset_signaled_network_request_needed() {
|
| - signaled_network_request_needed_ = false;
|
| - }
|
| -
|
| - private:
|
| - MOCK_METHOD1(OnInformOfNetworkRequestComplete, void(bool));
|
| -
|
| - // AffiliationFetchThrottler:
|
| - void SignalNetworkRequestNeeded() override {
|
| - signaled_network_request_needed_ = true;
|
| - }
|
| -
|
| - void InformOfNetworkRequestComplete(bool success) override {
|
| - OnInformOfNetworkRequestComplete(success);
|
| - reset_signaled_network_request_needed();
|
| - }
|
| -
|
| - bool signaled_network_request_needed_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(MockAffiliationFetchThrottler);
|
| -};
|
| -
|
| -const char kTestFacetURIAlpha1[] = "https://one.alpha.example.com";
|
| -const char kTestFacetURIAlpha2[] = "https://two.alpha.example.com";
|
| -const char kTestFacetURIAlpha3[] = "https://three.alpha.example.com";
|
| -const char kTestFacetURIBeta1[] = "https://one.beta.example.com";
|
| -const char kTestFacetURIBeta2[] = "https://two.beta.example.com";
|
| -const char kTestFacetURIGamma1[] = "https://gamma.example.com";
|
| -
|
| -AffiliatedFacets GetTestEquivalenceClassAlpha() {
|
| - AffiliatedFacets affiliated_facets;
|
| - affiliated_facets.push_back(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1));
|
| - affiliated_facets.push_back(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha2));
|
| - affiliated_facets.push_back(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha3));
|
| - return affiliated_facets;
|
| -}
|
| -
|
| -AffiliatedFacets GetTestEquivalenceClassBeta() {
|
| - AffiliatedFacets affiliated_facets;
|
| - affiliated_facets.push_back(FacetURI::FromCanonicalSpec(kTestFacetURIBeta1));
|
| - affiliated_facets.push_back(FacetURI::FromCanonicalSpec(kTestFacetURIBeta2));
|
| - return affiliated_facets;
|
| -}
|
| -
|
| -AffiliatedFacets GetTestEquivalenceClassGamma() {
|
| - AffiliatedFacets affiliated_facets;
|
| - affiliated_facets.push_back(FacetURI::FromCanonicalSpec(kTestFacetURIGamma1));
|
| - return affiliated_facets;
|
| -}
|
| -
|
| -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);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -class AffiliationBackendTest : public testing::Test {
|
| - public:
|
| - AffiliationBackendTest()
|
| - : backend_task_runner_(new base::TestMockTimeTaskRunner),
|
| - consumer_task_runner_(new base::TestSimpleTaskRunner),
|
| - mock_fetch_throttler_(nullptr) {}
|
| - ~AffiliationBackendTest() override {}
|
| -
|
| - protected:
|
| - void GetAffiliations(MockAffiliationConsumer* consumer,
|
| - const FacetURI& facet_uri,
|
| - StrategyOnCacheMiss cache_miss_strategy) {
|
| - backend_->GetAffiliations(facet_uri, cache_miss_strategy,
|
| - consumer->GetResultCallback(),
|
| - consumer_task_runner());
|
| - }
|
| -
|
| - void Prefetch(const FacetURI& facet_uri, base::Time keep_fresh_until) {
|
| - backend_->Prefetch(facet_uri, keep_fresh_until);
|
| - }
|
| -
|
| - void CancelPrefetch(const FacetURI& facet_uri, base::Time keep_fresh_until) {
|
| - backend_->CancelPrefetch(facet_uri, keep_fresh_until);
|
| - }
|
| -
|
| - void ExpectNeedForFetchAndLetItBeSent() {
|
| - ASSERT_FALSE(fake_affiliation_api()->HasPendingRequest());
|
| - ASSERT_TRUE(mock_fetch_throttler()->has_signaled_network_request_needed());
|
| - ASSERT_TRUE(mock_fetch_throttler()->LetNetworkRequestBeSent());
|
| - }
|
| -
|
| - void ExpectAndCompleteFetch(
|
| - const std::vector<FacetURI>& expected_requested_facet_uris) {
|
| - ASSERT_TRUE(fake_affiliation_api()->HasPendingRequest());
|
| - EXPECT_THAT(
|
| - fake_affiliation_api()->GetNextRequestedFacets(),
|
| - testing::UnorderedElementsAreArray(expected_requested_facet_uris));
|
| - mock_fetch_throttler()->ExpectInformOfNetworkRequestComplete(true);
|
| - fake_affiliation_api()->ServeNextRequest();
|
| - testing::Mock::VerifyAndClearExpectations(mock_fetch_throttler());
|
| - }
|
| -
|
| - void ExpectAndCompleteFetch(const FacetURI& expected_requested_facet_uri) {
|
| - std::vector<FacetURI> expected_facet_uris;
|
| - expected_facet_uris.push_back(expected_requested_facet_uri);
|
| - ASSERT_NO_FATAL_FAILURE(ExpectAndCompleteFetch(expected_facet_uris));
|
| - }
|
| -
|
| - void ExpectAndFailFetch(const FacetURI& expected_requested_facet_uri) {
|
| - ASSERT_TRUE(fake_affiliation_api()->HasPendingRequest());
|
| - EXPECT_THAT(fake_affiliation_api()->GetNextRequestedFacets(),
|
| - testing::UnorderedElementsAre(expected_requested_facet_uri));
|
| - mock_fetch_throttler()->ExpectInformOfNetworkRequestComplete(false);
|
| - fake_affiliation_api()->FailNextRequest();
|
| - testing::Mock::VerifyAndClearExpectations(mock_fetch_throttler());
|
| - }
|
| -
|
| - void ExpectNoFetchNeeded() {
|
| - ASSERT_FALSE(fake_affiliation_api()->HasPendingRequest());
|
| - ASSERT_FALSE(mock_fetch_throttler()->has_signaled_network_request_needed());
|
| - }
|
| -
|
| - void ExpectFailureWithoutFetch(MockAffiliationConsumer* consumer) {
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded());
|
| - consumer->ExpectFailure();
|
| - consumer_task_runner_->RunUntilIdle();
|
| - testing::Mock::VerifyAndClearExpectations(consumer);
|
| - }
|
| -
|
| - void GetAffiliationsAndExpectFetchAndThenResult(
|
| - const FacetURI& facet_uri,
|
| - const AffiliatedFacets& expected_result) {
|
| - GetAffiliations(mock_consumer(), facet_uri,
|
| - StrategyOnCacheMiss::FETCH_OVER_NETWORK);
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNeedForFetchAndLetItBeSent());
|
| - ASSERT_NO_FATAL_FAILURE(ExpectAndCompleteFetch(facet_uri));
|
| - mock_consumer()->ExpectSuccessWithResult(expected_result);
|
| - consumer_task_runner_->RunUntilIdle();
|
| - testing::Mock::VerifyAndClearExpectations(mock_consumer());
|
| - }
|
| -
|
| - void GetAffiliationsAndExpectResultWithoutFetch(
|
| - const FacetURI& facet_uri,
|
| - StrategyOnCacheMiss cache_miss_strategy,
|
| - const AffiliatedFacets& expected_result) {
|
| - GetAffiliations(mock_consumer(), facet_uri, cache_miss_strategy);
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded());
|
| - mock_consumer()->ExpectSuccessWithResult(expected_result);
|
| - consumer_task_runner_->RunUntilIdle();
|
| - testing::Mock::VerifyAndClearExpectations(mock_consumer());
|
| - }
|
| -
|
| - // TODO(engedy): Within this test fixture, the word "failure" refers to GTest
|
| - // failures, simulated network failures (above), and also AffiliationService
|
| - // failure callbacks. Make this less ambiguous.
|
| - void GetAffiliationsAndExpectFailureWithoutFetch(const FacetURI& facet_uri) {
|
| - GetAffiliations(mock_consumer(), facet_uri, StrategyOnCacheMiss::FAIL);
|
| - ASSERT_NO_FATAL_FAILURE(ExpectFailureWithoutFetch(mock_consumer()));
|
| - }
|
| -
|
| - void PrefetchAndExpectFetch(const FacetURI& facet_uri,
|
| - base::Time keep_fresh_until) {
|
| - Prefetch(facet_uri, keep_fresh_until);
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNeedForFetchAndLetItBeSent());
|
| - ASSERT_NO_FATAL_FAILURE(ExpectAndCompleteFetch(facet_uri));
|
| - }
|
| -
|
| - // Verifies that both on-demand and cached-only GetAffiliations() requests for
|
| - // each facet in |affiliated_facets| are served from cache with no fetches.
|
| - void ExpectThatEquivalenceClassIsServedFromCache(
|
| - const AffiliatedFacets& affiliated_facets) {
|
| - for (const FacetURI& facet_uri : affiliated_facets) {
|
| - SCOPED_TRACE(facet_uri);
|
| - ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectResultWithoutFetch(
|
| - facet_uri, StrategyOnCacheMiss::FAIL, affiliated_facets));
|
| - ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectResultWithoutFetch(
|
| - facet_uri, StrategyOnCacheMiss::FAIL, affiliated_facets));
|
| - }
|
| - }
|
| -
|
| - void DestroyBackend() { backend_.reset(); }
|
| -
|
| - void AdvanceTime(base::TimeDelta delta) {
|
| - backend_task_runner_->FastForwardBy(delta);
|
| - }
|
| -
|
| - // Directly opens the database and returns the number of equivalence classes
|
| - // stored therein.
|
| - size_t GetNumOfEquivalenceClassInDatabase() {
|
| - AffiliationDatabase database;
|
| - EXPECT_TRUE(database.Init(db_path()));
|
| - std::vector<AffiliatedFacetsWithUpdateTime> all_affiliations;
|
| - database.GetAllAffiliations(&all_affiliations);
|
| - return all_affiliations.size();
|
| - }
|
| -
|
| - size_t backend_facet_manager_count() {
|
| - return backend()->facet_manager_count_for_testing();
|
| - }
|
| -
|
| - bool IsCachedDataFreshForFacet(const FacetURI& facet_uri) {
|
| - std::unique_ptr<base::Clock> clock(backend_task_runner_->GetMockClock());
|
| - return FacetManager(facet_uri, backend(), clock.get()).IsCachedDataFresh();
|
| - }
|
| -
|
| - bool IsCachedDataNearStaleForFacet(const FacetURI& facet_uri) {
|
| - std::unique_ptr<base::Clock> clock(backend_task_runner_->GetMockClock());
|
| - return FacetManager(facet_uri, backend(), clock.get())
|
| - .IsCachedDataNearStale();
|
| - }
|
| -
|
| - AffiliationBackend* backend() { return backend_.get(); }
|
| -
|
| - const base::FilePath& db_path() const { return db_path_; }
|
| -
|
| - base::TestMockTimeTaskRunner* backend_task_runner() {
|
| - return backend_task_runner_.get();
|
| - }
|
| -
|
| - base::TestSimpleTaskRunner* consumer_task_runner() {
|
| - return consumer_task_runner_.get();
|
| - }
|
| -
|
| - ScopedFakeAffiliationAPI* fake_affiliation_api() {
|
| - return &fake_affiliation_api_;
|
| - }
|
| -
|
| - MockAffiliationConsumer* mock_consumer() { return &mock_consumer_; }
|
| -
|
| - MockAffiliationFetchThrottler* mock_fetch_throttler() {
|
| - return mock_fetch_throttler_;
|
| - }
|
| -
|
| - private:
|
| - // testing::Test:
|
| - void SetUp() override {
|
| - ASSERT_TRUE(CreateTemporaryFile(&db_path_));
|
| - backend_.reset(new AffiliationBackend(
|
| - NULL, backend_task_runner_, backend_task_runner_->GetMockClock(),
|
| - backend_task_runner_->GetMockTickClock()));
|
| - backend_->Initialize(db_path());
|
| - mock_fetch_throttler_ = new MockAffiliationFetchThrottler(backend_.get());
|
| - backend_->SetThrottlerForTesting(
|
| - base::WrapUnique<AffiliationFetchThrottler>(mock_fetch_throttler_));
|
| -
|
| - fake_affiliation_api_.AddTestEquivalenceClass(
|
| - GetTestEquivalenceClassAlpha());
|
| - fake_affiliation_api_.AddTestEquivalenceClass(
|
| - GetTestEquivalenceClassBeta());
|
| - fake_affiliation_api_.AddTestEquivalenceClass(
|
| - GetTestEquivalenceClassGamma());
|
| - }
|
| -
|
| - scoped_refptr<base::TestMockTimeTaskRunner> backend_task_runner_;
|
| - scoped_refptr<base::TestSimpleTaskRunner> consumer_task_runner_;
|
| -
|
| - base::FilePath db_path_;
|
| - ScopedFakeAffiliationAPI fake_affiliation_api_;
|
| - MockAffiliationConsumer mock_consumer_;
|
| - std::unique_ptr<AffiliationBackend> backend_;
|
| - MockAffiliationFetchThrottler* mock_fetch_throttler_; // Owned by |backend_|.
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(AffiliationBackendTest);
|
| -};
|
| -
|
| -TEST_F(AffiliationBackendTest, OnDemandRequestSucceedsWithFetch) {
|
| - ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectFetchAndThenResult(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1),
|
| - GetTestEquivalenceClassAlpha()));
|
| - EXPECT_EQ(0u, backend_facet_manager_count());
|
| -
|
| - ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectFetchAndThenResult(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIBeta1),
|
| - GetTestEquivalenceClassBeta()));
|
| - EXPECT_EQ(0u, backend_facet_manager_count());
|
| -}
|
| -
|
| -// This test also verifies that the FacetManager is immediately discarded.
|
| -TEST_F(AffiliationBackendTest, CachedOnlyRequestFailsDueToCacheMiss) {
|
| - GetAffiliationsAndExpectFailureWithoutFetch(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha2));
|
| - EXPECT_EQ(0u, backend_facet_manager_count());
|
| -}
|
| -
|
| -TEST_F(AffiliationBackendTest, PrefetchTriggersInitialFetch) {
|
| - ASSERT_NO_FATAL_FAILURE(PrefetchAndExpectFetch(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1), base::Time::Max()));
|
| -}
|
| -
|
| -// This test also verifies that the FacetManager is immediately discarded.
|
| -TEST_F(AffiliationBackendTest, ExpiredPrefetchTriggersNoInitialFetch) {
|
| - // Prefetch intervals are open from the right, thus intervals ending Now() are
|
| - // already expired.
|
| - Prefetch(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1),
|
| - backend_task_runner()->Now());
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded());
|
| - EXPECT_EQ(0u, backend_facet_manager_count());
|
| - EXPECT_FALSE(backend_task_runner()->HasPendingTask());
|
| -}
|
| -
|
| -// One additional GetAffiliations() and one Prefetch() request come in, both for
|
| -// unrelated facets, shortly after an initial GetAffiliations() request.
|
| -//
|
| -// Suppose that the network request triggered by the first GetAffiliations()
|
| -// request has already been initiated when the other requests arrive. As there
|
| -// should be no simultaneous requests, the additional facets should be queried
|
| -// together in a second fetch after the first fetch completes.
|
| -TEST_F(AffiliationBackendTest, ConcurrentUnrelatedRequests) {
|
| - FacetURI facet_alpha(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1));
|
| - FacetURI facet_beta(FacetURI::FromCanonicalSpec(kTestFacetURIBeta1));
|
| - FacetURI facet_gamma(FacetURI::FromCanonicalSpec(kTestFacetURIGamma1));
|
| -
|
| - // Pretend the fetch is already away when the two other requests come in.
|
| - MockAffiliationConsumer second_consumer;
|
| - GetAffiliations(mock_consumer(), facet_alpha,
|
| - StrategyOnCacheMiss::FETCH_OVER_NETWORK);
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNeedForFetchAndLetItBeSent());
|
| - GetAffiliations(&second_consumer, facet_beta,
|
| - StrategyOnCacheMiss::FETCH_OVER_NETWORK);
|
| - Prefetch(facet_gamma, base::Time::Max());
|
| -
|
| - std::vector<FacetURI> second_fetch_uris;
|
| - second_fetch_uris.push_back(facet_beta);
|
| - second_fetch_uris.push_back(facet_gamma);
|
| - ASSERT_NO_FATAL_FAILURE(ExpectAndCompleteFetch(facet_alpha));
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNeedForFetchAndLetItBeSent());
|
| - ASSERT_NO_FATAL_FAILURE(ExpectAndCompleteFetch(second_fetch_uris));
|
| -
|
| - mock_consumer()->ExpectSuccessWithResult(GetTestEquivalenceClassAlpha());
|
| - second_consumer.ExpectSuccessWithResult(GetTestEquivalenceClassBeta());
|
| - consumer_task_runner()->RunUntilIdle();
|
| - testing::Mock::VerifyAndClearExpectations(mock_consumer());
|
| -
|
| - // Now that the two GetAffiliation() requests have been completed, the first
|
| - // two FacetManagers should be discarded. The third FacetManager corresponding
|
| - // to the prefetched facet should be kept.
|
| - EXPECT_GE(1u, backend_facet_manager_count());
|
| -}
|
| -
|
| -// Now suppose that the first fetch is somewhat delayed (e.g., because network
|
| -// requests are throttled), so the other requests arrive before it is actually
|
| -// issued. In this case, all facet URIs should be queried together in one fetch.
|
| -TEST_F(AffiliationBackendTest, ConcurrentUnrelatedRequests2) {
|
| - FacetURI facet_alpha(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1));
|
| - FacetURI facet_beta(FacetURI::FromCanonicalSpec(kTestFacetURIBeta1));
|
| - FacetURI facet_gamma(FacetURI::FromCanonicalSpec(kTestFacetURIGamma1));
|
| -
|
| - MockAffiliationConsumer second_consumer;
|
| - GetAffiliations(mock_consumer(), facet_alpha,
|
| - StrategyOnCacheMiss::FETCH_OVER_NETWORK);
|
| - GetAffiliations(&second_consumer, facet_beta,
|
| - StrategyOnCacheMiss::FETCH_OVER_NETWORK);
|
| - Prefetch(facet_gamma, base::Time::Max());
|
| -
|
| - std::vector<FacetURI> fetched_uris;
|
| - fetched_uris.push_back(facet_alpha);
|
| - fetched_uris.push_back(facet_beta);
|
| - fetched_uris.push_back(facet_gamma);
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNeedForFetchAndLetItBeSent());
|
| - ASSERT_NO_FATAL_FAILURE(ExpectAndCompleteFetch(fetched_uris));
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded());
|
| -
|
| - mock_consumer()->ExpectSuccessWithResult(GetTestEquivalenceClassAlpha());
|
| - second_consumer.ExpectSuccessWithResult(GetTestEquivalenceClassBeta());
|
| - consumer_task_runner()->RunUntilIdle();
|
| - testing::Mock::VerifyAndClearExpectations(mock_consumer());
|
| -
|
| - // Now that the two GetAffiliation() requests have been completed, the first
|
| - // two FacetManagers should be discarded. The third FacetManager corresponding
|
| - // to the prefetched facet should be kept.
|
| - EXPECT_GE(1u, backend_facet_manager_count());
|
| -}
|
| -
|
| -TEST_F(AffiliationBackendTest, RetryIsMadeOnFailedFetch) {
|
| - FacetURI facet_uri(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1));
|
| -
|
| - GetAffiliations(mock_consumer(), facet_uri,
|
| - StrategyOnCacheMiss::FETCH_OVER_NETWORK);
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNeedForFetchAndLetItBeSent());
|
| - ASSERT_NO_FATAL_FAILURE(ExpectAndFailFetch(facet_uri));
|
| - EXPECT_EQ(1u, backend_facet_manager_count());
|
| -
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNeedForFetchAndLetItBeSent());
|
| - ASSERT_NO_FATAL_FAILURE(ExpectAndCompleteFetch(facet_uri));
|
| -
|
| - mock_consumer()->ExpectSuccessWithResult(GetTestEquivalenceClassAlpha());
|
| - consumer_task_runner()->RunUntilIdle();
|
| - testing::Mock::VerifyAndClearExpectations(mock_consumer());
|
| -
|
| - EXPECT_EQ(0u, backend_facet_manager_count());
|
| -}
|
| -
|
| -// The Prefetch() request expires before fetching corresponding affiliation
|
| -// information would be allowed. The fetch should be abandoned.
|
| -TEST_F(AffiliationBackendTest, FetchIsNoLongerNeededOnceAllowed) {
|
| - Prefetch(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1),
|
| - backend_task_runner()->Now() + GetShortTestPeriod());
|
| - ASSERT_TRUE(mock_fetch_throttler()->has_signaled_network_request_needed());
|
| - ASSERT_FALSE(fake_affiliation_api()->HasPendingRequest());
|
| -
|
| - AdvanceTime(GetShortTestPeriod() + Epsilon());
|
| -
|
| - bool did_send_request = mock_fetch_throttler()->LetNetworkRequestBeSent();
|
| - EXPECT_FALSE(did_send_request);
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded());
|
| - EXPECT_EQ(0u, backend_facet_manager_count());
|
| -}
|
| -
|
| -TEST_F(AffiliationBackendTest, CacheServesSubsequentRequestForSameFacet) {
|
| - ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectFetchAndThenResult(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1),
|
| - GetTestEquivalenceClassAlpha()));
|
| -
|
| - ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectResultWithoutFetch(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1),
|
| - StrategyOnCacheMiss::FETCH_OVER_NETWORK, GetTestEquivalenceClassAlpha()));
|
| -
|
| - ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectResultWithoutFetch(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1),
|
| - StrategyOnCacheMiss::FAIL, GetTestEquivalenceClassAlpha()));
|
| -
|
| - EXPECT_EQ(0u, backend_facet_manager_count());
|
| -}
|
| -
|
| -TEST_F(AffiliationBackendTest, CacheServesSubsequentRequestForAffiliatedFacet) {
|
| - ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectFetchAndThenResult(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1),
|
| - GetTestEquivalenceClassAlpha()));
|
| -
|
| - ASSERT_NO_FATAL_FAILURE(ExpectThatEquivalenceClassIsServedFromCache(
|
| - GetTestEquivalenceClassAlpha()));
|
| -
|
| - EXPECT_EQ(0u, backend_facet_manager_count());
|
| -}
|
| -
|
| -TEST_F(AffiliationBackendTest, CacheServesRequestsForPrefetchedFacets) {
|
| - ASSERT_NO_FATAL_FAILURE(PrefetchAndExpectFetch(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1), base::Time::Max()));
|
| -
|
| - ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectResultWithoutFetch(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1),
|
| - StrategyOnCacheMiss::FETCH_OVER_NETWORK, GetTestEquivalenceClassAlpha()));
|
| -
|
| - ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectResultWithoutFetch(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1),
|
| - StrategyOnCacheMiss::FAIL, GetTestEquivalenceClassAlpha()));
|
| -}
|
| -
|
| -TEST_F(AffiliationBackendTest,
|
| - CacheServesRequestsForFacetsAffiliatedWithPrefetchedFacets) {
|
| - ASSERT_NO_FATAL_FAILURE(PrefetchAndExpectFetch(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1), base::Time::Max()));
|
| -
|
| - ASSERT_NO_FATAL_FAILURE(ExpectThatEquivalenceClassIsServedFromCache(
|
| - GetTestEquivalenceClassAlpha()));
|
| -}
|
| -
|
| -// A second GetAffiliations() request for the same facet and a third request
|
| -// for an affiliated facet comes in while the network fetch triggered by the
|
| -// first request is in flight.
|
| -//
|
| -// There should be no simultaneous requests, and once the fetch completes, all
|
| -// three requests should be served without further fetches (they have the data).
|
| -TEST_F(AffiliationBackendTest,
|
| - CacheServesConcurrentRequestsForAffiliatedFacets) {
|
| - FacetURI facet_uri1(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1));
|
| - FacetURI facet_uri2(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha2));
|
| -
|
| - MockAffiliationConsumer second_consumer;
|
| - MockAffiliationConsumer third_consumer;
|
| - GetAffiliations(mock_consumer(), facet_uri1,
|
| - StrategyOnCacheMiss::FETCH_OVER_NETWORK);
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNeedForFetchAndLetItBeSent());
|
| - GetAffiliations(&second_consumer, facet_uri1,
|
| - StrategyOnCacheMiss::FETCH_OVER_NETWORK);
|
| - GetAffiliations(&third_consumer, facet_uri2,
|
| - StrategyOnCacheMiss::FETCH_OVER_NETWORK);
|
| -
|
| - ASSERT_NO_FATAL_FAILURE(ExpectAndCompleteFetch(facet_uri1));
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded());
|
| -
|
| - mock_consumer()->ExpectSuccessWithResult(GetTestEquivalenceClassAlpha());
|
| - second_consumer.ExpectSuccessWithResult(GetTestEquivalenceClassAlpha());
|
| - third_consumer.ExpectSuccessWithResult(GetTestEquivalenceClassAlpha());
|
| - consumer_task_runner()->RunUntilIdle();
|
| - testing::Mock::VerifyAndClearExpectations(mock_consumer());
|
| -
|
| - EXPECT_EQ(0u, backend_facet_manager_count());
|
| -}
|
| -
|
| -// A second Prefetch() request for the same facet and a third request for an
|
| -// affiliated facet comes in while the initial fetch triggered by the first
|
| -// request is in flight.
|
| -//
|
| -// There should be no simultaneous requests, and once the fetch completes, there
|
| -// should be no further initial fetches as the data needed is already there.
|
| -TEST_F(AffiliationBackendTest,
|
| - CacheServesConcurrentPrefetchesForAffiliatedFacets) {
|
| - FacetURI facet_uri1(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1));
|
| - FacetURI facet_uri2(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha2));
|
| -
|
| - Prefetch(facet_uri1, base::Time::Max());
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNeedForFetchAndLetItBeSent());
|
| - Prefetch(facet_uri1, base::Time::Max());
|
| - Prefetch(facet_uri2, base::Time::Max());
|
| -
|
| - ASSERT_NO_FATAL_FAILURE(ExpectAndCompleteFetch(facet_uri1));
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded());
|
| -
|
| - ASSERT_NO_FATAL_FAILURE(ExpectThatEquivalenceClassIsServedFromCache(
|
| - GetTestEquivalenceClassAlpha()));
|
| -}
|
| -
|
| -TEST_F(AffiliationBackendTest, SimpleCacheExpiryWithoutPrefetches) {
|
| - ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectFetchAndThenResult(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1),
|
| - GetTestEquivalenceClassAlpha()));
|
| -
|
| - AdvanceTime(GetCacheHardExpiryPeriod() - Epsilon());
|
| -
|
| - EXPECT_TRUE(IsCachedDataFreshForFacet(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| - ASSERT_NO_FATAL_FAILURE(ExpectThatEquivalenceClassIsServedFromCache(
|
| - GetTestEquivalenceClassAlpha()));
|
| -
|
| - AdvanceTime(Epsilon());
|
| -
|
| - // After the data becomes stale, the cached-only request should fail, but the
|
| - // subsequent on-demand request should fetch the data again and succeed.
|
| - EXPECT_FALSE(IsCachedDataFreshForFacet(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| - GetAffiliationsAndExpectFailureWithoutFetch(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1));
|
| -
|
| - ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectFetchAndThenResult(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha2),
|
| - GetTestEquivalenceClassAlpha()));
|
| -
|
| - ASSERT_NO_FATAL_FAILURE(ExpectThatEquivalenceClassIsServedFromCache(
|
| - GetTestEquivalenceClassAlpha()));
|
| -
|
| - EXPECT_EQ(0u, backend_facet_manager_count());
|
| -}
|
| -
|
| -// A Prefetch() request for a finite period. It should trigger an initial fetch
|
| -// and exactly one refetch, as the Prefetch() request expires exactly when the
|
| -// cached data obtained with the refetch expires.
|
| -TEST_F(AffiliationBackendTest,
|
| - PrefetchTriggersOneInitialFetchAndOneRefetchBeforeExpiring) {
|
| - ASSERT_NO_FATAL_FAILURE(PrefetchAndExpectFetch(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1),
|
| - backend_task_runner()->Now() + GetCacheHardExpiryPeriod() +
|
| - GetCacheSoftExpiryPeriod()));
|
| -
|
| - AdvanceTime(GetCacheSoftExpiryPeriod() - Epsilon());
|
| -
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded());
|
| - EXPECT_FALSE(IsCachedDataNearStaleForFacet(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| -
|
| - AdvanceTime(Epsilon());
|
| -
|
| - EXPECT_TRUE(IsCachedDataNearStaleForFacet(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNeedForFetchAndLetItBeSent());
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - ExpectAndCompleteFetch(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| -
|
| - AdvanceTime(GetCacheHardExpiryPeriod() - Epsilon());
|
| -
|
| - EXPECT_TRUE(IsCachedDataFreshForFacet(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| - EXPECT_TRUE(IsCachedDataNearStaleForFacet(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| - ASSERT_NO_FATAL_FAILURE(ExpectThatEquivalenceClassIsServedFromCache(
|
| - GetTestEquivalenceClassAlpha()));
|
| -
|
| - AdvanceTime(Epsilon());
|
| -
|
| - // The data should be allowed to expire and the FacetManager discarded.
|
| - EXPECT_FALSE(IsCachedDataFreshForFacet(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded());
|
| - EXPECT_EQ(0u, backend_facet_manager_count());
|
| - EXPECT_FALSE(backend_task_runner()->HasPendingTask());
|
| -
|
| - ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectFailureWithoutFetch(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| - ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectFailureWithoutFetch(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha2)));
|
| -
|
| - // However, a subsequent on-demand request should be able to trigger a fetch.
|
| - ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectFetchAndThenResult(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1),
|
| - GetTestEquivalenceClassAlpha()));
|
| -}
|
| -
|
| -// Affiliation data for prefetched facets should be automatically refetched once
|
| -// every 23 hours, and GetAffiliations() requests regarding affiliated facets
|
| -// should be continuously served from cache.
|
| -TEST_F(AffiliationBackendTest, PrefetchTriggersPeriodicRefetch) {
|
| - ASSERT_NO_FATAL_FAILURE(PrefetchAndExpectFetch(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1), base::Time::Max()));
|
| -
|
| - for (int cycle = 0; cycle < 3; ++cycle) {
|
| - SCOPED_TRACE(cycle);
|
| -
|
| - AdvanceTime(GetCacheSoftExpiryPeriod() - Epsilon());
|
| -
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded());
|
| - EXPECT_TRUE(IsCachedDataFreshForFacet(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| - EXPECT_FALSE(IsCachedDataNearStaleForFacet(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| - ASSERT_NO_FATAL_FAILURE(ExpectThatEquivalenceClassIsServedFromCache(
|
| - GetTestEquivalenceClassAlpha()));
|
| -
|
| - AdvanceTime(Epsilon());
|
| -
|
| - EXPECT_TRUE(IsCachedDataNearStaleForFacet(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNeedForFetchAndLetItBeSent());
|
| - ASSERT_NO_FATAL_FAILURE(ExpectAndCompleteFetch(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| - ASSERT_NO_FATAL_FAILURE(ExpectThatEquivalenceClassIsServedFromCache(
|
| - GetTestEquivalenceClassAlpha()));
|
| - }
|
| -}
|
| -
|
| -TEST_F(AffiliationBackendTest,
|
| - PrefetchTriggersNoInitialFetchIfDataIsAlreadyFresh) {
|
| - ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectFetchAndThenResult(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1),
|
| - GetTestEquivalenceClassAlpha()));
|
| -
|
| - EXPECT_FALSE(IsCachedDataNearStaleForFacet(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| -
|
| - Prefetch(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1), base::Time::Max());
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded());
|
| - ASSERT_NO_FATAL_FAILURE(ExpectThatEquivalenceClassIsServedFromCache(
|
| - GetTestEquivalenceClassAlpha()));
|
| -}
|
| -
|
| -TEST_F(AffiliationBackendTest, CancelPrefetch) {
|
| - ASSERT_NO_FATAL_FAILURE(PrefetchAndExpectFetch(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1), base::Time::Max()));
|
| -
|
| - AdvanceTime(GetCacheSoftExpiryPeriod() - Epsilon());
|
| -
|
| - // Cancel the prefetch the last microsecond before a refetch would take place.
|
| - backend()->CancelPrefetch(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1),
|
| - base::Time::Max());
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded());
|
| - EXPECT_EQ(0u, backend_facet_manager_count());
|
| - EXPECT_TRUE(backend_task_runner()->HasPendingTask());
|
| -
|
| - AdvanceTime(GetCacheHardExpiryPeriod() - GetCacheSoftExpiryPeriod() +
|
| - Epsilon());
|
| -
|
| - // The data should be allowed to expire.
|
| - EXPECT_FALSE(backend_task_runner()->HasPendingTask());
|
| - EXPECT_TRUE(IsCachedDataNearStaleForFacet(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| - ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectFailureWithoutFetch(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| - ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectFailureWithoutFetch(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha2)));
|
| -}
|
| -
|
| -TEST_F(AffiliationBackendTest, CancelDuplicatePrefetch) {
|
| - ASSERT_NO_FATAL_FAILURE(PrefetchAndExpectFetch(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1), base::Time::Max()));
|
| - Prefetch(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1), base::Time::Max());
|
| -
|
| - AdvanceTime(GetCacheSoftExpiryPeriod() - Epsilon());
|
| -
|
| - // Cancel the prefetch the last microsecond before a refetch would take place.
|
| - backend()->CancelPrefetch(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1),
|
| - base::Time::Max());
|
| -
|
| - AdvanceTime(Epsilon());
|
| -
|
| - // However, there is a second Prefetch() request which should keep the data
|
| - // fresh.
|
| - EXPECT_EQ(1u, backend_facet_manager_count());
|
| - EXPECT_TRUE(IsCachedDataNearStaleForFacet(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNeedForFetchAndLetItBeSent());
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - ExpectAndCompleteFetch(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| -
|
| - AdvanceTime(GetCacheHardExpiryPeriod() - GetCacheSoftExpiryPeriod());
|
| -
|
| - EXPECT_TRUE(IsCachedDataFreshForFacet(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| - ASSERT_NO_FATAL_FAILURE(ExpectThatEquivalenceClassIsServedFromCache(
|
| - GetTestEquivalenceClassAlpha()));
|
| -}
|
| -
|
| -// Canceling a non-existing prefetch request for a non-prefetched facet.
|
| -TEST_F(AffiliationBackendTest, CancelingNonExistingPrefetchIsSilentlyIgnored) {
|
| - CancelPrefetch(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1),
|
| - backend_task_runner()->Now() + base::TimeDelta::FromHours(24));
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded());
|
| - EXPECT_EQ(0u, backend_facet_manager_count());
|
| - EXPECT_FALSE(backend_task_runner()->HasPendingTask());
|
| -}
|
| -
|
| -// Verify removal of equivalence classes that contain only facets for which
|
| -// there are no FacetManagers.
|
| -TEST_F(AffiliationBackendTest, TrimCacheDiscardsDataWithoutFacetManagers) {
|
| - ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectFetchAndThenResult(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1),
|
| - GetTestEquivalenceClassAlpha()));
|
| - ASSERT_NO_FATAL_FAILURE(PrefetchAndExpectFetch(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIBeta1),
|
| - backend_task_runner()->Now() + GetShortTestPeriod()));
|
| - Prefetch(FacetURI::FromCanonicalSpec(kTestFacetURIBeta2), base::Time::Max());
|
| - ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded());
|
| - EXPECT_EQ(2u, GetNumOfEquivalenceClassInDatabase());
|
| -
|
| - AdvanceTime(GetShortTestPeriod());
|
| -
|
| - // Worst-case scenario: the first prefetch has just expired, the other has
|
| - // just been canceled when TrimCache() is called; plus immediately afterwards
|
| - // the backend is destroyed.
|
| - ASSERT_NO_FATAL_FAILURE(CancelPrefetch(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIBeta2), base::Time::Max()));
|
| - backend()->TrimCache();
|
| - DestroyBackend();
|
| - EXPECT_EQ(0u, GetNumOfEquivalenceClassInDatabase());
|
| -}
|
| -
|
| -// Verify removal of equivalence classes that contain only facets for which
|
| -// there are only FacetManagers that do not need the data.
|
| -TEST_F(AffiliationBackendTest,
|
| - TrimCacheDiscardsDataNoLongerNeededByFacetManagers) {
|
| - FacetURI facet_uri(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1));
|
| -
|
| - // Set up some stale data in the database.
|
| - ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectFetchAndThenResult(
|
| - facet_uri, GetTestEquivalenceClassAlpha()));
|
| - AdvanceTime(GetCacheHardExpiryPeriod());
|
| - EXPECT_FALSE(IsCachedDataFreshForFacet(facet_uri));
|
| -
|
| - // Now start prefetching the same facet, but keep the network fetch hanging.
|
| - Prefetch(facet_uri, base::Time::Max());
|
| - ASSERT_TRUE(mock_fetch_throttler()->has_signaled_network_request_needed());
|
| - EXPECT_EQ(1u, GetNumOfEquivalenceClassInDatabase());
|
| -
|
| - // The already stale data should be removed regardless of the active prefetch.
|
| - backend()->TrimCache();
|
| - EXPECT_EQ(0u, GetNumOfEquivalenceClassInDatabase());
|
| -
|
| - mock_fetch_throttler()->reset_signaled_network_request_needed();
|
| -}
|
| -
|
| -// Verify preservation of equivalence classes that contain >= 1 facet for which
|
| -// there is a FacetManager claiming that it needs to keep the data.
|
| -TEST_F(AffiliationBackendTest, TrimCacheRetainsDataThatNeededByFacetManagers) {
|
| - FacetURI facet_uri(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1));
|
| -
|
| - ASSERT_NO_FATAL_FAILURE(PrefetchAndExpectFetch(
|
| - facet_uri, backend_task_runner()->Now() + GetCacheHardExpiryPeriod()));
|
| - backend()->TrimCache();
|
| -
|
| - // Also verify that the last update time of the affiliation data is preserved,
|
| - // i.e., that it expires when it would normally have expired.
|
| - AdvanceTime(GetCacheHardExpiryPeriod() - Epsilon());
|
| - EXPECT_TRUE(IsCachedDataFreshForFacet(facet_uri));
|
| - ASSERT_NO_FATAL_FAILURE(ExpectThatEquivalenceClassIsServedFromCache(
|
| - GetTestEquivalenceClassAlpha()));
|
| - AdvanceTime(Epsilon());
|
| - EXPECT_FALSE(IsCachedDataFreshForFacet(facet_uri));
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - GetAffiliationsAndExpectFailureWithoutFetch(facet_uri));
|
| -}
|
| -
|
| -// Verify that TrimCacheForFacet() only removes the equivalence class for the
|
| -// given facet, and preserves others (even if they could be discarded).
|
| -TEST_F(AffiliationBackendTest,
|
| - TrimCacheForFacetOnlyRemovesDataForTheGivenFacet) {
|
| - FacetURI preserved_facet_uri(FacetURI::FromCanonicalSpec(kTestFacetURIBeta1));
|
| - ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectFetchAndThenResult(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1),
|
| - GetTestEquivalenceClassAlpha()));
|
| - ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectFetchAndThenResult(
|
| - preserved_facet_uri, GetTestEquivalenceClassBeta()));
|
| - EXPECT_EQ(2u, GetNumOfEquivalenceClassInDatabase());
|
| -
|
| - backend()->TrimCacheForFacet(
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha2));
|
| - EXPECT_EQ(1u, GetNumOfEquivalenceClassInDatabase());
|
| -
|
| - // Also verify that the last update time of the affiliation data is preserved,
|
| - // i.e., that it expires when it would normally have expired.
|
| - AdvanceTime(GetCacheHardExpiryPeriod() - Epsilon());
|
| - EXPECT_TRUE(IsCachedDataFreshForFacet(preserved_facet_uri));
|
| - ASSERT_NO_FATAL_FAILURE(ExpectThatEquivalenceClassIsServedFromCache(
|
| - GetTestEquivalenceClassBeta()));
|
| - AdvanceTime(Epsilon());
|
| - EXPECT_FALSE(IsCachedDataFreshForFacet(preserved_facet_uri));
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - GetAffiliationsAndExpectFailureWithoutFetch(preserved_facet_uri));
|
| -}
|
| -
|
| -TEST_F(AffiliationBackendTest, NothingExplodesWhenShutDownDuringFetch) {
|
| - GetAffiliations(mock_consumer(),
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha2),
|
| - StrategyOnCacheMiss::FETCH_OVER_NETWORK);
|
| - ASSERT_TRUE(mock_fetch_throttler()->has_signaled_network_request_needed());
|
| - mock_fetch_throttler()->reset_signaled_network_request_needed();
|
| - DestroyBackend();
|
| -}
|
| -
|
| -TEST_F(AffiliationBackendTest,
|
| - FailureCallbacksAreCalledIfBackendIsDestroyedWithPendingRequest) {
|
| - GetAffiliations(mock_consumer(),
|
| - FacetURI::FromCanonicalSpec(kTestFacetURIAlpha2),
|
| - StrategyOnCacheMiss::FETCH_OVER_NETWORK);
|
| - // Currently, a GetAffiliations() request can only be blocked due to fetch in
|
| - // flight -- so emulate this condition when destroying the backend.
|
| - ASSERT_TRUE(mock_fetch_throttler()->has_signaled_network_request_needed());
|
| - mock_fetch_throttler()->reset_signaled_network_request_needed();
|
| - DestroyBackend();
|
| - mock_consumer()->ExpectFailure();
|
| - consumer_task_runner()->RunUntilIdle();
|
| - testing::Mock::VerifyAndClearExpectations(mock_consumer());
|
| -}
|
| -
|
| -TEST_F(AffiliationBackendTest, DeleteCache) {
|
| - DestroyBackend();
|
| - ASSERT_TRUE(base::PathExists(db_path()));
|
| - AffiliationBackend::DeleteCache(db_path());
|
| - ASSERT_FALSE(base::PathExists(db_path()));
|
| -}
|
| -
|
| -} // namespace password_manager
|
|
|