Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: chrome/browser/chromeos/policy/system_log_uploader_unittest.cc

Issue 1216643002: Added unittests for SystemLogUploader. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased patch. Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/chromeos/policy/system_log_uploader.cc ('k') | chrome/chrome_tests_unit.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 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 "base/strings/stringprintf.h"
6 #include "base/test/test_simple_task_runner.h"
7 #include "base/time/time.h"
8 #include "chrome/browser/chromeos/policy/system_log_uploader.h"
9 #include "net/http/http_request_headers.h"
10 #include "testing/gmock/include/gmock/gmock.h"
11
12 namespace policy {
13
14 namespace {
15
16 // The list of tested system log file names.
17 const char* const kTestSystemLogFileNames[] = {"name1.txt", "name32.txt"};
18
19 // Generate the fake system log files.
20 SystemLogUploader::SystemLogs GenerateTestSystemLogFiles() {
21 SystemLogUploader::SystemLogs system_logs;
22 for (auto const file_path : kTestSystemLogFileNames) {
23 system_logs.push_back(std::make_pair(file_path, file_path));
24 }
25 return system_logs;
26 }
27
28 class MockUploadJob : public UploadJob {
29 public:
30 // If is_upload_error is false OnSuccess() will be invoked when the
31 // Start() method is called, otherwise OnFailure() will be invoked.
32 MockUploadJob(const GURL& upload_url,
33 UploadJob::Delegate* delegate,
34 bool is_upload_error,
35 int max_files);
36 ~MockUploadJob() override;
37
38 // policy::UploadJob:
39 void AddDataSegment(const std::string& name,
40 const std::string& filename,
41 const std::map<std::string, std::string>& header_entries,
42 scoped_ptr<std::string> data) override;
43 void Start() override;
44
45 protected:
46 UploadJob::Delegate* delegate_;
47 bool is_upload_error_;
48 int file_index_;
49 int max_files_;
50 };
51
52 MockUploadJob::MockUploadJob(const GURL& upload_url,
53 UploadJob::Delegate* delegate,
54 bool is_upload_error,
55 int max_files)
56 : delegate_(delegate),
57 is_upload_error_(is_upload_error),
58 file_index_(0),
59 max_files_(max_files) {}
60
61 MockUploadJob::~MockUploadJob() {}
62
63 void MockUploadJob::AddDataSegment(
64 const std::string& name,
65 const std::string& filename,
66 const std::map<std::string, std::string>& header_entries,
67 scoped_ptr<std::string> data) {
68 // Test all fields to upload.
69 EXPECT_LT(file_index_, max_files_);
70 EXPECT_GE(file_index_, 0);
71
72 EXPECT_EQ(base::StringPrintf(SystemLogUploader::kNameFieldTemplate,
73 file_index_ + 1),
74 name);
75
76 EXPECT_EQ(kTestSystemLogFileNames[file_index_], filename);
77
78 EXPECT_EQ(2U, header_entries.size());
79 EXPECT_EQ(
80 SystemLogUploader::kFileTypeLogFile,
81 header_entries.find(SystemLogUploader::kFileTypeHeaderName)->second);
82 EXPECT_EQ(SystemLogUploader::kContentTypePlainText,
83 header_entries.find(net::HttpRequestHeaders::kContentType)->second);
84
85 EXPECT_EQ(kTestSystemLogFileNames[file_index_], *data);
86
87 file_index_++;
88 }
89
90 void MockUploadJob::Start() {
91 DCHECK(delegate_);
92 // Check if all files were uploaded.
93 EXPECT_EQ(max_files_, file_index_);
94
95 if (is_upload_error_) {
96 // Send any ErrorCode.
97 delegate_->OnFailure(UploadJob::ErrorCode::NETWORK_ERROR);
98 } else {
99 delegate_->OnSuccess();
100 }
101 }
102
103 // MockSystemLogDelegate - mock class that creates an upload job and runs upload
104 // callback.
105 class MockSystemLogDelegate : public SystemLogUploader::Delegate {
106 public:
107 MockSystemLogDelegate(bool is_upload_error,
108 const SystemLogUploader::SystemLogs& system_logs)
109 : is_upload_error_(is_upload_error), system_logs_(system_logs) {}
110 ~MockSystemLogDelegate() override {}
111
112 void LoadSystemLogs(const LogUploadCallback& upload_callback) override {
113 upload_callback.Run(
114 make_scoped_ptr(new SystemLogUploader::SystemLogs(system_logs_)));
115 }
116
117 scoped_ptr<UploadJob> CreateUploadJob(
118 const GURL& url,
119 UploadJob::Delegate* delegate) override {
120 return make_scoped_ptr(new MockUploadJob(url, delegate, is_upload_error_,
121 system_logs_.size()));
122 }
123
124 private:
125 bool is_upload_error_;
126 SystemLogUploader::SystemLogs system_logs_;
127 };
128
129 } // namespace
130
131 class SystemLogUploaderTest : public testing::Test {
132 public:
133 SystemLogUploaderTest() : task_runner_(new base::TestSimpleTaskRunner()) {}
134
135 // Given a pending task to upload system logs.
136 void RunPendingUploadTaskAndCheckNext(const SystemLogUploader& uploader,
137 base::TimeDelta expected_delay) {
138 EXPECT_FALSE(task_runner_->GetPendingTasks().empty());
139 task_runner_->RunPendingTasks();
140
141 // The previous task should have uploaded another log upload task.
142 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size());
143
144 CheckPendingTaskDelay(uploader, expected_delay);
145 }
146
147 void CheckPendingTaskDelay(const SystemLogUploader& uploader,
148 base::TimeDelta expected_delay) {
149 // The next task should be scheduled sometime between
150 // |last_upload_attempt| + |expected_delay| and
151 // |now| + |expected_delay|.
152 base::Time now = base::Time::NowFromSystemTime();
153 base::Time next_task = now + task_runner_->NextPendingTaskDelay();
154
155 EXPECT_LE(next_task, now + expected_delay);
156 EXPECT_GE(next_task, uploader.last_upload_attempt() + expected_delay);
157 }
158
159 scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
160 };
161
162 // One success task pending.
163 TEST_F(SystemLogUploaderTest, SuccessTest) {
164 EXPECT_TRUE(task_runner_->GetPendingTasks().empty());
165
166 SystemLogUploader uploader(make_scoped_ptr(new MockSystemLogDelegate(
167 false, SystemLogUploader::SystemLogs())),
168 task_runner_);
169
170 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size());
171
172 RunPendingUploadTaskAndCheckNext(
173 uploader, base::TimeDelta::FromMilliseconds(
174 SystemLogUploader::kDefaultUploadDelayMs));
175 }
176
177 // Three failed responses recieved.
178 TEST_F(SystemLogUploaderTest, ThreeFailureTest) {
179 EXPECT_TRUE(task_runner_->GetPendingTasks().empty());
180
181 SystemLogUploader uploader(make_scoped_ptr(new MockSystemLogDelegate(
182 true, SystemLogUploader::SystemLogs())),
183 task_runner_);
184
185 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size());
186
187 // Do not retry two times consequentially.
188 RunPendingUploadTaskAndCheckNext(uploader,
189 base::TimeDelta::FromMilliseconds(
190 SystemLogUploader::kErrorUploadDelayMs));
191 // We are using the kDefaultUploadDelayMs and not the kErrorUploadDelayMs here
192 // because there's just one retry.
193 RunPendingUploadTaskAndCheckNext(
194 uploader, base::TimeDelta::FromMilliseconds(
195 SystemLogUploader::kDefaultUploadDelayMs));
196 RunPendingUploadTaskAndCheckNext(uploader,
197 base::TimeDelta::FromMilliseconds(
198 SystemLogUploader::kErrorUploadDelayMs));
199 }
200
201 // Check header fields of system log files to upload.
202 TEST_F(SystemLogUploaderTest, CheckHeaders) {
203 EXPECT_TRUE(task_runner_->GetPendingTasks().empty());
204
205 SystemLogUploader::SystemLogs system_logs = GenerateTestSystemLogFiles();
206 SystemLogUploader uploader(
207 make_scoped_ptr(new MockSystemLogDelegate(false, system_logs)),
208 task_runner_);
209
210 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size());
211
212 RunPendingUploadTaskAndCheckNext(
213 uploader, base::TimeDelta::FromMilliseconds(
214 SystemLogUploader::kDefaultUploadDelayMs));
215 }
216
217 } // namespace policy
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/policy/system_log_uploader.cc ('k') | chrome/chrome_tests_unit.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698