1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "components/offline_pages/core/offline_page_test_archiver.h"
6 
7 #include <string>
8 #include <utility>
9 
10 #include "base/bind.h"
11 #include "base/files/file_util.h"
12 #include "base/location.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14 #include "url/gurl.h"
15 
16 namespace offline_pages {
17 
OfflinePageTestArchiver(Observer * observer,const GURL & url,ArchiverResult result,const base::string16 & result_title,int64_t size_to_report,const std::string & digest_to_report,const scoped_refptr<base::SingleThreadTaskRunner> & task_runner)18 OfflinePageTestArchiver::OfflinePageTestArchiver(
19     Observer* observer,
20     const GURL& url,
21     ArchiverResult result,
22     const base::string16& result_title,
23     int64_t size_to_report,
24     const std::string& digest_to_report,
25     const scoped_refptr<base::SingleThreadTaskRunner>& task_runner)
26     : observer_(observer),
27       url_(url),
28       create_archive_params_(std::string()),
29       result_(result),
30       size_to_report_(size_to_report),
31       expect_create_archive_called_(false),
32       create_archive_called_(false),
33       delayed_(false),
34       result_title_(result_title),
35       digest_to_report_(digest_to_report),
36       task_runner_(task_runner) {}
37 
~OfflinePageTestArchiver()38 OfflinePageTestArchiver::~OfflinePageTestArchiver() {
39   if (expect_create_archive_called_)
40     EXPECT_TRUE(create_archive_called_);
41 }
42 
CreateArchive(const base::FilePath & archives_dir,const CreateArchiveParams & create_archive_params,content::WebContents * web_contents,CreateArchiveCallback callback)43 void OfflinePageTestArchiver::CreateArchive(
44     const base::FilePath& archives_dir,
45     const CreateArchiveParams& create_archive_params,
46     content::WebContents* web_contents,
47     CreateArchiveCallback callback) {
48   create_archive_called_ = true;
49   callback_ = std::move(callback);
50   archives_dir_ = archives_dir;
51   create_archive_params_ = create_archive_params;
52   if (!delayed_)
53     CompleteCreateArchive();
54 }
55 
CompleteCreateArchive()56 void OfflinePageTestArchiver::CompleteCreateArchive() {
57   DCHECK(!callback_.is_null());
58   base::FilePath archive_path;
59 
60   if (filename_.empty()) {
61     ASSERT_TRUE(base::CreateTemporaryFileInDir(archives_dir_, &archive_path));
62   } else if (filename_.IsAbsolute()) {
63     archive_path = filename_;
64   } else {
65     archive_path = archives_dir_.Append(filename_);
66     // This step ensures the file is created and closed immediately.
67     base::File file(archive_path, base::File::FLAG_OPEN_ALWAYS);
68   }
69 
70   if (observer_)
71     observer_->SetLastPathCreatedByArchiver(archive_path);
72 
73   task_runner_->PostTask(
74       FROM_HERE,
75       base::BindOnce(std::move(callback_), result_, url_, archive_path,
76                      result_title_, size_to_report_, digest_to_report_));
77 }
78 
79 }  // namespace offline_pages
80