| Index: components/offline_pages/background/request_picker_unittest.cc
|
| diff --git a/components/offline_pages/background/request_picker_unittest.cc b/components/offline_pages/background/request_picker_unittest.cc
|
| index cd74c70db4cc43d4e52c7f8a5e2219bf6e7c12d2..7082481854fa2e18547ba9479748a9f1de59882a 100644
|
| --- a/components/offline_pages/background/request_picker_unittest.cc
|
| +++ b/components/offline_pages/background/request_picker_unittest.cc
|
| @@ -9,6 +9,8 @@
|
| #include "base/threading/thread_task_runner_handle.h"
|
| #include "base/time/time.h"
|
| #include "components/offline_pages/background/device_conditions.h"
|
| +#include "components/offline_pages/background/offliner_factory.h"
|
| +#include "components/offline_pages/background/offliner_policy.h"
|
| #include "components/offline_pages/background/request_queue.h"
|
| #include "components/offline_pages/background/request_queue_in_memory_store.h"
|
| #include "components/offline_pages/background/save_page_request.h"
|
| @@ -38,6 +40,116 @@ const bool kPreferEarlier = true;
|
| const bool kPreferRetryCount = true;
|
| } // namespace
|
|
|
| +class SchedulerStub : public Scheduler {
|
| + public:
|
| + SchedulerStub()
|
| + : schedule_called_(false),
|
| + unschedule_called_(false),
|
| + conditions_(false, 0, false) {}
|
| +
|
| + void Schedule(const TriggerConditions& trigger_conditions) override {
|
| + schedule_called_ = true;
|
| + conditions_ = trigger_conditions;
|
| + }
|
| +
|
| + // Unschedules the currently scheduled task, if any.
|
| + void Unschedule() override { unschedule_called_ = true; }
|
| +
|
| + bool schedule_called() const { return schedule_called_; }
|
| +
|
| + bool unschedule_called() const { return unschedule_called_; }
|
| +
|
| + TriggerConditions const* conditions() const { return &conditions_; }
|
| +
|
| + private:
|
| + bool schedule_called_;
|
| + bool unschedule_called_;
|
| + TriggerConditions conditions_;
|
| +};
|
| +
|
| +class OfflinerStub : public Offliner {
|
| + public:
|
| + OfflinerStub()
|
| + : request_(kRequestId1,
|
| + kUrl1,
|
| + kClientId1,
|
| + base::Time::Now(),
|
| + kUserRequested),
|
| + enable_callback_(false),
|
| + cancel_called_(false) {}
|
| +
|
| + bool LoadAndSave(const SavePageRequest& request,
|
| + const CompletionCallback& callback) override {
|
| + callback_ = callback;
|
| + request_ = request;
|
| + // Post the callback on the run loop.
|
| + if (enable_callback_) {
|
| + base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(callback, request, Offliner::RequestStatus::SAVED));
|
| + }
|
| + return true;
|
| + }
|
| +
|
| + void Cancel() override { cancel_called_ = true; }
|
| +
|
| + void enable_callback(bool enable) { enable_callback_ = enable; }
|
| +
|
| + bool cancel_called() { return cancel_called_; }
|
| +
|
| + private:
|
| + CompletionCallback callback_;
|
| + SavePageRequest request_;
|
| + bool enable_callback_;
|
| + bool cancel_called_;
|
| +};
|
| +
|
| +class OfflinerFactoryStub : public OfflinerFactory {
|
| + public:
|
| + OfflinerFactoryStub() : offliner_(nullptr) {}
|
| +
|
| + Offliner* GetOffliner(const OfflinerPolicy* policy) override {
|
| + if (offliner_.get() == nullptr) {
|
| + offliner_.reset(new OfflinerStub());
|
| + }
|
| + return offliner_.get();
|
| + }
|
| +
|
| + private:
|
| + std::unique_ptr<OfflinerStub> offliner_;
|
| +};
|
| +
|
| +class RequestCoordinatorStub : public RequestCoordinator {
|
| + public:
|
| + RequestCoordinatorStub()
|
| + : RequestCoordinator(
|
| + std::unique_ptr<OfflinerPolicy>(new OfflinerPolicy()),
|
| + std::unique_ptr<OfflinerFactory>(new OfflinerFactoryStub()),
|
| + std::unique_ptr<RequestQueue>(
|
| + new RequestQueue(std::unique_ptr<RequestQueueInMemoryStore>(
|
| + new RequestQueueInMemoryStore()))),
|
| + std::unique_ptr<Scheduler>(new SchedulerStub())) {}
|
| +
|
| + void NotifyRequestsExpired(
|
| + const std::vector<SavePageRequest>& expired_requests,
|
| + RequestQueue::UpdateRequestResult result) override {
|
| + last_request_expiration_result_ = result;
|
| + last_expired_requests_ = expired_requests;
|
| + }
|
| +
|
| + const std::vector<SavePageRequest>& last_expired_requests() {
|
| + return last_expired_requests_;
|
| + }
|
| +
|
| + RequestQueue::UpdateRequestResult last_request_expiration_result() {
|
| + return last_request_expiration_result_;
|
| + }
|
| +
|
| + private:
|
| + RequestQueue::UpdateRequestResult last_request_expiration_result_;
|
| + std::vector<SavePageRequest> last_expired_requests_;
|
| +};
|
| +
|
| class RequestPickerTest : public testing::Test {
|
| public:
|
| RequestPickerTest();
|
| @@ -58,11 +170,14 @@ class RequestPickerTest : public testing::Test {
|
| void QueueRequestsAndChooseOne(const SavePageRequest& request1,
|
| const SavePageRequest& request2);
|
|
|
| + RequestCoordinatorStub* GetCoordinator() { return coordinator_.get(); }
|
| +
|
| protected:
|
| // The request queue is simple enough we will use a real queue with a memory
|
| // store instead of a stub.
|
| std::unique_ptr<RequestQueue> queue_;
|
| std::unique_ptr<RequestPicker> picker_;
|
| + std::unique_ptr<RequestCoordinatorStub> coordinator_;
|
| std::unique_ptr<SavePageRequest> last_picked_;
|
| std::unique_ptr<OfflinerPolicy> policy_;
|
| bool request_queue_empty_called_;
|
| @@ -83,7 +198,9 @@ void RequestPickerTest::SetUp() {
|
| new RequestQueueInMemoryStore());
|
| queue_.reset(new RequestQueue(std::move(store)));
|
| policy_.reset(new OfflinerPolicy());
|
| - picker_.reset(new RequestPicker(queue_.get(), policy_.get()));
|
| + coordinator_.reset(new RequestCoordinatorStub());
|
| + picker_.reset(
|
| + new RequestPicker(queue_.get(), policy_.get(), coordinator_.get()));
|
| request_queue_empty_called_ = false;
|
| }
|
|
|
| @@ -143,6 +260,28 @@ TEST_F(RequestPickerTest, PickFromEmptyQueue) {
|
| EXPECT_TRUE(request_queue_empty_called_);
|
| }
|
|
|
| +TEST_F(RequestPickerTest, ChooseNonExpiredRequest) {
|
| + base::Time creation_time = base::Time::Now();
|
| + base::Time expired_time =
|
| + creation_time -
|
| + base::TimeDelta::FromSeconds(kRequestExpirationTimeInSeconds + 60);
|
| + SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
|
| + kUserRequested);
|
| + SavePageRequest request2(kRequestId2, kUrl2, kClientId2, expired_time,
|
| + kUserRequested);
|
| +
|
| + QueueRequestsAndChooseOne(request1, request2);
|
| +
|
| + PumpLoop();
|
| +
|
| + EXPECT_EQ(kRequestId1, last_picked_->request_id());
|
| + EXPECT_FALSE(request_queue_empty_called_);
|
| + EXPECT_EQ(kRequestId2,
|
| + GetCoordinator()->last_expired_requests()[0].request_id());
|
| + EXPECT_EQ(RequestQueue::UpdateRequestResult::SUCCESS,
|
| + GetCoordinator()->last_request_expiration_result());
|
| +}
|
| +
|
| TEST_F(RequestPickerTest, ChooseRequestWithHigherRetryCount) {
|
| policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier,
|
| kPreferRetryCount, kMaxStartedTries,
|
| @@ -182,7 +321,8 @@ TEST_F(RequestPickerTest, ChooseEarlierRequest) {
|
| policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier,
|
| !kPreferRetryCount, kMaxStartedTries,
|
| kMaxCompletedTries));
|
| - picker_.reset(new RequestPicker(queue_.get(), policy_.get()));
|
| + picker_.reset(
|
| + new RequestPicker(queue_.get(), policy_.get(), coordinator_.get()));
|
|
|
| base::Time creation_time1 =
|
| base::Time::Now() - base::TimeDelta::FromSeconds(10);
|
| @@ -204,7 +344,8 @@ TEST_F(RequestPickerTest, ChooseSameTimeRequestWithHigherRetryCount) {
|
| policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier,
|
| !kPreferRetryCount, kMaxStartedTries,
|
| kMaxCompletedTries + 1));
|
| - picker_.reset(new RequestPicker(queue_.get(), policy_.get()));
|
| + picker_.reset(
|
| + new RequestPicker(queue_.get(), policy_.get(), coordinator_.get()));
|
|
|
| base::Time creation_time = base::Time::Now();
|
| SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
|
| @@ -224,7 +365,8 @@ TEST_F(RequestPickerTest, ChooseRequestWithLowerRetryCount) {
|
| policy_.reset(new OfflinerPolicy(!kPreferUntried, kPreferEarlier,
|
| kPreferRetryCount, kMaxStartedTries,
|
| kMaxCompletedTries + 1));
|
| - picker_.reset(new RequestPicker(queue_.get(), policy_.get()));
|
| + picker_.reset(
|
| + new RequestPicker(queue_.get(), policy_.get(), coordinator_.get()));
|
|
|
| base::Time creation_time = base::Time::Now();
|
| SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
|
| @@ -244,7 +386,8 @@ TEST_F(RequestPickerTest, ChooseLaterRequest) {
|
| policy_.reset(new OfflinerPolicy(kPreferUntried, !kPreferEarlier,
|
| !kPreferRetryCount, kMaxStartedTries,
|
| kMaxCompletedTries));
|
| - picker_.reset(new RequestPicker(queue_.get(), policy_.get()));
|
| + picker_.reset(
|
| + new RequestPicker(queue_.get(), policy_.get(), coordinator_.get()));
|
|
|
| base::Time creation_time1 =
|
| base::Time::Now() - base::TimeDelta::FromSeconds(10);
|
|
|