| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/renderer/media/rtc_peer_connection_handler.h" | 5 #include "content/renderer/media/rtc_peer_connection_handler.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <set> |
| 10 #include <string> | 11 #include <string> |
| 11 #include <vector> | 12 #include <vector> |
| 12 | 13 |
| 13 #include "base/location.h" | 14 #include "base/location.h" |
| 14 #include "base/run_loop.h" | 15 #include "base/run_loop.h" |
| 15 #include "base/single_thread_task_runner.h" | 16 #include "base/single_thread_task_runner.h" |
| 16 #include "base/strings/utf_string_conversions.h" | 17 #include "base/strings/utf_string_conversions.h" |
| 17 #include "base/threading/thread_task_runner_handle.h" | 18 #include "base/threading/thread_task_runner_handle.h" |
| 18 #include "base/values.h" | 19 #include "base/values.h" |
| 19 #include "content/child/child_process.h" | 20 #include "content/child/child_process.h" |
| (...skipping 23 matching lines...) Expand all Loading... |
| 43 #include "third_party/WebKit/public/platform/WebRTCDataChannelInit.h" | 44 #include "third_party/WebKit/public/platform/WebRTCDataChannelInit.h" |
| 44 #include "third_party/WebKit/public/platform/WebRTCICECandidate.h" | 45 #include "third_party/WebKit/public/platform/WebRTCICECandidate.h" |
| 45 #include "third_party/WebKit/public/platform/WebRTCPeerConnectionHandlerClient.h
" | 46 #include "third_party/WebKit/public/platform/WebRTCPeerConnectionHandlerClient.h
" |
| 46 #include "third_party/WebKit/public/platform/WebRTCSessionDescription.h" | 47 #include "third_party/WebKit/public/platform/WebRTCSessionDescription.h" |
| 47 #include "third_party/WebKit/public/platform/WebRTCSessionDescriptionRequest.h" | 48 #include "third_party/WebKit/public/platform/WebRTCSessionDescriptionRequest.h" |
| 48 #include "third_party/WebKit/public/platform/WebRTCStatsRequest.h" | 49 #include "third_party/WebKit/public/platform/WebRTCStatsRequest.h" |
| 49 #include "third_party/WebKit/public/platform/WebRTCVoidRequest.h" | 50 #include "third_party/WebKit/public/platform/WebRTCVoidRequest.h" |
| 50 #include "third_party/WebKit/public/platform/WebURL.h" | 51 #include "third_party/WebKit/public/platform/WebURL.h" |
| 51 #include "third_party/WebKit/public/web/WebHeap.h" | 52 #include "third_party/WebKit/public/web/WebHeap.h" |
| 52 #include "third_party/webrtc/api/peerconnectioninterface.h" | 53 #include "third_party/webrtc/api/peerconnectioninterface.h" |
| 54 #include "third_party/webrtc/stats/test/rtcteststats.h" |
| 53 | 55 |
| 54 static const char kDummySdp[] = "dummy sdp"; | 56 static const char kDummySdp[] = "dummy sdp"; |
| 55 static const char kDummySdpType[] = "dummy type"; | 57 static const char kDummySdpType[] = "dummy type"; |
| 56 | 58 |
| 57 using blink::WebRTCPeerConnectionHandlerClient; | 59 using blink::WebRTCPeerConnectionHandlerClient; |
| 58 using testing::NiceMock; | 60 using testing::NiceMock; |
| 59 using testing::_; | 61 using testing::_; |
| 60 using testing::Ref; | 62 using testing::Ref; |
| 61 using testing::SaveArg; | 63 using testing::SaveArg; |
| 62 | 64 |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 TrackIceGatheringStateChange, | 183 TrackIceGatheringStateChange, |
| 182 void(RTCPeerConnectionHandler* pc_handler, | 184 void(RTCPeerConnectionHandler* pc_handler, |
| 183 WebRTCPeerConnectionHandlerClient::ICEGatheringState state)); | 185 WebRTCPeerConnectionHandlerClient::ICEGatheringState state)); |
| 184 MOCK_METHOD1(TrackOnRenegotiationNeeded, | 186 MOCK_METHOD1(TrackOnRenegotiationNeeded, |
| 185 void(RTCPeerConnectionHandler* pc_handler)); | 187 void(RTCPeerConnectionHandler* pc_handler)); |
| 186 MOCK_METHOD2(TrackCreateDTMFSender, | 188 MOCK_METHOD2(TrackCreateDTMFSender, |
| 187 void(RTCPeerConnectionHandler* pc_handler, | 189 void(RTCPeerConnectionHandler* pc_handler, |
| 188 const blink::WebMediaStreamTrack& track)); | 190 const blink::WebMediaStreamTrack& track)); |
| 189 }; | 191 }; |
| 190 | 192 |
| 193 class MockRTCStatsReportCallback : public blink::WebRTCStatsReportCallback { |
| 194 public: |
| 195 MockRTCStatsReportCallback(std::unique_ptr<blink::WebRTCStatsReport>* result) |
| 196 : main_thread_(base::ThreadTaskRunnerHandle::Get()), |
| 197 result_(result) { |
| 198 DCHECK(result_); |
| 199 } |
| 200 |
| 201 void OnStatsDelivered( |
| 202 std::unique_ptr<blink::WebRTCStatsReport> report) override { |
| 203 EXPECT_TRUE(main_thread_->BelongsToCurrentThread()); |
| 204 EXPECT_TRUE(report); |
| 205 result_->reset(report.release()); |
| 206 } |
| 207 |
| 208 private: |
| 209 scoped_refptr<base::SingleThreadTaskRunner> main_thread_; |
| 210 std::unique_ptr<blink::WebRTCStatsReport>* result_; |
| 211 }; |
| 212 |
| 213 template<typename T> |
| 214 std::vector<T> ToSequence(T value) { |
| 215 std::vector<T> vec; |
| 216 vec.push_back(value); |
| 217 return vec; |
| 218 } |
| 219 |
| 220 template<typename T> |
| 221 void ExpectSequenceEquals(const blink::WebVector<T>& sequence, T value) { |
| 222 EXPECT_EQ(sequence.size(), static_cast<size_t>(1)); |
| 223 EXPECT_EQ(sequence[0], value); |
| 224 } |
| 225 |
| 191 class RTCPeerConnectionHandlerUnderTest : public RTCPeerConnectionHandler { | 226 class RTCPeerConnectionHandlerUnderTest : public RTCPeerConnectionHandler { |
| 192 public: | 227 public: |
| 193 RTCPeerConnectionHandlerUnderTest( | 228 RTCPeerConnectionHandlerUnderTest( |
| 194 WebRTCPeerConnectionHandlerClient* client, | 229 WebRTCPeerConnectionHandlerClient* client, |
| 195 PeerConnectionDependencyFactory* dependency_factory) | 230 PeerConnectionDependencyFactory* dependency_factory) |
| 196 : RTCPeerConnectionHandler(client, dependency_factory) { | 231 : RTCPeerConnectionHandler(client, dependency_factory) { |
| 197 } | 232 } |
| 198 | 233 |
| 199 MockPeerConnectionImpl* native_peer_connection() { | 234 MockPeerConnectionImpl* native_peer_connection() { |
| 200 return static_cast<MockPeerConnectionImpl*>( | 235 return static_cast<MockPeerConnectionImpl*>( |
| (...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 629 scoped_refptr<MockRTCStatsRequest> request( | 664 scoped_refptr<MockRTCStatsRequest> request( |
| 630 new rtc::RefCountedObject<MockRTCStatsRequest>()); | 665 new rtc::RefCountedObject<MockRTCStatsRequest>()); |
| 631 request->setSelector(component); | 666 request->setSelector(component); |
| 632 pc_handler_->getStats(request.get()); | 667 pc_handler_->getStats(request.get()); |
| 633 base::RunLoop().RunUntilIdle(); | 668 base::RunLoop().RunUntilIdle(); |
| 634 EXPECT_EQ(0, request->result()->report_count()); | 669 EXPECT_EQ(0, request->result()->report_count()); |
| 635 | 670 |
| 636 StopAllTracks(local_stream); | 671 StopAllTracks(local_stream); |
| 637 } | 672 } |
| 638 | 673 |
| 674 TEST_F(RTCPeerConnectionHandlerTest, GetRTCStats) { |
| 675 rtc::scoped_refptr<webrtc::RTCStatsReport> report = |
| 676 webrtc::RTCStatsReport::Create(); |
| 677 |
| 678 report->AddStats(std::unique_ptr<const webrtc::RTCStats>( |
| 679 new webrtc::RTCTestStats("RTCUndefinedStats", 1000))); |
| 680 |
| 681 std::unique_ptr<webrtc::RTCTestStats> stats_defined_members( |
| 682 new webrtc::RTCTestStats("RTCDefinedStats", 2000)); |
| 683 stats_defined_members->m_int32 = 42; |
| 684 stats_defined_members->m_uint32 = 42; |
| 685 stats_defined_members->m_int64 = 42; |
| 686 stats_defined_members->m_uint64 = 42; |
| 687 stats_defined_members->m_double = 42.0; |
| 688 stats_defined_members->m_string = "42"; |
| 689 stats_defined_members->m_sequence_int32 = ToSequence<int32_t>(42); |
| 690 stats_defined_members->m_sequence_uint32 = ToSequence<uint32_t>(42); |
| 691 stats_defined_members->m_sequence_int64 = ToSequence<int64_t>(42); |
| 692 stats_defined_members->m_sequence_uint64 = ToSequence<uint64_t>(42); |
| 693 stats_defined_members->m_sequence_double = ToSequence<double>(42); |
| 694 stats_defined_members->m_sequence_string = ToSequence<std::string>("42"); |
| 695 report->AddStats(std::unique_ptr<const webrtc::RTCStats>( |
| 696 stats_defined_members.release())); |
| 697 |
| 698 pc_handler_->native_peer_connection()->SetGetStatsReport(report); |
| 699 std::unique_ptr<blink::WebRTCStatsReport> result; |
| 700 pc_handler_->getStats(std::unique_ptr<blink::WebRTCStatsReportCallback>( |
| 701 new MockRTCStatsReportCallback(&result))); |
| 702 base::RunLoop().RunUntilIdle(); |
| 703 EXPECT_TRUE(result); |
| 704 |
| 705 int undefined_stats_count = 0; |
| 706 int defined_stats_count = 0; |
| 707 for (std::unique_ptr<blink::WebRTCStats> stats = result->next(); stats; |
| 708 stats.reset(result->next().release())) { |
| 709 EXPECT_EQ(stats->type().utf8(), webrtc::RTCTestStats::kType); |
| 710 if (stats->id().utf8() == "RTCUndefinedStats") { |
| 711 ++undefined_stats_count; |
| 712 EXPECT_EQ(stats->timestamp(), 1.0); |
| 713 for (size_t i = 0; i < stats->membersCount(); ++i) { |
| 714 EXPECT_FALSE(stats->getMember(i)->isDefined()); |
| 715 } |
| 716 } else if (stats->id().utf8() == "RTCDefinedStats") { |
| 717 ++defined_stats_count; |
| 718 EXPECT_EQ(stats->timestamp(), 2.0); |
| 719 std::set<blink::WebRTCStatsMemberType> members; |
| 720 for (size_t i = 0; i < stats->membersCount(); ++i) { |
| 721 std::unique_ptr<blink::WebRTCStatsMember> member = |
| 722 stats->getMember(i); |
| 723 EXPECT_TRUE(member->isDefined()); |
| 724 members.insert(member->type()); |
| 725 switch (member->type()) { |
| 726 case blink::WebRTCStatsMemberTypeInt32: |
| 727 EXPECT_EQ(member->valueInt32(), static_cast<int32_t>(42)); |
| 728 break; |
| 729 case blink::WebRTCStatsMemberTypeUint32: |
| 730 EXPECT_EQ(member->valueUint32(), static_cast<uint32_t>(42)); |
| 731 break; |
| 732 case blink::WebRTCStatsMemberTypeInt64: |
| 733 EXPECT_EQ(member->valueInt64(), static_cast<int64_t>(42)); |
| 734 break; |
| 735 case blink::WebRTCStatsMemberTypeUint64: |
| 736 EXPECT_EQ(member->valueUint64(), static_cast<uint64_t>(42)); |
| 737 break; |
| 738 case blink::WebRTCStatsMemberTypeDouble: |
| 739 EXPECT_EQ(member->valueDouble(), 42.0); |
| 740 break; |
| 741 case blink::WebRTCStatsMemberTypeString: |
| 742 EXPECT_EQ(member->valueString(), blink::WebString::fromUTF8("42")); |
| 743 break; |
| 744 case blink::WebRTCStatsMemberTypeSequenceInt32: |
| 745 ExpectSequenceEquals(member->valueSequenceInt32(), |
| 746 static_cast<int32_t>(42)); |
| 747 break; |
| 748 case blink::WebRTCStatsMemberTypeSequenceUint32: |
| 749 ExpectSequenceEquals(member->valueSequenceUint32(), |
| 750 static_cast<uint32_t>(42)); |
| 751 break; |
| 752 case blink::WebRTCStatsMemberTypeSequenceInt64: |
| 753 ExpectSequenceEquals(member->valueSequenceInt64(), |
| 754 static_cast<int64_t>(42)); |
| 755 break; |
| 756 case blink::WebRTCStatsMemberTypeSequenceUint64: |
| 757 ExpectSequenceEquals(member->valueSequenceUint64(), |
| 758 static_cast<uint64_t>(42)); |
| 759 break; |
| 760 case blink::WebRTCStatsMemberTypeSequenceDouble: |
| 761 ExpectSequenceEquals(member->valueSequenceDouble(), 42.0); |
| 762 break; |
| 763 case blink::WebRTCStatsMemberTypeSequenceString: |
| 764 ExpectSequenceEquals(member->valueSequenceString(), |
| 765 blink::WebString::fromUTF8("42")); |
| 766 break; |
| 767 default: |
| 768 NOTREACHED(); |
| 769 } |
| 770 } |
| 771 EXPECT_EQ(members.size(), static_cast<size_t>(12)); |
| 772 } else { |
| 773 NOTREACHED(); |
| 774 } |
| 775 } |
| 776 EXPECT_EQ(undefined_stats_count, 1); |
| 777 EXPECT_EQ(defined_stats_count, 1); |
| 778 } |
| 779 |
| 639 TEST_F(RTCPeerConnectionHandlerTest, OnSignalingChange) { | 780 TEST_F(RTCPeerConnectionHandlerTest, OnSignalingChange) { |
| 640 testing::InSequence sequence; | 781 testing::InSequence sequence; |
| 641 | 782 |
| 642 webrtc::PeerConnectionInterface::SignalingState new_state = | 783 webrtc::PeerConnectionInterface::SignalingState new_state = |
| 643 webrtc::PeerConnectionInterface::kHaveRemoteOffer; | 784 webrtc::PeerConnectionInterface::kHaveRemoteOffer; |
| 644 EXPECT_CALL(*mock_tracker_.get(), TrackSignalingStateChange( | 785 EXPECT_CALL(*mock_tracker_.get(), TrackSignalingStateChange( |
| 645 pc_handler_.get(), | 786 pc_handler_.get(), |
| 646 WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemoteOffer)); | 787 WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemoteOffer)); |
| 647 EXPECT_CALL(*mock_client_.get(), didChangeSignalingState( | 788 EXPECT_CALL(*mock_client_.get(), didChangeSignalingState( |
| 648 WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemoteOffer)); | 789 WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemoteOffer)); |
| (...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1058 testing::Ref(tracks[0]))); | 1199 testing::Ref(tracks[0]))); |
| 1059 | 1200 |
| 1060 std::unique_ptr<blink::WebRTCDTMFSenderHandler> sender( | 1201 std::unique_ptr<blink::WebRTCDTMFSenderHandler> sender( |
| 1061 pc_handler_->createDTMFSender(tracks[0])); | 1202 pc_handler_->createDTMFSender(tracks[0])); |
| 1062 EXPECT_TRUE(sender.get()); | 1203 EXPECT_TRUE(sender.get()); |
| 1063 | 1204 |
| 1064 StopAllTracks(local_stream); | 1205 StopAllTracks(local_stream); |
| 1065 } | 1206 } |
| 1066 | 1207 |
| 1067 } // namespace content | 1208 } // namespace content |
| OLD | NEW |