OLD | NEW |
---|---|
(Empty) | |
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 "webrtc/api/rtcstats.h" | |
12 #include "webrtc/api/rtcstatsreport.h" | |
13 | |
14 #include "webrtc/base/checks.h" | |
15 #include "webrtc/base/gunit.h" | |
16 #include "webrtc/base/logging.h" | |
17 | |
18 namespace webrtc { | |
19 | |
20 class RTCTestStats : public RTCStats { | |
21 public: | |
22 static const char* const kType; | |
23 | |
24 RTCTestStats(const std::string& id, double timestamp) | |
25 : RTCStats(id, timestamp), | |
26 m_int32("mInt32"), | |
27 m_uint32("mUint32"), | |
28 m_int64("mInt64"), | |
29 m_uint64("mUint64"), | |
30 m_double("mDouble"), | |
31 m_static_string("mStaticString"), | |
32 m_string("mString"), | |
33 m_sequence_int32("mSequenceInt32"), | |
34 m_sequence_uint32("mSequenceUint32"), | |
35 m_sequence_int64("mSequenceInt64"), | |
36 m_sequence_uint64("mSequenceUint64"), | |
37 m_sequence_double("mSequenceDouble"), | |
38 m_sequence_static_string("mSequenceStaticString"), | |
39 m_sequence_string("mSequenceString") { | |
40 } | |
41 std::unique_ptr<RTCStats> copy() const override { | |
42 return std::unique_ptr<RTCStats>(new RTCTestStats(*this)); | |
43 } | |
44 | |
45 const char* const* type() const override { return &kType; } | |
46 const char* type_name() const override { return kType; } | |
hta - Chromium
2016/08/15 15:14:57
Is there any chance that these could be different?
hbos
2016/08/15 22:46:43
It is possible to have default implementations, bu
| |
47 std::vector<const RTCStatsMemberInterface*> Members() const override { | |
48 const RTCStatsMemberInterface* members[] = { | |
49 &m_int32, | |
50 &m_uint32, | |
51 &m_int64, | |
52 &m_uint64, | |
53 &m_double, | |
54 &m_static_string, | |
55 &m_string, | |
56 &m_sequence_int32, | |
57 &m_sequence_uint32, | |
58 &m_sequence_int64, | |
59 &m_sequence_uint64, | |
60 &m_sequence_double, | |
61 &m_sequence_static_string, | |
62 &m_sequence_string | |
63 }; | |
64 return MembersVector(members, sizeof(members) / sizeof(members[0])); | |
65 } | |
66 | |
67 RTCStatsMember<int32_t> m_int32; | |
68 RTCStatsMember<uint32_t> m_uint32; | |
69 RTCStatsMember<int64_t> m_int64; | |
70 RTCStatsMember<uint64_t> m_uint64; | |
71 RTCStatsMember<double> m_double; | |
72 RTCStatsMember<const char*> m_static_string; | |
73 RTCStatsMember<std::string> m_string; | |
74 | |
75 RTCStatsMember<std::vector<int32_t>> m_sequence_int32; | |
76 RTCStatsMember<std::vector<uint32_t>> m_sequence_uint32; | |
77 RTCStatsMember<std::vector<int64_t>> m_sequence_int64; | |
78 RTCStatsMember<std::vector<uint64_t>> m_sequence_uint64; | |
79 RTCStatsMember<std::vector<double>> m_sequence_double; | |
80 RTCStatsMember<std::vector<const char*>> m_sequence_static_string; | |
81 RTCStatsMember<std::vector<std::string>> m_sequence_string; | |
82 }; | |
83 | |
84 const char* const RTCTestStats::kType = "test"; | |
85 | |
86 class RTCTestStats2 : public RTCStats { | |
87 public: | |
88 static const char* const kType; | |
89 | |
90 RTCTestStats2(const std::string& id, double timestamp) | |
91 : RTCStats(id, timestamp) { | |
92 } | |
93 std::unique_ptr<RTCStats> copy() const override { | |
94 return std::unique_ptr<RTCStats>(new RTCTestStats2(*this)); | |
95 } | |
96 | |
97 const char* const* type() const override { return &kType; } | |
98 const char* type_name() const override { return kType; } | |
99 std::vector<const RTCStatsMemberInterface*> Members() const override { | |
100 return std::vector<const RTCStatsMemberInterface*>(); | |
101 } | |
102 }; | |
103 | |
104 const char* const RTCTestStats2::kType = "test2"; | |
105 | |
106 class RTCTestStats3 : public RTCStats { | |
107 public: | |
108 static const char* const kType; | |
109 | |
110 RTCTestStats3(const std::string& id, double timestamp) | |
111 : RTCStats(id, timestamp) { | |
112 } | |
113 std::unique_ptr<RTCStats> copy() const override { | |
114 return std::unique_ptr<RTCStats>(new RTCTestStats3(*this)); | |
115 } | |
116 | |
117 const char* const* type() const override { return &kType; } | |
118 const char* type_name() const override { return kType; } | |
119 std::vector<const RTCStatsMemberInterface*> Members() const override { | |
120 return std::vector<const RTCStatsMemberInterface*>(); | |
121 } | |
122 }; | |
hta - Chromium
2016/08/15 15:14:57
For completeness, derive a class from RTCTestStats
hbos
2016/08/15 22:46:43
Done.
| |
123 | |
124 const char* const RTCTestStats3::kType = "test3"; | |
125 | |
126 class RTCStatsTest : public testing::Test { | |
127 }; | |
128 | |
129 TEST_F(RTCStatsTest, TestRTCStatsAndMembers) { | |
130 RTCTestStats stats("testId", 42.0); | |
131 EXPECT_EQ(stats.id(), "testId"); | |
132 EXPECT_EQ(stats.timestamp(), 42.0); | |
133 std::vector<const RTCStatsMemberInterface*> members = stats.Members(); | |
134 EXPECT_EQ(members.size(), static_cast<size_t>(14)); | |
135 for (const RTCStatsMemberInterface* member : members) { | |
136 EXPECT_FALSE(member->has_value()); | |
137 } | |
138 stats.m_int32 = 123; | |
139 stats.m_uint32 = 123; | |
140 stats.m_int64 = 123; | |
141 stats.m_uint64 = 123; | |
142 stats.m_double = 123.0; | |
143 stats.m_static_string = "123"; | |
144 stats.m_string = std::string("123"); | |
145 stats.m_sequence_int32 = std::vector<int32_t>(); | |
146 stats.m_sequence_uint32 = std::vector<uint32_t>(); | |
147 stats.m_sequence_int64 = std::vector<int64_t>(); | |
148 stats.m_sequence_uint64 = std::vector<uint64_t>(); | |
149 stats.m_sequence_double = std::vector<double>(); | |
150 stats.m_sequence_static_string = std::vector<const char*>(); | |
hta - Chromium
2016/08/15 15:14:57
Might be nice to thrown in a test that stats.m_seq
hbos
2016/08/15 22:46:43
The for loop above has already tested all members'
| |
151 stats.m_sequence_string = std::vector<std::string>(); | |
152 for (const RTCStatsMemberInterface* member : members) { | |
153 EXPECT_TRUE(member->has_value()); | |
154 } | |
155 EXPECT_EQ(*stats.m_int32, static_cast<int32_t>(123)); | |
156 EXPECT_EQ(*stats.m_uint32, static_cast<uint32_t>(123)); | |
157 EXPECT_EQ(*stats.m_int64, static_cast<int64_t>(123)); | |
158 EXPECT_EQ(*stats.m_uint64, static_cast<uint64_t>(123)); | |
159 EXPECT_EQ(*stats.m_double, 123.0); | |
160 EXPECT_EQ(*stats.m_static_string, "123"); | |
161 EXPECT_EQ(*stats.m_string, std::string("123")); | |
162 EXPECT_EQ(*stats.m_sequence_int32, std::vector<int32_t>()); | |
163 EXPECT_EQ(*stats.m_sequence_uint32, std::vector<uint32_t>()); | |
164 EXPECT_EQ(*stats.m_sequence_int64, std::vector<int64_t>()); | |
165 EXPECT_EQ(*stats.m_sequence_uint64, std::vector<uint64_t>()); | |
166 EXPECT_EQ(*stats.m_sequence_double, std::vector<double>()); | |
167 EXPECT_EQ(*stats.m_sequence_static_string, std::vector<const char*>()); | |
168 EXPECT_EQ(*stats.m_sequence_string, std::vector<std::string>()); | |
hta - Chromium
2016/08/15 15:14:57
Throw in a case where you give a value to a sequen
hbos
2016/08/15 22:46:43
Done.
| |
169 } | |
170 | |
171 TEST_F(RTCStatsTest, TestRTCStatsReport) { | |
172 rtc::scoped_refptr<RTCStatsReport> report = RTCStatsReport::Create(); | |
173 EXPECT_EQ(report->size(), static_cast<size_t>(0)); | |
174 report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats("a0", 1.0))); | |
175 report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats("a1", 2.0))); | |
176 report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("b0", 4.0))); | |
177 report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("b1", 8.0))); | |
178 report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats("a2", 16.0))); | |
179 report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("b2", 32.0))); | |
180 EXPECT_EQ(report->size(), static_cast<size_t>(6)); | |
181 | |
182 EXPECT_EQ((*report)["missing"], nullptr); | |
183 EXPECT_EQ((*report)["a0"]->id(), "a0"); | |
184 EXPECT_EQ((*report)["b2"]->id(), "b2"); | |
185 | |
186 std::vector<const RTCTestStats*> a = report->GetStatsOfType<RTCTestStats>(); | |
187 EXPECT_EQ(a.size(), static_cast<size_t>(3)); | |
188 uint32_t mask = 0; | |
189 for (const RTCTestStats* stats : a) | |
190 mask |= static_cast<uint32_t>(stats->timestamp()); | |
191 EXPECT_EQ(mask, static_cast<uint32_t>(1 | 2 | 16)); | |
192 | |
193 std::vector<const RTCTestStats2*> b = report->GetStatsOfType<RTCTestStats2>(); | |
194 EXPECT_EQ(b.size(), static_cast<size_t>(3)); | |
195 mask = 0; | |
196 for (const RTCTestStats2* stats : b) | |
197 mask |= static_cast<uint32_t>(stats->timestamp()); | |
198 EXPECT_EQ(mask, static_cast<uint32_t>(4 | 8 | 32)); | |
199 | |
200 EXPECT_EQ(report->GetStatsOfType<RTCTestStats3>().size(), | |
201 static_cast<size_t>(0)); | |
202 } | |
203 | |
204 } // namespace webrtc | |
OLD | NEW |