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