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...) 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...) 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...) 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...) 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 |