1823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org/*
2823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org *
4823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org *  Use of this source code is governed by a BSD-style license
5823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org *  that can be found in the LICENSE file in the root of the source
6823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org *  tree. An additional intellectual property rights grant can be found
7823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org *  in the file PATENTS.  All contributing project authors may
8823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org */
10823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org
11823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
12823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org
137623ce4aeb9130c937ba5836490cbb3a35679e79Peter Boström#include "webrtc/video/report_block_stats.h"
14823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org
15823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.orgnamespace webrtc {
16823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org
17823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.orgclass ReportBlockStatsTest : public ::testing::Test {
18823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org protected:
19823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  ReportBlockStatsTest() : kSsrc1(0x12345), kSsrc2(0x23456) {}
20823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org
2114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void SetUp() override {
22823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    // kSsrc1: block 1-3.
23823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block1_1_.cumulativeLost = 10;
24823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block1_1_.fractionLost = 123;
25823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block1_1_.extendedHighSeqNum = 24000;
26823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block1_1_.jitter = 777;
27823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block1_1_.sourceSSRC = kSsrc1;
28823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block1_2_.cumulativeLost = 15;
29823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block1_2_.fractionLost = 0;
30823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block1_2_.extendedHighSeqNum = 24100;
31823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block1_2_.jitter = 222;
32823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block1_2_.sourceSSRC = kSsrc1;
33823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block1_3_.cumulativeLost = 50;
34823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block1_3_.fractionLost = 0;
35823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block1_3_.extendedHighSeqNum = 24200;
36823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block1_3_.jitter = 333;
37823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block1_3_.sourceSSRC = kSsrc1;
38823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    // kSsrc2: block 1,2.
39823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block2_1_.cumulativeLost = 111;
40823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block2_1_.fractionLost = 222;
41823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block2_1_.extendedHighSeqNum = 8500;
42823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block2_1_.jitter = 555;
43823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block2_1_.sourceSSRC = kSsrc2;
44823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block2_2_.cumulativeLost = 136;
45823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block2_2_.fractionLost = 0;
46823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block2_2_.extendedHighSeqNum = 8800;
47823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block2_2_.jitter = 888;
48823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block2_2_.sourceSSRC = kSsrc2;
49823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org
50823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    ssrc1block1_.push_back(block1_1_);
51823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    ssrc1block2_.push_back(block1_2_);
52823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    ssrc12block1_.push_back(block1_1_);
53823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    ssrc12block1_.push_back(block2_1_);
54823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    ssrc12block2_.push_back(block1_2_);
55823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    ssrc12block2_.push_back(block2_2_);
56823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  }
57823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org
58823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  RtcpStatistics RtcpReportBlockToRtcpStatistics(
59823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org      const RTCPReportBlock& stats) {
60823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    RtcpStatistics block;
61823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block.cumulative_lost = stats.cumulativeLost;
62823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block.fraction_lost = stats.fractionLost;
63823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block.extended_max_sequence_number = stats.extendedHighSeqNum;
64823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    block.jitter = stats.jitter;
65823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org    return block;
66823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  }
67823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org
68823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  const uint32_t kSsrc1;
69823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  const uint32_t kSsrc2;
70823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  RTCPReportBlock block1_1_;
71823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  RTCPReportBlock block1_2_;
72823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  RTCPReportBlock block1_3_;
73823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  RTCPReportBlock block2_1_;
74823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  RTCPReportBlock block2_2_;
75823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  std::vector<RTCPReportBlock> ssrc1block1_;
76823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  std::vector<RTCPReportBlock> ssrc1block2_;
77823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  std::vector<RTCPReportBlock> ssrc12block1_;
78823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  std::vector<RTCPReportBlock> ssrc12block2_;
79823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org};
80823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org
81823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.orgTEST_F(ReportBlockStatsTest, AggregateAndStore_NoSsrc) {
82823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  ReportBlockStats stats;
83823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  std::vector<RTCPReportBlock> empty;
84823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  RTCPReportBlock aggregated = stats.AggregateAndStore(empty);
85823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ(0U, aggregated.fractionLost);
86823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ(0U, aggregated.cumulativeLost);
87823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ(0U, aggregated.jitter);
88823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ(0U, aggregated.extendedHighSeqNum);
89823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org}
90823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org
91823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.orgTEST_F(ReportBlockStatsTest, AggregateAndStore_OneSsrc) {
92823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  ReportBlockStats stats;
93823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  RTCPReportBlock aggregated = stats.AggregateAndStore(ssrc1block1_);
94823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  // One ssrc, no aggregation done.
95823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ(123U, aggregated.fractionLost);
96823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ(10U, aggregated.cumulativeLost);
97823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ(777U, aggregated.jitter);
98823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ(24000U, aggregated.extendedHighSeqNum);
99823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org
100823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  aggregated = stats.AggregateAndStore(ssrc1block2_);
101823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ(0U, aggregated.fractionLost);
102823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ(15U, aggregated.cumulativeLost);
103823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ(222U, aggregated.jitter);
104823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ(24100U, aggregated.extendedHighSeqNum);
105823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org
106823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  // fl: 100 * (15-10) / (24100-24000) = 5%
107823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ(5, stats.FractionLostInPercent());
108823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org}
109823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org
110823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.orgTEST_F(ReportBlockStatsTest, AggregateAndStore_TwoSsrcs) {
111823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  ReportBlockStats stats;
112823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  RTCPReportBlock aggregated = stats.AggregateAndStore(ssrc12block1_);
113823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ(0U, aggregated.fractionLost);
114823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ(10U + 111U, aggregated.cumulativeLost);
115823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ((777U + 555U) / 2, aggregated.jitter);
116823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ(0U, aggregated.extendedHighSeqNum);
117823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org
118823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  aggregated = stats.AggregateAndStore(ssrc12block2_);
119823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  // fl: 255 * ((15-10) + (136-111)) / ((24100-24000) + (8800-8500)) = 19
120823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ(19U, aggregated.fractionLost);
121823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ(15U + 136U, aggregated.cumulativeLost);
122823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ((222U + 888U) / 2, aggregated.jitter);
123823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ(0U, aggregated.extendedHighSeqNum);
124823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org
125823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  // fl: 100 * ((15-10) + (136-111)) / ((24100-24000) + (8800-8500)) = 7%
126823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ(7, stats.FractionLostInPercent());
127823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org}
128823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org
129823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.orgTEST_F(ReportBlockStatsTest, StoreAndGetFractionLost) {
130823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  const uint32_t kRemoteSsrc = 1;
131823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  ReportBlockStats stats;
132e7358eabbc9f7d0b774bbcaea35874668fc790edasapersson@webrtc.org  EXPECT_EQ(-1, stats.FractionLostInPercent());
133823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org
134e7358eabbc9f7d0b774bbcaea35874668fc790edasapersson@webrtc.org  // First block.
135823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  stats.Store(RtcpReportBlockToRtcpStatistics(block1_1_), kRemoteSsrc, kSsrc1);
136e7358eabbc9f7d0b774bbcaea35874668fc790edasapersson@webrtc.org  EXPECT_EQ(-1, stats.FractionLostInPercent());
137823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  // fl: 100 * (15-10) / (24100-24000) = 5%
138823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  stats.Store(RtcpReportBlockToRtcpStatistics(block1_2_), kRemoteSsrc, kSsrc1);
139823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ(5, stats.FractionLostInPercent());
140823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  // fl: 100 * (50-10) / (24200-24000) = 20%
141823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  stats.Store(RtcpReportBlockToRtcpStatistics(block1_3_), kRemoteSsrc, kSsrc1);
142823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org  EXPECT_EQ(20, stats.FractionLostInPercent());
143823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org}
144823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org
145823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org}  // namespace webrtc
146823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org
147