• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 = RTCStatsReport::Create(1337);
57   EXPECT_EQ(report->timestamp_us(), 1337u);
58   EXPECT_EQ(report->size(), static_cast<size_t>(0));
59   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("a0", 1)));
60   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("a1", 2)));
61   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("b0", 4)));
62   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("b1", 8)));
63   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("a2", 16)));
64   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("b2", 32)));
65   EXPECT_EQ(report->size(), static_cast<size_t>(6));
66 
67   EXPECT_EQ(report->Get("missing"), nullptr);
68   EXPECT_EQ(report->Get("a0")->id(), "a0");
69   EXPECT_EQ(report->Get("b2")->id(), "b2");
70 
71   std::vector<const RTCTestStats1*> a = report->GetStatsOfType<RTCTestStats1>();
72   EXPECT_EQ(a.size(), static_cast<size_t>(3));
73   int64_t mask = 0;
74   for (const RTCTestStats1* stats : a)
75     mask |= stats->timestamp_us();
76   EXPECT_EQ(mask, static_cast<int64_t>(1 | 2 | 16));
77 
78   std::vector<const RTCTestStats2*> b = report->GetStatsOfType<RTCTestStats2>();
79   EXPECT_EQ(b.size(), static_cast<size_t>(3));
80   mask = 0;
81   for (const RTCTestStats2* stats : b)
82     mask |= stats->timestamp_us();
83   EXPECT_EQ(mask, static_cast<int64_t>(4 | 8 | 32));
84 
85   EXPECT_EQ(report->GetStatsOfType<RTCTestStats3>().size(),
86             static_cast<size_t>(0));
87 }
88 
TEST(RTCStatsReport,StatsOrder)89 TEST(RTCStatsReport, StatsOrder) {
90   rtc::scoped_refptr<RTCStatsReport> report = RTCStatsReport::Create(1337);
91   EXPECT_EQ(report->timestamp_us(), 1337u);
92   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("C", 2)));
93   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("D", 3)));
94   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("B", 1)));
95   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("A", 0)));
96   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("E", 4)));
97   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("F", 5)));
98   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("G", 6)));
99   int64_t i = 0;
100   for (const RTCStats& stats : *report) {
101     EXPECT_EQ(stats.timestamp_us(), i);
102     ++i;
103   }
104   EXPECT_EQ(i, static_cast<int64_t>(7));
105 }
106 
TEST(RTCStatsReport,Take)107 TEST(RTCStatsReport, Take) {
108   rtc::scoped_refptr<RTCStatsReport> report = RTCStatsReport::Create(0);
109   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("A", 1)));
110   report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("B", 2)));
111   EXPECT_TRUE(report->Get("A"));
112   EXPECT_EQ(report->size(), 2u);
113   auto a = report->Take("A");
114   EXPECT_TRUE(a);
115   EXPECT_EQ(report->size(), 1u);
116   EXPECT_FALSE(report->Get("A"));
117   EXPECT_FALSE(report->Take("A"));
118 }
119 
TEST(RTCStatsReport,TakeMembersFrom)120 TEST(RTCStatsReport, TakeMembersFrom) {
121   rtc::scoped_refptr<RTCStatsReport> a = RTCStatsReport::Create(1337);
122   EXPECT_EQ(a->timestamp_us(), 1337u);
123   a->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("B", 1)));
124   a->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("C", 2)));
125   a->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("E", 4)));
126   rtc::scoped_refptr<RTCStatsReport> b = RTCStatsReport::Create(1338);
127   EXPECT_EQ(b->timestamp_us(), 1338u);
128   b->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("A", 0)));
129   b->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("D", 3)));
130   b->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("F", 5)));
131 
132   a->TakeMembersFrom(b);
133   EXPECT_EQ(b->size(), static_cast<size_t>(0));
134   int64_t i = 0;
135   for (const RTCStats& stats : *a) {
136     EXPECT_EQ(stats.timestamp_us(), i);
137     ++i;
138   }
139   EXPECT_EQ(i, static_cast<int64_t>(6));
140 }
141 
142 }  // namespace webrtc
143