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 namespace { | |
13 | |
14 // MockSystemLogDelegate - mock class that does nothing. | |
15 class MockSystemLogDelegate : public SystemLogUploadJob::Delegate { | |
16 public: | |
17 MockSystemLogDelegate() {} | |
18 ~MockSystemLogDelegate() override {} | |
19 | |
20 void LoadSystemLogs(const LogUploadCallback& upload_callback) override {} | |
21 scoped_ptr<UploadJob> CreateUploadJob(const GURL&, | |
Andrew T Wilson (Slow)
2015/07/17 15:59:28
Maybe explain that neither of these should ever be
Polina Bondarenko
2015/07/29 15:36:02
Changed the system log upload logic here: https://
| |
22 UploadJob::Delegate*) override { | |
23 return nullptr; | |
24 } | |
25 }; | |
26 | |
27 // MockSystemLogUploadJob - mock class that invokes appropriate | |
28 // SystemLogUploader's callback. | |
29 class MockSystemLogUploadJob : public SystemLogUploadJob { | |
30 public: | |
31 // Store response from server on system log upload. | |
32 explicit MockSystemLogUploadJob( | |
33 scoped_ptr<MockSystemLogDelegate> syslog_delegate, | |
34 const base::Closure& succeeded_callback, | |
35 const base::Closure& failed_callback, | |
36 bool response) | |
37 : SystemLogUploadJob(syslog_delegate.Pass(), | |
38 succeeded_callback, | |
39 failed_callback) { | |
40 // Store only appropriate callback to be invoked. | |
41 if (response) | |
42 callback = succeeded_callback; | |
43 else | |
44 callback = failed_callback; | |
45 } | |
46 | |
47 ~MockSystemLogUploadJob() override {} | |
48 | |
49 // Runs succeeded or failed callback according to response_ stored. | |
50 void Run() override { callback.Run(); } | |
Andrew T Wilson (Slow)
2015/07/17 15:59:28
This is OK, but would be even better if we could e
Polina Bondarenko
2015/07/29 15:36:02
Removed this MockSystemLogUploadJob at all.
| |
51 | |
52 private: | |
53 base::Closure callback; | |
54 }; | |
55 | |
56 // MockSystemLogUploader - overrides only the creation of the system log | |
57 // upload job of SystemLogUploader. | |
58 class MockSystemLogUploader : public SystemLogUploader { | |
59 public: | |
60 MockSystemLogUploader( | |
61 const scoped_refptr<base::SequencedTaskRunner>& task_runner, | |
62 bool response) | |
63 : SystemLogUploader(task_runner), response_(response) {} | |
64 | |
65 private: | |
66 SystemLogUploadJob* CreateSystemLogUploadJob( | |
67 const base::Closure& succeeded_callback, | |
68 const base::Closure& failed_callback) override { | |
69 // Passes |response_| to the upload job. | |
70 return new MockSystemLogUploadJob( | |
71 make_scoped_ptr(new MockSystemLogDelegate()), succeeded_callback, | |
72 failed_callback, response_); | |
73 } | |
74 | |
75 // Passed to the upload job. | |
76 bool response_; | |
77 }; | |
78 | |
79 } // namespace | |
80 | |
81 class SystemLogUploaderTest : public testing::Test { | |
82 public: | |
83 SystemLogUploaderTest() : task_runner_(new base::TestSimpleTaskRunner()) {} | |
84 | |
85 // Given a pending task to upload system logs. | |
86 void RunPendingUploadTaskAndCheckNext(const MockSystemLogUploader& uploader, | |
87 base::TimeDelta expected_delay) { | |
88 EXPECT_FALSE(task_runner_->GetPendingTasks().empty()); | |
89 task_runner_->RunPendingTasks(); | |
90 | |
91 // The previours task scheduled new log upload task. | |
Andrew T Wilson (Slow)
2015/07/17 15:59:28
nit: The previous task should have uploaded anothe
Polina Bondarenko
2015/07/29 15:36:02
Done.
| |
92 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size()); | |
93 | |
94 CheckPendingTaskDelay(uploader, expected_delay); | |
95 } | |
96 | |
97 void CheckPendingTaskDelay(const MockSystemLogUploader& uploader, | |
98 base::TimeDelta expected_delay) { | |
99 // The next task should be scheduled sometime between | |
100 // |last_upload_attempt| + |expected_delay| and | |
101 // |now| + |expected_delay|. | |
102 base::Time now = base::Time::NowFromSystemTime(); | |
103 base::Time next_task = now + task_runner_->NextPendingTaskDelay(); | |
104 | |
105 EXPECT_LE(next_task, now + expected_delay); | |
106 EXPECT_GE(next_task, uploader.last_upload_attempt() + expected_delay); | |
107 } | |
108 | |
109 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | |
110 }; | |
111 | |
112 // One success task pending. | |
113 TEST_F(SystemLogUploaderTest, SuccessTest) { | |
114 EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); | |
115 | |
116 MockSystemLogUploader uploader(task_runner_, true); | |
117 | |
118 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size()); | |
119 | |
120 CheckPendingTaskDelay(uploader, | |
121 base::TimeDelta::FromMilliseconds( | |
122 SystemLogUploader::kDefaultUploadDelayMs)); | |
123 } | |
124 | |
125 // Three failed responses recieved. | |
126 TEST_F(SystemLogUploaderTest, ThreeFailureTest) { | |
127 EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); | |
128 | |
129 MockSystemLogUploader uploader(task_runner_, false); | |
130 | |
131 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size()); | |
132 | |
133 // Do not retry two times consequentially. | |
134 RunPendingUploadTaskAndCheckNext(uploader, | |
135 base::TimeDelta::FromMilliseconds( | |
136 SystemLogUploader::kErrorUploadDelayMs)); | |
137 RunPendingUploadTaskAndCheckNext( | |
138 uploader, base::TimeDelta::FromMilliseconds( | |
139 SystemLogUploader::kDefaultUploadDelayMs)); | |
Andrew T Wilson (Slow)
2015/07/17 15:59:28
Maybe highlight that we are using the upload_delay
Polina Bondarenko
2015/07/29 15:36:02
Done.
| |
140 RunPendingUploadTaskAndCheckNext(uploader, | |
141 base::TimeDelta::FromMilliseconds( | |
142 SystemLogUploader::kErrorUploadDelayMs)); | |
143 } | |
144 | |
145 } // namespace policy | |
OLD | NEW |