| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "components/gcm_driver/gcm_client_impl.h" | 5 #include "components/gcm_driver/gcm_client_impl.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/files/file_path.h" | 8 #include "base/files/file_path.h" |
| 9 #include "base/files/file_util.h" | 9 #include "base/files/file_util.h" |
| 10 #include "base/files/scoped_temp_dir.h" | 10 #include "base/files/scoped_temp_dir.h" |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 241 GCMClientImplTest(); | 241 GCMClientImplTest(); |
| 242 ~GCMClientImplTest() override; | 242 ~GCMClientImplTest() override; |
| 243 | 243 |
| 244 void SetUp() override; | 244 void SetUp() override; |
| 245 | 245 |
| 246 void SetUpUrlFetcherFactory(); | 246 void SetUpUrlFetcherFactory(); |
| 247 | 247 |
| 248 void BuildGCMClient(base::TimeDelta clock_step); | 248 void BuildGCMClient(base::TimeDelta clock_step); |
| 249 void InitializeGCMClient(); | 249 void InitializeGCMClient(); |
| 250 void StartGCMClient(); | 250 void StartGCMClient(); |
| 251 void Register(const std::string& app_id, |
| 252 const std::vector<std::string>& senders); |
| 253 void Unregister(const std::string& app_id); |
| 251 void ReceiveMessageFromMCS(const MCSMessage& message); | 254 void ReceiveMessageFromMCS(const MCSMessage& message); |
| 252 void ReceiveOnMessageSentToMCS( | 255 void ReceiveOnMessageSentToMCS( |
| 253 const std::string& app_id, | 256 const std::string& app_id, |
| 254 const std::string& message_id, | 257 const std::string& message_id, |
| 255 const MCSClient::MessageSendStatus status); | 258 const MCSClient::MessageSendStatus status); |
| 256 void CompleteCheckin(uint64 android_id, | 259 void CompleteCheckin(uint64 android_id, |
| 257 uint64 security_token, | 260 uint64 security_token, |
| 258 const std::string& digest, | 261 const std::string& digest, |
| 259 const std::map<std::string, std::string>& settings); | 262 const std::map<std::string, std::string>& settings); |
| 260 void CompleteRegistration(const std::string& registration_id); | 263 void CompleteRegistration(const std::string& registration_id); |
| 261 void CompleteUnregistration(const std::string& app_id); | 264 void CompleteUnregistration(const std::string& app_id); |
| 262 void VerifyPendingRequestFetcherDeleted(); | 265 void VerifyPendingRequestFetcherDeleted(); |
| 263 | 266 |
| 264 bool ExistsRegistration(const std::string& app_id) const; | 267 bool ExistsRegistration(const std::string& app_id) const; |
| 265 void AddRegistration(const std::string& app_id, | 268 void AddRegistration(const std::string& app_id, |
| 266 const std::vector<std::string>& sender_ids, | 269 const std::vector<std::string>& sender_ids, |
| 267 const std::string& registration_id); | 270 const std::string& registration_id); |
| 268 | 271 |
| 269 // GCMClient::Delegate overrides (for verification). | 272 // GCMClient::Delegate overrides (for verification). |
| 270 void OnRegisterFinished(const std::string& app_id, | 273 void OnRegisterFinished(const linked_ptr<RegistrationInfo>& registration_info, |
| 271 const std::string& registration_id, | 274 const std::string& registration_id, |
| 272 GCMClient::Result result) override; | 275 GCMClient::Result result) override; |
| 273 void OnUnregisterFinished(const std::string& app_id, | 276 void OnUnregisterFinished( |
| 274 GCMClient::Result result) override; | 277 const linked_ptr<RegistrationInfo>& registration_info, |
| 278 GCMClient::Result result) override; |
| 275 void OnSendFinished(const std::string& app_id, | 279 void OnSendFinished(const std::string& app_id, |
| 276 const std::string& message_id, | 280 const std::string& message_id, |
| 277 GCMClient::Result result) override {} | 281 GCMClient::Result result) override {} |
| 278 void OnMessageReceived(const std::string& registration_id, | 282 void OnMessageReceived(const std::string& registration_id, |
| 279 const GCMClient::IncomingMessage& message) override; | 283 const GCMClient::IncomingMessage& message) override; |
| 280 void OnMessagesDeleted(const std::string& app_id) override; | 284 void OnMessagesDeleted(const std::string& app_id) override; |
| 281 void OnMessageSendError( | 285 void OnMessageSendError( |
| 282 const std::string& app_id, | 286 const std::string& app_id, |
| 283 const gcm::GCMClient::SendErrorDetails& send_error_details) override; | 287 const gcm::GCMClient::SendErrorDetails& send_error_details) override; |
| 284 void OnSendAcknowledged(const std::string& app_id, | 288 void OnSendAcknowledged(const std::string& app_id, |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 487 fetcher->SetResponseString(response); | 491 fetcher->SetResponseString(response); |
| 488 fetcher->delegate()->OnURLFetchComplete(fetcher); | 492 fetcher->delegate()->OnURLFetchComplete(fetcher); |
| 489 } | 493 } |
| 490 | 494 |
| 491 void GCMClientImplTest::VerifyPendingRequestFetcherDeleted() { | 495 void GCMClientImplTest::VerifyPendingRequestFetcherDeleted() { |
| 492 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); | 496 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); |
| 493 EXPECT_FALSE(fetcher); | 497 EXPECT_FALSE(fetcher); |
| 494 } | 498 } |
| 495 | 499 |
| 496 bool GCMClientImplTest::ExistsRegistration(const std::string& app_id) const { | 500 bool GCMClientImplTest::ExistsRegistration(const std::string& app_id) const { |
| 497 return gcm_client_->registrations_.count(app_id) > 0; | 501 return ExistsGCMRegistrationInMap(gcm_client_->registrations_, app_id); |
| 498 } | 502 } |
| 499 | 503 |
| 500 void GCMClientImplTest::AddRegistration( | 504 void GCMClientImplTest::AddRegistration( |
| 501 const std::string& app_id, | 505 const std::string& app_id, |
| 502 const std::vector<std::string>& sender_ids, | 506 const std::vector<std::string>& sender_ids, |
| 503 const std::string& registration_id) { | 507 const std::string& registration_id) { |
| 504 linked_ptr<RegistrationInfo> registration(new RegistrationInfo); | 508 linked_ptr<GCMRegistrationInfo> registration(new GCMRegistrationInfo); |
| 509 registration->app_id = app_id; |
| 505 registration->sender_ids = sender_ids; | 510 registration->sender_ids = sender_ids; |
| 506 registration->registration_id = registration_id; | 511 gcm_client_->registrations_[registration] = registration_id; |
| 507 gcm_client_->registrations_[app_id] = registration; | |
| 508 } | 512 } |
| 509 | 513 |
| 510 void GCMClientImplTest::InitializeGCMClient() { | 514 void GCMClientImplTest::InitializeGCMClient() { |
| 511 clock()->Advance(base::TimeDelta::FromMilliseconds(1)); | 515 clock()->Advance(base::TimeDelta::FromMilliseconds(1)); |
| 512 | 516 |
| 513 // Actual initialization. | 517 // Actual initialization. |
| 514 GCMClient::ChromeBuildInfo chrome_build_info; | 518 GCMClient::ChromeBuildInfo chrome_build_info; |
| 515 gcm_client_->Initialize(chrome_build_info, | 519 gcm_client_->Initialize(chrome_build_info, |
| 516 temp_directory_.path(), | 520 temp_directory_.path(), |
| 517 message_loop_.message_loop_proxy(), | 521 message_loop_.message_loop_proxy(), |
| 518 url_request_context_getter_, | 522 url_request_context_getter_, |
| 519 make_scoped_ptr<Encryptor>(new FakeEncryptor), | 523 make_scoped_ptr<Encryptor>(new FakeEncryptor), |
| 520 this); | 524 this); |
| 521 } | 525 } |
| 522 | 526 |
| 523 void GCMClientImplTest::StartGCMClient() { | 527 void GCMClientImplTest::StartGCMClient() { |
| 524 // Start loading and check-in. | 528 // Start loading and check-in. |
| 525 gcm_client_->Start(GCMClient::IMMEDIATE_START); | 529 gcm_client_->Start(GCMClient::IMMEDIATE_START); |
| 526 | 530 |
| 527 PumpLoopUntilIdle(); | 531 PumpLoopUntilIdle(); |
| 528 } | 532 } |
| 529 | 533 |
| 534 void GCMClientImplTest::Register(const std::string& app_id, |
| 535 const std::vector<std::string>& senders) { |
| 536 scoped_ptr<GCMRegistrationInfo> gcm_info(new GCMRegistrationInfo); |
| 537 gcm_info->app_id = app_id; |
| 538 gcm_info->sender_ids = senders; |
| 539 gcm_client()->Register(make_linked_ptr<RegistrationInfo>(gcm_info.release())); |
| 540 } |
| 541 |
| 542 void GCMClientImplTest::Unregister(const std::string& app_id) { |
| 543 scoped_ptr<GCMRegistrationInfo> gcm_info(new GCMRegistrationInfo); |
| 544 gcm_info->app_id = app_id; |
| 545 gcm_client()->Unregister( |
| 546 make_linked_ptr<RegistrationInfo>(gcm_info.release())); |
| 547 } |
| 548 |
| 530 void GCMClientImplTest::ReceiveMessageFromMCS(const MCSMessage& message) { | 549 void GCMClientImplTest::ReceiveMessageFromMCS(const MCSMessage& message) { |
| 531 gcm_client_->recorder_.RecordConnectionInitiated(std::string()); | 550 gcm_client_->recorder_.RecordConnectionInitiated(std::string()); |
| 532 gcm_client_->recorder_.RecordConnectionSuccess(); | 551 gcm_client_->recorder_.RecordConnectionSuccess(); |
| 533 gcm_client_->OnMessageReceivedFromMCS(message); | 552 gcm_client_->OnMessageReceivedFromMCS(message); |
| 534 } | 553 } |
| 535 | 554 |
| 536 void GCMClientImplTest::ReceiveOnMessageSentToMCS( | 555 void GCMClientImplTest::ReceiveOnMessageSentToMCS( |
| 537 const std::string& app_id, | 556 const std::string& app_id, |
| 538 const std::string& message_id, | 557 const std::string& message_id, |
| 539 const MCSClient::MessageSendStatus status) { | 558 const MCSClient::MessageSendStatus status) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 551 | 570 |
| 552 void GCMClientImplTest::OnMessageReceived( | 571 void GCMClientImplTest::OnMessageReceived( |
| 553 const std::string& registration_id, | 572 const std::string& registration_id, |
| 554 const GCMClient::IncomingMessage& message) { | 573 const GCMClient::IncomingMessage& message) { |
| 555 last_event_ = MESSAGE_RECEIVED; | 574 last_event_ = MESSAGE_RECEIVED; |
| 556 last_app_id_ = registration_id; | 575 last_app_id_ = registration_id; |
| 557 last_message_ = message; | 576 last_message_ = message; |
| 558 QuitLoop(); | 577 QuitLoop(); |
| 559 } | 578 } |
| 560 | 579 |
| 561 void GCMClientImplTest::OnRegisterFinished(const std::string& app_id, | 580 void GCMClientImplTest::OnRegisterFinished( |
| 562 const std::string& registration_id, | 581 const linked_ptr<RegistrationInfo>& registration_info, |
| 563 GCMClient::Result result) { | 582 const std::string& registration_id, |
| 583 GCMClient::Result result) { |
| 564 last_event_ = REGISTRATION_COMPLETED; | 584 last_event_ = REGISTRATION_COMPLETED; |
| 565 last_app_id_ = app_id; | 585 last_app_id_ = registration_info->app_id; |
| 566 last_registration_id_ = registration_id; | 586 last_registration_id_ = registration_id; |
| 567 last_result_ = result; | 587 last_result_ = result; |
| 568 } | 588 } |
| 569 | 589 |
| 570 void GCMClientImplTest::OnUnregisterFinished(const std::string& app_id, | 590 void GCMClientImplTest::OnUnregisterFinished( |
| 571 GCMClient::Result result) { | 591 const linked_ptr<RegistrationInfo>& registration_info, |
| 592 GCMClient::Result result) { |
| 572 last_event_ = UNREGISTRATION_COMPLETED; | 593 last_event_ = UNREGISTRATION_COMPLETED; |
| 573 last_app_id_ = app_id; | 594 last_app_id_ = registration_info->app_id; |
| 574 last_result_ = result; | 595 last_result_ = result; |
| 575 } | 596 } |
| 576 | 597 |
| 577 void GCMClientImplTest::OnMessagesDeleted(const std::string& app_id) { | 598 void GCMClientImplTest::OnMessagesDeleted(const std::string& app_id) { |
| 578 last_event_ = MESSAGES_DELETED; | 599 last_event_ = MESSAGES_DELETED; |
| 579 last_app_id_ = app_id; | 600 last_app_id_ = app_id; |
| 580 } | 601 } |
| 581 | 602 |
| 582 void GCMClientImplTest::OnMessageSendError( | 603 void GCMClientImplTest::OnMessageSendError( |
| 583 const std::string& app_id, | 604 const std::string& app_id, |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 635 EXPECT_EQ(LOADING_COMPLETED, last_event()); | 656 EXPECT_EQ(LOADING_COMPLETED, last_event()); |
| 636 EXPECT_EQ(kDeviceAndroidId2, mcs_client()->last_android_id()); | 657 EXPECT_EQ(kDeviceAndroidId2, mcs_client()->last_android_id()); |
| 637 EXPECT_EQ(kDeviceSecurityToken2, mcs_client()->last_security_token()); | 658 EXPECT_EQ(kDeviceSecurityToken2, mcs_client()->last_security_token()); |
| 638 } | 659 } |
| 639 | 660 |
| 640 TEST_F(GCMClientImplTest, RegisterApp) { | 661 TEST_F(GCMClientImplTest, RegisterApp) { |
| 641 EXPECT_FALSE(ExistsRegistration(kAppId)); | 662 EXPECT_FALSE(ExistsRegistration(kAppId)); |
| 642 | 663 |
| 643 std::vector<std::string> senders; | 664 std::vector<std::string> senders; |
| 644 senders.push_back("sender"); | 665 senders.push_back("sender"); |
| 645 gcm_client()->Register(kAppId, senders); | 666 Register(kAppId, senders); |
| 646 CompleteRegistration("reg_id"); | 667 CompleteRegistration("reg_id"); |
| 647 | 668 |
| 648 EXPECT_EQ(REGISTRATION_COMPLETED, last_event()); | 669 EXPECT_EQ(REGISTRATION_COMPLETED, last_event()); |
| 649 EXPECT_EQ(kAppId, last_app_id()); | 670 EXPECT_EQ(kAppId, last_app_id()); |
| 650 EXPECT_EQ("reg_id", last_registration_id()); | 671 EXPECT_EQ("reg_id", last_registration_id()); |
| 651 EXPECT_EQ(GCMClient::SUCCESS, last_result()); | 672 EXPECT_EQ(GCMClient::SUCCESS, last_result()); |
| 652 EXPECT_TRUE(ExistsRegistration(kAppId)); | 673 EXPECT_TRUE(ExistsRegistration(kAppId)); |
| 653 } | 674 } |
| 654 | 675 |
| 655 TEST_F(GCMClientImplTest, DISABLED_RegisterAppFromCache) { | 676 TEST_F(GCMClientImplTest, DISABLED_RegisterAppFromCache) { |
| 656 EXPECT_FALSE(ExistsRegistration(kAppId)); | 677 EXPECT_FALSE(ExistsRegistration(kAppId)); |
| 657 | 678 |
| 658 std::vector<std::string> senders; | 679 std::vector<std::string> senders; |
| 659 senders.push_back("sender"); | 680 senders.push_back("sender"); |
| 660 gcm_client()->Register(kAppId, senders); | 681 Register(kAppId, senders); |
| 661 CompleteRegistration("reg_id"); | 682 CompleteRegistration("reg_id"); |
| 662 EXPECT_TRUE(ExistsRegistration(kAppId)); | 683 EXPECT_TRUE(ExistsRegistration(kAppId)); |
| 663 | 684 |
| 664 EXPECT_EQ(kAppId, last_app_id()); | 685 EXPECT_EQ(kAppId, last_app_id()); |
| 665 EXPECT_EQ("reg_id", last_registration_id()); | 686 EXPECT_EQ("reg_id", last_registration_id()); |
| 666 EXPECT_EQ(GCMClient::SUCCESS, last_result()); | 687 EXPECT_EQ(GCMClient::SUCCESS, last_result()); |
| 667 EXPECT_EQ(REGISTRATION_COMPLETED, last_event()); | 688 EXPECT_EQ(REGISTRATION_COMPLETED, last_event()); |
| 668 | 689 |
| 669 // Recreate GCMClient in order to load from the persistent store. | 690 // Recreate GCMClient in order to load from the persistent store. |
| 670 BuildGCMClient(base::TimeDelta()); | 691 BuildGCMClient(base::TimeDelta()); |
| 671 InitializeGCMClient(); | 692 InitializeGCMClient(); |
| 672 StartGCMClient(); | 693 StartGCMClient(); |
| 673 | 694 |
| 674 EXPECT_TRUE(ExistsRegistration(kAppId)); | 695 EXPECT_TRUE(ExistsRegistration(kAppId)); |
| 675 } | 696 } |
| 676 | 697 |
| 677 TEST_F(GCMClientImplTest, UnregisterApp) { | 698 TEST_F(GCMClientImplTest, UnregisterApp) { |
| 678 EXPECT_FALSE(ExistsRegistration(kAppId)); | 699 EXPECT_FALSE(ExistsRegistration(kAppId)); |
| 679 | 700 |
| 680 std::vector<std::string> senders; | 701 std::vector<std::string> senders; |
| 681 senders.push_back("sender"); | 702 senders.push_back("sender"); |
| 682 gcm_client()->Register(kAppId, senders); | 703 Register(kAppId, senders); |
| 683 CompleteRegistration("reg_id"); | 704 CompleteRegistration("reg_id"); |
| 684 EXPECT_TRUE(ExistsRegistration(kAppId)); | 705 EXPECT_TRUE(ExistsRegistration(kAppId)); |
| 685 | 706 |
| 686 gcm_client()->Unregister(kAppId); | 707 Unregister(kAppId); |
| 687 CompleteUnregistration(kAppId); | 708 CompleteUnregistration(kAppId); |
| 688 | 709 |
| 689 EXPECT_EQ(UNREGISTRATION_COMPLETED, last_event()); | 710 EXPECT_EQ(UNREGISTRATION_COMPLETED, last_event()); |
| 690 EXPECT_EQ(kAppId, last_app_id()); | 711 EXPECT_EQ(kAppId, last_app_id()); |
| 691 EXPECT_EQ(GCMClient::SUCCESS, last_result()); | 712 EXPECT_EQ(GCMClient::SUCCESS, last_result()); |
| 692 EXPECT_FALSE(ExistsRegistration(kAppId)); | 713 EXPECT_FALSE(ExistsRegistration(kAppId)); |
| 693 } | 714 } |
| 694 | 715 |
| 695 // Tests that stopping the GCMClient also deletes pending registration requests. | 716 // Tests that stopping the GCMClient also deletes pending registration requests. |
| 696 // This is tested by checking that url fetcher contained in the request was | 717 // This is tested by checking that url fetcher contained in the request was |
| 697 // deleted. | 718 // deleted. |
| 698 TEST_F(GCMClientImplTest, DeletePendingRequestsWhenStopping) { | 719 TEST_F(GCMClientImplTest, DeletePendingRequestsWhenStopping) { |
| 699 std::vector<std::string> senders; | 720 std::vector<std::string> senders; |
| 700 senders.push_back("sender"); | 721 senders.push_back("sender"); |
| 701 gcm_client()->Register(kAppId, senders); | 722 Register(kAppId, senders); |
| 702 | 723 |
| 703 gcm_client()->Stop(); | 724 gcm_client()->Stop(); |
| 704 VerifyPendingRequestFetcherDeleted(); | 725 VerifyPendingRequestFetcherDeleted(); |
| 705 } | 726 } |
| 706 | 727 |
| 707 TEST_F(GCMClientImplTest, DispatchDownstreamMessage) { | 728 TEST_F(GCMClientImplTest, DispatchDownstreamMessage) { |
| 708 // Register to receive messages from kSender and kSender2 only. | 729 // Register to receive messages from kSender and kSender2 only. |
| 709 std::vector<std::string> senders; | 730 std::vector<std::string> senders; |
| 710 senders.push_back(kSender); | 731 senders.push_back(kSender); |
| 711 senders.push_back(kSender2); | 732 senders.push_back(kSender2); |
| (...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1141 // Start the GCM immediately and complete the checkin. | 1162 // Start the GCM immediately and complete the checkin. |
| 1142 gcm_client()->Start(GCMClient::IMMEDIATE_START); | 1163 gcm_client()->Start(GCMClient::IMMEDIATE_START); |
| 1143 PumpLoopUntilIdle(); | 1164 PumpLoopUntilIdle(); |
| 1144 EXPECT_EQ(GCMClientImpl::INITIAL_DEVICE_CHECKIN, gcm_client_state()); | 1165 EXPECT_EQ(GCMClientImpl::INITIAL_DEVICE_CHECKIN, gcm_client_state()); |
| 1145 DefaultCompleteCheckin(); | 1166 DefaultCompleteCheckin(); |
| 1146 EXPECT_EQ(GCMClientImpl::READY, gcm_client_state()); | 1167 EXPECT_EQ(GCMClientImpl::READY, gcm_client_state()); |
| 1147 | 1168 |
| 1148 // Registration. | 1169 // Registration. |
| 1149 std::vector<std::string> senders; | 1170 std::vector<std::string> senders; |
| 1150 senders.push_back("sender"); | 1171 senders.push_back("sender"); |
| 1151 gcm_client()->Register(kAppId, senders); | 1172 Register(kAppId, senders); |
| 1152 CompleteRegistration("reg_id"); | 1173 CompleteRegistration("reg_id"); |
| 1153 EXPECT_EQ(GCMClientImpl::READY, gcm_client_state()); | 1174 EXPECT_EQ(GCMClientImpl::READY, gcm_client_state()); |
| 1154 | 1175 |
| 1155 // Stop the GCM. | 1176 // Stop the GCM. |
| 1156 gcm_client()->Stop(); | 1177 gcm_client()->Stop(); |
| 1157 PumpLoopUntilIdle(); | 1178 PumpLoopUntilIdle(); |
| 1158 EXPECT_EQ(GCMClientImpl::INITIALIZED, gcm_client_state()); | 1179 EXPECT_EQ(GCMClientImpl::INITIALIZED, gcm_client_state()); |
| 1159 | 1180 |
| 1160 // Delay start the GCM. GCM is indeed started without delay because the | 1181 // Delay start the GCM. GCM is indeed started without delay because the |
| 1161 // registration record has been found. | 1182 // registration record has been found. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1195 ASSERT_EQ(1UL, last_account_mappings().size()); | 1216 ASSERT_EQ(1UL, last_account_mappings().size()); |
| 1196 const AccountMapping& actual_mapping = last_account_mappings()[0]; | 1217 const AccountMapping& actual_mapping = last_account_mappings()[0]; |
| 1197 EXPECT_EQ(expected_mapping.account_id, actual_mapping.account_id); | 1218 EXPECT_EQ(expected_mapping.account_id, actual_mapping.account_id); |
| 1198 EXPECT_EQ(expected_mapping.email, actual_mapping.email); | 1219 EXPECT_EQ(expected_mapping.email, actual_mapping.email); |
| 1199 EXPECT_EQ(expected_mapping.status, actual_mapping.status); | 1220 EXPECT_EQ(expected_mapping.status, actual_mapping.status); |
| 1200 EXPECT_EQ(expected_mapping.status_change_timestamp, | 1221 EXPECT_EQ(expected_mapping.status_change_timestamp, |
| 1201 actual_mapping.status_change_timestamp); | 1222 actual_mapping.status_change_timestamp); |
| 1202 } | 1223 } |
| 1203 | 1224 |
| 1204 } // namespace gcm | 1225 } // namespace gcm |
| OLD | NEW |