1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11946d2407699745b512dc969150e01b1c034db0bcmikhal@webrtc.org#include "webrtc/modules/rtp_rtcp/test/testAPI/test_api.h" 12946d2407699745b512dc969150e01b1c034db0bcmikhal@webrtc.org 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <algorithm> 14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <vector> 15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgusing namespace webrtc; 17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass RtpRtcpAPITest : public ::testing::Test { 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org protected: 201bb2146351979b6610107419b2a9c86cca2692a3stefan@webrtc.org RtpRtcpAPITest() : module(NULL), fake_clock(123456) { 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org test_CSRC[0] = 1234; 22cf4441c9151afe2be8beb01d2ef49fd084d6c243stefan@webrtc.org test_CSRC[1] = 2345; 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org test_id = 123; 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org test_ssrc = 3456; 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org test_timestamp = 4567; 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org test_sequence_number = 2345; 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ~RtpRtcpAPITest() {} 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void SetUp() { 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org RtpRtcp::Configuration configuration; 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org configuration.id = test_id; 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org configuration.audio = true; 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org configuration.clock = &fake_clock; 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org module = RtpRtcp::CreateRtpRtcp(configuration); 367fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org rtp_payload_registry_.reset(new RTPPayloadRegistry( 3799681317b0a9dc29c1682a17908f382eac16bd2aandresp@webrtc.org RTPPayloadStrategy::CreateStrategy(true))); 387fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org rtp_receiver_.reset(RtpReceiver::CreateAudioReceiver( 397fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org test_id, &fake_clock, NULL, NULL, NULL, rtp_payload_registry_.get())); 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void TearDown() { 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete module; 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int test_id; 477fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org scoped_ptr<RTPPayloadRegistry> rtp_payload_registry_; 487fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org scoped_ptr<RtpReceiver> rtp_receiver_; 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org RtpRtcp* module; 50b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org uint32_t test_ssrc; 51b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org uint32_t test_timestamp; 52b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org uint16_t test_sequence_number; 53b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org uint32_t test_CSRC[webrtc::kRtpCsrcSize]; 541bb2146351979b6610107419b2a9c86cca2692a3stefan@webrtc.org SimulatedClock fake_clock; 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(RtpRtcpAPITest, Basic) { 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module->SetSequenceNumber(test_sequence_number)); 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(test_sequence_number, module->SequenceNumber()); 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module->SetStartTimestamp(test_timestamp)); 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(test_timestamp, module->StartTimestamp()); 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FALSE(module->Sending()); 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module->SetSendingStatus(true)); 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(module->Sending()); 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(RtpRtcpAPITest, MTU) { 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(-1, module->SetMaxTransferUnit(10)); 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(-1, module->SetMaxTransferUnit(IP_PACKET_SIZE + 1)); 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module->SetMaxTransferUnit(1234)); 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(1234-20-8, module->MaxPayloadLength()); 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module->SetTransportOverhead(true, true, 12)); 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(1234 - 20- 20 -20 - 12, module->MaxPayloadLength()); 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module->SetTransportOverhead(false, false, 0)); 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(1234 - 20 - 8, module->MaxPayloadLength()); 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(RtpRtcpAPITest, SSRC) { 83903e746cc9a73da17bfa3f6110293582fa6ee3bestefan@webrtc.org module->SetSSRC(test_ssrc); 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(test_ssrc, module->SSRC()); 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(RtpRtcpAPITest, CSRC) { 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module->SetCSRCs(test_CSRC, 2)); 89b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org uint32_t testOfCSRC[webrtc::kRtpCsrcSize]; 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(2, module->CSRCs(testOfCSRC)); 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(test_CSRC[0], testOfCSRC[0]); 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(test_CSRC[1], testOfCSRC[1]); 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(RtpRtcpAPITest, RTCP) { 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(kRtcpOff, module->RTCP()); 97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module->SetRTCPStatus(kRtcpCompound)); 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(kRtcpCompound, module->RTCP()); 99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module->SetCNAME("john.doe@test.test")); 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FALSE(module->TMMBR()); 103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module->SetTMMBRStatus(true)); 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(module->TMMBR()); 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, module->SetTMMBRStatus(false)); 106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_FALSE(module->TMMBR()); 107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1087fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org EXPECT_EQ(kNackOff, rtp_receiver_->NACK()); 109db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org rtp_receiver_->SetNACKStatus(kNackRtcp); 1107fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org EXPECT_EQ(kNackRtcp, rtp_receiver_->NACK()); 111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 112946d2407699745b512dc969150e01b1c034db0bcmikhal@webrtc.org 113db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.orgTEST_F(RtpRtcpAPITest, RtxSender) { 114946d2407699745b512dc969150e01b1c034db0bcmikhal@webrtc.org unsigned int ssrc = 0; 11547f0c4192df67999055b47f6a5d5314ce6a4ac4bstefan@webrtc.org int rtx_mode = kRtxOff; 1167bc7e02c4aadc8acb8fdc35a555a0cb33e566b16mflodman@webrtc.org const int kRtxPayloadType = 119; 1177bc7e02c4aadc8acb8fdc35a555a0cb33e566b16mflodman@webrtc.org int payload_type = -1; 118903e746cc9a73da17bfa3f6110293582fa6ee3bestefan@webrtc.org module->SetRTXSendStatus(kRtxRetransmitted); 1197bc7e02c4aadc8acb8fdc35a555a0cb33e566b16mflodman@webrtc.org module->SetRtxSendPayloadType(kRtxPayloadType); 120903e746cc9a73da17bfa3f6110293582fa6ee3bestefan@webrtc.org module->SetRtxSsrc(1); 121903e746cc9a73da17bfa3f6110293582fa6ee3bestefan@webrtc.org module->RTXSendStatus(&rtx_mode, &ssrc, &payload_type); 122946d2407699745b512dc969150e01b1c034db0bcmikhal@webrtc.org EXPECT_EQ(kRtxRetransmitted, rtx_mode); 123946d2407699745b512dc969150e01b1c034db0bcmikhal@webrtc.org EXPECT_EQ(1u, ssrc); 1247bc7e02c4aadc8acb8fdc35a555a0cb33e566b16mflodman@webrtc.org EXPECT_EQ(kRtxPayloadType, payload_type); 125946d2407699745b512dc969150e01b1c034db0bcmikhal@webrtc.org rtx_mode = kRtxOff; 126903e746cc9a73da17bfa3f6110293582fa6ee3bestefan@webrtc.org module->SetRTXSendStatus(kRtxOff); 1277bc7e02c4aadc8acb8fdc35a555a0cb33e566b16mflodman@webrtc.org payload_type = -1; 1287bc7e02c4aadc8acb8fdc35a555a0cb33e566b16mflodman@webrtc.org module->SetRtxSendPayloadType(kRtxPayloadType); 129903e746cc9a73da17bfa3f6110293582fa6ee3bestefan@webrtc.org module->RTXSendStatus(&rtx_mode, &ssrc, &payload_type); 130946d2407699745b512dc969150e01b1c034db0bcmikhal@webrtc.org EXPECT_EQ(kRtxOff, rtx_mode); 131903e746cc9a73da17bfa3f6110293582fa6ee3bestefan@webrtc.org EXPECT_EQ(kRtxPayloadType, payload_type); 132903e746cc9a73da17bfa3f6110293582fa6ee3bestefan@webrtc.org module->SetRTXSendStatus(kRtxRetransmitted); 133903e746cc9a73da17bfa3f6110293582fa6ee3bestefan@webrtc.org module->RTXSendStatus(&rtx_mode, &ssrc, &payload_type); 1347bc7e02c4aadc8acb8fdc35a555a0cb33e566b16mflodman@webrtc.org EXPECT_EQ(kRtxRetransmitted, rtx_mode); 1357fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org EXPECT_EQ(kRtxPayloadType, payload_type); 136946d2407699745b512dc969150e01b1c034db0bcmikhal@webrtc.org} 137946d2407699745b512dc969150e01b1c034db0bcmikhal@webrtc.org 138db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.orgTEST_F(RtpRtcpAPITest, RtxReceiver) { 139db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org const uint32_t kRtxSsrc = 1; 1407bc7e02c4aadc8acb8fdc35a555a0cb33e566b16mflodman@webrtc.org const int kRtxPayloadType = 119; 141903e746cc9a73da17bfa3f6110293582fa6ee3bestefan@webrtc.org EXPECT_FALSE(rtp_payload_registry_->RtxEnabled()); 142903e746cc9a73da17bfa3f6110293582fa6ee3bestefan@webrtc.org rtp_payload_registry_->SetRtxSsrc(kRtxSsrc); 143db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org rtp_payload_registry_->SetRtxPayloadType(kRtxPayloadType); 144db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org EXPECT_TRUE(rtp_payload_registry_->RtxEnabled()); 145db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org RTPHeader rtx_header; 146db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org rtx_header.ssrc = kRtxSsrc; 147db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org rtx_header.payloadType = kRtxPayloadType; 148db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org EXPECT_TRUE(rtp_payload_registry_->IsRtx(rtx_header)); 149db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org rtx_header.ssrc = 0; 150db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org EXPECT_FALSE(rtp_payload_registry_->IsRtx(rtx_header)); 151db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org rtx_header.ssrc = kRtxSsrc; 152903e746cc9a73da17bfa3f6110293582fa6ee3bestefan@webrtc.org rtx_header.payloadType = 0; 153903e746cc9a73da17bfa3f6110293582fa6ee3bestefan@webrtc.org EXPECT_TRUE(rtp_payload_registry_->IsRtx(rtx_header)); 154946d2407699745b512dc969150e01b1c034db0bcmikhal@webrtc.org} 155