blob: 14f0c63ecf95a34fb6f9b25d83ad193461c2149e [file] [log] [blame]
// Copyright 2016 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/offline_pages/background/request_queue.h"
#include <memory>
#include "base/bind.h"
#include "base/test/test_simple_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "components/offline_pages/background/request_queue_in_memory_store.h"
#include "components/offline_pages/background/save_page_request.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace offline_pages {
using AddRequestResult = RequestQueue::AddRequestResult;
using GetRequestsResult = RequestQueue::GetRequestsResult;
using UpdateRequestResult = RequestQueue::UpdateRequestResult;
namespace {
// Data for request 1.
const int64_t kRequestId = 42;
const GURL kUrl("http://example.com");
const ClientId kClientId("bookmark", "1234");
// Data for request 2.
const int64_t kRequestId2 = 77;
const GURL kUrl2("http://test.com");
const ClientId kClientId2("bookmark", "567");
} // namespace
// TODO(fgorski): Add tests for store failures in add/remove/get.
class RequestQueueTest : public testing::Test {
public:
RequestQueueTest();
~RequestQueueTest() override;
// Test overrides.
void SetUp() override;
void PumpLoop();
// Callback for adding requests.
void AddRequestDone(AddRequestResult result, const SavePageRequest& request);
// Callback for getting requests.
void GetRequestsDone(GetRequestsResult result,
const std::vector<SavePageRequest>& requests);
// Callback for removing request.
void RemoveRequestDone(UpdateRequestResult result);
RequestQueue* queue() { return queue_.get(); }
AddRequestResult last_add_result() const { return last_add_result_; }
SavePageRequest* last_added_request() {
return last_added_request_.get();
}
UpdateRequestResult last_remove_result() const { return last_remove_result_; }
GetRequestsResult last_get_requests_result() const {
return last_get_requests_result_;
}
const std::vector<SavePageRequest>& last_requests() const {
return last_requests_;
}
private:
AddRequestResult last_add_result_;
std::unique_ptr<SavePageRequest> last_added_request_;
UpdateRequestResult last_remove_result_;
GetRequestsResult last_get_requests_result_;
std::vector<SavePageRequest> last_requests_;
std::unique_ptr<RequestQueue> queue_;
scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
base::ThreadTaskRunnerHandle task_runner_handle_;
};
RequestQueueTest::RequestQueueTest()
: last_add_result_(AddRequestResult::kStoreFailure),
last_remove_result_(UpdateRequestResult::kStoreFailure),
last_get_requests_result_(GetRequestsResult::kStoreFailure),
task_runner_(new base::TestSimpleTaskRunner),
task_runner_handle_(task_runner_) {}
RequestQueueTest::~RequestQueueTest() {}
void RequestQueueTest::SetUp() {
std::unique_ptr<RequestQueueInMemoryStore> store(
new RequestQueueInMemoryStore());
queue_.reset(new RequestQueue(std::move(store)));
}
void RequestQueueTest::PumpLoop() {
task_runner_->RunUntilIdle();
}
void RequestQueueTest::AddRequestDone(AddRequestResult result,
const SavePageRequest& request) {
last_add_result_ = result;
last_added_request_.reset(new SavePageRequest(request));
}
void RequestQueueTest::GetRequestsDone(
GetRequestsResult result,
const std::vector<SavePageRequest>& requests) {
last_get_requests_result_ = result;
last_requests_ = requests;
}
void RequestQueueTest::RemoveRequestDone(UpdateRequestResult result) {
last_remove_result_ = result;
}
TEST_F(RequestQueueTest, GetRequestsEmpty) {
queue()->GetRequests(
base::Bind(&RequestQueueTest::GetRequestsDone, base::Unretained(this)));
PumpLoop();
ASSERT_EQ(GetRequestsResult::kSuccess, last_get_requests_result());
ASSERT_EQ(0ul, last_requests().size());
}
TEST_F(RequestQueueTest, AddRequest) {
base::Time creation_time = base::Time::Now();
SavePageRequest request(kRequestId, kUrl, kClientId, creation_time);
queue()->AddRequest(request, base::Bind(&RequestQueueTest::AddRequestDone,
base::Unretained(this)));
PumpLoop();
ASSERT_EQ(AddRequestResult::kSuccess, last_add_result());
ASSERT_TRUE(last_added_request());
ASSERT_EQ(kRequestId, last_added_request()->request_id());
queue()->GetRequests(
base::Bind(&RequestQueueTest::GetRequestsDone, base::Unretained(this)));
PumpLoop();
ASSERT_EQ(GetRequestsResult::kSuccess, last_get_requests_result());
ASSERT_EQ(1ul, last_requests().size());
}
TEST_F(RequestQueueTest, RemoveRequest) {
base::Time creation_time = base::Time::Now();
SavePageRequest request(kRequestId, kUrl, kClientId, creation_time);
queue()->AddRequest(request, base::Bind(&RequestQueueTest::AddRequestDone,
base::Unretained(this)));
PumpLoop();
ASSERT_EQ(kRequestId, last_added_request()->request_id());
queue()->RemoveRequest(
kRequestId,
base::Bind(&RequestQueueTest::RemoveRequestDone, base::Unretained(this)));
PumpLoop();
ASSERT_EQ(UpdateRequestResult::kSuccess, last_remove_result());
queue()->GetRequests(
base::Bind(&RequestQueueTest::GetRequestsDone, base::Unretained(this)));
PumpLoop();
ASSERT_EQ(GetRequestsResult::kSuccess, last_get_requests_result());
ASSERT_EQ(0ul, last_requests().size());
}
// A longer test populating the request queue with more than one item, properly
// listing multiple items and removing the right item.
TEST_F(RequestQueueTest, MultipleRequestsAddGetRemove) {
base::Time creation_time = base::Time::Now();
SavePageRequest request1(kRequestId, kUrl, kClientId, creation_time);
queue()->AddRequest(request1, base::Bind(&RequestQueueTest::AddRequestDone,
base::Unretained(this)));
PumpLoop();
ASSERT_EQ(request1.request_id(), last_added_request()->request_id());
SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time);
queue()->AddRequest(request2, base::Bind(&RequestQueueTest::AddRequestDone,
base::Unretained(this)));
PumpLoop();
ASSERT_EQ(request2.request_id(), last_added_request()->request_id());
queue()->GetRequests(
base::Bind(&RequestQueueTest::GetRequestsDone, base::Unretained(this)));
PumpLoop();
ASSERT_EQ(GetRequestsResult::kSuccess, last_get_requests_result());
ASSERT_EQ(2ul, last_requests().size());
queue()->RemoveRequest(
request1.request_id(),
base::Bind(&RequestQueueTest::RemoveRequestDone, base::Unretained(this)));
PumpLoop();
ASSERT_EQ(UpdateRequestResult::kSuccess, last_remove_result());
queue()->GetRequests(
base::Bind(&RequestQueueTest::GetRequestsDone, base::Unretained(this)));
PumpLoop();
ASSERT_EQ(GetRequestsResult::kSuccess, last_get_requests_result());
ASSERT_EQ(1ul, last_requests().size());
ASSERT_EQ(request2.request_id(), last_requests()[0].request_id());
}
} // namespace offline_pages