Index: content/renderer/media/rtc_peer_connection_handler_unittest.cc |
diff --git a/content/renderer/media/rtc_peer_connection_handler_unittest.cc b/content/renderer/media/rtc_peer_connection_handler_unittest.cc |
index ac55922d2ca8c90e12d41119b5857dfc76bd5fac..3e0ecf8e86e397284f9efd2e13ff226564d81ad6 100644 |
--- a/content/renderer/media/rtc_peer_connection_handler_unittest.cc |
+++ b/content/renderer/media/rtc_peer_connection_handler_unittest.cc |
@@ -7,6 +7,7 @@ |
#include <stddef.h> |
#include <memory> |
+#include <set> |
#include <string> |
#include <vector> |
@@ -50,6 +51,7 @@ |
#include "third_party/WebKit/public/platform/WebURL.h" |
#include "third_party/WebKit/public/web/WebHeap.h" |
#include "third_party/webrtc/api/peerconnectioninterface.h" |
+#include "third_party/webrtc/stats/test/rtcteststats.h" |
static const char kDummySdp[] = "dummy sdp"; |
static const char kDummySdpType[] = "dummy type"; |
@@ -188,6 +190,39 @@ class MockPeerConnectionTracker : public PeerConnectionTracker { |
const blink::WebMediaStreamTrack& track)); |
}; |
+class MockRTCStatsReportCallback : public blink::WebRTCStatsReportCallback { |
+ public: |
+ MockRTCStatsReportCallback(std::unique_ptr<blink::WebRTCStatsReport>* result) |
+ : main_thread_(base::ThreadTaskRunnerHandle::Get()), |
+ result_(result) { |
+ DCHECK(result_); |
+ } |
+ |
+ void OnStatsDelivered( |
+ std::unique_ptr<blink::WebRTCStatsReport> report) override { |
+ EXPECT_TRUE(main_thread_->BelongsToCurrentThread()); |
+ EXPECT_TRUE(report); |
+ result_->reset(report.release()); |
+ } |
+ |
+ private: |
+ scoped_refptr<base::SingleThreadTaskRunner> main_thread_; |
+ std::unique_ptr<blink::WebRTCStatsReport>* result_; |
+}; |
+ |
+template<typename T> |
+std::vector<T> ToSequence(T value) { |
+ std::vector<T> vec; |
+ vec.push_back(value); |
+ return vec; |
+} |
+ |
+template<typename T> |
+void ExpectSequenceEquals(const blink::WebVector<T>& sequence, T value) { |
+ EXPECT_EQ(sequence.size(), static_cast<size_t>(1)); |
+ EXPECT_EQ(sequence[0], value); |
+} |
+ |
class RTCPeerConnectionHandlerUnderTest : public RTCPeerConnectionHandler { |
public: |
RTCPeerConnectionHandlerUnderTest( |
@@ -636,6 +671,112 @@ TEST_F(RTCPeerConnectionHandlerTest, GetStatsWithBadSelector) { |
StopAllTracks(local_stream); |
} |
+TEST_F(RTCPeerConnectionHandlerTest, GetRTCStats) { |
+ rtc::scoped_refptr<webrtc::RTCStatsReport> report = |
+ webrtc::RTCStatsReport::Create(); |
+ |
+ report->AddStats(std::unique_ptr<const webrtc::RTCStats>( |
+ new webrtc::RTCTestStats("RTCUndefinedStats", 1000))); |
+ |
+ std::unique_ptr<webrtc::RTCTestStats> stats_defined_members( |
+ new webrtc::RTCTestStats("RTCDefinedStats", 2000)); |
+ stats_defined_members->m_int32 = 42; |
+ stats_defined_members->m_uint32 = 42; |
+ stats_defined_members->m_int64 = 42; |
+ stats_defined_members->m_uint64 = 42; |
+ stats_defined_members->m_double = 42.0; |
+ stats_defined_members->m_string = "42"; |
+ stats_defined_members->m_sequence_int32 = ToSequence<int32_t>(42); |
+ stats_defined_members->m_sequence_uint32 = ToSequence<uint32_t>(42); |
+ stats_defined_members->m_sequence_int64 = ToSequence<int64_t>(42); |
+ stats_defined_members->m_sequence_uint64 = ToSequence<uint64_t>(42); |
+ stats_defined_members->m_sequence_double = ToSequence<double>(42); |
+ stats_defined_members->m_sequence_string = ToSequence<std::string>("42"); |
+ report->AddStats(std::unique_ptr<const webrtc::RTCStats>( |
+ stats_defined_members.release())); |
+ |
+ pc_handler_->native_peer_connection()->SetGetStatsReport(report); |
+ std::unique_ptr<blink::WebRTCStatsReport> result; |
+ pc_handler_->getStats(std::unique_ptr<blink::WebRTCStatsReportCallback>( |
+ new MockRTCStatsReportCallback(&result))); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_TRUE(result); |
+ |
+ int undefined_stats_count = 0; |
+ int defined_stats_count = 0; |
+ for (std::unique_ptr<blink::WebRTCStats> stats = result->next(); stats; |
+ stats.reset(result->next().release())) { |
+ EXPECT_EQ(stats->type().utf8(), webrtc::RTCTestStats::kType); |
+ if (stats->id().utf8() == "RTCUndefinedStats") { |
+ ++undefined_stats_count; |
+ EXPECT_EQ(stats->timestamp(), 1.0); |
+ for (size_t i = 0; i < stats->membersCount(); ++i) { |
+ EXPECT_FALSE(stats->getMember(i)->isDefined()); |
+ } |
+ } else if (stats->id().utf8() == "RTCDefinedStats") { |
+ ++defined_stats_count; |
+ EXPECT_EQ(stats->timestamp(), 2.0); |
+ std::set<blink::WebRTCStatsMemberType> members; |
+ for (size_t i = 0; i < stats->membersCount(); ++i) { |
+ std::unique_ptr<blink::WebRTCStatsMember> member = |
+ stats->getMember(i); |
+ EXPECT_TRUE(member->isDefined()); |
+ members.insert(member->type()); |
+ switch (member->type()) { |
+ case blink::WebRTCStatsMemberTypeInt32: |
+ EXPECT_EQ(member->valueInt32(), static_cast<int32_t>(42)); |
+ break; |
+ case blink::WebRTCStatsMemberTypeUint32: |
+ EXPECT_EQ(member->valueUint32(), static_cast<uint32_t>(42)); |
+ break; |
+ case blink::WebRTCStatsMemberTypeInt64: |
+ EXPECT_EQ(member->valueInt64(), static_cast<int64_t>(42)); |
+ break; |
+ case blink::WebRTCStatsMemberTypeUint64: |
+ EXPECT_EQ(member->valueUint64(), static_cast<uint64_t>(42)); |
+ break; |
+ case blink::WebRTCStatsMemberTypeDouble: |
+ EXPECT_EQ(member->valueDouble(), 42.0); |
+ break; |
+ case blink::WebRTCStatsMemberTypeString: |
+ EXPECT_EQ(member->valueString(), blink::WebString::fromUTF8("42")); |
+ break; |
+ case blink::WebRTCStatsMemberTypeSequenceInt32: |
+ ExpectSequenceEquals(member->valueSequenceInt32(), |
+ static_cast<int32_t>(42)); |
+ break; |
+ case blink::WebRTCStatsMemberTypeSequenceUint32: |
+ ExpectSequenceEquals(member->valueSequenceUint32(), |
+ static_cast<uint32_t>(42)); |
+ break; |
+ case blink::WebRTCStatsMemberTypeSequenceInt64: |
+ ExpectSequenceEquals(member->valueSequenceInt64(), |
+ static_cast<int64_t>(42)); |
+ break; |
+ case blink::WebRTCStatsMemberTypeSequenceUint64: |
+ ExpectSequenceEquals(member->valueSequenceUint64(), |
+ static_cast<uint64_t>(42)); |
+ break; |
+ case blink::WebRTCStatsMemberTypeSequenceDouble: |
+ ExpectSequenceEquals(member->valueSequenceDouble(), 42.0); |
+ break; |
+ case blink::WebRTCStatsMemberTypeSequenceString: |
+ ExpectSequenceEquals(member->valueSequenceString(), |
+ blink::WebString::fromUTF8("42")); |
+ break; |
+ default: |
+ NOTREACHED(); |
+ } |
+ } |
+ EXPECT_EQ(members.size(), static_cast<size_t>(12)); |
+ } else { |
+ NOTREACHED(); |
+ } |
+ } |
+ EXPECT_EQ(undefined_stats_count, 1); |
+ EXPECT_EQ(defined_stats_count, 1); |
+} |
+ |
TEST_F(RTCPeerConnectionHandlerTest, OnSignalingChange) { |
testing::InSequence sequence; |