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 "google_apis/gcm/gcm_client_impl.h" | 5 #include "google_apis/gcm/gcm_client_impl.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/files/scoped_temp_dir.h" | 8 #include "base/files/scoped_temp_dir.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
229 void CompleteUnregistration(const std::string& app_id); | 229 void CompleteUnregistration(const std::string& app_id); |
230 | 230 |
231 bool ExistsRegistration(const std::string& app_id) const; | 231 bool ExistsRegistration(const std::string& app_id) const; |
232 void AddRegistration(const std::string& app_id, | 232 void AddRegistration(const std::string& app_id, |
233 const std::vector<std::string>& sender_ids, | 233 const std::vector<std::string>& sender_ids, |
234 const std::string& registration_id); | 234 const std::string& registration_id); |
235 | 235 |
236 // GCMClient::Delegate overrides (for verification). | 236 // GCMClient::Delegate overrides (for verification). |
237 virtual void OnRegisterFinished(const std::string& app_id, | 237 virtual void OnRegisterFinished(const std::string& app_id, |
238 const std::string& registration_id, | 238 const std::string& registration_id, |
239 GCMClient::Result result) OVERRIDE; | 239 Result result) OVERRIDE; |
240 virtual void OnUnregisterFinished(const std::string& app_id, | 240 virtual void OnUnregisterFinished(const std::string& app_id, |
241 GCMClient::Result result) OVERRIDE; | 241 Result result) OVERRIDE; |
242 virtual void OnSendFinished(const std::string& app_id, | 242 virtual void OnSendFinished(const std::string& app_id, |
243 const std::string& message_id, | 243 const std::string& message_id, |
244 GCMClient::Result result) OVERRIDE {} | 244 Result result) OVERRIDE {} |
245 virtual void OnMessageReceived(const std::string& registration_id, | 245 virtual void OnMessageReceived(const std::string& registration_id, |
246 const GCMClient::IncomingMessage& message) | 246 const IncomingMessage& message) |
247 OVERRIDE; | 247 OVERRIDE; |
248 virtual void OnMessagesDeleted(const std::string& app_id) OVERRIDE; | 248 virtual void OnMessagesDeleted(const std::string& app_id) OVERRIDE; |
249 virtual void OnMessageSendError( | 249 virtual void OnMessageSendError( |
250 const std::string& app_id, | 250 const std::string& app_id, |
251 const gcm::GCMClient::SendErrorDetails& send_error_details) OVERRIDE; | 251 const gcm::SendErrorDetails& send_error_details) OVERRIDE; |
252 virtual void OnGCMReady() OVERRIDE; | 252 virtual void OnGCMReady() OVERRIDE; |
253 | 253 |
254 GCMClientImpl* gcm_client() const { return gcm_client_.get(); } | 254 GCMClientImpl* gcm_client() const { return gcm_client_.get(); } |
255 FakeMCSClient* mcs_client() const { | 255 FakeMCSClient* mcs_client() const { |
256 return reinterpret_cast<FakeMCSClient*>(gcm_client_->mcs_client_.get()); | 256 return reinterpret_cast<FakeMCSClient*>(gcm_client_->mcs_client_.get()); |
257 } | 257 } |
258 ConnectionFactory* connection_factory() const { | 258 ConnectionFactory* connection_factory() const { |
259 return gcm_client_->connection_factory_.get(); | 259 return gcm_client_->connection_factory_.get(); |
260 } | 260 } |
261 | 261 |
262 void reset_last_event() { | 262 void reset_last_event() { |
263 last_event_ = NONE; | 263 last_event_ = NONE; |
264 last_app_id_.clear(); | 264 last_app_id_.clear(); |
265 last_registration_id_.clear(); | 265 last_registration_id_.clear(); |
266 last_message_id_.clear(); | 266 last_message_id_.clear(); |
267 last_result_ = GCMClient::UNKNOWN_ERROR; | 267 last_result_ = RESULT_UNKNOWN_ERROR; |
268 } | 268 } |
269 | 269 |
270 LastEvent last_event() const { return last_event_; } | 270 LastEvent last_event() const { return last_event_; } |
271 const std::string& last_app_id() const { return last_app_id_; } | 271 const std::string& last_app_id() const { return last_app_id_; } |
272 const std::string& last_registration_id() const { | 272 const std::string& last_registration_id() const { |
273 return last_registration_id_; | 273 return last_registration_id_; |
274 } | 274 } |
275 const std::string& last_message_id() const { return last_message_id_; } | 275 const std::string& last_message_id() const { return last_message_id_; } |
276 GCMClient::Result last_result() const { return last_result_; } | 276 Result last_result() const { return last_result_; } |
277 const GCMClient::IncomingMessage& last_message() const { | 277 const IncomingMessage& last_message() const { |
278 return last_message_; | 278 return last_message_; |
279 } | 279 } |
280 const GCMClient::SendErrorDetails& last_error_details() const { | 280 const SendErrorDetails& last_error_details() const { |
281 return last_error_details_; | 281 return last_error_details_; |
282 } | 282 } |
283 | 283 |
284 const GServicesSettings& gservices_settings() const { | 284 const GServicesSettings& gservices_settings() const { |
285 return gcm_client_->gservices_settings_; | 285 return gcm_client_->gservices_settings_; |
286 } | 286 } |
287 | 287 |
288 int64 CurrentTime(); | 288 int64 CurrentTime(); |
289 | 289 |
290 // Tooling. | 290 // Tooling. |
291 void PumpLoop(); | 291 void PumpLoop(); |
292 void PumpLoopUntilIdle(); | 292 void PumpLoopUntilIdle(); |
293 void QuitLoop(); | 293 void QuitLoop(); |
294 void InitializeLoop(); | 294 void InitializeLoop(); |
295 bool CreateUniqueTempDir(); | 295 bool CreateUniqueTempDir(); |
296 AutoAdvancingTestClock* clock() const { | 296 AutoAdvancingTestClock* clock() const { |
297 return reinterpret_cast<AutoAdvancingTestClock*>(gcm_client_->clock_.get()); | 297 return reinterpret_cast<AutoAdvancingTestClock*>(gcm_client_->clock_.get()); |
298 } | 298 } |
299 | 299 |
300 private: | 300 private: |
301 // Variables used for verification. | 301 // Variables used for verification. |
302 LastEvent last_event_; | 302 LastEvent last_event_; |
303 std::string last_app_id_; | 303 std::string last_app_id_; |
304 std::string last_registration_id_; | 304 std::string last_registration_id_; |
305 std::string last_message_id_; | 305 std::string last_message_id_; |
306 GCMClient::Result last_result_; | 306 Result last_result_; |
307 GCMClient::IncomingMessage last_message_; | 307 IncomingMessage last_message_; |
308 GCMClient::SendErrorDetails last_error_details_; | 308 SendErrorDetails last_error_details_; |
309 | 309 |
310 scoped_ptr<GCMClientImpl> gcm_client_; | 310 scoped_ptr<GCMClientImpl> gcm_client_; |
311 | 311 |
312 base::MessageLoop message_loop_; | 312 base::MessageLoop message_loop_; |
313 scoped_ptr<base::RunLoop> run_loop_; | 313 scoped_ptr<base::RunLoop> run_loop_; |
314 net::TestURLFetcherFactory url_fetcher_factory_; | 314 net::TestURLFetcherFactory url_fetcher_factory_; |
315 | 315 |
316 // Injected to GCM client: | 316 // Injected to GCM client: |
317 base::ScopedTempDir temp_directory_; | 317 base::ScopedTempDir temp_directory_; |
318 scoped_refptr<net::TestURLRequestContextGetter> url_request_context_getter_; | 318 scoped_refptr<net::TestURLRequestContextGetter> url_request_context_getter_; |
319 }; | 319 }; |
320 | 320 |
321 GCMClientImplTest::GCMClientImplTest() | 321 GCMClientImplTest::GCMClientImplTest() |
322 : last_event_(NONE), | 322 : last_event_(NONE), |
323 last_result_(GCMClient::UNKNOWN_ERROR), | 323 last_result_(RESULT_UNKNOWN_ERROR), |
324 url_request_context_getter_(new net::TestURLRequestContextGetter( | 324 url_request_context_getter_(new net::TestURLRequestContextGetter( |
325 message_loop_.message_loop_proxy())) { | 325 message_loop_.message_loop_proxy())) { |
326 } | 326 } |
327 | 327 |
328 GCMClientImplTest::~GCMClientImplTest() {} | 328 GCMClientImplTest::~GCMClientImplTest() {} |
329 | 329 |
330 void GCMClientImplTest::SetUp() { | 330 void GCMClientImplTest::SetUp() { |
331 testing::Test::SetUp(); | 331 testing::Test::SetUp(); |
332 #if defined(OS_MACOSX) | 332 #if defined(OS_MACOSX) |
333 base::CommandLine::ForCurrentProcess()->AppendSwitch( | 333 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 gcm_client_->OnMessageReceivedFromMCS(message); | 465 gcm_client_->OnMessageReceivedFromMCS(message); |
466 } | 466 } |
467 | 467 |
468 void GCMClientImplTest::OnGCMReady() { | 468 void GCMClientImplTest::OnGCMReady() { |
469 last_event_ = LOADING_COMPLETED; | 469 last_event_ = LOADING_COMPLETED; |
470 QuitLoop(); | 470 QuitLoop(); |
471 } | 471 } |
472 | 472 |
473 void GCMClientImplTest::OnMessageReceived( | 473 void GCMClientImplTest::OnMessageReceived( |
474 const std::string& registration_id, | 474 const std::string& registration_id, |
475 const GCMClient::IncomingMessage& message) { | 475 const IncomingMessage& message) { |
476 last_event_ = MESSAGE_RECEIVED; | 476 last_event_ = MESSAGE_RECEIVED; |
477 last_app_id_ = registration_id; | 477 last_app_id_ = registration_id; |
478 last_message_ = message; | 478 last_message_ = message; |
479 QuitLoop(); | 479 QuitLoop(); |
480 } | 480 } |
481 | 481 |
482 void GCMClientImplTest::OnRegisterFinished(const std::string& app_id, | 482 void GCMClientImplTest::OnRegisterFinished(const std::string& app_id, |
483 const std::string& registration_id, | 483 const std::string& registration_id, |
484 GCMClient::Result result) { | 484 Result result) { |
485 last_event_ = REGISTRATION_COMPLETED; | 485 last_event_ = REGISTRATION_COMPLETED; |
486 last_app_id_ = app_id; | 486 last_app_id_ = app_id; |
487 last_registration_id_ = registration_id; | 487 last_registration_id_ = registration_id; |
488 last_result_ = result; | 488 last_result_ = result; |
489 } | 489 } |
490 | 490 |
491 void GCMClientImplTest::OnUnregisterFinished(const std::string& app_id, | 491 void GCMClientImplTest::OnUnregisterFinished(const std::string& app_id, |
492 GCMClient::Result result) { | 492 Result result) { |
493 last_event_ = UNREGISTRATION_COMPLETED; | 493 last_event_ = UNREGISTRATION_COMPLETED; |
494 last_app_id_ = app_id; | 494 last_app_id_ = app_id; |
495 last_result_ = result; | 495 last_result_ = result; |
496 } | 496 } |
497 | 497 |
498 void GCMClientImplTest::OnMessagesDeleted(const std::string& app_id) { | 498 void GCMClientImplTest::OnMessagesDeleted(const std::string& app_id) { |
499 last_event_ = MESSAGES_DELETED; | 499 last_event_ = MESSAGES_DELETED; |
500 last_app_id_ = app_id; | 500 last_app_id_ = app_id; |
501 } | 501 } |
502 | 502 |
503 void GCMClientImplTest::OnMessageSendError( | 503 void GCMClientImplTest::OnMessageSendError( |
504 const std::string& app_id, | 504 const std::string& app_id, |
505 const gcm::GCMClient::SendErrorDetails& send_error_details) { | 505 const gcm::SendErrorDetails& send_error_details) { |
506 last_event_ = MESSAGE_SEND_ERROR; | 506 last_event_ = MESSAGE_SEND_ERROR; |
507 last_app_id_ = app_id; | 507 last_app_id_ = app_id; |
508 last_error_details_ = send_error_details; | 508 last_error_details_ = send_error_details; |
509 } | 509 } |
510 | 510 |
511 int64 GCMClientImplTest::CurrentTime() { | 511 int64 GCMClientImplTest::CurrentTime() { |
512 return clock()->Now().ToInternalValue() / base::Time::kMicrosecondsPerSecond; | 512 return clock()->Now().ToInternalValue() / base::Time::kMicrosecondsPerSecond; |
513 } | 513 } |
514 | 514 |
515 TEST_F(GCMClientImplTest, LoadingCompleted) { | 515 TEST_F(GCMClientImplTest, LoadingCompleted) { |
(...skipping 14 matching lines...) Expand all Loading... |
530 EXPECT_FALSE(ExistsRegistration(kAppId)); | 530 EXPECT_FALSE(ExistsRegistration(kAppId)); |
531 | 531 |
532 std::vector<std::string> senders; | 532 std::vector<std::string> senders; |
533 senders.push_back("sender"); | 533 senders.push_back("sender"); |
534 gcm_client()->Register(kAppId, senders); | 534 gcm_client()->Register(kAppId, senders); |
535 CompleteRegistration("reg_id"); | 535 CompleteRegistration("reg_id"); |
536 | 536 |
537 EXPECT_EQ(REGISTRATION_COMPLETED, last_event()); | 537 EXPECT_EQ(REGISTRATION_COMPLETED, last_event()); |
538 EXPECT_EQ(kAppId, last_app_id()); | 538 EXPECT_EQ(kAppId, last_app_id()); |
539 EXPECT_EQ("reg_id", last_registration_id()); | 539 EXPECT_EQ("reg_id", last_registration_id()); |
540 EXPECT_EQ(GCMClient::SUCCESS, last_result()); | 540 EXPECT_EQ(RESULT_SUCCESS, last_result()); |
541 EXPECT_TRUE(ExistsRegistration(kAppId)); | 541 EXPECT_TRUE(ExistsRegistration(kAppId)); |
542 } | 542 } |
543 | 543 |
544 TEST_F(GCMClientImplTest, DISABLED_RegisterAppFromCache) { | 544 TEST_F(GCMClientImplTest, DISABLED_RegisterAppFromCache) { |
545 EXPECT_FALSE(ExistsRegistration(kAppId)); | 545 EXPECT_FALSE(ExistsRegistration(kAppId)); |
546 | 546 |
547 std::vector<std::string> senders; | 547 std::vector<std::string> senders; |
548 senders.push_back("sender"); | 548 senders.push_back("sender"); |
549 gcm_client()->Register(kAppId, senders); | 549 gcm_client()->Register(kAppId, senders); |
550 CompleteRegistration("reg_id"); | 550 CompleteRegistration("reg_id"); |
551 EXPECT_TRUE(ExistsRegistration(kAppId)); | 551 EXPECT_TRUE(ExistsRegistration(kAppId)); |
552 | 552 |
553 EXPECT_EQ(kAppId, last_app_id()); | 553 EXPECT_EQ(kAppId, last_app_id()); |
554 EXPECT_EQ("reg_id", last_registration_id()); | 554 EXPECT_EQ("reg_id", last_registration_id()); |
555 EXPECT_EQ(GCMClient::SUCCESS, last_result()); | 555 EXPECT_EQ(RESULT_SUCCESS, last_result()); |
556 EXPECT_EQ(REGISTRATION_COMPLETED, last_event()); | 556 EXPECT_EQ(REGISTRATION_COMPLETED, last_event()); |
557 | 557 |
558 // Recreate GCMClient in order to load from the persistent store. | 558 // Recreate GCMClient in order to load from the persistent store. |
559 BuildGCMClient(base::TimeDelta()); | 559 BuildGCMClient(base::TimeDelta()); |
560 InitializeGCMClient(); | 560 InitializeGCMClient(); |
561 | 561 |
562 EXPECT_TRUE(ExistsRegistration(kAppId)); | 562 EXPECT_TRUE(ExistsRegistration(kAppId)); |
563 } | 563 } |
564 | 564 |
565 TEST_F(GCMClientImplTest, UnregisterApp) { | 565 TEST_F(GCMClientImplTest, UnregisterApp) { |
566 EXPECT_FALSE(ExistsRegistration(kAppId)); | 566 EXPECT_FALSE(ExistsRegistration(kAppId)); |
567 | 567 |
568 std::vector<std::string> senders; | 568 std::vector<std::string> senders; |
569 senders.push_back("sender"); | 569 senders.push_back("sender"); |
570 gcm_client()->Register(kAppId, senders); | 570 gcm_client()->Register(kAppId, senders); |
571 CompleteRegistration("reg_id"); | 571 CompleteRegistration("reg_id"); |
572 EXPECT_TRUE(ExistsRegistration(kAppId)); | 572 EXPECT_TRUE(ExistsRegistration(kAppId)); |
573 | 573 |
574 gcm_client()->Unregister(kAppId); | 574 gcm_client()->Unregister(kAppId); |
575 CompleteUnregistration(kAppId); | 575 CompleteUnregistration(kAppId); |
576 | 576 |
577 EXPECT_EQ(UNREGISTRATION_COMPLETED, last_event()); | 577 EXPECT_EQ(UNREGISTRATION_COMPLETED, last_event()); |
578 EXPECT_EQ(kAppId, last_app_id()); | 578 EXPECT_EQ(kAppId, last_app_id()); |
579 EXPECT_EQ(GCMClient::SUCCESS, last_result()); | 579 EXPECT_EQ(RESULT_SUCCESS, last_result()); |
580 EXPECT_FALSE(ExistsRegistration(kAppId)); | 580 EXPECT_FALSE(ExistsRegistration(kAppId)); |
581 } | 581 } |
582 | 582 |
583 TEST_F(GCMClientImplTest, DispatchDownstreamMessage) { | 583 TEST_F(GCMClientImplTest, DispatchDownstreamMessage) { |
584 // Register to receive messages from kSender and kSender2 only. | 584 // Register to receive messages from kSender and kSender2 only. |
585 std::vector<std::string> senders; | 585 std::vector<std::string> senders; |
586 senders.push_back(kSender); | 586 senders.push_back(kSender); |
587 senders.push_back(kSender2); | 587 senders.push_back(kSender2); |
588 AddRegistration(kAppId, senders, "reg_id"); | 588 AddRegistration(kAppId, senders, "reg_id"); |
589 | 589 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
635 expected_data["error_details"] = "some details"; | 635 expected_data["error_details"] = "some details"; |
636 MCSMessage message(BuildDownstreamMessage( | 636 MCSMessage message(BuildDownstreamMessage( |
637 kSender, kAppId, expected_data)); | 637 kSender, kAppId, expected_data)); |
638 EXPECT_TRUE(message.IsValid()); | 638 EXPECT_TRUE(message.IsValid()); |
639 ReceiveMessageFromMCS(message); | 639 ReceiveMessageFromMCS(message); |
640 | 640 |
641 EXPECT_EQ(MESSAGE_SEND_ERROR, last_event()); | 641 EXPECT_EQ(MESSAGE_SEND_ERROR, last_event()); |
642 EXPECT_EQ(kAppId, last_app_id()); | 642 EXPECT_EQ(kAppId, last_app_id()); |
643 EXPECT_EQ("007", last_error_details().message_id); | 643 EXPECT_EQ("007", last_error_details().message_id); |
644 EXPECT_EQ(1UL, last_error_details().additional_data.size()); | 644 EXPECT_EQ(1UL, last_error_details().additional_data.size()); |
645 GCMClient::MessageData::const_iterator iter = | 645 MessageData::const_iterator iter = |
646 last_error_details().additional_data.find("error_details"); | 646 last_error_details().additional_data.find("error_details"); |
647 EXPECT_TRUE(iter != last_error_details().additional_data.end()); | 647 EXPECT_TRUE(iter != last_error_details().additional_data.end()); |
648 EXPECT_EQ("some details", iter->second); | 648 EXPECT_EQ("some details", iter->second); |
649 } | 649 } |
650 | 650 |
651 TEST_F(GCMClientImplTest, DispatchDownstreamMessgaesDeleted) { | 651 TEST_F(GCMClientImplTest, DispatchDownstreamMessgaesDeleted) { |
652 std::map<std::string, std::string> expected_data; | 652 std::map<std::string, std::string> expected_data; |
653 expected_data["message_type"] = "deleted_messages"; | 653 expected_data["message_type"] = "deleted_messages"; |
654 MCSMessage message(BuildDownstreamMessage( | 654 MCSMessage message(BuildDownstreamMessage( |
655 kSender, kAppId, expected_data)); | 655 kSender, kAppId, expected_data)); |
656 EXPECT_TRUE(message.IsValid()); | 656 EXPECT_TRUE(message.IsValid()); |
657 ReceiveMessageFromMCS(message); | 657 ReceiveMessageFromMCS(message); |
658 | 658 |
659 EXPECT_EQ(MESSAGES_DELETED, last_event()); | 659 EXPECT_EQ(MESSAGES_DELETED, last_event()); |
660 EXPECT_EQ(kAppId, last_app_id()); | 660 EXPECT_EQ(kAppId, last_app_id()); |
661 } | 661 } |
662 | 662 |
663 TEST_F(GCMClientImplTest, SendMessage) { | 663 TEST_F(GCMClientImplTest, SendMessage) { |
664 mcs_proto::DataMessageStanza stanza; | 664 mcs_proto::DataMessageStanza stanza; |
665 stanza.set_ttl(500); | 665 stanza.set_ttl(500); |
666 | 666 |
667 GCMClient::OutgoingMessage message; | 667 OutgoingMessage message; |
668 message.id = "007"; | 668 message.id = "007"; |
669 message.time_to_live = 500; | 669 message.time_to_live = 500; |
670 message.data["key"] = "value"; | 670 message.data["key"] = "value"; |
671 gcm_client()->Send(kAppId, kSender, message); | 671 gcm_client()->Send(kAppId, kSender, message); |
672 | 672 |
673 EXPECT_EQ(kDataMessageStanzaTag, mcs_client()->last_message_tag()); | 673 EXPECT_EQ(kDataMessageStanzaTag, mcs_client()->last_message_tag()); |
674 EXPECT_EQ(kAppId, mcs_client()->last_data_message_stanza().category()); | 674 EXPECT_EQ(kAppId, mcs_client()->last_data_message_stanza().category()); |
675 EXPECT_EQ(kSender, mcs_client()->last_data_message_stanza().to()); | 675 EXPECT_EQ(kSender, mcs_client()->last_data_message_stanza().to()); |
676 EXPECT_EQ(500, mcs_client()->last_data_message_stanza().ttl()); | 676 EXPECT_EQ(500, mcs_client()->last_data_message_stanza().ttl()); |
677 EXPECT_EQ(CurrentTime(), mcs_client()->last_data_message_stanza().sent()); | 677 EXPECT_EQ(CurrentTime(), mcs_client()->last_data_message_stanza().sent()); |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
767 gservices_settings().checkin_interval()); | 767 gservices_settings().checkin_interval()); |
768 EXPECT_EQ(GURL("http://alternative.url/checkin"), | 768 EXPECT_EQ(GURL("http://alternative.url/checkin"), |
769 gservices_settings().checkin_url()); | 769 gservices_settings().checkin_url()); |
770 EXPECT_EQ(GURL("http://alternative.url/registration"), | 770 EXPECT_EQ(GURL("http://alternative.url/registration"), |
771 gservices_settings().registration_url()); | 771 gservices_settings().registration_url()); |
772 EXPECT_EQ("http://alternative.gcm.host", gservices_settings().mcs_hostname()); | 772 EXPECT_EQ("http://alternative.gcm.host", gservices_settings().mcs_hostname()); |
773 EXPECT_EQ(443, gservices_settings().mcs_secure_port()); | 773 EXPECT_EQ(443, gservices_settings().mcs_secure_port()); |
774 } | 774 } |
775 | 775 |
776 } // namespace gcm | 776 } // namespace gcm |
OLD | NEW |