test_api_rtcp.cc revision 00b8f6b3643332cce1ee711715f7fbb824d793ca
18281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org/* 207c68b9c9de03b4110f25cb59d9d7ba8bad624bdleozwang@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 38281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org * 48281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org * Use of this source code is governed by a BSD-style license 58281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org * that can be found in the LICENSE file in the root of the source 68281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org * tree. An additional intellectual property rights grant can be found 78281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org * in the file PATENTS. All contributing project authors may 88281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org * be found in the AUTHORS file in the root of the source tree. 98281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org */ 108281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 118281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org#include <algorithm> 128281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org#include <vector> 138281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 14a048d7cb0a5bad5ca49bbcc5273cb4cca28c1710pbos@webrtc.org#include "testing/gmock/include/gmock/gmock.h" 15a048d7cb0a5bad5ca49bbcc5273cb4cca28c1710pbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 16a048d7cb0a5bad5ca49bbcc5273cb4cca28c1710pbos@webrtc.org#include "webrtc/common_types.h" 17822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/receive_statistics.h" 18a048d7cb0a5bad5ca49bbcc5273cb4cca28c1710pbos@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h" 19a048d7cb0a5bad5ca49bbcc5273cb4cca28c1710pbos@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h" 20822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org#include "webrtc/modules/rtp_rtcp/source/rtp_receiver_audio.h" 21a048d7cb0a5bad5ca49bbcc5273cb4cca28c1710pbos@webrtc.org#include "webrtc/modules/rtp_rtcp/test/testAPI/test_api.h" 228281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 238281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.orgusing namespace webrtc; 249663686546d9d19b7b8d3d6d75d550d14fe3d3d0andrew@webrtc.org 2549888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.orgconst uint64_t kTestPictureId = 12345678; 268281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 27ece3890d3a40fe911ae895e28c329491e795b14dpbos@webrtc.orgclass RtcpCallback : public RtcpIntraFrameObserver { 288281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org public: 292853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org void SetModule(RtpRtcp* module) { 308281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org _rtpRtcpModule = module; 318281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org }; 322f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org virtual void OnRTCPPacketTimeout(const int32_t id) { 338281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org } 342f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org virtual void OnLipSyncUpdate(const int32_t id, 352f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org const int32_t audioVideoOffset) { 368281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org }; 379663686546d9d19b7b8d3d6d75d550d14fe3d3d0andrew@webrtc.org virtual void OnReceivedIntraFrameRequest(uint32_t ssrc) { 3849888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org }; 399663686546d9d19b7b8d3d6d75d550d14fe3d3d0andrew@webrtc.org virtual void OnReceivedSLI(uint32_t ssrc, 409663686546d9d19b7b8d3d6d75d550d14fe3d3d0andrew@webrtc.org uint8_t pictureId) { 4149888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org EXPECT_EQ(28, pictureId); 4249888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org }; 439663686546d9d19b7b8d3d6d75d550d14fe3d3d0andrew@webrtc.org virtual void OnReceivedRPSI(uint32_t ssrc, 449663686546d9d19b7b8d3d6d75d550d14fe3d3d0andrew@webrtc.org uint64_t pictureId) { 4549888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org EXPECT_EQ(kTestPictureId, pictureId); 4649888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org }; 47aca26292aeb35c91e70dd22d5923bf74ce68fa30mflodman@webrtc.org virtual void OnLocalSsrcChanged(uint32_t old_ssrc, uint32_t new_ssrc) {}; 488281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org private: 498281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org RtpRtcp* _rtpRtcpModule; 508281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org}; 518281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 52822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.orgclass TestRtpFeedback : public NullRtpFeedback { 53822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org public: 54822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org TestRtpFeedback(RtpRtcp* rtp_rtcp) : rtp_rtcp_(rtp_rtcp) {} 55822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org virtual ~TestRtpFeedback() {} 56822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 57822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org virtual void OnIncomingSSRCChanged(const int32_t id, 58286fe0b04d97205ac84688bbe613d5749192b2d1stefan@webrtc.org const uint32_t ssrc) { 59286fe0b04d97205ac84688bbe613d5749192b2d1stefan@webrtc.org rtp_rtcp_->SetRemoteSSRC(ssrc); 60822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org } 61822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 62822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org private: 63822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org RtpRtcp* rtp_rtcp_; 64822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org}; 65822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 668281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.orgclass RtpRtcpRtcpTest : public ::testing::Test { 678281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org protected: 68a678a3baee2e680bd521f3a6caf97707fffd6093stefan@webrtc.org RtpRtcpRtcpTest() : fake_clock(123456) { 699334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org test_csrcs.push_back(1234); 709334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org test_csrcs.push_back(2345); 718281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org test_id = 123; 728281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org test_ssrc = 3456; 738281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org test_timestamp = 4567; 748281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org test_sequence_number = 2345; 758281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org } 768281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org ~RtpRtcpRtcpTest() {} 778281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 788281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org virtual void SetUp() { 79822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org receiver = new TestRtpReceiver(); 802853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org transport1 = new LoopBackTransport(); 812853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org transport2 = new LoopBackTransport(); 822853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org myRTCPFeedback1 = new RtcpCallback(); 832853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org myRTCPFeedback2 = new RtcpCallback(); 842853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org 85822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org receive_statistics1_.reset(ReceiveStatistics::Create(&fake_clock)); 86822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org receive_statistics2_.reset(ReceiveStatistics::Create(&fake_clock)); 87822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 882853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org RtpRtcp::Configuration configuration; 892853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org configuration.id = test_id; 908d0cd07d0c5e30eacaac4c118f9fd624b11e67abstefan@webrtc.org configuration.audio = true; 912853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org configuration.clock = &fake_clock; 92822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org configuration.receive_statistics = receive_statistics1_.get(); 932853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org configuration.outgoing_transport = transport1; 942853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org configuration.intra_frame_callback = myRTCPFeedback1; 95822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 96822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_payload_registry1_.reset(new RTPPayloadRegistry( 97dc80bae2a62a1bdbe0d342b3260a7e5b2cb958dfandresp@webrtc.org RTPPayloadStrategy::CreateStrategy(true))); 98822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_payload_registry2_.reset(new RTPPayloadRegistry( 99dc80bae2a62a1bdbe0d342b3260a7e5b2cb958dfandresp@webrtc.org RTPPayloadStrategy::CreateStrategy(true))); 1002853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org 1012853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org module1 = RtpRtcp::CreateRtpRtcp(configuration); 1022853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org 103822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_feedback1_.reset(new TestRtpFeedback(module1)); 104822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 105822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_receiver1_.reset(RtpReceiver::CreateAudioReceiver( 106822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org test_id, &fake_clock, NULL, receiver, rtp_feedback1_.get(), 107822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_payload_registry1_.get())); 108822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 109822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org configuration.receive_statistics = receive_statistics2_.get(); 1102853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org configuration.id = test_id + 1; 1112853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org configuration.outgoing_transport = transport2; 1122853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org configuration.intra_frame_callback = myRTCPFeedback2; 113822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 1142853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org module2 = RtpRtcp::CreateRtpRtcp(configuration); 1152853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org 116822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_feedback2_.reset(new TestRtpFeedback(module2)); 117822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 118822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_receiver2_.reset(RtpReceiver::CreateAudioReceiver( 119822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org test_id + 1, &fake_clock, NULL, receiver, rtp_feedback2_.get(), 120822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_payload_registry2_.get())); 121822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 122822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org transport1->SetSendModule(module2, rtp_payload_registry2_.get(), 123822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_receiver2_.get(), receive_statistics2_.get()); 124822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org transport2->SetSendModule(module1, rtp_payload_registry1_.get(), 125822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org rtp_receiver1_.get(), receive_statistics1_.get()); 1262853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org myRTCPFeedback1->SetModule(module1); 1272853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org myRTCPFeedback2->SetModule(module2); 128ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 129d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org module1->SetRTCPStatus(kRtcpCompound); 130d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org module2->SetRTCPStatus(kRtcpCompound); 131ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 132ef92755780253c6a7940c89598a206e58e05b810stefan@webrtc.org module2->SetSSRC(test_ssrc + 1); 133ef92755780253c6a7940c89598a206e58e05b810stefan@webrtc.org module1->SetSSRC(test_ssrc); 134d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org module1->SetSequenceNumber(test_sequence_number); 135d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org module1->SetStartTimestamp(test_timestamp); 1369334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org 1379334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org module1->SetCsrcs(test_csrcs); 138ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0, module1->SetCNAME("john.doe@test.test")); 139ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 140ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0, module1->SetSendingStatus(true)); 141ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 142822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org CodecInst voice_codec; 143822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.pltype = 96; 144822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.plfreq = 8000; 145822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.rate = 64000; 146822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org memcpy(voice_codec.plname, "PCMU", 5); 147822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org 148822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(0, module1->RegisterSendPayload(voice_codec)); 149822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(0, rtp_receiver1_->RegisterReceivePayload( 150822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.plname, 151822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.pltype, 152822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.plfreq, 153822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.channels, 154822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org (voice_codec.rate < 0) ? 0 : voice_codec.rate)); 155822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(0, module2->RegisterSendPayload(voice_codec)); 156822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(0, rtp_receiver2_->RegisterReceivePayload( 157822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.plname, 158822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.pltype, 159822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.plfreq, 160822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org voice_codec.channels, 161822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org (voice_codec.rate < 0) ? 0 : voice_codec.rate)); 162ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 163ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org // We need to send one RTP packet to get the RTCP packet to be accepted by 164ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org // the receiving module. 165ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org // send RTP packet with the data "testtest" 1662f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org const uint8_t test[9] = "testtest"; 167ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0, module1->SendOutgoingData(webrtc::kAudioFrameSpeech, 96, 168ddfdfed3b55de3da5fda9a55d34e46d6e422baafstefan@webrtc.org 0, -1, test, 8)); 169ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org } 170ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 1712853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org virtual void TearDown() { 1722853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org delete module1; 1732853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org delete module2; 1748d0cd07d0c5e30eacaac4c118f9fd624b11e67abstefan@webrtc.org delete myRTCPFeedback1; 1758d0cd07d0c5e30eacaac4c118f9fd624b11e67abstefan@webrtc.org delete myRTCPFeedback2; 1762853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org delete transport1; 1772853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org delete transport2; 1782853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org delete receiver; 1792853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org } 1802853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org 1818281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org int test_id; 18200b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<TestRtpFeedback> rtp_feedback1_; 18300b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<TestRtpFeedback> rtp_feedback2_; 18400b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<ReceiveStatistics> receive_statistics1_; 18500b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<ReceiveStatistics> receive_statistics2_; 18600b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<RTPPayloadRegistry> rtp_payload_registry1_; 18700b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<RTPPayloadRegistry> rtp_payload_registry2_; 18800b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<RtpReceiver> rtp_receiver1_; 18900b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<RtpReceiver> rtp_receiver2_; 1908281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org RtpRtcp* module1; 1918281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org RtpRtcp* module2; 192822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org TestRtpReceiver* receiver; 1938281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org LoopBackTransport* transport1; 1948281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org LoopBackTransport* transport2; 1952853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org RtcpCallback* myRTCPFeedback1; 1962853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org RtcpCallback* myRTCPFeedback2; 1972853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org 1982f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org uint32_t test_ssrc; 1992f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org uint32_t test_timestamp; 2002f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org uint16_t test_sequence_number; 2019334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org std::vector<uint32_t> test_csrcs; 202a678a3baee2e680bd521f3a6caf97707fffd6093stefan@webrtc.org SimulatedClock fake_clock; 2038281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org}; 2048281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 20549888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.orgTEST_F(RtpRtcpRtcpTest, RTCP_PLI_RPSI) { 2068281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org EXPECT_EQ(0, module1->SendRTCPReferencePictureSelection(kTestPictureId)); 2078281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org EXPECT_EQ(0, module1->SendRTCPSliceLossIndication(156)); 20849888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org} 2098281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 21049888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.orgTEST_F(RtpRtcpRtcpTest, RTCP_CNAME) { 2112f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org uint32_t testOfCSRC[webrtc::kRtpCsrcSize]; 212822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(2, rtp_receiver2_->CSRCs(testOfCSRC)); 2139334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(test_csrcs[0], testOfCSRC[0]); 2149334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(test_csrcs[1], testOfCSRC[1]); 2158281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 2168281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org // Set cname of mixed. 2179334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(0, module1->AddMixedCNAME(test_csrcs[0], "john@192.168.0.1")); 2189334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(0, module1->AddMixedCNAME(test_csrcs[1], "jane@192.168.0.2")); 2198281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 2209334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(-1, module1->RemoveMixedCNAME(test_csrcs[0] + 1)); 2219334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(0, module1->RemoveMixedCNAME(test_csrcs[1])); 2229334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(0, module1->AddMixedCNAME(test_csrcs[1], "jane@192.168.0.2")); 2238281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 22449888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org // send RTCP packet, triggered by timer 225a678a3baee2e680bd521f3a6caf97707fffd6093stefan@webrtc.org fake_clock.AdvanceTimeMilliseconds(7500); 22649888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org module1->Process(); 227a678a3baee2e680bd521f3a6caf97707fffd6093stefan@webrtc.org fake_clock.AdvanceTimeMilliseconds(100); 22849888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org module2->Process(); 22949888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org 23049888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org char cName[RTCP_CNAME_SIZE]; 231822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(-1, module2->RemoteCNAME(rtp_receiver2_->SSRC() + 1, cName)); 23249888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org 23349888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org // Check multiple CNAME. 234822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(0, module2->RemoteCNAME(rtp_receiver2_->SSRC(), cName)); 23549888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org EXPECT_EQ(0, strncmp(cName, "john.doe@test.test", RTCP_CNAME_SIZE)); 23649888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org 2379334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(0, module2->RemoteCNAME(test_csrcs[0], cName)); 23849888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org EXPECT_EQ(0, strncmp(cName, "john@192.168.0.1", RTCP_CNAME_SIZE)); 23949888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org 2409334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(0, module2->RemoteCNAME(test_csrcs[1], cName)); 24149888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org EXPECT_EQ(0, strncmp(cName, "jane@192.168.0.2", RTCP_CNAME_SIZE)); 24249888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org 24349888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org EXPECT_EQ(0, module1->SetSendingStatus(false)); 24449888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org 24549888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org // Test that BYE clears the CNAME 246822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(-1, module2->RemoteCNAME(rtp_receiver2_->SSRC(), cName)); 24749888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org} 24849888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org 24949888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.orgTEST_F(RtpRtcpRtcpTest, RTCP) { 2508281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org RTCPReportBlock reportBlock; 2518d0cd07d0c5e30eacaac4c118f9fd624b11e67abstefan@webrtc.org reportBlock.remoteSSRC = 1; 2528d0cd07d0c5e30eacaac4c118f9fd624b11e67abstefan@webrtc.org reportBlock.sourceSSRC = 2; 2538281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org reportBlock.cumulativeLost = 1; 2548281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org reportBlock.delaySinceLastSR = 2; 2558281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org reportBlock.extendedHighSeqNum = 3; 2568281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org reportBlock.fractionLost= 4; 2578281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org reportBlock.jitter = 5; 2588281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org reportBlock.lastSR = 6; 2598281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 2608281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org // Set report blocks. 2619334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(0, module1->AddRTCPReportBlock(test_csrcs[0], &reportBlock)); 2628281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 2638281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org reportBlock.lastSR= 7; 2649334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(0, module1->AddRTCPReportBlock(test_csrcs[1], &reportBlock)); 2658281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 2662f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org uint32_t name = 't' << 24; 2678281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org name += 'e' << 16; 2688281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org name += 's' << 8; 2698281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org name += 't'; 2708281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org EXPECT_EQ(0, module1->SetRTCPApplicationSpecificData( 2718281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 3, 2728281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org name, 2732f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org (const uint8_t *)"test test test test test test test test test"\ 2748281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org " test test test test test test test test test test test test test"\ 2758281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org " test test test test test test test test test test test test test"\ 2768281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org " test test test test test test test test test test test test test"\ 2778281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org " test test test test test test test test test test test test ", 2788281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 300)); 2798281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 2808281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org // send RTCP packet, triggered by timer 281a678a3baee2e680bd521f3a6caf97707fffd6093stefan@webrtc.org fake_clock.AdvanceTimeMilliseconds(7500); 2828281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org module1->Process(); 283a678a3baee2e680bd521f3a6caf97707fffd6093stefan@webrtc.org fake_clock.AdvanceTimeMilliseconds(100); 2848281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org module2->Process(); 2858281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 2862f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org uint32_t receivedNTPsecs = 0; 2872f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org uint32_t receivedNTPfrac = 0; 2882f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org uint32_t RTCPArrivalTimeSecs = 0; 2892f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org uint32_t RTCPArrivalTimeFrac = 0; 2907c3523c1a4c828ecb2773c685145fcfbd7c3ceadstefan@webrtc.org EXPECT_EQ(0, module2->RemoteNTP(&receivedNTPsecs, 2917c3523c1a4c828ecb2773c685145fcfbd7c3ceadstefan@webrtc.org &receivedNTPfrac, 2927c3523c1a4c828ecb2773c685145fcfbd7c3ceadstefan@webrtc.org &RTCPArrivalTimeSecs, 2937c3523c1a4c828ecb2773c685145fcfbd7c3ceadstefan@webrtc.org &RTCPArrivalTimeFrac, 2947c3523c1a4c828ecb2773c685145fcfbd7c3ceadstefan@webrtc.org NULL)); 2958281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 2968281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 2978281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org // get all report blocks 298ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org std::vector<RTCPReportBlock> report_blocks; 299ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0, module1->RemoteRTCPStat(&report_blocks)); 300b5865079868c4dec49571e7aef0aa52124b50c64stefan@webrtc.org ASSERT_EQ(1u, report_blocks.size()); 301ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org const RTCPReportBlock& reportBlockReceived = report_blocks[0]; 302ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 3038281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org float secSinceLastReport = 3048281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org static_cast<float>(reportBlockReceived.delaySinceLastSR) / 65536.0f; 3058281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org EXPECT_GE(0.101f, secSinceLastReport); 3068281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org EXPECT_LE(0.100f, secSinceLastReport); 3078281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org EXPECT_EQ(test_sequence_number, reportBlockReceived.extendedHighSeqNum); 3088281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org EXPECT_EQ(0, reportBlockReceived.fractionLost); 3098281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 3102f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org EXPECT_EQ(static_cast<uint32_t>(0), 3118281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org reportBlockReceived.cumulativeLost); 3128281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 313286fe0b04d97205ac84688bbe613d5749192b2d1stefan@webrtc.org StreamStatistician *statistician = 314286fe0b04d97205ac84688bbe613d5749192b2d1stefan@webrtc.org receive_statistics2_->GetStatistician(reportBlockReceived.sourceSSRC); 31554ae4ffb9e235a9742e2b11298327e02d870571csprang@webrtc.org RtcpStatistics stats; 316286fe0b04d97205ac84688bbe613d5749192b2d1stefan@webrtc.org EXPECT_TRUE(statistician->GetStatistics(&stats, true)); 317822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(0, stats.fraction_lost); 318822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ((uint32_t)0, stats.cumulative_lost); 319822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(test_sequence_number, stats.extended_max_sequence_number); 320822fbd8b68ffdb481b9557e2950ae8d6657c8ce6wu@webrtc.org EXPECT_EQ(reportBlockReceived.jitter, stats.jitter); 3218281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 32216825b1a828bb4ff40f7682040e43a239b7b8ca3pkasting@chromium.org int64_t RTT; 32316825b1a828bb4ff40f7682040e43a239b7b8ca3pkasting@chromium.org int64_t avgRTT; 32416825b1a828bb4ff40f7682040e43a239b7b8ca3pkasting@chromium.org int64_t minRTT; 32516825b1a828bb4ff40f7682040e43a239b7b8ca3pkasting@chromium.org int64_t maxRTT; 3268281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 3278281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org // Get RoundTripTime. 3288281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org EXPECT_EQ(0, module1->RTT(test_ssrc + 1, &RTT, &avgRTT, &minRTT, &maxRTT)); 3298281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org EXPECT_GE(10, RTT); 3308281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org EXPECT_GE(10, avgRTT); 3318281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org EXPECT_GE(10, minRTT); 3328281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org EXPECT_GE(10, maxRTT); 3338281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 3348281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org // Set report blocks. 3359334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org EXPECT_EQ(0, module1->AddRTCPReportBlock(test_csrcs[0], &reportBlock)); 3368281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 3378281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org // Test receive report. 3388281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org EXPECT_EQ(0, module1->SetSendingStatus(false)); 3398281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org 3408281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org // Send RTCP packet, triggered by timer. 341a678a3baee2e680bd521f3a6caf97707fffd6093stefan@webrtc.org fake_clock.AdvanceTimeMilliseconds(5000); 3428281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org module1->Process(); 3438281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org module2->Process(); 3448281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org} 345ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 346ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.orgTEST_F(RtpRtcpRtcpTest, RemoteRTCPStatRemote) { 347ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org std::vector<RTCPReportBlock> report_blocks; 348ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 349ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0, module1->RemoteRTCPStat(&report_blocks)); 350ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0u, report_blocks.size()); 351ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 352ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org // send RTCP packet, triggered by timer 353a678a3baee2e680bd521f3a6caf97707fffd6093stefan@webrtc.org fake_clock.AdvanceTimeMilliseconds(7500); 354ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org module1->Process(); 355a678a3baee2e680bd521f3a6caf97707fffd6093stefan@webrtc.org fake_clock.AdvanceTimeMilliseconds(100); 356ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org module2->Process(); 357ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 358ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0, module1->RemoteRTCPStat(&report_blocks)); 359ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org ASSERT_EQ(1u, report_blocks.size()); 360ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 361ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org // |test_ssrc+1| is the SSRC of module2 that send the report. 362ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(test_ssrc+1, report_blocks[0].remoteSSRC); 363ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(test_ssrc, report_blocks[0].sourceSSRC); 364ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org 365ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0u, report_blocks[0].cumulativeLost); 366ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_LT(0u, report_blocks[0].delaySinceLastSR); 367ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(test_sequence_number, report_blocks[0].extendedHighSeqNum); 368ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org EXPECT_EQ(0u, report_blocks[0].fractionLost); 369ce5990cb0bbfbf5ee5306cf990e975a2faa090b7perkj@webrtc.org} 370