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 "chrome/browser/chromeos/policy/heartbeat_scheduler.h" | 5 #include "chrome/browser/chromeos/policy/heartbeat_scheduler.h" |
6 | 6 |
| 7 #include "base/macros.h" |
7 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
8 #include "base/test/test_simple_task_runner.h" | 9 #include "base/test/test_simple_task_runner.h" |
9 #include "chrome/browser/chromeos/settings/scoped_cros_settings_test_helper.h" | 10 #include "chrome/browser/chromeos/settings/scoped_cros_settings_test_helper.h" |
10 #include "chromeos/settings/cros_settings_names.h" | 11 #include "chromeos/settings/cros_settings_names.h" |
| 12 #include "components/gcm_driver/common/gcm_messages.h" |
11 #include "components/gcm_driver/fake_gcm_driver.h" | 13 #include "components/gcm_driver/fake_gcm_driver.h" |
12 #include "components/policy/core/common/cloud/cloud_policy_client.h" | 14 #include "components/policy/core/common/cloud/cloud_policy_client.h" |
13 #include "components/policy/core/common/cloud/mock_cloud_policy_client.h" | 15 #include "components/policy/core/common/cloud/mock_cloud_policy_client.h" |
14 #include "content/public/test/test_utils.h" | 16 #include "content/public/test/test_utils.h" |
| 17 #include "net/base/ip_endpoint.h" |
15 #include "testing/gmock/include/gmock/gmock.h" | 18 #include "testing/gmock/include/gmock/gmock.h" |
16 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
17 | 20 |
18 using ::testing::_; | 21 using ::testing::_; |
| 22 using ::testing::AnyNumber; |
| 23 using ::testing::AtLeast; |
| 24 using ::testing::Contains; |
| 25 using ::testing::Field; |
| 26 using ::testing::Key; |
| 27 using ::testing::Matches; |
| 28 using ::testing::Pair; |
19 using ::testing::SaveArg; | 29 using ::testing::SaveArg; |
20 | 30 |
21 namespace { | 31 namespace { |
22 const char* const kFakeEnrollmentDomain = "example.com"; | 32 const char* const kFakeEnrollmentDomain = "example.com"; |
23 const char* const kFakeDeviceId = "fake_device_id"; | 33 const char* const kFakeDeviceId = "fake_device_id"; |
24 const char* const kHeartbeatGCMAppID = "com.google.chromeos.monitoring"; | 34 const char* const kHeartbeatGCMAppID = "com.google.chromeos.monitoring"; |
25 const char* const kRegistrationId = "registration_id"; | 35 const char* const kRegistrationId = "registration_id"; |
26 const char* const kDMToken = "fake_dm_token"; | 36 const char* const kDMToken = "fake_dm_token"; |
27 | 37 |
| 38 MATCHER(IsHeartbeatMsg, "") { |
| 39 return Matches( |
| 40 Field(&gcm::OutgoingMessage::data, Contains(Pair("type", "hb"))))(arg); |
| 41 } |
| 42 |
| 43 MATCHER(IsUpstreamNotificationMsg, "") { |
| 44 return Matches(Field(&gcm::OutgoingMessage::data, Contains(Key("notify"))))( |
| 45 arg); |
| 46 } |
| 47 |
28 class MockGCMDriver : public testing::StrictMock<gcm::FakeGCMDriver> { | 48 class MockGCMDriver : public testing::StrictMock<gcm::FakeGCMDriver> { |
29 public: | 49 public: |
30 MockGCMDriver() { | 50 MockGCMDriver() { IgnoreDefaultHeartbeatsInterval(); } |
31 } | |
32 | 51 |
33 ~MockGCMDriver() override { | 52 ~MockGCMDriver() override { |
34 } | 53 } |
35 | 54 |
36 MOCK_METHOD2(RegisterImpl, | 55 MOCK_METHOD2(RegisterImpl, |
37 void(const std::string&, const std::vector<std::string>&)); | 56 void(const std::string&, const std::vector<std::string>&)); |
38 MOCK_METHOD3(SendImpl, | 57 MOCK_METHOD3(SendImpl, |
39 void(const std::string&, | 58 void(const std::string&, |
40 const std::string&, | 59 const std::string&, |
41 const gcm::OutgoingMessage& message)); | 60 const gcm::OutgoingMessage& message)); |
42 | 61 |
| 62 MOCK_METHOD2(AddHeartbeatInterval, |
| 63 void(const std::string& scope, int interval_ms)); |
| 64 |
43 // Helper function to complete a registration previously started by | 65 // Helper function to complete a registration previously started by |
44 // Register(). | 66 // Register(). |
45 void CompleteRegistration(const std::string& app_id, | 67 void CompleteRegistration(const std::string& app_id, |
46 gcm::GCMClient::Result result) { | 68 gcm::GCMClient::Result result) { |
47 RegisterFinished(app_id, kRegistrationId, result); | 69 RegisterFinished(app_id, kRegistrationId, result); |
48 } | 70 } |
49 | 71 |
50 // Helper function to complete a send operation previously started by | 72 // Helper function to complete a send operation previously started by |
51 // Send(). | 73 // Send(). |
52 void CompleteSend(const std::string& app_id, | 74 void CompleteSend(const std::string& app_id, |
53 const std::string& message_id, | 75 const std::string& message_id, |
54 gcm::GCMClient::Result result) { | 76 gcm::GCMClient::Result result) { |
55 SendFinished(app_id, message_id, result); | 77 SendFinished(app_id, message_id, result); |
56 } | 78 } |
| 79 |
| 80 void AddConnectionObserver(gcm::GCMConnectionObserver* observer) override { |
| 81 EXPECT_FALSE(observer_); |
| 82 observer_ = observer; |
| 83 } |
| 84 |
| 85 void RemoveConnectionObserver(gcm::GCMConnectionObserver* observer) override { |
| 86 EXPECT_TRUE(observer_); |
| 87 observer_ = nullptr; |
| 88 } |
| 89 |
| 90 void NotifyConnected() { |
| 91 ASSERT_TRUE(observer_); |
| 92 observer_->OnConnected(net::IPEndPoint()); |
| 93 } |
| 94 |
| 95 void IgnoreDefaultHeartbeatsInterval() { |
| 96 // Ignore default setting for heartbeats interval. |
| 97 EXPECT_CALL(*this, AddHeartbeatInterval(_, 2 * 60 * 1000)) |
| 98 .Times(AnyNumber()); |
| 99 } |
| 100 |
| 101 private: |
| 102 gcm::GCMConnectionObserver* observer_ = nullptr; |
| 103 |
| 104 DISALLOW_COPY_AND_ASSIGN(MockGCMDriver); |
57 }; | 105 }; |
58 | 106 |
59 class HeartbeatSchedulerTest : public testing::Test { | 107 class HeartbeatSchedulerTest : public testing::Test { |
60 public: | 108 public: |
61 HeartbeatSchedulerTest() | 109 HeartbeatSchedulerTest() |
62 : task_runner_(new base::TestSimpleTaskRunner()), | 110 : task_runner_(new base::TestSimpleTaskRunner()), |
63 scheduler_(&gcm_driver_, | 111 scheduler_(&gcm_driver_, |
64 &cloud_policy_client_, | 112 &cloud_policy_client_, |
65 kFakeEnrollmentDomain, | 113 kFakeEnrollmentDomain, |
66 kFakeDeviceId, | 114 kFakeDeviceId, |
(...skipping 22 matching lines...) Expand all Loading... |
89 // smaller than |expected_delay|. | 137 // smaller than |expected_delay|. |
90 // | 138 // |
91 // We do know that the task was posted sometime between |last_heartbeat| | 139 // We do know that the task was posted sometime between |last_heartbeat| |
92 // and |now|, so we know that 0 <= |expected_delay| - |actual_delay| <= | 140 // and |now|, so we know that 0 <= |expected_delay| - |actual_delay| <= |
93 // |now| - |last_heartbeat|. | 141 // |now| - |last_heartbeat|. |
94 base::TimeDelta delta = expected_delay - actual_delay; | 142 base::TimeDelta delta = expected_delay - actual_delay; |
95 EXPECT_LE(base::TimeDelta(), delta); | 143 EXPECT_LE(base::TimeDelta(), delta); |
96 EXPECT_GE(now - last_heartbeat, delta); | 144 EXPECT_GE(now - last_heartbeat, delta); |
97 } | 145 } |
98 | 146 |
| 147 void IgnoreUpstreamNotificationMsg() { |
| 148 EXPECT_CALL(gcm_driver_, |
| 149 SendImpl(kHeartbeatGCMAppID, _, IsUpstreamNotificationMsg())) |
| 150 .Times(AnyNumber()); |
| 151 } |
| 152 |
99 base::MessageLoop loop_; | 153 base::MessageLoop loop_; |
100 MockGCMDriver gcm_driver_; | 154 MockGCMDriver gcm_driver_; |
101 chromeos::ScopedCrosSettingsTestHelper settings_helper_; | 155 chromeos::ScopedCrosSettingsTestHelper settings_helper_; |
102 testing::NiceMock<policy::MockCloudPolicyClient> cloud_policy_client_; | 156 testing::NiceMock<policy::MockCloudPolicyClient> cloud_policy_client_; |
103 | 157 |
104 // TaskRunner used to run individual tests. | 158 // TaskRunner used to run individual tests. |
105 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | 159 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
106 | 160 |
107 // The HeartbeatScheduler instance under test. | 161 // The HeartbeatScheduler instance under test. |
108 policy::HeartbeatScheduler scheduler_; | 162 policy::HeartbeatScheduler scheduler_; |
(...skipping 11 matching lines...) Expand all Loading... |
120 EXPECT_CALL(gcm_driver_, RegisterImpl(kHeartbeatGCMAppID, _)); | 174 EXPECT_CALL(gcm_driver_, RegisterImpl(kHeartbeatGCMAppID, _)); |
121 settings_helper_.SetBoolean(chromeos::kHeartbeatEnabled, true); | 175 settings_helper_.SetBoolean(chromeos::kHeartbeatEnabled, true); |
122 gcm_driver_.CompleteRegistration( | 176 gcm_driver_.CompleteRegistration( |
123 kHeartbeatGCMAppID, gcm::GCMClient::GCM_DISABLED); | 177 kHeartbeatGCMAppID, gcm::GCMClient::GCM_DISABLED); |
124 | 178 |
125 // There should be no heartbeat tasks pending, because registration failed. | 179 // There should be no heartbeat tasks pending, because registration failed. |
126 ASSERT_TRUE(task_runner_->GetPendingTasks().empty()); | 180 ASSERT_TRUE(task_runner_->GetPendingTasks().empty()); |
127 } | 181 } |
128 | 182 |
129 TEST_F(HeartbeatSchedulerTest, TemporarilyFailedGCMRegistration) { | 183 TEST_F(HeartbeatSchedulerTest, TemporarilyFailedGCMRegistration) { |
| 184 IgnoreUpstreamNotificationMsg(); |
| 185 |
130 EXPECT_CALL(gcm_driver_, RegisterImpl(kHeartbeatGCMAppID, _)); | 186 EXPECT_CALL(gcm_driver_, RegisterImpl(kHeartbeatGCMAppID, _)); |
131 settings_helper_.SetBoolean(chromeos::kHeartbeatEnabled, true); | 187 settings_helper_.SetBoolean(chromeos::kHeartbeatEnabled, true); |
132 gcm_driver_.CompleteRegistration( | 188 gcm_driver_.CompleteRegistration( |
133 kHeartbeatGCMAppID, gcm::GCMClient::SERVER_ERROR); | 189 kHeartbeatGCMAppID, gcm::GCMClient::SERVER_ERROR); |
134 testing::Mock::VerifyAndClearExpectations(&gcm_driver_); | 190 testing::Mock::VerifyAndClearExpectations(&gcm_driver_); |
135 | 191 |
| 192 IgnoreUpstreamNotificationMsg(); |
| 193 gcm_driver_.IgnoreDefaultHeartbeatsInterval(); |
| 194 |
136 // Should have a pending task to try registering again. | 195 // Should have a pending task to try registering again. |
137 ASSERT_FALSE(task_runner_->GetPendingTasks().empty()); | 196 ASSERT_FALSE(task_runner_->GetPendingTasks().empty()); |
138 EXPECT_CALL(gcm_driver_, RegisterImpl(kHeartbeatGCMAppID, _)); | 197 EXPECT_CALL(gcm_driver_, RegisterImpl(kHeartbeatGCMAppID, _)); |
139 task_runner_->RunPendingTasks(); | 198 task_runner_->RunPendingTasks(); |
140 testing::Mock::VerifyAndClearExpectations(&gcm_driver_); | 199 testing::Mock::VerifyAndClearExpectations(&gcm_driver_); |
141 | 200 |
| 201 IgnoreUpstreamNotificationMsg(); |
| 202 gcm_driver_.IgnoreDefaultHeartbeatsInterval(); |
| 203 |
142 // Once we have successfully registered, we should send a heartbeat. | 204 // Once we have successfully registered, we should send a heartbeat. |
143 EXPECT_CALL(gcm_driver_, SendImpl(kHeartbeatGCMAppID, _, _)); | 205 EXPECT_CALL(gcm_driver_, SendImpl(kHeartbeatGCMAppID, _, IsHeartbeatMsg())); |
144 gcm_driver_.CompleteRegistration( | 206 gcm_driver_.CompleteRegistration( |
145 kHeartbeatGCMAppID, gcm::GCMClient::SUCCESS); | 207 kHeartbeatGCMAppID, gcm::GCMClient::SUCCESS); |
146 task_runner_->RunPendingTasks(); | 208 task_runner_->RunPendingTasks(); |
147 } | 209 } |
148 | 210 |
149 TEST_F(HeartbeatSchedulerTest, ChangeHeartbeatFrequency) { | 211 TEST_F(HeartbeatSchedulerTest, ChangeHeartbeatFrequency) { |
| 212 IgnoreUpstreamNotificationMsg(); |
| 213 |
150 EXPECT_CALL(gcm_driver_, RegisterImpl(kHeartbeatGCMAppID, _)); | 214 EXPECT_CALL(gcm_driver_, RegisterImpl(kHeartbeatGCMAppID, _)); |
151 settings_helper_.SetBoolean(chromeos::kHeartbeatEnabled, true); | 215 settings_helper_.SetBoolean(chromeos::kHeartbeatEnabled, true); |
152 gcm_driver_.CompleteRegistration( | 216 gcm_driver_.CompleteRegistration( |
153 kHeartbeatGCMAppID, gcm::GCMClient::SUCCESS); | 217 kHeartbeatGCMAppID, gcm::GCMClient::SUCCESS); |
154 | 218 |
155 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size()); | 219 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size()); |
156 // Should have a heartbeat task posted with zero delay on startup. | 220 // Should have a heartbeat task posted with zero delay on startup. |
157 EXPECT_EQ(base::TimeDelta(), task_runner_->NextPendingTaskDelay()); | 221 EXPECT_EQ(base::TimeDelta(), task_runner_->NextPendingTaskDelay()); |
158 testing::Mock::VerifyAndClearExpectations(&gcm_driver_); | 222 testing::Mock::VerifyAndClearExpectations(&gcm_driver_); |
159 | 223 |
| 224 IgnoreUpstreamNotificationMsg(); |
| 225 gcm_driver_.IgnoreDefaultHeartbeatsInterval(); |
| 226 |
160 const int new_delay = 1234*1000; // 1234 seconds. | 227 const int new_delay = 1234*1000; // 1234 seconds. |
| 228 EXPECT_CALL(gcm_driver_, AddHeartbeatInterval(_, new_delay)); |
161 settings_helper_.SetInteger(chromeos::kHeartbeatFrequency, new_delay); | 229 settings_helper_.SetInteger(chromeos::kHeartbeatFrequency, new_delay); |
162 // Now run pending heartbeat task, should send a heartbeat. | 230 // Now run pending heartbeat task, should send a heartbeat. |
163 gcm::OutgoingMessage message; | 231 gcm::OutgoingMessage message; |
164 EXPECT_CALL(gcm_driver_, SendImpl(kHeartbeatGCMAppID, _, _)) | 232 EXPECT_CALL(gcm_driver_, SendImpl(kHeartbeatGCMAppID, _, IsHeartbeatMsg())) |
165 .WillOnce(SaveArg<2>(&message)); | 233 .WillOnce(SaveArg<2>(&message)); |
166 task_runner_->RunPendingTasks(); | 234 task_runner_->RunPendingTasks(); |
167 EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); | 235 EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); |
168 | 236 |
169 // Complete sending a message - we should queue up the next heartbeat | 237 // Complete sending a message - we should queue up the next heartbeat |
170 // even if the previous attempt failed. | 238 // even if the previous attempt failed. |
171 gcm_driver_.CompleteSend( | 239 gcm_driver_.CompleteSend( |
172 kHeartbeatGCMAppID, message.id, gcm::GCMClient::SERVER_ERROR); | 240 kHeartbeatGCMAppID, message.id, gcm::GCMClient::SERVER_ERROR); |
173 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size()); | 241 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size()); |
174 CheckPendingTaskDelay(scheduler_.last_heartbeat(), | 242 CheckPendingTaskDelay(scheduler_.last_heartbeat(), |
175 base::TimeDelta::FromMilliseconds(new_delay)); | 243 base::TimeDelta::FromMilliseconds(new_delay)); |
176 } | 244 } |
177 | 245 |
178 TEST_F(HeartbeatSchedulerTest, DisableHeartbeats) { | 246 TEST_F(HeartbeatSchedulerTest, DisableHeartbeats) { |
| 247 IgnoreUpstreamNotificationMsg(); |
| 248 |
179 // Makes sure that we can disable heartbeats on the fly. | 249 // Makes sure that we can disable heartbeats on the fly. |
180 EXPECT_CALL(gcm_driver_, RegisterImpl(kHeartbeatGCMAppID, _)); | 250 EXPECT_CALL(gcm_driver_, RegisterImpl(kHeartbeatGCMAppID, _)); |
181 settings_helper_.SetBoolean(chromeos::kHeartbeatEnabled, true); | 251 settings_helper_.SetBoolean(chromeos::kHeartbeatEnabled, true); |
182 gcm::OutgoingMessage message; | 252 gcm::OutgoingMessage message; |
183 EXPECT_CALL(gcm_driver_, SendImpl(kHeartbeatGCMAppID, _, _)) | 253 EXPECT_CALL(gcm_driver_, SendImpl(kHeartbeatGCMAppID, _, IsHeartbeatMsg())) |
184 .WillOnce(SaveArg<2>(&message)); | 254 .WillOnce(SaveArg<2>(&message)); |
185 gcm_driver_.CompleteRegistration( | 255 gcm_driver_.CompleteRegistration( |
186 kHeartbeatGCMAppID, gcm::GCMClient::SUCCESS); | 256 kHeartbeatGCMAppID, gcm::GCMClient::SUCCESS); |
187 // Should have a heartbeat task posted. | 257 // Should have a heartbeat task posted. |
188 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size()); | 258 EXPECT_EQ(1U, task_runner_->GetPendingTasks().size()); |
189 task_runner_->RunPendingTasks(); | 259 task_runner_->RunPendingTasks(); |
190 | 260 |
191 // Complete sending a message - we should queue up the next heartbeat. | 261 // Complete sending a message - we should queue up the next heartbeat. |
192 gcm_driver_.CompleteSend( | 262 gcm_driver_.CompleteSend( |
193 kHeartbeatGCMAppID, message.id, gcm::GCMClient::SUCCESS); | 263 kHeartbeatGCMAppID, message.id, gcm::GCMClient::SUCCESS); |
194 | 264 |
195 // Should have a new heartbeat task posted. | 265 // Should have a new heartbeat task posted. |
196 ASSERT_EQ(1U, task_runner_->GetPendingTasks().size()); | 266 ASSERT_EQ(1U, task_runner_->GetPendingTasks().size()); |
197 CheckPendingTaskDelay( | 267 CheckPendingTaskDelay( |
198 scheduler_.last_heartbeat(), | 268 scheduler_.last_heartbeat(), |
199 base::TimeDelta::FromMilliseconds( | 269 base::TimeDelta::FromMilliseconds( |
200 policy::HeartbeatScheduler::kDefaultHeartbeatIntervalMs)); | 270 policy::HeartbeatScheduler::kDefaultHeartbeatIntervalMs)); |
201 testing::Mock::VerifyAndClearExpectations(&gcm_driver_); | 271 testing::Mock::VerifyAndClearExpectations(&gcm_driver_); |
202 | 272 |
| 273 IgnoreUpstreamNotificationMsg(); |
| 274 gcm_driver_.IgnoreDefaultHeartbeatsInterval(); |
| 275 |
203 // Now disable heartbeats. Should get no more heartbeats sent. | 276 // Now disable heartbeats. Should get no more heartbeats sent. |
204 settings_helper_.SetBoolean(chromeos::kHeartbeatEnabled, false); | 277 settings_helper_.SetBoolean(chromeos::kHeartbeatEnabled, false); |
205 task_runner_->RunPendingTasks(); | 278 task_runner_->RunPendingTasks(); |
206 EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); | 279 EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); |
207 } | 280 } |
208 | 281 |
209 TEST_F(HeartbeatSchedulerTest, CheckMessageContents) { | 282 TEST_F(HeartbeatSchedulerTest, CheckMessageContents) { |
| 283 IgnoreUpstreamNotificationMsg(); |
| 284 |
210 gcm::OutgoingMessage message; | 285 gcm::OutgoingMessage message; |
211 EXPECT_CALL(gcm_driver_, RegisterImpl(kHeartbeatGCMAppID, _)); | 286 EXPECT_CALL(gcm_driver_, RegisterImpl(kHeartbeatGCMAppID, _)); |
212 EXPECT_CALL(gcm_driver_, SendImpl(kHeartbeatGCMAppID, _, _)) | 287 EXPECT_CALL(gcm_driver_, SendImpl(kHeartbeatGCMAppID, _, IsHeartbeatMsg())) |
213 .WillOnce(SaveArg<2>(&message)); | 288 .WillOnce(SaveArg<2>(&message)); |
214 settings_helper_.SetBoolean(chromeos::kHeartbeatEnabled, true); | 289 settings_helper_.SetBoolean(chromeos::kHeartbeatEnabled, true); |
215 gcm_driver_.CompleteRegistration( | 290 gcm_driver_.CompleteRegistration( |
216 kHeartbeatGCMAppID, gcm::GCMClient::SUCCESS); | 291 kHeartbeatGCMAppID, gcm::GCMClient::SUCCESS); |
217 task_runner_->RunPendingTasks(); | 292 task_runner_->RunPendingTasks(); |
218 | 293 |
219 // Heartbeats should have a time-to-live equivalent to the heartbeat frequency | 294 // Heartbeats should have a time-to-live equivalent to the heartbeat frequency |
220 // so we don't have more than one heartbeat queued at a time. | 295 // so we don't have more than one heartbeat queued at a time. |
221 EXPECT_EQ(policy::HeartbeatScheduler::kDefaultHeartbeatIntervalMs/1000, | 296 EXPECT_EQ(policy::HeartbeatScheduler::kDefaultHeartbeatIntervalMs/1000, |
222 message.time_to_live); | 297 message.time_to_live); |
223 | 298 |
224 // Check the values in the message payload. | 299 // Check the values in the message payload. |
225 EXPECT_EQ("hb", message.data["type"]); | 300 EXPECT_EQ("hb", message.data["type"]); |
226 int64 timestamp; | 301 int64 timestamp; |
227 EXPECT_TRUE(base::StringToInt64(message.data["timestamp"], ×tamp)); | 302 EXPECT_TRUE(base::StringToInt64(message.data["timestamp"], ×tamp)); |
228 EXPECT_EQ(kFakeEnrollmentDomain, message.data["domain_name"]); | 303 EXPECT_EQ(kFakeEnrollmentDomain, message.data["domain_name"]); |
229 EXPECT_EQ(kFakeDeviceId, message.data["device_id"]); | 304 EXPECT_EQ(kFakeDeviceId, message.data["device_id"]); |
230 } | 305 } |
231 | 306 |
232 TEST_F(HeartbeatSchedulerTest, SendGcmIdUpdate) { | 307 TEST_F(HeartbeatSchedulerTest, SendGcmIdUpdate) { |
233 // Verifies that GCM id update request was sent after GCM registration. | 308 // Verifies that GCM id update request was sent after GCM registration. |
234 cloud_policy_client_.SetDMToken(kDMToken); | 309 cloud_policy_client_.SetDMToken(kDMToken); |
235 policy::CloudPolicyClient::StatusCallback callback; | 310 policy::CloudPolicyClient::StatusCallback callback; |
236 EXPECT_CALL(cloud_policy_client_, UpdateGcmId(kRegistrationId, _)) | 311 EXPECT_CALL(cloud_policy_client_, UpdateGcmId(kRegistrationId, _)) |
237 .WillOnce(SaveArg<1>(&callback)); | 312 .WillOnce(SaveArg<1>(&callback)); |
238 | 313 |
239 // Enable heartbeats. | 314 // Enable heartbeats. |
240 EXPECT_CALL(gcm_driver_, RegisterImpl(kHeartbeatGCMAppID, _)); | 315 EXPECT_CALL(gcm_driver_, RegisterImpl(kHeartbeatGCMAppID, _)); |
241 EXPECT_CALL(gcm_driver_, SendImpl(kHeartbeatGCMAppID, _, _)); | 316 EXPECT_CALL(gcm_driver_, SendImpl(kHeartbeatGCMAppID, _, _)) |
| 317 .Times(AtLeast(1)); |
242 settings_helper_.SetBoolean(chromeos::kHeartbeatEnabled, true); | 318 settings_helper_.SetBoolean(chromeos::kHeartbeatEnabled, true); |
243 gcm_driver_.CompleteRegistration(kHeartbeatGCMAppID, gcm::GCMClient::SUCCESS); | 319 gcm_driver_.CompleteRegistration(kHeartbeatGCMAppID, gcm::GCMClient::SUCCESS); |
244 task_runner_->RunPendingTasks(); | 320 task_runner_->RunPendingTasks(); |
245 | 321 |
246 // Verifies that CloudPolicyClient got the update request, with a valid | 322 // Verifies that CloudPolicyClient got the update request, with a valid |
247 // callback. | 323 // callback. |
248 testing::Mock::VerifyAndClearExpectations(&cloud_policy_client_); | 324 testing::Mock::VerifyAndClearExpectations(&cloud_policy_client_); |
249 EXPECT_FALSE(callback.is_null()); | 325 EXPECT_FALSE(callback.is_null()); |
250 callback.Run(true); | 326 callback.Run(true); |
251 } | 327 } |
252 | 328 |
| 329 TEST_F(HeartbeatSchedulerTest, GcmUpstreamNotificationSignup) { |
| 330 // Verifies that upstream notification works as expected. |
| 331 cloud_policy_client_.SetDMToken(kDMToken); |
| 332 EXPECT_CALL(gcm_driver_, RegisterImpl(kHeartbeatGCMAppID, _)) |
| 333 .Times(AnyNumber()); |
| 334 EXPECT_CALL(cloud_policy_client_, UpdateGcmId(kRegistrationId, _)); |
| 335 |
| 336 // GCM connected event before the registration should be ignored. |
| 337 settings_helper_.SetBoolean(chromeos::kHeartbeatEnabled, true); |
| 338 gcm_driver_.NotifyConnected(); |
| 339 task_runner_->RunPendingTasks(); |
| 340 testing::Mock::VerifyAndClearExpectations(&gcm_driver_); |
| 341 |
| 342 // Ignore unintested calls. |
| 343 EXPECT_CALL(gcm_driver_, RegisterImpl(kHeartbeatGCMAppID, _)) |
| 344 .Times(AnyNumber()); |
| 345 EXPECT_CALL(gcm_driver_, SendImpl(kHeartbeatGCMAppID, _, IsHeartbeatMsg())) |
| 346 .Times(AnyNumber()); |
| 347 gcm_driver_.IgnoreDefaultHeartbeatsInterval(); |
| 348 |
| 349 EXPECT_CALL(gcm_driver_, |
| 350 SendImpl(kHeartbeatGCMAppID, _, IsUpstreamNotificationMsg())) |
| 351 .Times(AtLeast(1)); |
| 352 gcm_driver_.CompleteRegistration(kHeartbeatGCMAppID, gcm::GCMClient::SUCCESS); |
| 353 |
| 354 gcm_driver_.NotifyConnected(); |
| 355 } |
| 356 |
253 } // namespace | 357 } // namespace |
OLD | NEW |