| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2012 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 452 // Add kTelephoneEventCodec for dtmf test. | 452 // Add kTelephoneEventCodec for dtmf test. |
| 453 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000, | 453 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000, |
| 454 0, 1); | 454 0, 1); |
| 455 std::vector<cricket::AudioCodec> codecs; | 455 std::vector<cricket::AudioCodec> codecs; |
| 456 codecs.push_back(kTelephoneEventCodec); | 456 codecs.push_back(kTelephoneEventCodec); |
| 457 media_engine_->SetAudioCodecs(codecs); | 457 media_engine_->SetAudioCodecs(codecs); |
| 458 desc_factory_->set_audio_codecs(codecs); | 458 desc_factory_->set_audio_codecs(codecs); |
| 459 Init(); | 459 Init(); |
| 460 } | 460 } |
| 461 | 461 |
| 462 void InitWithGcm() { |
| 463 rtc::CryptoOptions crypto_options; |
| 464 crypto_options.enable_gcm_crypto_suites = true; |
| 465 channel_manager_->SetCryptoOptions(crypto_options); |
| 466 with_gcm_ = true; |
| 467 Init(); |
| 468 } |
| 469 |
| 462 void SendAudioVideoStream1() { | 470 void SendAudioVideoStream1() { |
| 463 send_stream_1_ = true; | 471 send_stream_1_ = true; |
| 464 send_stream_2_ = false; | 472 send_stream_2_ = false; |
| 465 send_audio_ = true; | 473 send_audio_ = true; |
| 466 send_video_ = true; | 474 send_video_ = true; |
| 467 } | 475 } |
| 468 | 476 |
| 469 void SendAudioVideoStream2() { | 477 void SendAudioVideoStream2() { |
| 470 send_stream_1_ = false; | 478 send_stream_1_ = false; |
| 471 send_stream_2_ = true; | 479 send_stream_2_ = true; |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 542 session_options->HasSendMediaStream(cricket::MEDIA_TYPE_VIDEO); | 550 session_options->HasSendMediaStream(cricket::MEDIA_TYPE_VIDEO); |
| 543 } | 551 } |
| 544 session_options->bundle_enabled = | 552 session_options->bundle_enabled = |
| 545 session_options->bundle_enabled && | 553 session_options->bundle_enabled && |
| 546 (session_options->has_audio() || session_options->has_video() || | 554 (session_options->has_audio() || session_options->has_video() || |
| 547 session_options->has_data()); | 555 session_options->has_data()); |
| 548 | 556 |
| 549 if (session_->data_channel_type() == cricket::DCT_SCTP && data_channel_) { | 557 if (session_->data_channel_type() == cricket::DCT_SCTP && data_channel_) { |
| 550 session_options->data_channel_type = cricket::DCT_SCTP; | 558 session_options->data_channel_type = cricket::DCT_SCTP; |
| 551 } | 559 } |
| 560 |
| 561 if (with_gcm_) { |
| 562 session_options->crypto_options.enable_gcm_crypto_suites = true; |
| 563 } |
| 552 } | 564 } |
| 553 | 565 |
| 554 void GetOptionsForAnswer(cricket::MediaSessionOptions* session_options) { | 566 void GetOptionsForAnswer(cricket::MediaSessionOptions* session_options) { |
| 555 // ParseConstraintsForAnswer is used to set some defaults. | 567 // ParseConstraintsForAnswer is used to set some defaults. |
| 556 ASSERT_TRUE(webrtc::ParseConstraintsForAnswer(nullptr, session_options)); | 568 ASSERT_TRUE(webrtc::ParseConstraintsForAnswer(nullptr, session_options)); |
| 557 | 569 |
| 558 AddStreamsToOptions(session_options); | 570 AddStreamsToOptions(session_options); |
| 559 session_options->bundle_enabled = | 571 session_options->bundle_enabled = |
| 560 session_options->bundle_enabled && | 572 session_options->bundle_enabled && |
| 561 (session_options->has_audio() || session_options->has_video() || | 573 (session_options->has_audio() || session_options->has_video() || |
| 562 session_options->has_data()); | 574 session_options->has_data()); |
| 563 | 575 |
| 564 if (session_->data_channel_type() == cricket::DCT_SCTP) { | 576 if (session_->data_channel_type() == cricket::DCT_SCTP) { |
| 565 session_options->data_channel_type = cricket::DCT_SCTP; | 577 session_options->data_channel_type = cricket::DCT_SCTP; |
| 566 } | 578 } |
| 579 |
| 580 if (with_gcm_) { |
| 581 session_options->crypto_options.enable_gcm_crypto_suites = true; |
| 582 } |
| 567 } | 583 } |
| 568 | 584 |
| 569 // Creates a local offer and applies it. Starts ICE. | 585 // Creates a local offer and applies it. Starts ICE. |
| 570 // Call SendAudioVideoStreamX() before this function | 586 // Call SendAudioVideoStreamX() before this function |
| 571 // to decide which streams to create. | 587 // to decide which streams to create. |
| 572 void InitiateCall() { | 588 void InitiateCall() { |
| 573 SessionDescriptionInterface* offer = CreateOffer(); | 589 SessionDescriptionInterface* offer = CreateOffer(); |
| 574 SetLocalDescriptionWithoutError(offer); | 590 SetLocalDescriptionWithoutError(offer); |
| 575 EXPECT_TRUE_WAIT(PeerConnectionInterface::kIceGatheringNew != | 591 EXPECT_TRUE_WAIT(PeerConnectionInterface::kIceGatheringNew != |
| 576 observer_.ice_gathering_state_, | 592 observer_.ice_gathering_state_, |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 619 options.recv_video = true; | 635 options.recv_video = true; |
| 620 options.recv_audio = true; | 636 options.recv_audio = true; |
| 621 return CreateAnswer(options); | 637 return CreateAnswer(options); |
| 622 } | 638 } |
| 623 | 639 |
| 624 bool ChannelsExist() const { | 640 bool ChannelsExist() const { |
| 625 return (session_->voice_channel() != NULL && | 641 return (session_->voice_channel() != NULL && |
| 626 session_->video_channel() != NULL); | 642 session_->video_channel() != NULL); |
| 627 } | 643 } |
| 628 | 644 |
| 629 void VerifyCryptoParams(const cricket::SessionDescription* sdp) { | 645 void VerifyCryptoParams(const cricket::SessionDescription* sdp, |
| 646 bool gcm_enabled = false) { |
| 630 ASSERT_TRUE(session_.get() != NULL); | 647 ASSERT_TRUE(session_.get() != NULL); |
| 631 const cricket::ContentInfo* content = cricket::GetFirstAudioContent(sdp); | 648 const cricket::ContentInfo* content = cricket::GetFirstAudioContent(sdp); |
| 632 ASSERT_TRUE(content != NULL); | 649 ASSERT_TRUE(content != NULL); |
| 633 const cricket::AudioContentDescription* audio_content = | 650 const cricket::AudioContentDescription* audio_content = |
| 634 static_cast<const cricket::AudioContentDescription*>( | 651 static_cast<const cricket::AudioContentDescription*>( |
| 635 content->description); | 652 content->description); |
| 636 ASSERT_TRUE(audio_content != NULL); | 653 ASSERT_TRUE(audio_content != NULL); |
| 637 ASSERT_EQ(1U, audio_content->cryptos().size()); | 654 if (!gcm_enabled) { |
| 638 ASSERT_EQ(47U, audio_content->cryptos()[0].key_params.size()); | 655 ASSERT_EQ(1U, audio_content->cryptos().size()); |
| 639 ASSERT_EQ("AES_CM_128_HMAC_SHA1_80", | 656 ASSERT_EQ(47U, audio_content->cryptos()[0].key_params.size()); |
| 640 audio_content->cryptos()[0].cipher_suite); | 657 ASSERT_EQ("AES_CM_128_HMAC_SHA1_80", |
| 641 EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), | 658 audio_content->cryptos()[0].cipher_suite); |
| 642 audio_content->protocol()); | 659 EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), |
| 660 audio_content->protocol()); |
| 661 } else { |
| 662 // The offer contains 3 possible crypto suites, the answer 1. |
| 663 EXPECT_LE(1U, audio_content->cryptos().size()); |
| 664 EXPECT_NE(2U, audio_content->cryptos().size()); |
| 665 EXPECT_GE(3U, audio_content->cryptos().size()); |
| 666 ASSERT_EQ(67U, audio_content->cryptos()[0].key_params.size()); |
| 667 ASSERT_EQ("AEAD_AES_256_GCM", |
| 668 audio_content->cryptos()[0].cipher_suite); |
| 669 EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), |
| 670 audio_content->protocol()); |
| 671 } |
| 643 | 672 |
| 644 content = cricket::GetFirstVideoContent(sdp); | 673 content = cricket::GetFirstVideoContent(sdp); |
| 645 ASSERT_TRUE(content != NULL); | 674 ASSERT_TRUE(content != NULL); |
| 646 const cricket::VideoContentDescription* video_content = | 675 const cricket::VideoContentDescription* video_content = |
| 647 static_cast<const cricket::VideoContentDescription*>( | 676 static_cast<const cricket::VideoContentDescription*>( |
| 648 content->description); | 677 content->description); |
| 649 ASSERT_TRUE(video_content != NULL); | 678 ASSERT_TRUE(video_content != NULL); |
| 650 ASSERT_EQ(1U, video_content->cryptos().size()); | 679 if (!gcm_enabled) { |
| 651 ASSERT_EQ("AES_CM_128_HMAC_SHA1_80", | 680 ASSERT_EQ(1U, video_content->cryptos().size()); |
| 652 video_content->cryptos()[0].cipher_suite); | 681 ASSERT_EQ("AES_CM_128_HMAC_SHA1_80", |
| 653 ASSERT_EQ(47U, video_content->cryptos()[0].key_params.size()); | 682 video_content->cryptos()[0].cipher_suite); |
| 654 EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), | 683 ASSERT_EQ(47U, video_content->cryptos()[0].key_params.size()); |
| 655 video_content->protocol()); | 684 EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), |
| 685 video_content->protocol()); |
| 686 } else { |
| 687 // The offer contains 3 possible crypto suites, the answer 1. |
| 688 EXPECT_LE(1U, video_content->cryptos().size()); |
| 689 EXPECT_NE(2U, video_content->cryptos().size()); |
| 690 EXPECT_GE(3U, video_content->cryptos().size()); |
| 691 ASSERT_EQ("AEAD_AES_256_GCM", |
| 692 video_content->cryptos()[0].cipher_suite); |
| 693 ASSERT_EQ(67U, video_content->cryptos()[0].key_params.size()); |
| 694 EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), |
| 695 video_content->protocol()); |
| 696 } |
| 656 } | 697 } |
| 657 | 698 |
| 658 void VerifyNoCryptoParams(const cricket::SessionDescription* sdp, bool dtls) { | 699 void VerifyNoCryptoParams(const cricket::SessionDescription* sdp, bool dtls) { |
| 659 const cricket::ContentInfo* content = cricket::GetFirstAudioContent(sdp); | 700 const cricket::ContentInfo* content = cricket::GetFirstAudioContent(sdp); |
| 660 ASSERT_TRUE(content != NULL); | 701 ASSERT_TRUE(content != NULL); |
| 661 const cricket::AudioContentDescription* audio_content = | 702 const cricket::AudioContentDescription* audio_content = |
| 662 static_cast<const cricket::AudioContentDescription*>( | 703 static_cast<const cricket::AudioContentDescription*>( |
| 663 content->description); | 704 content->description); |
| 664 ASSERT_TRUE(audio_content != NULL); | 705 ASSERT_TRUE(audio_content != NULL); |
| 665 ASSERT_EQ(0U, audio_content->cryptos().size()); | 706 ASSERT_EQ(0U, audio_content->cryptos().size()); |
| (...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1441 // The following flags affect options created for CreateOffer/CreateAnswer. | 1482 // The following flags affect options created for CreateOffer/CreateAnswer. |
| 1442 bool send_stream_1_ = false; | 1483 bool send_stream_1_ = false; |
| 1443 bool send_stream_2_ = false; | 1484 bool send_stream_2_ = false; |
| 1444 bool send_audio_ = false; | 1485 bool send_audio_ = false; |
| 1445 bool send_video_ = false; | 1486 bool send_video_ = false; |
| 1446 rtc::scoped_refptr<DataChannel> data_channel_; | 1487 rtc::scoped_refptr<DataChannel> data_channel_; |
| 1447 // Last values received from data channel creation signal. | 1488 // Last values received from data channel creation signal. |
| 1448 std::string last_data_channel_label_; | 1489 std::string last_data_channel_label_; |
| 1449 InternalDataChannelInit last_data_channel_config_; | 1490 InternalDataChannelInit last_data_channel_config_; |
| 1450 bool session_destroyed_ = false; | 1491 bool session_destroyed_ = false; |
| 1492 bool with_gcm_ = false; |
| 1451 }; | 1493 }; |
| 1452 | 1494 |
| 1453 TEST_P(WebRtcSessionTest, TestInitializeWithDtls) { | 1495 TEST_P(WebRtcSessionTest, TestInitializeWithDtls) { |
| 1454 InitWithDtls(GetParam()); | 1496 InitWithDtls(GetParam()); |
| 1455 // SDES is disabled when DTLS is on. | 1497 // SDES is disabled when DTLS is on. |
| 1456 EXPECT_EQ(cricket::SEC_DISABLED, session_->SdesPolicy()); | 1498 EXPECT_EQ(cricket::SEC_DISABLED, session_->SdesPolicy()); |
| 1457 } | 1499 } |
| 1458 | 1500 |
| 1459 TEST_F(WebRtcSessionTest, TestInitializeWithoutDtls) { | 1501 TEST_F(WebRtcSessionTest, TestInitializeWithoutDtls) { |
| 1460 Init(); | 1502 Init(); |
| (...skipping 1322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2783 TEST_F(WebRtcSessionTest, VerifyCryptoParamsInSDP) { | 2825 TEST_F(WebRtcSessionTest, VerifyCryptoParamsInSDP) { |
| 2784 Init(); | 2826 Init(); |
| 2785 SendAudioVideoStream1(); | 2827 SendAudioVideoStream1(); |
| 2786 std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer()); | 2828 std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer()); |
| 2787 VerifyCryptoParams(offer->description()); | 2829 VerifyCryptoParams(offer->description()); |
| 2788 SetRemoteDescriptionWithoutError(offer.release()); | 2830 SetRemoteDescriptionWithoutError(offer.release()); |
| 2789 std::unique_ptr<SessionDescriptionInterface> answer(CreateAnswer()); | 2831 std::unique_ptr<SessionDescriptionInterface> answer(CreateAnswer()); |
| 2790 VerifyCryptoParams(answer->description()); | 2832 VerifyCryptoParams(answer->description()); |
| 2791 } | 2833 } |
| 2792 | 2834 |
| 2835 TEST_F(WebRtcSessionTest, VerifyCryptoParamsInSDPGcm) { |
| 2836 InitWithGcm(); |
| 2837 SendAudioVideoStream1(); |
| 2838 std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer()); |
| 2839 VerifyCryptoParams(offer->description(), true); |
| 2840 SetRemoteDescriptionWithoutError(offer.release()); |
| 2841 std::unique_ptr<SessionDescriptionInterface> answer(CreateAnswer()); |
| 2842 VerifyCryptoParams(answer->description(), true); |
| 2843 } |
| 2844 |
| 2793 TEST_F(WebRtcSessionTest, VerifyNoCryptoParamsInSDP) { | 2845 TEST_F(WebRtcSessionTest, VerifyNoCryptoParamsInSDP) { |
| 2794 options_.disable_encryption = true; | 2846 options_.disable_encryption = true; |
| 2795 Init(); | 2847 Init(); |
| 2796 SendAudioVideoStream1(); | 2848 SendAudioVideoStream1(); |
| 2797 std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer()); | 2849 std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer()); |
| 2798 VerifyNoCryptoParams(offer->description(), false); | 2850 VerifyNoCryptoParams(offer->description(), false); |
| 2799 } | 2851 } |
| 2800 | 2852 |
| 2801 TEST_F(WebRtcSessionTest, VerifyAnswerFromNonCryptoOffer) { | 2853 TEST_F(WebRtcSessionTest, VerifyAnswerFromNonCryptoOffer) { |
| 2802 Init(); | 2854 Init(); |
| (...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3354 EXPECT_TRUE((local_offer)->Initialize(offer_str, NULL)); | 3406 EXPECT_TRUE((local_offer)->Initialize(offer_str, NULL)); |
| 3355 SetLocalDescriptionOfferExpectError(kBundleWithoutRtcpMux, local_offer); | 3407 SetLocalDescriptionOfferExpectError(kBundleWithoutRtcpMux, local_offer); |
| 3356 JsepSessionDescription* remote_offer = | 3408 JsepSessionDescription* remote_offer = |
| 3357 new JsepSessionDescription(JsepSessionDescription::kOffer); | 3409 new JsepSessionDescription(JsepSessionDescription::kOffer); |
| 3358 EXPECT_TRUE((remote_offer)->Initialize(offer_str, NULL)); | 3410 EXPECT_TRUE((remote_offer)->Initialize(offer_str, NULL)); |
| 3359 SetRemoteDescriptionOfferExpectError(kBundleWithoutRtcpMux, remote_offer); | 3411 SetRemoteDescriptionOfferExpectError(kBundleWithoutRtcpMux, remote_offer); |
| 3360 // Trying unmodified SDP. | 3412 // Trying unmodified SDP. |
| 3361 SetLocalDescriptionWithoutError(offer); | 3413 SetLocalDescriptionWithoutError(offer); |
| 3362 } | 3414 } |
| 3363 | 3415 |
| 3416 TEST_F(WebRtcSessionTest, SetSetupGcm) { |
| 3417 InitWithGcm(); |
| 3418 SendAudioVideoStream1(); |
| 3419 CreateAndSetRemoteOfferAndLocalAnswer(); |
| 3420 } |
| 3421 |
| 3364 TEST_F(WebRtcSessionTest, SetAudioPlayout) { | 3422 TEST_F(WebRtcSessionTest, SetAudioPlayout) { |
| 3365 Init(); | 3423 Init(); |
| 3366 SendAudioVideoStream1(); | 3424 SendAudioVideoStream1(); |
| 3367 CreateAndSetRemoteOfferAndLocalAnswer(); | 3425 CreateAndSetRemoteOfferAndLocalAnswer(); |
| 3368 cricket::FakeVoiceMediaChannel* channel = media_engine_->GetVoiceChannel(0); | 3426 cricket::FakeVoiceMediaChannel* channel = media_engine_->GetVoiceChannel(0); |
| 3369 ASSERT_TRUE(channel != NULL); | 3427 ASSERT_TRUE(channel != NULL); |
| 3370 ASSERT_EQ(1u, channel->recv_streams().size()); | 3428 ASSERT_EQ(1u, channel->recv_streams().size()); |
| 3371 uint32_t receive_ssrc = channel->recv_streams()[0].first_ssrc(); | 3429 uint32_t receive_ssrc = channel->recv_streams()[0].first_ssrc(); |
| 3372 double volume; | 3430 double volume; |
| 3373 EXPECT_TRUE(channel->GetOutputVolume(receive_ssrc, &volume)); | 3431 EXPECT_TRUE(channel->GetOutputVolume(receive_ssrc, &volume)); |
| (...skipping 1022 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4396 } | 4454 } |
| 4397 | 4455 |
| 4398 // TODO(bemasc): Add a TestIceStatesBundle with BUNDLE enabled. That test | 4456 // TODO(bemasc): Add a TestIceStatesBundle with BUNDLE enabled. That test |
| 4399 // currently fails because upon disconnection and reconnection OnIceComplete is | 4457 // currently fails because upon disconnection and reconnection OnIceComplete is |
| 4400 // called more than once without returning to IceGatheringGathering. | 4458 // called more than once without returning to IceGatheringGathering. |
| 4401 | 4459 |
| 4402 INSTANTIATE_TEST_CASE_P(WebRtcSessionTests, | 4460 INSTANTIATE_TEST_CASE_P(WebRtcSessionTests, |
| 4403 WebRtcSessionTest, | 4461 WebRtcSessionTest, |
| 4404 testing::Values(ALREADY_GENERATED, | 4462 testing::Values(ALREADY_GENERATED, |
| 4405 DTLS_IDENTITY_STORE)); | 4463 DTLS_IDENTITY_STORE)); |
| OLD | NEW |