blob: f6de8e607c9deb041d7413ee4ff1da4468e72d96 [file] [log] [blame]
hbos615d3012016-08-24 01:33:13 -07001/*
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"
hbos615d3012016-08-24 01:33:13 -070012
hbosfdafab82016-09-14 06:02:13 -070013#include <cstring>
14
hbos615d3012016-08-24 01:33:13 -070015#include "webrtc/base/checks.h"
16#include "webrtc/base/gunit.h"
hbos615d3012016-08-24 01:33:13 -070017
18namespace webrtc {
19
20class RTCTestStats : public RTCStats {
21 public:
hbos0e6758d2016-08-31 07:57:36 -070022 RTCTestStats(const std::string& id, int64_t timestamp_us)
23 : RTCStats(id, timestamp_us),
hbos615d3012016-08-24 01:33:13 -070024 m_int32("mInt32"),
25 m_uint32("mUint32"),
26 m_int64("mInt64"),
27 m_uint64("mUint64"),
28 m_double("mDouble"),
hbos615d3012016-08-24 01:33:13 -070029 m_string("mString"),
30 m_sequence_int32("mSequenceInt32"),
31 m_sequence_uint32("mSequenceUint32"),
32 m_sequence_int64("mSequenceInt64"),
33 m_sequence_uint64("mSequenceUint64"),
34 m_sequence_double("mSequenceDouble"),
hbos615d3012016-08-24 01:33:13 -070035 m_sequence_string("mSequenceString") {
36 }
37
38 WEBRTC_RTCSTATS_IMPL(RTCStats, RTCTestStats,
39 &m_int32,
40 &m_uint32,
41 &m_int64,
42 &m_uint64,
43 &m_double,
hbos615d3012016-08-24 01:33:13 -070044 &m_string,
45 &m_sequence_int32,
46 &m_sequence_uint32,
47 &m_sequence_int64,
48 &m_sequence_uint64,
49 &m_sequence_double,
hbos615d3012016-08-24 01:33:13 -070050 &m_sequence_string);
51
52 RTCStatsMember<int32_t> m_int32;
53 RTCStatsMember<uint32_t> m_uint32;
54 RTCStatsMember<int64_t> m_int64;
55 RTCStatsMember<uint64_t> m_uint64;
56 RTCStatsMember<double> m_double;
hbos615d3012016-08-24 01:33:13 -070057 RTCStatsMember<std::string> m_string;
58
59 RTCStatsMember<std::vector<int32_t>> m_sequence_int32;
60 RTCStatsMember<std::vector<uint32_t>> m_sequence_uint32;
61 RTCStatsMember<std::vector<int64_t>> m_sequence_int64;
62 RTCStatsMember<std::vector<uint64_t>> m_sequence_uint64;
63 RTCStatsMember<std::vector<double>> m_sequence_double;
hbos615d3012016-08-24 01:33:13 -070064 RTCStatsMember<std::vector<std::string>> m_sequence_string;
65};
66
67const char RTCTestStats::kType[] = "test-stats";
68
69class RTCChildStats : public RTCStats {
70 public:
hbos0e6758d2016-08-31 07:57:36 -070071 RTCChildStats(const std::string& id, int64_t timestamp_us)
72 : RTCStats(id, timestamp_us),
hbos615d3012016-08-24 01:33:13 -070073 child_int("childInt") {}
74
75 WEBRTC_RTCSTATS_IMPL(RTCStats, RTCChildStats,
76 &child_int);
77
78 RTCStatsMember<int32_t> child_int;
79};
80
81const char RTCChildStats::kType[] = "child-stats";
82
83class RTCGrandChildStats : public RTCChildStats {
84 public:
hbos0e6758d2016-08-31 07:57:36 -070085 RTCGrandChildStats(const std::string& id, int64_t timestamp_us)
86 : RTCChildStats(id, timestamp_us),
hbos615d3012016-08-24 01:33:13 -070087 grandchild_int("grandchildInt") {}
88
89 WEBRTC_RTCSTATS_IMPL(RTCChildStats, RTCGrandChildStats,
90 &grandchild_int);
91
92 RTCStatsMember<int32_t> grandchild_int;
93};
94
95const char RTCGrandChildStats::kType[] = "grandchild-stats";
96
97TEST(RTCStatsTest, RTCStatsAndMembers) {
hbos0e6758d2016-08-31 07:57:36 -070098 RTCTestStats stats("testId", 42);
hbos615d3012016-08-24 01:33:13 -070099 EXPECT_EQ(stats.id(), "testId");
hbos0e6758d2016-08-31 07:57:36 -0700100 EXPECT_EQ(stats.timestamp_us(), static_cast<int64_t>(42));
hbos615d3012016-08-24 01:33:13 -0700101 std::vector<const RTCStatsMemberInterface*> members = stats.Members();
hbos8faf9e02016-09-15 06:52:43 -0700102 EXPECT_EQ(members.size(), static_cast<size_t>(12));
hbos615d3012016-08-24 01:33:13 -0700103 for (const RTCStatsMemberInterface* member : members) {
104 EXPECT_FALSE(member->is_defined());
105 }
106 stats.m_int32 = 123;
107 stats.m_uint32 = 123;
108 stats.m_int64 = 123;
109 stats.m_uint64 = 123;
110 stats.m_double = 123.0;
hbos615d3012016-08-24 01:33:13 -0700111 stats.m_string = std::string("123");
hbosfdafab82016-09-14 06:02:13 -0700112
113 std::vector<int32_t> sequence_int32;
114 sequence_int32.push_back(static_cast<int32_t>(1));
115 std::vector<uint32_t> sequence_uint32;
116 sequence_uint32.push_back(static_cast<uint32_t>(2));
117 std::vector<int64_t> sequence_int64;
118 sequence_int64.push_back(static_cast<int64_t>(3));
119 std::vector<uint64_t> sequence_uint64;
120 sequence_uint64.push_back(static_cast<uint64_t>(4));
121 std::vector<double> sequence_double;
122 sequence_double.push_back(5.0);
hbosfdafab82016-09-14 06:02:13 -0700123 std::vector<std::string> sequence_string;
hbos8faf9e02016-09-15 06:52:43 -0700124 sequence_string.push_back(std::string("six"));
hbosfdafab82016-09-14 06:02:13 -0700125
126 stats.m_sequence_int32 = sequence_int32;
127 stats.m_sequence_uint32 = sequence_uint32;
hbos615d3012016-08-24 01:33:13 -0700128 EXPECT_FALSE(stats.m_sequence_int64.is_defined());
hbosfdafab82016-09-14 06:02:13 -0700129 stats.m_sequence_int64 = sequence_int64;
130 stats.m_sequence_uint64 = sequence_uint64;
131 stats.m_sequence_double = sequence_double;
hbosfdafab82016-09-14 06:02:13 -0700132 stats.m_sequence_string = sequence_string;
hbos615d3012016-08-24 01:33:13 -0700133 for (const RTCStatsMemberInterface* member : members) {
134 EXPECT_TRUE(member->is_defined());
135 }
136 EXPECT_EQ(*stats.m_int32, static_cast<int32_t>(123));
137 EXPECT_EQ(*stats.m_uint32, static_cast<uint32_t>(123));
138 EXPECT_EQ(*stats.m_int64, static_cast<int64_t>(123));
139 EXPECT_EQ(*stats.m_uint64, static_cast<uint64_t>(123));
140 EXPECT_EQ(*stats.m_double, 123.0);
hbos615d3012016-08-24 01:33:13 -0700141 EXPECT_EQ(*stats.m_string, std::string("123"));
hbosfdafab82016-09-14 06:02:13 -0700142 EXPECT_EQ(*stats.m_sequence_int32, sequence_int32);
143 EXPECT_EQ(*stats.m_sequence_uint32, sequence_uint32);
144 EXPECT_EQ(*stats.m_sequence_int64, sequence_int64);
145 EXPECT_EQ(*stats.m_sequence_uint64, sequence_uint64);
146 EXPECT_EQ(*stats.m_sequence_double, sequence_double);
hbosfdafab82016-09-14 06:02:13 -0700147 EXPECT_EQ(*stats.m_sequence_string, sequence_string);
148
hbos615d3012016-08-24 01:33:13 -0700149 int32_t numbers[] = { 4, 8, 15, 16, 23, 42 };
hbosfdafab82016-09-14 06:02:13 -0700150 std::vector<int32_t> numbers_sequence(&numbers[0], &numbers[6]);
151 stats.m_sequence_int32->clear();
hbos615d3012016-08-24 01:33:13 -0700152 stats.m_sequence_int32->insert(stats.m_sequence_int32->end(),
153 numbers_sequence.begin(),
154 numbers_sequence.end());
155 EXPECT_EQ(*stats.m_sequence_int32, numbers_sequence);
156}
157
158TEST(RTCStatsTest, RTCStatsGrandChild) {
159 RTCGrandChildStats stats("grandchild", 0.0);
160 stats.child_int = 1;
161 stats.grandchild_int = 2;
162 int32_t sum = 0;
163 for (const RTCStatsMemberInterface* member : stats.Members()) {
164 sum += *member->cast_to<const RTCStatsMember<int32_t>>();
165 }
166 EXPECT_EQ(sum, static_cast<int32_t>(3));
167
168 std::unique_ptr<RTCStats> copy_ptr = stats.copy();
169 const RTCGrandChildStats& copy = copy_ptr->cast_to<RTCGrandChildStats>();
170 EXPECT_EQ(*copy.child_int, *stats.child_int);
171 EXPECT_EQ(*copy.grandchild_int, *stats.grandchild_int);
172}
173
hbos615d3012016-08-24 01:33:13 -0700174// Death tests.
175// Disabled on Android because death tests misbehave on Android, see
176// base/test/gtest_util.h.
177#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
178
179TEST(RTCStatsDeathTest, ValueOfUndefinedMember) {
180 RTCTestStats stats("testId", 0.0);
181 EXPECT_FALSE(stats.m_int32.is_defined());
182 EXPECT_DEATH(*stats.m_int32, "");
183}
184
185TEST(RTCStatsDeathTest, InvalidCasting) {
186 RTCGrandChildStats stats("grandchild", 0.0);
187 EXPECT_DEATH(stats.cast_to<RTCChildStats>(), "");
188}
189
190#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
191
192} // namespace webrtc