OLD | NEW |
(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 |
OLD | NEW |