Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/strings/stringprintf.h" | 5 #include "base/strings/stringprintf.h" |
| 6 #include "base/test/test_simple_task_runner.h" | 6 #include "base/test/test_simple_task_runner.h" |
| 7 #include "base/time/time.h" | 7 #include "base/time/time.h" |
| 8 #include "chrome/browser/chromeos/policy/system_log_uploader.h" | 8 #include "chrome/browser/chromeos/policy/system_log_uploader.h" |
| 9 #include "chrome/browser/chromeos/settings/scoped_cros_settings_test_helper.h" | |
| 10 #include "content/public/test/test_browser_thread_bundle.h" | |
| 11 #include "content/public/test/test_utils.h" | |
| 9 #include "net/http/http_request_headers.h" | 12 #include "net/http/http_request_headers.h" |
| 10 #include "testing/gmock/include/gmock/gmock.h" | 13 #include "testing/gmock/include/gmock/gmock.h" |
| 11 | 14 |
| 12 namespace policy { | 15 namespace policy { |
| 13 | 16 |
| 14 namespace { | 17 namespace { |
| 15 | 18 |
| 16 // The list of tested system log file names. | 19 // The list of tested system log file names. |
| 17 const char* const kTestSystemLogFileNames[] = {"name1.txt", "name32.txt"}; | 20 const char* const kTestSystemLogFileNames[] = {"name1.txt", "name32.txt"}; |
| 18 | 21 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 103 // MockSystemLogDelegate - mock class that creates an upload job and runs upload | 106 // MockSystemLogDelegate - mock class that creates an upload job and runs upload |
| 104 // callback. | 107 // callback. |
| 105 class MockSystemLogDelegate : public SystemLogUploader::Delegate { | 108 class MockSystemLogDelegate : public SystemLogUploader::Delegate { |
| 106 public: | 109 public: |
| 107 MockSystemLogDelegate(bool is_upload_error, | 110 MockSystemLogDelegate(bool is_upload_error, |
| 108 const SystemLogUploader::SystemLogs& system_logs) | 111 const SystemLogUploader::SystemLogs& system_logs) |
| 109 : is_upload_error_(is_upload_error), system_logs_(system_logs) {} | 112 : is_upload_error_(is_upload_error), system_logs_(system_logs) {} |
| 110 ~MockSystemLogDelegate() override {} | 113 ~MockSystemLogDelegate() override {} |
| 111 | 114 |
| 112 void LoadSystemLogs(const LogUploadCallback& upload_callback) override { | 115 void LoadSystemLogs(const LogUploadCallback& upload_callback) override { |
| 116 EXPECT_TRUE(is_upload_allowed_); | |
| 113 upload_callback.Run( | 117 upload_callback.Run( |
| 114 make_scoped_ptr(new SystemLogUploader::SystemLogs(system_logs_))); | 118 make_scoped_ptr(new SystemLogUploader::SystemLogs(system_logs_))); |
| 115 } | 119 } |
| 116 | 120 |
| 117 scoped_ptr<UploadJob> CreateUploadJob( | 121 scoped_ptr<UploadJob> CreateUploadJob( |
| 118 const GURL& url, | 122 const GURL& url, |
| 119 UploadJob::Delegate* delegate) override { | 123 UploadJob::Delegate* delegate) override { |
| 120 return make_scoped_ptr(new MockUploadJob(url, delegate, is_upload_error_, | 124 return make_scoped_ptr(new MockUploadJob(url, delegate, is_upload_error_, |
| 121 system_logs_.size())); | 125 system_logs_.size())); |
| 122 } | 126 } |
| 123 | 127 |
| 128 void set_upload_allowed(bool is_upload_allowed) { | |
| 129 is_upload_allowed_ = is_upload_allowed; | |
| 130 } | |
| 131 | |
| 124 private: | 132 private: |
| 133 bool is_upload_allowed_; | |
| 125 bool is_upload_error_; | 134 bool is_upload_error_; |
| 126 SystemLogUploader::SystemLogs system_logs_; | 135 SystemLogUploader::SystemLogs system_logs_; |
| 127 }; | 136 }; |
| 128 | 137 |
| 129 } // namespace | 138 } // namespace |
| 130 | 139 |
| 131 class SystemLogUploaderTest : public testing::Test { | 140 class SystemLogUploaderTest : public testing::Test { |
| 132 public: | 141 public: |
| 133 SystemLogUploaderTest() : task_runner_(new base::TestSimpleTaskRunner()) {} | 142 SystemLogUploaderTest() : task_runner_(new base::TestSimpleTaskRunner()) {} |
| 134 | 143 |
| 144 void TearDown() override { content::RunAllBlockingPoolTasksUntilIdle(); } | |
| 145 | |
| 135 // Given a pending task to upload system logs. | 146 // Given a pending task to upload system logs. |
| 136 void RunPendingUploadTaskAndCheckNext(const SystemLogUploader& uploader, | 147 void RunPendingUploadTaskAndCheckNext(base::TimeDelta expected_delay) { |
| 137 base::TimeDelta expected_delay) { | |
| 138 EXPECT_FALSE(task_runner_->GetPendingTasks().empty()); | 148 EXPECT_FALSE(task_runner_->GetPendingTasks().empty()); |
| 139 task_runner_->RunPendingTasks(); | 149 task_runner_->RunPendingTasks(); |
| 140 | 150 |
| 141 // The previous task should have uploaded another log upload task. | 151 // The previous task should have uploaded another log upload task. |
| 142 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size()); | 152 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size()); |
| 143 | 153 |
| 144 CheckPendingTaskDelay(uploader, expected_delay); | 154 CheckPendingTaskDelay(expected_delay); |
| 145 } | 155 } |
| 146 | 156 |
| 147 void CheckPendingTaskDelay(const SystemLogUploader& uploader, | 157 void CheckPendingTaskDelay(base::TimeDelta expected_delay) { |
| 148 base::TimeDelta expected_delay) { | |
| 149 // The next task should be scheduled sometime between | 158 // The next task should be scheduled sometime between |
| 150 // |last_upload_attempt| + |expected_delay| and | 159 // |last_upload_attempt| + |expected_delay| and |
| 151 // |now| + |expected_delay|. | 160 // |now| + |expected_delay|. |
| 152 base::Time now = base::Time::NowFromSystemTime(); | 161 base::Time now = base::Time::NowFromSystemTime(); |
| 153 base::Time next_task = now + task_runner_->NextPendingTaskDelay(); | 162 base::Time next_task = now + task_runner_->NextPendingTaskDelay(); |
| 154 | 163 |
| 155 EXPECT_LE(next_task, now + expected_delay); | 164 EXPECT_LE(next_task, now + expected_delay); |
| 156 EXPECT_GE(next_task, uploader.last_upload_attempt() + expected_delay); | 165 EXPECT_GE(next_task, uploader_->last_upload_attempt() + expected_delay); |
| 157 } | 166 } |
| 158 | 167 |
| 168 void InitTestCase(scoped_ptr<MockSystemLogDelegate> delegate) { | |
| 169 // Replace settings provider must be after observer creation in the system | |
|
Andrew T Wilson (Slow)
2015/08/13 11:26:18
Why is the ordering important? I'm not sure I unde
Polina Bondarenko
2015/08/13 14:51:16
Yes, you're right, it's not important, removed it.
| |
| 170 // log uploader's constructor. | |
| 171 uploader_.reset(new SystemLogUploader(delegate.Pass(), task_runner_)); | |
| 172 settings_helper_.ReplaceProvider(chromeos::kLogUploadEnabled); | |
| 173 } | |
| 174 | |
| 175 void DestroyTestCase() { settings_helper_.RestoreProvider(); } | |
| 176 | |
| 177 protected: | |
| 178 content::TestBrowserThreadBundle thread_bundle_; | |
| 179 chromeos::ScopedCrosSettingsTestHelper settings_helper_; | |
| 159 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | 180 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
| 181 scoped_ptr<SystemLogUploader> uploader_; | |
| 160 }; | 182 }; |
| 161 | 183 |
| 184 // Turn off system log uploads. | |
| 185 TEST_F(SystemLogUploaderTest, Basic) { | |
| 186 EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); | |
| 187 | |
| 188 scoped_ptr<MockSystemLogDelegate> syslog_delegate( | |
| 189 new MockSystemLogDelegate(false, SystemLogUploader::SystemLogs())); | |
| 190 syslog_delegate->set_upload_allowed(false); | |
| 191 InitTestCase(syslog_delegate.Pass()); | |
|
Andrew T Wilson (Slow)
2015/08/13 11:26:18
It's a bit weird to have this Init/DestroyTestCase
Polina Bondarenko
2015/08/13 14:51:17
Yes, it's possible, done.
| |
| 192 | |
| 193 settings_helper_.SetBoolean(chromeos::kLogUploadEnabled, false); | |
| 194 | |
| 195 task_runner_->RunPendingTasks(); | |
| 196 DestroyTestCase(); | |
| 197 } | |
| 198 | |
| 162 // One success task pending. | 199 // One success task pending. |
| 163 TEST_F(SystemLogUploaderTest, SuccessTest) { | 200 TEST_F(SystemLogUploaderTest, SuccessTest) { |
| 164 EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); | 201 EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); |
| 165 | 202 |
| 166 SystemLogUploader uploader(make_scoped_ptr(new MockSystemLogDelegate( | 203 scoped_ptr<MockSystemLogDelegate> syslog_delegate( |
| 167 false, SystemLogUploader::SystemLogs())), | 204 new MockSystemLogDelegate(false, SystemLogUploader::SystemLogs())); |
| 168 task_runner_); | 205 syslog_delegate->set_upload_allowed(true); |
| 206 InitTestCase(syslog_delegate.Pass()); | |
| 207 | |
| 208 settings_helper_.SetBoolean(chromeos::kLogUploadEnabled, true); | |
| 169 | 209 |
| 170 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size()); | 210 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size()); |
| 171 | 211 |
| 172 RunPendingUploadTaskAndCheckNext( | 212 RunPendingUploadTaskAndCheckNext(base::TimeDelta::FromMilliseconds( |
| 173 uploader, base::TimeDelta::FromMilliseconds( | 213 SystemLogUploader::kDefaultUploadDelayMs)); |
| 174 SystemLogUploader::kDefaultUploadDelayMs)); | 214 DestroyTestCase(); |
| 175 } | 215 } |
| 176 | 216 |
| 177 // Three failed responses recieved. | 217 // Three failed responses recieved. |
| 178 TEST_F(SystemLogUploaderTest, ThreeFailureTest) { | 218 TEST_F(SystemLogUploaderTest, ThreeFailureTest) { |
| 179 EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); | 219 EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); |
| 180 | 220 |
| 181 SystemLogUploader uploader(make_scoped_ptr(new MockSystemLogDelegate( | 221 scoped_ptr<MockSystemLogDelegate> syslog_delegate( |
| 182 true, SystemLogUploader::SystemLogs())), | 222 new MockSystemLogDelegate(true, SystemLogUploader::SystemLogs())); |
| 183 task_runner_); | 223 syslog_delegate->set_upload_allowed(true); |
| 184 | 224 |
| 225 InitTestCase(syslog_delegate.Pass()); | |
| 226 | |
| 227 settings_helper_.SetBoolean(chromeos::kLogUploadEnabled, true); | |
| 185 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size()); | 228 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size()); |
| 186 | 229 |
| 187 // Do not retry two times consequentially. | 230 // Do not retry two times consequentially. |
| 188 RunPendingUploadTaskAndCheckNext(uploader, | 231 RunPendingUploadTaskAndCheckNext(base::TimeDelta::FromMilliseconds( |
| 189 base::TimeDelta::FromMilliseconds( | 232 SystemLogUploader::kErrorUploadDelayMs)); |
| 190 SystemLogUploader::kErrorUploadDelayMs)); | |
| 191 // We are using the kDefaultUploadDelayMs and not the kErrorUploadDelayMs here | 233 // We are using the kDefaultUploadDelayMs and not the kErrorUploadDelayMs here |
| 192 // because there's just one retry. | 234 // because there's just one retry. |
| 193 RunPendingUploadTaskAndCheckNext( | 235 RunPendingUploadTaskAndCheckNext(base::TimeDelta::FromMilliseconds( |
| 194 uploader, base::TimeDelta::FromMilliseconds( | 236 SystemLogUploader::kDefaultUploadDelayMs)); |
| 195 SystemLogUploader::kDefaultUploadDelayMs)); | 237 RunPendingUploadTaskAndCheckNext(base::TimeDelta::FromMilliseconds( |
| 196 RunPendingUploadTaskAndCheckNext(uploader, | 238 SystemLogUploader::kErrorUploadDelayMs)); |
| 197 base::TimeDelta::FromMilliseconds( | 239 DestroyTestCase(); |
| 198 SystemLogUploader::kErrorUploadDelayMs)); | |
| 199 } | 240 } |
| 200 | 241 |
| 201 // Check header fields of system log files to upload. | 242 // Check header fields of system log files to upload. |
| 202 TEST_F(SystemLogUploaderTest, CheckHeaders) { | 243 TEST_F(SystemLogUploaderTest, CheckHeaders) { |
| 203 EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); | 244 EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); |
| 204 | 245 |
| 205 SystemLogUploader::SystemLogs system_logs = GenerateTestSystemLogFiles(); | 246 SystemLogUploader::SystemLogs system_logs = GenerateTestSystemLogFiles(); |
| 206 SystemLogUploader uploader( | 247 scoped_ptr<MockSystemLogDelegate> syslog_delegate( |
| 207 make_scoped_ptr(new MockSystemLogDelegate(false, system_logs)), | 248 new MockSystemLogDelegate(false, system_logs)); |
| 208 task_runner_); | 249 syslog_delegate->set_upload_allowed(true); |
| 250 InitTestCase(syslog_delegate.Pass()); | |
| 251 | |
| 252 settings_helper_.SetBoolean(chromeos::kLogUploadEnabled, true); | |
| 209 | 253 |
| 210 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size()); | 254 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size()); |
| 211 | 255 |
| 212 RunPendingUploadTaskAndCheckNext( | 256 RunPendingUploadTaskAndCheckNext(base::TimeDelta::FromMilliseconds( |
| 213 uploader, base::TimeDelta::FromMilliseconds( | 257 SystemLogUploader::kDefaultUploadDelayMs)); |
| 214 SystemLogUploader::kDefaultUploadDelayMs)); | 258 DestroyTestCase(); |
| 259 } | |
| 260 | |
| 261 // Disable system log uploads after one failed log upload. | |
| 262 TEST_F(SystemLogUploaderTest, DisableLogUpload) { | |
| 263 EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); | |
| 264 | |
| 265 scoped_ptr<MockSystemLogDelegate> syslog_delegate( | |
| 266 new MockSystemLogDelegate(true, SystemLogUploader::SystemLogs())); | |
| 267 MockSystemLogDelegate* mock_delegate = syslog_delegate.get(); | |
| 268 InitTestCase(syslog_delegate.Pass()); | |
| 269 | |
| 270 settings_helper_.SetBoolean(chromeos::kLogUploadEnabled, true); | |
| 271 mock_delegate->set_upload_allowed(true); | |
| 272 | |
| 273 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size()); | |
| 274 RunPendingUploadTaskAndCheckNext(base::TimeDelta::FromMilliseconds( | |
| 275 SystemLogUploader::kErrorUploadDelayMs)); | |
| 276 | |
| 277 // Disable log upload and check that frequency is usual, because there is no | |
| 278 // errors, we should not upload logs. | |
| 279 settings_helper_.SetBoolean(chromeos::kLogUploadEnabled, false); | |
| 280 mock_delegate->set_upload_allowed(false); | |
| 281 task_runner_->RunPendingTasks(); | |
| 282 | |
| 283 RunPendingUploadTaskAndCheckNext(base::TimeDelta::FromMilliseconds( | |
| 284 SystemLogUploader::kDefaultUploadDelayMs)); | |
| 285 RunPendingUploadTaskAndCheckNext(base::TimeDelta::FromMilliseconds( | |
| 286 SystemLogUploader::kDefaultUploadDelayMs)); | |
| 287 DestroyTestCase(); | |
| 215 } | 288 } |
| 216 | 289 |
| 217 } // namespace policy | 290 } // namespace policy |
| OLD | NEW |