1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/media/webrtc/test_stats_dictionary.h"
6
7 #include "base/check.h"
8 #include "base/json/json_writer.h"
9
10 namespace content {
11
TestStatsReportDictionary(std::unique_ptr<base::DictionaryValue> report)12 TestStatsReportDictionary::TestStatsReportDictionary(
13 std::unique_ptr<base::DictionaryValue> report)
14 : report_(std::move(report)) {
15 CHECK(report_);
16 }
17
~TestStatsReportDictionary()18 TestStatsReportDictionary::~TestStatsReportDictionary() {
19 }
20
ForEach(std::function<void (const TestStatsDictionary &)> iteration)21 void TestStatsReportDictionary::ForEach(
22 std::function<void(const TestStatsDictionary&)> iteration) {
23 for (base::DictionaryValue::Iterator it(*report_); !it.IsAtEnd();
24 it.Advance()) {
25 const base::DictionaryValue* it_value;
26 CHECK(it.value().GetAsDictionary(&it_value));
27 iteration(TestStatsDictionary(this, it_value));
28 }
29 }
30
Filter(std::function<bool (const TestStatsDictionary &)> filter)31 std::vector<TestStatsDictionary> TestStatsReportDictionary::Filter(
32 std::function<bool(const TestStatsDictionary&)> filter) {
33 std::vector<TestStatsDictionary> result;
34 ForEach([&result, &filter](const TestStatsDictionary& stats) {
35 if (filter(stats))
36 result.push_back(stats);
37 });
38 return result;
39 }
40
Get(const std::string & id)41 std::unique_ptr<TestStatsDictionary> TestStatsReportDictionary::Get(
42 const std::string& id) {
43 const base::DictionaryValue* dictionary;
44 if (!report_->GetDictionary(id, &dictionary))
45 return nullptr;
46 return std::unique_ptr<TestStatsDictionary>(
47 new TestStatsDictionary(this, dictionary));
48 }
49
GetAll()50 std::vector<TestStatsDictionary> TestStatsReportDictionary::GetAll() {
51 return Filter([](const TestStatsDictionary&) { return true; });
52 }
53
GetByType(const std::string & type)54 std::vector<TestStatsDictionary> TestStatsReportDictionary::GetByType(
55 const std::string& type) {
56 return Filter([&type](const TestStatsDictionary& stats) {
57 return stats.GetString("type") == type;
58 });
59 }
60
TestStatsDictionary(TestStatsReportDictionary * report,const base::DictionaryValue * stats)61 TestStatsDictionary::TestStatsDictionary(
62 TestStatsReportDictionary* report, const base::DictionaryValue* stats)
63 : report_(report), stats_(stats) {
64 CHECK(report_);
65 CHECK(stats_);
66 }
67
68 TestStatsDictionary::TestStatsDictionary(
69 const TestStatsDictionary& other) = default;
70
~TestStatsDictionary()71 TestStatsDictionary::~TestStatsDictionary() {
72 }
73
IsBoolean(const std::string & key) const74 bool TestStatsDictionary::IsBoolean(const std::string& key) const {
75 bool value;
76 return GetBoolean(key, &value);
77 }
78
GetBoolean(const std::string & key) const79 bool TestStatsDictionary::GetBoolean(const std::string& key) const {
80 bool value;
81 CHECK(GetBoolean(key, &value));
82 return value;
83 }
84
IsNumber(const std::string & key) const85 bool TestStatsDictionary::IsNumber(const std::string& key) const {
86 double value;
87 return GetNumber(key, &value);
88 }
89
GetNumber(const std::string & key) const90 double TestStatsDictionary::GetNumber(const std::string& key) const {
91 double value;
92 CHECK(GetNumber(key, &value));
93 return value;
94 }
95
IsString(const std::string & key) const96 bool TestStatsDictionary::IsString(const std::string& key) const {
97 std::string value;
98 return GetString(key, &value);
99 }
100
GetString(const std::string & key) const101 std::string TestStatsDictionary::GetString(const std::string& key) const {
102 std::string value;
103 CHECK(GetString(key, &value));
104 return value;
105 }
106
IsSequenceBoolean(const std::string & key) const107 bool TestStatsDictionary::IsSequenceBoolean(const std::string& key) const {
108 std::vector<bool> value;
109 return GetSequenceBoolean(key, &value);
110 }
111
GetSequenceBoolean(const std::string & key) const112 std::vector<bool> TestStatsDictionary::GetSequenceBoolean(
113 const std::string& key) const {
114 std::vector<bool> value;
115 CHECK(GetSequenceBoolean(key, &value));
116 return value;
117 }
118
IsSequenceNumber(const std::string & key) const119 bool TestStatsDictionary::IsSequenceNumber(const std::string& key) const {
120 std::vector<double> value;
121 return GetSequenceNumber(key, &value);
122 }
123
GetSequenceNumber(const std::string & key) const124 std::vector<double> TestStatsDictionary::GetSequenceNumber(
125 const std::string& key) const {
126 std::vector<double> value;
127 CHECK(GetSequenceNumber(key, &value));
128 return value;
129 }
130
IsSequenceString(const std::string & key) const131 bool TestStatsDictionary::IsSequenceString(const std::string& key) const {
132 std::vector<std::string> value;
133 return GetSequenceString(key, &value);
134 }
135
GetSequenceString(const std::string & key) const136 std::vector<std::string> TestStatsDictionary::GetSequenceString(
137 const std::string& key) const {
138 std::vector<std::string> value;
139 CHECK(GetSequenceString(key, &value));
140 return value;
141 }
142
GetBoolean(const std::string & key,bool * out) const143 bool TestStatsDictionary::GetBoolean(
144 const std::string& key, bool* out) const {
145 return stats_->GetBoolean(key, out);
146 }
147
GetNumber(const std::string & key,double * out) const148 bool TestStatsDictionary::GetNumber(
149 const std::string& key, double* out) const {
150 return stats_->GetDouble(key, out);
151 }
152
GetString(const std::string & key,std::string * out) const153 bool TestStatsDictionary::GetString(
154 const std::string& key, std::string* out) const {
155 return stats_->GetString(key, out);
156 }
157
GetSequenceBoolean(const std::string & key,std::vector<bool> * out) const158 bool TestStatsDictionary::GetSequenceBoolean(
159 const std::string& key,
160 std::vector<bool>* out) const {
161 const base::ListValue* list;
162 if (!stats_->GetList(key, &list))
163 return false;
164 std::vector<bool> sequence;
165 bool element;
166 for (size_t i = 0; i < list->GetSize(); ++i) {
167 if (!list->GetBoolean(i, &element))
168 return false;
169 sequence.push_back(element);
170 }
171 *out = std::move(sequence);
172 return true;
173 }
174
GetSequenceNumber(const std::string & key,std::vector<double> * out) const175 bool TestStatsDictionary::GetSequenceNumber(
176 const std::string& key,
177 std::vector<double>* out) const {
178 const base::ListValue* list;
179 if (!stats_->GetList(key, &list))
180 return false;
181 std::vector<double> sequence;
182 double element;
183 for (size_t i = 0; i < list->GetSize(); ++i) {
184 if (!list->GetDouble(i, &element))
185 return false;
186 sequence.push_back(element);
187 }
188 *out = std::move(sequence);
189 return true;
190 }
191
GetSequenceString(const std::string & key,std::vector<std::string> * out) const192 bool TestStatsDictionary::GetSequenceString(
193 const std::string& key,
194 std::vector<std::string>* out) const {
195 const base::ListValue* list;
196 if (!stats_->GetList(key, &list))
197 return false;
198 std::vector<std::string> sequence;
199 std::string element;
200 for (size_t i = 0; i < list->GetSize(); ++i) {
201 if (!list->GetString(i, &element))
202 return false;
203 sequence.push_back(element);
204 }
205 *out = std::move(sequence);
206 return true;
207 }
208
ToString() const209 std::string TestStatsDictionary::ToString() const {
210 std::string str;
211 CHECK(base::JSONWriter::WriteWithOptions(
212 *stats_, base::JSONWriter::OPTIONS_PRETTY_PRINT, &str));
213 return str;
214 }
215
216 } // namespace content
217