blob: 4740589695bb62ad482cd2adfbd2ed10c61f5e58 [file] [log] [blame]
// Copyright 2018 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/core/offline_page_archiver.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
#include "base/memory/weak_ptr.h"
#include "base/sequenced_task_runner.h"
#include "base/test/test_simple_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "components/offline_pages/core/model/offline_page_item_generator.h"
#include "components/offline_pages/core/stub_system_download_manager.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
const int64_t kDownloadId = 42LL;
} // namespace
namespace offline_pages {
class TestOfflinePageArchiver : public OfflinePageArchiver {
public:
void CreateArchive(const base::FilePath& archives_dir,
const CreateArchiveParams& create_archive_params,
content::WebContents* web_contents,
CreateArchiveCallback callback) override {}
};
class OfflinePageArchiverTest
: public testing::Test,
public base::SupportsWeakPtr<OfflinePageArchiverTest> {
public:
OfflinePageArchiverTest()
: task_runner_(new base::TestSimpleTaskRunner),
task_runner_handle_(task_runner_),
weak_ptr_factory_(this) {}
~OfflinePageArchiverTest() override {}
SavePageCallback save_page_callback;
void SetUp() override;
void PumpLoop();
OfflinePageItemGenerator* page_generator() { return &page_generator_; }
const base::FilePath& temporary_dir_path() {
return temporary_dir_.GetPath();
}
const base::FilePath& private_archive_dir_path() {
return private_archive_dir_.GetPath();
}
const base::FilePath& public_archive_dir_path() {
return public_archive_dir_.GetPath();
}
const PublishArchiveResult& publish_archive_result() {
return publish_archive_result_;
}
scoped_refptr<base::SequencedTaskRunner> task_runner() {
return task_runner_;
}
base::WeakPtr<OfflinePageArchiverTest> get_weak_ptr() {
return weak_ptr_factory_.GetWeakPtr();
}
void PublishArchiveDone(SavePageCallback save_page_callback,
const OfflinePageItem& offline_page,
PublishArchiveResult archive_result);
private:
base::ScopedTempDir temporary_dir_;
base::ScopedTempDir private_archive_dir_;
base::ScopedTempDir public_archive_dir_;
OfflinePageItemGenerator page_generator_;
PublishArchiveResult publish_archive_result_;
scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
base::ThreadTaskRunnerHandle task_runner_handle_;
base::WeakPtrFactory<OfflinePageArchiverTest> weak_ptr_factory_;
};
void OfflinePageArchiverTest::SetUp() {
ASSERT_TRUE(temporary_dir_.CreateUniqueTempDir());
ASSERT_TRUE(private_archive_dir_.CreateUniqueTempDir());
ASSERT_TRUE(public_archive_dir_.CreateUniqueTempDir());
}
void OfflinePageArchiverTest::PublishArchiveDone(
SavePageCallback save_page_callback,
const OfflinePageItem& offline_page,
PublishArchiveResult archive_result) {
publish_archive_result_ = archive_result;
}
void OfflinePageArchiverTest::PumpLoop() {
task_runner_->RunUntilIdle();
}
TEST_F(OfflinePageArchiverTest, PublishArchive) {
TestOfflinePageArchiver archiver;
// Put an offline page into the private dir, adjust the FilePath.
page_generator()->SetArchiveDirectory(temporary_dir_path());
OfflinePageItem offline_page = page_generator()->CreateItemWithTempFile();
base::FilePath old_file_path = offline_page.file_path;
base::FilePath new_file_path =
public_archive_dir_path().Append(offline_page.file_path.BaseName());
std::unique_ptr<SystemDownloadManager> download_manager(
new StubSystemDownloadManager(kDownloadId, true));
archiver.PublishArchive(
offline_page, base::ThreadTaskRunnerHandle::Get(),
public_archive_dir_path(), download_manager.get(),
base::BindOnce(&OfflinePageArchiverTest::PublishArchiveDone,
get_weak_ptr(), std::move(save_page_callback)));
PumpLoop();
EXPECT_EQ(SavePageResult::SUCCESS, publish_archive_result().move_result);
EXPECT_EQ(kDownloadId, publish_archive_result().download_id);
// Check there is a file in the new location.
EXPECT_TRUE(public_archive_dir_path().IsParent(
publish_archive_result().new_file_path));
EXPECT_TRUE(base::PathExists(publish_archive_result().new_file_path));
// Check there is no longer a file in the old location.
EXPECT_FALSE(base::PathExists(old_file_path));
}
// TODO(petewil): Add test cases for move failed, and adding to ADM failed.
} // namespace offline_pages