Index: webrtc/api/rtcstats_integrationtest.cc |
diff --git a/webrtc/api/rtcstats_integrationtest.cc b/webrtc/api/rtcstats_integrationtest.cc |
index c28130fe8a692558116b401eb2887ef3149454ae..0ffffb10619a7acceebb3cef40491be41331921d 100644 |
--- a/webrtc/api/rtcstats_integrationtest.cc |
+++ b/webrtc/api/rtcstats_integrationtest.cc |
@@ -8,6 +8,7 @@ |
* be found in the AUTHORS file in the root of the source tree. |
*/ |
+#include <functional> |
#include <set> |
#include <vector> |
@@ -121,18 +122,26 @@ class RTCStatsVerifier { |
void TestMemberIsDefined(const RTCStatsMemberInterface& member) { |
EXPECT_TRUE(member.is_defined()) << |
- stats_->type() << "." << member.name() << "[" << stats_->id() << |
- "] was undefined."; |
+ stats_->type() << "." << member.name() << "[" << stats_->id() << |
+ "] was undefined."; |
MarkMemberTested(member, member.is_defined()); |
} |
void TestMemberIsUndefined(const RTCStatsMemberInterface& member) { |
EXPECT_FALSE(member.is_defined()) << |
- stats_->type() << "." << member.name() << "[" << stats_->id() << |
- "] was defined (" << member.ValueToString() << ")."; |
+ stats_->type() << "." << member.name() << "[" << stats_->id() << |
+ "] was defined (" << member.ValueToString() << ")."; |
MarkMemberTested(member, !member.is_defined()); |
} |
+ void TestMemberIsPositive(const RTCStatsMemberInterface& member) { |
+ TestMemberSign(member, "positive", [](int sign) { return sign == 1; }); |
hta-webrtc
2016/12/20 15:19:18
This seems like a huge amount of machinery for say
hbos
2016/12/21 10:41:14
Not quite, I have to do MarkMemberTested and EXPEC
|
+ } |
+ |
+ void TestMemberIsNonNegative(const RTCStatsMemberInterface& member) { |
+ TestMemberSign(member, "non-negative", [](int sign) { return sign >= 0; }); |
+ } |
+ |
void TestMemberIsIDReference( |
const RTCStatsMemberInterface& member, |
const char* expected_type) { |
@@ -157,6 +166,62 @@ class RTCStatsVerifier { |
} |
private: |
+ void TestMemberSign(const RTCStatsMemberInterface& member, |
+ const char* sign_requirement, |
+ std::function<bool(int)> sign_check) { |
+ EXPECT_TRUE(member.is_defined()) << |
+ stats_->type() << "." << member.name() << "[" << stats_->id() << |
+ "] was undefined."; |
+ if (!member.is_defined()) { |
+ MarkMemberTested(member, false); |
+ return; |
+ } |
+ rtc::Optional<int> sign; |
+ switch (member.type()) { |
+ case RTCStatsMemberInterface::kInt32: |
+ sign = rtc::Optional<int>(Sign( |
+ **static_cast<const RTCStatsMember<int32_t>*>(&member))); |
+ break; |
+ case RTCStatsMemberInterface::kUint32: |
+ sign = rtc::Optional<int>(Sign( |
+ **static_cast<const RTCStatsMember<uint32_t>*>(&member))); |
+ break; |
+ case RTCStatsMemberInterface::kInt64: |
+ sign = rtc::Optional<int>(Sign( |
+ **static_cast<const RTCStatsMember<int64_t>*>(&member))); |
+ break; |
+ case RTCStatsMemberInterface::kUint64: |
+ sign = rtc::Optional<int>(Sign( |
+ **static_cast<const RTCStatsMember<uint64_t>*>(&member))); |
+ break; |
+ case RTCStatsMemberInterface::kDouble: |
+ sign = rtc::Optional<int>(Sign( |
+ **static_cast<const RTCStatsMember<double>*>(&member))); |
+ break; |
+ default: |
+ break; |
+ } |
+ if (!sign) { |
+ EXPECT_TRUE(false) << |
+ stats_->type() << "." << member.name() << "[" << stats_->id() << |
+ "] is not " << sign_requirement << " because it is not a numeric " << |
+ "value (" << member.ValueToString() << ")."; |
+ MarkMemberTested(member, false); |
+ return; |
+ } |
+ bool passed_sign_check = sign_check(*sign); |
+ EXPECT_TRUE(passed_sign_check) << |
+ stats_->type() << "." << member.name() << "[" << stats_->id() << |
+ "] is not " << sign_requirement << " (" << member.ValueToString() << |
+ ")."; |
+ MarkMemberTested(member, passed_sign_check); |
+ } |
+ |
+ template<typename T> |
+ int Sign(T value) { |
+ return (value > T(0)) - (value < T(0)); |
+ } |
+ |
void TestMemberIsIDReference( |
const RTCStatsMemberInterface& member, |
const char* expected_type, |
@@ -297,7 +362,7 @@ class RTCStatsReportVerifier { |
RTCStatsVerifier verifier(report_, &codec); |
verifier.TestMemberIsDefined(codec.payload_type); |
verifier.TestMemberIsDefined(codec.codec); |
- verifier.TestMemberIsDefined(codec.clock_rate); |
+ verifier.TestMemberIsPositive(codec.clock_rate); |
verifier.TestMemberIsUndefined(codec.channels); |
verifier.TestMemberIsUndefined(codec.parameters); |
verifier.TestMemberIsUndefined(codec.implementation); |
@@ -311,10 +376,10 @@ class RTCStatsReportVerifier { |
verifier.TestMemberIsDefined(data_channel.protocol); |
verifier.TestMemberIsDefined(data_channel.datachannelid); |
verifier.TestMemberIsDefined(data_channel.state); |
- verifier.TestMemberIsDefined(data_channel.messages_sent); |
- verifier.TestMemberIsDefined(data_channel.bytes_sent); |
- verifier.TestMemberIsDefined(data_channel.messages_received); |
- verifier.TestMemberIsDefined(data_channel.bytes_received); |
+ verifier.TestMemberIsNonNegative(data_channel.messages_sent); |
+ verifier.TestMemberIsNonNegative(data_channel.bytes_sent); |
+ verifier.TestMemberIsNonNegative(data_channel.messages_received); |
+ verifier.TestMemberIsNonNegative(data_channel.bytes_received); |
return verifier.ExpectAllMembersSuccessfullyTested(); |
} |
@@ -332,20 +397,20 @@ class RTCStatsReportVerifier { |
verifier.TestMemberIsUndefined(candidate_pair.nominated); |
verifier.TestMemberIsDefined(candidate_pair.writable); |
verifier.TestMemberIsUndefined(candidate_pair.readable); |
- verifier.TestMemberIsDefined(candidate_pair.bytes_sent); |
- verifier.TestMemberIsDefined(candidate_pair.bytes_received); |
+ verifier.TestMemberIsNonNegative(candidate_pair.bytes_sent); |
+ verifier.TestMemberIsNonNegative(candidate_pair.bytes_received); |
verifier.TestMemberIsUndefined(candidate_pair.total_round_trip_time); |
- verifier.TestMemberIsDefined(candidate_pair.current_round_trip_time); |
+ verifier.TestMemberIsNonNegative(candidate_pair.current_round_trip_time); |
verifier.TestMemberIsUndefined(candidate_pair.available_outgoing_bitrate); |
verifier.TestMemberIsUndefined(candidate_pair.available_incoming_bitrate); |
- verifier.TestMemberIsDefined(candidate_pair.requests_received); |
- verifier.TestMemberIsDefined(candidate_pair.requests_sent); |
- verifier.TestMemberIsDefined(candidate_pair.responses_received); |
- verifier.TestMemberIsDefined(candidate_pair.responses_sent); |
+ verifier.TestMemberIsNonNegative(candidate_pair.requests_received); |
+ verifier.TestMemberIsNonNegative(candidate_pair.requests_sent); |
+ verifier.TestMemberIsNonNegative(candidate_pair.responses_received); |
+ verifier.TestMemberIsNonNegative(candidate_pair.responses_sent); |
verifier.TestMemberIsUndefined(candidate_pair.retransmissions_received); |
verifier.TestMemberIsUndefined(candidate_pair.retransmissions_sent); |
verifier.TestMemberIsUndefined(candidate_pair.consent_requests_received); |
- verifier.TestMemberIsDefined(candidate_pair.consent_requests_sent); |
+ verifier.TestMemberIsNonNegative(candidate_pair.consent_requests_sent); |
verifier.TestMemberIsUndefined(candidate_pair.consent_responses_received); |
verifier.TestMemberIsUndefined(candidate_pair.consent_responses_sent); |
return verifier.ExpectAllMembersSuccessfullyTested(); |
@@ -355,10 +420,10 @@ class RTCStatsReportVerifier { |
const RTCIceCandidateStats& candidate) { |
RTCStatsVerifier verifier(report_, &candidate); |
verifier.TestMemberIsDefined(candidate.ip); |
- verifier.TestMemberIsDefined(candidate.port); |
+ verifier.TestMemberIsNonNegative(candidate.port); |
verifier.TestMemberIsDefined(candidate.protocol); |
verifier.TestMemberIsDefined(candidate.candidate_type); |
- verifier.TestMemberIsDefined(candidate.priority); |
+ verifier.TestMemberIsNonNegative(candidate.priority); |
verifier.TestMemberIsUndefined(candidate.url); |
return verifier.ExpectAllMembersSuccessfullyTested(); |
} |
@@ -393,8 +458,8 @@ class RTCStatsReportVerifier { |
// Video or audio media stream track? |
if (media_stream_track.frame_width.is_defined()) { |
// Video-only members |
- verifier.TestMemberIsDefined(media_stream_track.frame_width); |
- verifier.TestMemberIsDefined(media_stream_track.frame_height); |
+ verifier.TestMemberIsNonNegative(media_stream_track.frame_width); |
+ verifier.TestMemberIsNonNegative(media_stream_track.frame_height); |
verifier.TestMemberIsUndefined(media_stream_track.frames_per_second); |
verifier.TestMemberIsUndefined(media_stream_track.frames_sent); |
verifier.TestMemberIsUndefined(media_stream_track.frames_received); |
@@ -436,8 +501,8 @@ class RTCStatsReportVerifier { |
bool VerifyRTCPeerConnectionStats( |
const RTCPeerConnectionStats& peer_connection) { |
RTCStatsVerifier verifier(report_, &peer_connection); |
- verifier.TestMemberIsDefined(peer_connection.data_channels_opened); |
- verifier.TestMemberIsDefined(peer_connection.data_channels_closed); |
+ verifier.TestMemberIsNonNegative(peer_connection.data_channels_opened); |
+ verifier.TestMemberIsNonNegative(peer_connection.data_channels_closed); |
return verifier.ExpectAllMembersSuccessfullyTested(); |
} |
@@ -452,9 +517,9 @@ class RTCStatsReportVerifier { |
stream.transport_id, RTCTransportStats::kType); |
verifier->TestMemberIsIDReference(stream.codec_id, RTCCodecStats::kType); |
if (stream.media_type.is_defined() && *stream.media_type == "video") { |
- verifier->TestMemberIsDefined(stream.fir_count); |
- verifier->TestMemberIsDefined(stream.pli_count); |
- verifier->TestMemberIsDefined(stream.nack_count); |
+ verifier->TestMemberIsNonNegative(stream.fir_count); |
+ verifier->TestMemberIsNonNegative(stream.pli_count); |
+ verifier->TestMemberIsNonNegative(stream.nack_count); |
} else { |
verifier->TestMemberIsUndefined(stream.fir_count); |
verifier->TestMemberIsUndefined(stream.pli_count); |
@@ -467,16 +532,16 @@ class RTCStatsReportVerifier { |
const RTCInboundRTPStreamStats& inbound_stream) { |
RTCStatsVerifier verifier(report_, &inbound_stream); |
VerifyRTCRTPStreamStats(inbound_stream, &verifier); |
- verifier.TestMemberIsDefined(inbound_stream.packets_received); |
- verifier.TestMemberIsDefined(inbound_stream.bytes_received); |
- verifier.TestMemberIsDefined(inbound_stream.packets_lost); |
+ verifier.TestMemberIsNonNegative(inbound_stream.packets_received); |
+ verifier.TestMemberIsNonNegative(inbound_stream.bytes_received); |
+ verifier.TestMemberIsNonNegative(inbound_stream.packets_lost); |
if (inbound_stream.media_type.is_defined() && |
*inbound_stream.media_type == "video") { |
verifier.TestMemberIsUndefined(inbound_stream.jitter); |
} else { |
- verifier.TestMemberIsDefined(inbound_stream.jitter); |
+ verifier.TestMemberIsNonNegative(inbound_stream.jitter); |
} |
- verifier.TestMemberIsDefined(inbound_stream.fraction_lost); |
+ verifier.TestMemberIsNonNegative(inbound_stream.fraction_lost); |
verifier.TestMemberIsUndefined(inbound_stream.packets_discarded); |
verifier.TestMemberIsUndefined(inbound_stream.packets_repaired); |
verifier.TestMemberIsUndefined(inbound_stream.burst_packets_lost); |
@@ -494,8 +559,8 @@ class RTCStatsReportVerifier { |
const RTCOutboundRTPStreamStats& outbound_stream) { |
RTCStatsVerifier verifier(report_, &outbound_stream); |
VerifyRTCRTPStreamStats(outbound_stream, &verifier); |
- verifier.TestMemberIsDefined(outbound_stream.packets_sent); |
- verifier.TestMemberIsDefined(outbound_stream.bytes_sent); |
+ verifier.TestMemberIsNonNegative(outbound_stream.packets_sent); |
+ verifier.TestMemberIsNonNegative(outbound_stream.bytes_sent); |
verifier.TestMemberIsUndefined(outbound_stream.target_bitrate); |
// TODO(hbos): Defined in video but not audio case. Why? crbug.com/669877 |
verifier.MarkMemberTested(outbound_stream.round_trip_time, true); |
@@ -505,8 +570,8 @@ class RTCStatsReportVerifier { |
bool VerifyRTCTransportStats( |
const RTCTransportStats& transport) { |
RTCStatsVerifier verifier(report_, &transport); |
- verifier.TestMemberIsDefined(transport.bytes_sent); |
- verifier.TestMemberIsDefined(transport.bytes_received); |
+ verifier.TestMemberIsNonNegative(transport.bytes_sent); |
+ verifier.TestMemberIsNonNegative(transport.bytes_received); |
verifier.TestMemberIsOptionalIDReference( |
transport.rtcp_transport_stats_id, RTCTransportStats::kType); |
verifier.TestMemberIsDefined(transport.active_connection); |