| Index: components/password_manager/core/browser/affiliation_backend_unittest.cc
|
| diff --git a/components/password_manager/core/browser/affiliation_backend_unittest.cc b/components/password_manager/core/browser/affiliation_backend_unittest.cc
|
| index 5c45f35602f7a2a897063522800ed455f9612fa6..474eed2b989588790458a4b07d8d635396fbf21e 100644
|
| --- a/components/password_manager/core/browser/affiliation_backend_unittest.cc
|
| +++ b/components/password_manager/core/browser/affiliation_backend_unittest.cc
|
| @@ -11,8 +11,10 @@
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/test/test_mock_time_task_runner.h"
|
| #include "base/test/test_simple_task_runner.h"
|
| -#include "base/thread_task_runner_handle.h"
|
| #include "base/time/clock.h"
|
| +#include "base/time/tick_clock.h"
|
| +#include "components/password_manager/core/browser/affiliation_fetch_throttler.h"
|
| +#include "components/password_manager/core/browser/affiliation_fetch_throttler_delegate.h"
|
| #include "components/password_manager/core/browser/facet_manager.h"
|
| #include "components/password_manager/core/browser/fake_affiliation_api.h"
|
| #include "components/password_manager/core/browser/mock_affiliation_consumer.h"
|
| @@ -24,6 +26,70 @@ namespace password_manager {
|
|
|
| namespace {
|
|
|
| +// 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";
|
| @@ -60,6 +126,10 @@ 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);
|
| @@ -70,12 +140,9 @@ base::TimeDelta Epsilon() {
|
| class AffiliationBackendTest : public testing::Test {
|
| public:
|
| AffiliationBackendTest()
|
| - : consumer_task_runner_(new base::TestSimpleTaskRunner),
|
| - backend_task_runner_(new base::TestMockTimeTaskRunner),
|
| - backend_task_runner_handle_(backend_task_runner_),
|
| - backend_(new AffiliationBackend(NULL,
|
| - backend_task_runner_->GetMockClock())) {
|
| - }
|
| + : backend_task_runner_(new base::TestMockTimeTaskRunner),
|
| + consumer_task_runner_(new base::TestSimpleTaskRunner),
|
| + mock_fetch_throttler_(nullptr) {}
|
| ~AffiliationBackendTest() override {}
|
|
|
| protected:
|
| @@ -95,15 +162,45 @@ class AffiliationBackendTest : public testing::Test {
|
| 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));
|
| - fake_affiliation_api()->ServeNextRequest();
|
| + mock_fetch_throttler()->ExpectInformOfNetworkRequestComplete(false);
|
| + fake_affiliation_api()->FailNextRequest();
|
| + testing::Mock::VerifyAndClearExpectations(mock_fetch_throttler());
|
| }
|
|
|
| - void ExpectFailureWithoutFetch(MockAffiliationConsumer* consumer) {
|
| + 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);
|
| @@ -113,6 +210,7 @@ class AffiliationBackendTest : public testing::Test {
|
| const FacetURI& facet_uri,
|
| const AffiliatedFacets& expected_result) {
|
| GetAffiliations(mock_consumer(), facet_uri, false);
|
| + ASSERT_NO_FATAL_FAILURE(ExpectNeedForFetchAndLetItBeSent());
|
| ASSERT_NO_FATAL_FAILURE(ExpectAndCompleteFetch(facet_uri));
|
| mock_consumer()->ExpectSuccessWithResult(expected_result);
|
| consumer_task_runner_->RunUntilIdle();
|
| @@ -124,7 +222,7 @@ class AffiliationBackendTest : public testing::Test {
|
| bool cached_only,
|
| const AffiliatedFacets& expected_result) {
|
| GetAffiliations(mock_consumer(), facet_uri, cached_only);
|
| - ASSERT_FALSE(fake_affiliation_api()->HasPendingRequest());
|
| + ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded());
|
| mock_consumer()->ExpectSuccessWithResult(expected_result);
|
| consumer_task_runner_->RunUntilIdle();
|
| testing::Mock::VerifyAndClearExpectations(mock_consumer());
|
| @@ -138,6 +236,7 @@ class AffiliationBackendTest : public testing::Test {
|
| 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));
|
| }
|
|
|
| @@ -181,8 +280,6 @@ class AffiliationBackendTest : public testing::Test {
|
| return backend_task_runner_.get();
|
| }
|
|
|
| - MockAffiliationConsumer* mock_consumer() { return &mock_consumer_; }
|
| -
|
| base::TestSimpleTaskRunner* consumer_task_runner() {
|
| return consumer_task_runner_.get();
|
| }
|
| @@ -191,12 +288,24 @@ class AffiliationBackendTest : public testing::Test {
|
| return &fake_affiliation_api_;
|
| }
|
|
|
| + MockAffiliationConsumer* mock_consumer() { return &mock_consumer_; }
|
| +
|
| + MockAffiliationFetchThrottler* mock_fetch_throttler() {
|
| + return mock_fetch_throttler_;
|
| + }
|
| +
|
| private:
|
| // testing::Test:
|
| void SetUp() override {
|
| base::FilePath database_path;
|
| ASSERT_TRUE(CreateTemporaryFile(&database_path));
|
| + backend_.reset(new AffiliationBackend(
|
| + NULL, backend_task_runner_, backend_task_runner_->GetMockClock(),
|
| + backend_task_runner_->GetMockTickClock()));
|
| backend_->Initialize(database_path);
|
| + mock_fetch_throttler_ = new MockAffiliationFetchThrottler(backend_.get());
|
| + backend_->SetThrottlerForTesting(
|
| + make_scoped_ptr<AffiliationFetchThrottler>(mock_fetch_throttler_));
|
|
|
| fake_affiliation_api_.AddTestEquivalenceClass(
|
| GetTestEquivalenceClassAlpha());
|
| @@ -206,14 +315,13 @@ class AffiliationBackendTest : public testing::Test {
|
| GetTestEquivalenceClassGamma());
|
| }
|
|
|
| - ScopedFakeAffiliationAPI fake_affiliation_api_;
|
| - MockAffiliationConsumer mock_consumer_;
|
| - scoped_refptr<base::TestSimpleTaskRunner> consumer_task_runner_;
|
| -
|
| scoped_refptr<base::TestMockTimeTaskRunner> backend_task_runner_;
|
| - base::ThreadTaskRunnerHandle backend_task_runner_handle_;
|
| + scoped_refptr<base::TestSimpleTaskRunner> consumer_task_runner_;
|
|
|
| + ScopedFakeAffiliationAPI fake_affiliation_api_;
|
| + MockAffiliationConsumer mock_consumer_;
|
| scoped_ptr<AffiliationBackend> backend_;
|
| + MockAffiliationFetchThrottler* mock_fetch_throttler_; // Owned by |backend_|.
|
|
|
| DISALLOW_COPY_AND_ASSIGN(AffiliationBackendTest);
|
| };
|
| @@ -248,30 +356,68 @@ TEST_F(AffiliationBackendTest, ExpiredPrefetchTriggersNoInitialFetch) {
|
| // already expired.
|
| Prefetch(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1),
|
| backend_task_runner()->Now());
|
| + ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded());
|
| EXPECT_EQ(0u, backend_facet_manager_count());
|
| - EXPECT_FALSE(fake_affiliation_api()->HasPendingRequest());
|
| EXPECT_FALSE(backend_task_runner()->HasPendingTask());
|
| }
|
|
|
| -// One additional GetAffiliations() and one Prefetch() request for unrelated
|
| -// facets come in while the network fetch triggered by the first request is in
|
| -// flight. There should be no simultaneous requests, and the additional facets
|
| -// should be queried together in a second fetch after the first fetch completes.
|
| +// 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, false);
|
| + ASSERT_NO_FATAL_FAILURE(ExpectNeedForFetchAndLetItBeSent());
|
| GetAffiliations(&second_consumer, facet_beta, false);
|
| 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_TRUE(fake_affiliation_api()->HasPendingRequest());
|
| - EXPECT_THAT(fake_affiliation_api()->GetNextRequestedFacets(),
|
| - testing::UnorderedElementsAre(facet_beta, facet_gamma));
|
| - fake_affiliation_api()->ServeNextRequest();
|
| + 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, false);
|
| + GetAffiliations(&second_consumer, facet_beta, false);
|
| + 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());
|
| @@ -284,6 +430,40 @@ TEST_F(AffiliationBackendTest, ConcurrentUnrelatedRequests) {
|
| EXPECT_GE(1u, backend_facet_manager_count());
|
| }
|
|
|
| +TEST_F(AffiliationBackendTest, RetryIsMadeOnFailedFetch) {
|
| + FacetURI facet_uri(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1));
|
| +
|
| + GetAffiliations(mock_consumer(), facet_uri, false /* cached_only */);
|
| + 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),
|
| @@ -347,11 +527,12 @@ TEST_F(AffiliationBackendTest,
|
| MockAffiliationConsumer second_consumer;
|
| MockAffiliationConsumer third_consumer;
|
| GetAffiliations(mock_consumer(), facet_uri1, false);
|
| + ASSERT_NO_FATAL_FAILURE(ExpectNeedForFetchAndLetItBeSent());
|
| GetAffiliations(&second_consumer, facet_uri1, false);
|
| GetAffiliations(&third_consumer, facet_uri2, false);
|
|
|
| ASSERT_NO_FATAL_FAILURE(ExpectAndCompleteFetch(facet_uri1));
|
| - ASSERT_FALSE(fake_affiliation_api()->HasPendingRequest());
|
| + ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded());
|
|
|
| mock_consumer()->ExpectSuccessWithResult(GetTestEquivalenceClassAlpha());
|
| second_consumer.ExpectSuccessWithResult(GetTestEquivalenceClassAlpha());
|
| @@ -374,11 +555,12 @@ TEST_F(AffiliationBackendTest,
|
| 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_FALSE(fake_affiliation_api()->HasPendingRequest());
|
| + ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded());
|
|
|
| ASSERT_NO_FATAL_FAILURE(ExpectThatEquivalenceClassIsServedFromCache(
|
| GetTestEquivalenceClassAlpha()));
|
| @@ -427,7 +609,7 @@ TEST_F(AffiliationBackendTest,
|
|
|
| AdvanceTime(GetCacheSoftExpiryPeriod() - Epsilon());
|
|
|
| - EXPECT_FALSE(fake_affiliation_api()->HasPendingRequest());
|
| + ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded());
|
| EXPECT_FALSE(IsCachedDataNearStaleForFacet(
|
| FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
|
|
| @@ -435,6 +617,7 @@ TEST_F(AffiliationBackendTest,
|
|
|
| EXPECT_TRUE(IsCachedDataNearStaleForFacet(
|
| FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| + ASSERT_NO_FATAL_FAILURE(ExpectNeedForFetchAndLetItBeSent());
|
| ASSERT_NO_FATAL_FAILURE(
|
| ExpectAndCompleteFetch(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
|
|
| @@ -452,8 +635,8 @@ TEST_F(AffiliationBackendTest,
|
| // 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(fake_affiliation_api()->HasPendingRequest());
|
| EXPECT_FALSE(backend_task_runner()->HasPendingTask());
|
|
|
| ASSERT_NO_FATAL_FAILURE(GetAffiliationsAndExpectFailureWithoutFetch(
|
| @@ -479,7 +662,7 @@ TEST_F(AffiliationBackendTest, PrefetchTriggersPeriodicRefetch) {
|
|
|
| AdvanceTime(GetCacheSoftExpiryPeriod() - Epsilon());
|
|
|
| - EXPECT_FALSE(fake_affiliation_api()->HasPendingRequest());
|
| + ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded());
|
| EXPECT_TRUE(IsCachedDataFreshForFacet(
|
| FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| EXPECT_FALSE(IsCachedDataNearStaleForFacet(
|
| @@ -491,6 +674,7 @@ TEST_F(AffiliationBackendTest, PrefetchTriggersPeriodicRefetch) {
|
|
|
| EXPECT_TRUE(IsCachedDataNearStaleForFacet(
|
| FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| + ASSERT_NO_FATAL_FAILURE(ExpectNeedForFetchAndLetItBeSent());
|
| ASSERT_NO_FATAL_FAILURE(ExpectAndCompleteFetch(
|
| FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
| ASSERT_NO_FATAL_FAILURE(ExpectThatEquivalenceClassIsServedFromCache(
|
| @@ -508,7 +692,7 @@ TEST_F(AffiliationBackendTest,
|
| FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1)));
|
|
|
| Prefetch(FacetURI::FromCanonicalSpec(kTestFacetURIAlpha1), base::Time::Max());
|
| - EXPECT_FALSE(fake_affiliation_api()->HasPendingRequest());
|
| + ASSERT_NO_FATAL_FAILURE(ExpectNoFetchNeeded());
|
| ASSERT_NO_FATAL_FAILURE(ExpectThatEquivalenceClassIsServedFromCache(
|
| GetTestEquivalenceClassAlpha()));
|
| }
|
| @@ -522,8 +706,8 @@ TEST_F(AffiliationBackendTest, CancelPrefetch) {
|
| // 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_FALSE(fake_affiliation_api()->HasPendingRequest());
|
| EXPECT_TRUE(backend_task_runner()->HasPendingTask());
|
|
|
| AdvanceTime(GetCacheHardExpiryPeriod() - GetCacheSoftExpiryPeriod() +
|
| @@ -557,6 +741,7 @@ TEST_F(AffiliationBackendTest, CancelDuplicatePrefetch) {
|
| 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)));
|
|
|
| @@ -572,8 +757,8 @@ TEST_F(AffiliationBackendTest, CancelDuplicatePrefetch) {
|
| 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(fake_affiliation_api()->HasPendingRequest());
|
| EXPECT_FALSE(backend_task_runner()->HasPendingTask());
|
| }
|
|
|
| @@ -581,8 +766,8 @@ TEST_F(AffiliationBackendTest, NothingExplodesWhenShutDownDuringFetch) {
|
| GetAffiliations(mock_consumer(),
|
| FacetURI::FromCanonicalSpec(kTestFacetURIAlpha2),
|
| false /* cached_only */);
|
| - ASSERT_TRUE(fake_affiliation_api()->HasPendingRequest());
|
| - fake_affiliation_api()->IgnoreNextRequest();
|
| + ASSERT_TRUE(mock_fetch_throttler()->has_signaled_network_request_needed());
|
| + mock_fetch_throttler()->reset_signaled_network_request_needed();
|
| DestroyBackend();
|
| }
|
|
|
| @@ -591,10 +776,10 @@ TEST_F(AffiliationBackendTest,
|
| GetAffiliations(mock_consumer(),
|
| FacetURI::FromCanonicalSpec(kTestFacetURIAlpha2),
|
| false /* cached_only */);
|
| - ASSERT_TRUE(fake_affiliation_api()->HasPendingRequest());
|
| // Currently, a GetAffiliations() request can only be blocked due to fetch in
|
| // flight -- so emulate this condition when destroying the backend.
|
| - fake_affiliation_api()->IgnoreNextRequest();
|
| + 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();
|
|
|