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; } |
| 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 }; |
| 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*>(); |
| 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>()); |
| 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 |