191941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap/* 291941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. 391941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap * 491941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap * Use of this source code is governed by a BSD-style license 591941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap * that can be found in the LICENSE file in the root of the source 691941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap * tree. An additional intellectual property rights grant can be found 791941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap * in the file PATENTS. All contributing project authors may 891941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap * be found in the AUTHORS file in the root of the source tree. 991941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap */ 1091941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap 1191941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/voip_metric.h" 1291941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap 1391941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap#include "testing/gtest/include/gtest/gtest.h" 1491941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap 1591941ae493cb37a4e1250c7d3aad1c7394b5850edanilchapnamespace webrtc { 1691941ae493cb37a4e1250c7d3aad1c7394b5850edanilchapnamespace rtcp { 1791941ae493cb37a4e1250c7d3aad1c7394b5850edanilchapnamespace { 1891941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap 1991941ae493cb37a4e1250c7d3aad1c7394b5850edanilchapconst uint32_t kRemoteSsrc = 0x23456789; 2091941ae493cb37a4e1250c7d3aad1c7394b5850edanilchapconst uint8_t kBlock[] = {0x07, 0x00, 0x00, 0x08, 0x23, 0x45, 0x67, 0x89, 2191941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap 0x01, 0x02, 0x03, 0x04, 0x11, 0x12, 0x22, 0x23, 2291941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap 0x33, 0x34, 0x44, 0x45, 0x05, 0x06, 0x07, 0x08, 2391941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x00, 0x55, 0x56, 2491941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap 0x66, 0x67, 0x77, 0x78}; 2591941ae493cb37a4e1250c7d3aad1c7394b5850edanilchapconst size_t kBlockSizeBytes = sizeof(kBlock); 2691941ae493cb37a4e1250c7d3aad1c7394b5850edanilchapstatic_assert( 2791941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap kBlockSizeBytes == VoipMetric::kLength, 2891941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap "Size of manually created Voip Metric block should match class constant"); 2991941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap 3091941ae493cb37a4e1250c7d3aad1c7394b5850edanilchapTEST(RtcpPacketVoipMetricTest, Create) { 3191941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap uint8_t buffer[VoipMetric::kLength]; 3291941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap RTCPVoIPMetric metric; 3391941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric.lossRate = 1; 3491941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric.discardRate = 2; 3591941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric.burstDensity = 3; 3691941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric.gapDensity = 4; 3791941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric.burstDuration = 0x1112; 3891941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric.gapDuration = 0x2223; 3991941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric.roundTripDelay = 0x3334; 4091941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric.endSystemDelay = 0x4445; 4191941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric.signalLevel = 5; 4291941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric.noiseLevel = 6; 4391941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric.RERL = 7; 4491941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric.Gmin = 8; 4591941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric.Rfactor = 9; 4691941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric.extRfactor = 10; 4791941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric.MOSLQ = 11; 4891941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric.MOSCQ = 12; 4991941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric.RXconfig = 13; 5091941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric.JBnominal = 0x5556; 5191941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric.JBmax = 0x6667; 5291941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric.JBabsMax = 0x7778; 5391941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap VoipMetric metric_block; 5491941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric_block.To(kRemoteSsrc); 5591941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric_block.WithVoipMetric(metric); 5691941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap 5791941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap metric_block.Create(buffer); 5891941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap EXPECT_EQ(0, memcmp(buffer, kBlock, kBlockSizeBytes)); 5991941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap} 6091941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap 6191941ae493cb37a4e1250c7d3aad1c7394b5850edanilchapTEST(RtcpPacketVoipMetricTest, Parse) { 6291941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap VoipMetric read_metric; 6391941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap read_metric.Parse(kBlock); 6491941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap 6591941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap // Run checks on const object to ensure all accessors have const modifier. 6691941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap const VoipMetric& parsed = read_metric; 6791941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap 6891941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap EXPECT_EQ(kRemoteSsrc, parsed.ssrc()); 6991941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap EXPECT_EQ(1, parsed.voip_metric().lossRate); 7091941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap EXPECT_EQ(2, parsed.voip_metric().discardRate); 7191941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap EXPECT_EQ(3, parsed.voip_metric().burstDensity); 7291941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap EXPECT_EQ(4, parsed.voip_metric().gapDensity); 7391941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap EXPECT_EQ(0x1112, parsed.voip_metric().burstDuration); 7491941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap EXPECT_EQ(0x2223, parsed.voip_metric().gapDuration); 7591941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap EXPECT_EQ(0x3334, parsed.voip_metric().roundTripDelay); 7691941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap EXPECT_EQ(0x4445, parsed.voip_metric().endSystemDelay); 7791941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap EXPECT_EQ(5, parsed.voip_metric().signalLevel); 7891941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap EXPECT_EQ(6, parsed.voip_metric().noiseLevel); 7991941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap EXPECT_EQ(7, parsed.voip_metric().RERL); 8091941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap EXPECT_EQ(8, parsed.voip_metric().Gmin); 8191941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap EXPECT_EQ(9, parsed.voip_metric().Rfactor); 8291941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap EXPECT_EQ(10, parsed.voip_metric().extRfactor); 8391941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap EXPECT_EQ(11, parsed.voip_metric().MOSLQ); 8491941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap EXPECT_EQ(12, parsed.voip_metric().MOSCQ); 8591941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap EXPECT_EQ(13, parsed.voip_metric().RXconfig); 8691941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap EXPECT_EQ(0x5556, parsed.voip_metric().JBnominal); 8791941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap EXPECT_EQ(0x6667, parsed.voip_metric().JBmax); 8891941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap EXPECT_EQ(0x7778, parsed.voip_metric().JBabsMax); 8991941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap} 9091941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap 9191941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap} // namespace 9291941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap} // namespace rtcp 9391941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap} // namespace webrtc 94