Chromium Code Reviews| 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/test/test_simple_task_runner.h" | |
| 6 #include "base/time/time.h" | |
| 7 #include "chrome/browser/chromeos/policy/system_log_uploader.h" | |
| 8 #include "testing/gmock/include/gmock/gmock.h" | |
| 9 | |
| 10 namespace policy { | |
| 11 | |
| 12 // MockSystemLogDelegate - mock class that does nothing. | |
| 13 class MockSystemLogDelegate : public SystemLogUploadJob::Delegate { | |
| 14 public: | |
| 15 MockSystemLogDelegate(); | |
| 16 ~MockSystemLogDelegate() override; | |
| 17 | |
| 18 void LoadSystemLogs( | |
| 19 const SystemLogUploadJob::LogUploadCallback& upload_callback) override; | |
| 20 scoped_ptr<UploadJob> CreateUploadJob(const GURL&, | |
| 21 UploadJob::Delegate*) override; | |
| 22 }; | |
| 23 | |
| 24 // MockSystemLogUploadJob - mock class that stores the SUCCESS or FAILURE | |
| 25 // response and invokes appropriate SystemLogUploader's callback. | |
| 26 class MockSystemLogUploadJob : public SystemLogUploadJob { | |
| 27 public: | |
| 28 // Store response from server on system log upload. | |
| 29 explicit MockSystemLogUploadJob( | |
| 30 scoped_ptr<MockSystemLogDelegate> syslog_delegate, | |
| 31 bool response); | |
| 32 ~MockSystemLogUploadJob() override; | |
| 33 | |
| 34 // Runs succeeded or failed callback according to response_ stored. | |
| 35 void Run(const base::Closure& succeeded_callback, | |
| 36 const base::Closure& failed_callback) override; | |
| 37 | |
| 38 private: | |
| 39 bool response_; | |
| 40 }; | |
| 41 | |
| 42 // MockSystemLogUploader - overrides only the creation of the system log | |
| 43 // upload job of SystemLogUploader. | |
| 44 class MockSystemLogUploader : public SystemLogUploader { | |
| 45 public: | |
| 46 MockSystemLogUploader( | |
| 47 const scoped_refptr<base::SequencedTaskRunner>& task_runner, | |
| 48 bool result); | |
| 49 | |
| 50 private: | |
| 51 SystemLogUploadJob* CreateSystemLogUploadJob() override; | |
| 52 // Passed to the upload job. | |
| 53 bool response_; | |
| 54 }; | |
| 55 | |
| 56 MockSystemLogUploader::MockSystemLogUploader( | |
| 57 const scoped_refptr<base::SequencedTaskRunner>& task_runner, | |
| 58 bool response) | |
| 59 : SystemLogUploader(task_runner), response_(response) { | |
| 60 } | |
| 61 | |
| 62 SystemLogUploadJob* MockSystemLogUploader::CreateSystemLogUploadJob() { | |
| 63 // Passes |response_| to the upload job. | |
| 64 return new MockSystemLogUploadJob( | |
| 65 make_scoped_ptr(new MockSystemLogDelegate()), response_); | |
| 66 } | |
| 67 | |
| 68 class SystemLogUploaderTest : public testing::Test { | |
| 69 public: | |
| 70 SystemLogUploaderTest() : task_runner_(new base::TestSimpleTaskRunner()) {} | |
| 71 | |
| 72 // Given a pending task to upload system logs. | |
| 73 void RunPendingUploadTaskAndCheckNext(const MockSystemLogUploader& uploader, | |
| 74 base::TimeDelta expected_delay) { | |
| 75 EXPECT_FALSE(task_runner_->GetPendingTasks().empty()); | |
| 76 task_runner_->RunPendingTasks(); | |
| 77 | |
| 78 // The previours task scheduled new log upload task. | |
| 79 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size()); | |
| 80 | |
| 81 CheckPendingTaskDelay(uploader, expected_delay); | |
| 82 } | |
| 83 | |
| 84 void CheckPendingTaskDelay(const MockSystemLogUploader& uploader, | |
| 85 base::TimeDelta expected_delay) { | |
| 86 // The next task should be scheduled sometime between | |
| 87 // |last_upload_attempt| + |expected_delay| and | |
| 88 // |now| + |expected_delay|. | |
| 89 base::Time now = base::Time::NowFromSystemTime(); | |
| 90 base::Time next_task = now + task_runner_->NextPendingTaskDelay(); | |
| 91 | |
| 92 EXPECT_LE(next_task, now + expected_delay); | |
| 93 EXPECT_GE(next_task, uploader.last_upload_attempt() + expected_delay); | |
| 94 } | |
| 95 | |
| 96 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | |
| 97 }; | |
| 98 | |
| 99 MockSystemLogDelegate::MockSystemLogDelegate() { | |
| 100 } | |
| 101 | |
| 102 MockSystemLogDelegate::~MockSystemLogDelegate() { | |
| 103 } | |
| 104 | |
| 105 void MockSystemLogDelegate::LoadSystemLogs( | |
| 106 const SystemLogUploadJob::LogUploadCallback& upload_callback) { | |
| 107 } | |
| 108 | |
| 109 scoped_ptr<UploadJob> MockSystemLogDelegate::CreateUploadJob( | |
| 110 const GURL& upload_url, | |
| 111 UploadJob::Delegate* delegate) { | |
| 112 return nullptr; | |
| 113 } | |
| 114 | |
| 115 MockSystemLogUploadJob::MockSystemLogUploadJob( | |
| 116 scoped_ptr<MockSystemLogDelegate> syslog_delegate, | |
| 117 bool response) | |
| 118 : SystemLogUploadJob(syslog_delegate.Pass()), response_(response) { | |
| 119 } | |
| 120 | |
| 121 MockSystemLogUploadJob::~MockSystemLogUploadJob() { | |
| 122 } | |
| 123 | |
| 124 void MockSystemLogUploadJob::Run(const base::Closure& succeeded_callback, | |
| 125 const base::Closure& failed_callback) { | |
| 126 if (response_) | |
| 127 succeeded_callback.Run(); | |
| 128 else | |
| 129 failed_callback.Run(); | |
| 130 } | |
| 131 | |
| 132 // One success task pending. | |
| 133 TEST_F(SystemLogUploaderTest, SuccessTest) { | |
| 134 EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); | |
| 135 | |
| 136 MockSystemLogUploader uploader(task_runner_, true); | |
| 137 | |
| 138 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size()); | |
| 139 | |
| 140 CheckPendingTaskDelay(uploader, | |
| 141 base::TimeDelta::FromMilliseconds( | |
| 142 SystemLogUploader::kDefaultUploadDelayMs)); | |
| 143 } | |
| 144 | |
| 145 // Three failed responses recieved. | |
| 146 TEST_F(SystemLogUploaderTest, ThreeFailureTest) { | |
| 147 EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); | |
| 148 MockSystemLogUploader uploader(task_runner_, false); | |
| 149 | |
| 150 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size()); | |
| 151 | |
| 152 // Do not retry two times consequentially. | |
| 153 RunPendingUploadTaskAndCheckNext(uploader, | |
| 154 base::TimeDelta::FromMilliseconds( | |
| 155 SystemLogUploader::kErrorUploadDelayMs)); | |
| 156 RunPendingUploadTaskAndCheckNext( | |
| 157 uploader, base::TimeDelta::FromMilliseconds( | |
| 158 SystemLogUploader::kDefaultUploadDelayMs)); | |
| 159 RunPendingUploadTaskAndCheckNext(uploader, | |
| 160 base::TimeDelta::FromMilliseconds( | |
| 161 SystemLogUploader::kErrorUploadDelayMs)); | |
| 162 } | |
|
Andrew T Wilson (Slow)
2015/07/03 16:20:00
Good, you've covered the cases of making sure that
Polina Bondarenko
2015/07/10 13:24:22
I decided to test it separately. Thus here is the
| |
| 163 | |
| 164 } // namespace policy | |
| OLD | NEW |