xref: /aosp_15_r20/external/webrtc/stats/rtc_stats_report_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright 2016 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "api/stats/rtc_stats_report.h"
12 
13 #include "api/stats/rtc_stats.h"
14 #include "rtc_base/checks.h"
15 #include "test/gtest.h"
16 
17 namespace webrtc {
18 
19 class RTCTestStats1 : public RTCStats {
20  public:
21   WEBRTC_RTCSTATS_DECL();
22 
RTCTestStats1(const std::string & id,int64_t timestamp_us)23   RTCTestStats1(const std::string& id, int64_t timestamp_us)
24       : RTCStats(id, timestamp_us), integer("integer") {}
25 
26   RTCStatsMember<int32_t> integer;
27 };
28 
29 WEBRTC_RTCSTATS_IMPL(RTCTestStats1, RTCStats, "test-stats-1", &integer)
30 
31 class RTCTestStats2 : public RTCStats {
32  public:
33   WEBRTC_RTCSTATS_DECL();
34 
RTCTestStats2(const std::string & id,int64_t timestamp_us)35   RTCTestStats2(const std::string& id, int64_t timestamp_us)
36       : RTCStats(id, timestamp_us), number("number") {}
37 
38   RTCStatsMember<double> number;
39 };
40 
41 WEBRTC_RTCSTATS_IMPL(RTCTestStats2, RTCStats, "test-stats-2", &number)
42 
43 class RTCTestStats3 : public RTCStats {
44  public:
45   WEBRTC_RTCSTATS_DECL();
46 
RTCTestStats3(const std::string & id,int64_t timestamp_us)47   RTCTestStats3(const std::string& id, int64_t timestamp_us)
48       : RTCStats(id, timestamp_us), string("string") {}
49 
50   RTCStatsMember<std::string> string;
51 };
52 
53 WEBRTC_RTCSTATS_IMPL(RTCTestStats3, RTCStats, "test-stats-3", &string)
54 
TEST(RTCStatsReport,AddAndGetStats)55 TEST(RTCStatsReport, AddAndGetStats) {
56   rtc::scoped_refptr<RTCStatsReport> report =
57       RTCStatsReport::Create(Timestamp::Micros(1337));
58   EXPECT_EQ(report->timestamp_us(), 1337u);
59   EXPECT_EQ(report->timestamp().us_or(-1), 1337u);
60   EXPECT_EQ(report->size(), static_cast<size_t>(0));
61   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("a0", 1)));
62   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("a1", 2)));
63   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("b0", 4)));
64   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("b1", 8)));
65   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("a2", 16)));
66   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("b2", 32)));
67   EXPECT_EQ(report->size(), static_cast<size_t>(6));
68 
69   EXPECT_EQ(report->Get("missing"), nullptr);
70   EXPECT_EQ(report->Get("a0")->id(), "a0");
71   EXPECT_EQ(report->Get("b2")->id(), "b2");
72 
73   std::vector<const RTCTestStats1*> a = report->GetStatsOfType<RTCTestStats1>();
74   EXPECT_EQ(a.size(), static_cast<size_t>(3));
75   int64_t mask = 0;
76   for (const RTCTestStats1* stats : a)
77     mask |= stats->timestamp_us();
78   EXPECT_EQ(mask, static_cast<int64_t>(1 | 2 | 16));
79 
80   std::vector<const RTCTestStats2*> b = report->GetStatsOfType<RTCTestStats2>();
81   EXPECT_EQ(b.size(), static_cast<size_t>(3));
82   mask = 0;
83   for (const RTCTestStats2* stats : b)
84     mask |= stats->timestamp_us();
85   EXPECT_EQ(mask, static_cast<int64_t>(4 | 8 | 32));
86 
87   EXPECT_EQ(report->GetStatsOfType<RTCTestStats3>().size(),
88             static_cast<size_t>(0));
89 }
90 
TEST(RTCStatsReport,StatsOrder)91 TEST(RTCStatsReport, StatsOrder) {
92   rtc::scoped_refptr<RTCStatsReport> report =
93       RTCStatsReport::Create(Timestamp::Micros(1337));
94   EXPECT_EQ(report->timestamp_us(), 1337u);
95   EXPECT_EQ(report->timestamp().us_or(-1), 1337u);
96   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("C", 2)));
97   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("D", 3)));
98   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("B", 1)));
99   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("A", 0)));
100   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("E", 4)));
101   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("F", 5)));
102   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("G", 6)));
103   int64_t i = 0;
104   for (const RTCStats& stats : *report) {
105     EXPECT_EQ(stats.timestamp_us(), i);
106     ++i;
107   }
108   EXPECT_EQ(i, static_cast<int64_t>(7));
109 }
110 
TEST(RTCStatsReport,Take)111 TEST(RTCStatsReport, Take) {
112   rtc::scoped_refptr<RTCStatsReport> report =
113       RTCStatsReport::Create(Timestamp::Zero());
114   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("A", 1)));
115   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("B", 2)));
116   EXPECT_TRUE(report->Get("A"));
117   EXPECT_EQ(report->size(), 2u);
118   auto a = report->Take("A");
119   EXPECT_TRUE(a);
120   EXPECT_EQ(report->size(), 1u);
121   EXPECT_FALSE(report->Get("A"));
122   EXPECT_FALSE(report->Take("A"));
123 }
124 
TEST(RTCStatsReport,TakeMembersFrom)125 TEST(RTCStatsReport, TakeMembersFrom) {
126   rtc::scoped_refptr<RTCStatsReport> a =
127       RTCStatsReport::Create(Timestamp::Micros(1337));
128   EXPECT_EQ(a->timestamp_us(), 1337u);
129   EXPECT_EQ(a->timestamp().us_or(-1), 1337u);
130   a->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("B", 1)));
131   a->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("C", 2)));
132   a->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("E", 4)));
133   rtc::scoped_refptr<RTCStatsReport> b =
134       RTCStatsReport::Create(Timestamp::Micros(1338));
135   EXPECT_EQ(b->timestamp_us(), 1338u);
136   EXPECT_EQ(b->timestamp().us_or(-1), 1338u);
137   b->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("A", 0)));
138   b->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("D", 3)));
139   b->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("F", 5)));
140 
141   a->TakeMembersFrom(b);
142   EXPECT_EQ(b->size(), static_cast<size_t>(0));
143   int64_t i = 0;
144   for (const RTCStats& stats : *a) {
145     EXPECT_EQ(stats.timestamp_us(), i);
146     ++i;
147   }
148   EXPECT_EQ(i, static_cast<int64_t>(6));
149 }
150 
151 }  // namespace webrtc
152