| Index: chrome/browser/media/webrtc/test_stats_dictionary.cc
|
| diff --git a/chrome/browser/media/webrtc/test_stats_dictionary.cc b/chrome/browser/media/webrtc/test_stats_dictionary.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a02c385a0686ec30aeb4135fa378dd2c879492df
|
| --- /dev/null
|
| +++ b/chrome/browser/media/webrtc/test_stats_dictionary.cc
|
| @@ -0,0 +1,216 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/media/webrtc/test_stats_dictionary.h"
|
| +
|
| +#include "base/json/json_writer.h"
|
| +#include "base/logging.h"
|
| +
|
| +namespace content {
|
| +
|
| +TestStatsReportDictionary::TestStatsReportDictionary(
|
| + std::unique_ptr<base::DictionaryValue> report)
|
| + : report_(std::move(report)) {
|
| + CHECK(report_);
|
| +}
|
| +
|
| +TestStatsReportDictionary::~TestStatsReportDictionary() {
|
| +}
|
| +
|
| +void TestStatsReportDictionary::ForEach(
|
| + std::function<void(const TestStatsDictionary&)> iteration) {
|
| + for (base::DictionaryValue::Iterator it(*report_); !it.IsAtEnd();
|
| + it.Advance()) {
|
| + const base::DictionaryValue* it_value;
|
| + CHECK(it.value().GetAsDictionary(&it_value));
|
| + iteration(TestStatsDictionary(this, it_value));
|
| + }
|
| +}
|
| +
|
| +std::vector<TestStatsDictionary> TestStatsReportDictionary::Filter(
|
| + std::function<bool(const TestStatsDictionary&)> filter) {
|
| + std::vector<TestStatsDictionary> result;
|
| + ForEach([&result, &filter](const TestStatsDictionary& stats) {
|
| + if (filter(stats))
|
| + result.push_back(stats);
|
| + });
|
| + return result;
|
| +}
|
| +
|
| +std::unique_ptr<TestStatsDictionary> TestStatsReportDictionary::Get(
|
| + const std::string& id) {
|
| + const base::DictionaryValue* dictionary;
|
| + if (!report_->GetDictionary(id, &dictionary))
|
| + return nullptr;
|
| + return std::unique_ptr<TestStatsDictionary>(
|
| + new TestStatsDictionary(this, dictionary));
|
| +}
|
| +
|
| +std::vector<TestStatsDictionary> TestStatsReportDictionary::GetAll() {
|
| + return Filter([](const TestStatsDictionary&) { return true; });
|
| +}
|
| +
|
| +std::vector<TestStatsDictionary> TestStatsReportDictionary::GetByType(
|
| + const std::string& type) {
|
| + return Filter([&type](const TestStatsDictionary& stats) {
|
| + return stats.GetString("type") == type;
|
| + });
|
| +}
|
| +
|
| +TestStatsDictionary::TestStatsDictionary(
|
| + TestStatsReportDictionary* report, const base::DictionaryValue* stats)
|
| + : report_(report), stats_(stats) {
|
| + CHECK(report_);
|
| + CHECK(stats_);
|
| +}
|
| +
|
| +TestStatsDictionary::TestStatsDictionary(
|
| + const TestStatsDictionary& other) = default;
|
| +
|
| +TestStatsDictionary::~TestStatsDictionary() {
|
| +}
|
| +
|
| +bool TestStatsDictionary::IsBoolean(const std::string& key) const {
|
| + bool value;
|
| + return GetBoolean(key, &value);
|
| +}
|
| +
|
| +bool TestStatsDictionary::GetBoolean(const std::string& key) const {
|
| + bool value;
|
| + CHECK(GetBoolean(key, &value));
|
| + return value;
|
| +}
|
| +
|
| +bool TestStatsDictionary::IsNumber(const std::string& key) const {
|
| + double value;
|
| + return GetNumber(key, &value);
|
| +}
|
| +
|
| +double TestStatsDictionary::GetNumber(const std::string& key) const {
|
| + double value;
|
| + CHECK(GetNumber(key, &value));
|
| + return value;
|
| +}
|
| +
|
| +bool TestStatsDictionary::IsString(const std::string& key) const {
|
| + std::string value;
|
| + return GetString(key, &value);
|
| +}
|
| +
|
| +std::string TestStatsDictionary::GetString(const std::string& key) const {
|
| + std::string value;
|
| + CHECK(GetString(key, &value));
|
| + return value;
|
| +}
|
| +
|
| +bool TestStatsDictionary::IsSequenceBoolean(const std::string& key) const {
|
| + std::vector<bool> value;
|
| + return GetSequenceBoolean(key, &value);
|
| +}
|
| +
|
| +std::vector<bool> TestStatsDictionary::GetSequenceBoolean(
|
| + const std::string& key) const {
|
| + std::vector<bool> value;
|
| + CHECK(GetSequenceBoolean(key, &value));
|
| + return value;
|
| +}
|
| +
|
| +bool TestStatsDictionary::IsSequenceNumber(const std::string& key) const {
|
| + std::vector<double> value;
|
| + return GetSequenceNumber(key, &value);
|
| +}
|
| +
|
| +std::vector<double> TestStatsDictionary::GetSequenceNumber(
|
| + const std::string& key) const {
|
| + std::vector<double> value;
|
| + CHECK(GetSequenceNumber(key, &value));
|
| + return value;
|
| +}
|
| +
|
| +bool TestStatsDictionary::IsSequenceString(const std::string& key) const {
|
| + std::vector<std::string> value;
|
| + return GetSequenceString(key, &value);
|
| +}
|
| +
|
| +std::vector<std::string> TestStatsDictionary::GetSequenceString(
|
| + const std::string& key) const {
|
| + std::vector<std::string> value;
|
| + CHECK(GetSequenceString(key, &value));
|
| + return value;
|
| +}
|
| +
|
| +bool TestStatsDictionary::GetBoolean(
|
| + const std::string& key, bool* out) const {
|
| + return stats_->GetBoolean(key, out);
|
| +}
|
| +
|
| +bool TestStatsDictionary::GetNumber(
|
| + const std::string& key, double* out) const {
|
| + return stats_->GetDouble(key, out);
|
| +}
|
| +
|
| +bool TestStatsDictionary::GetString(
|
| + const std::string& key, std::string* out) const {
|
| + return stats_->GetString(key, out);
|
| +}
|
| +
|
| +bool TestStatsDictionary::GetSequenceBoolean(
|
| + const std::string& key,
|
| + std::vector<bool>* out) const {
|
| + const base::ListValue* list;
|
| + if (!stats_->GetList(key, &list))
|
| + return false;
|
| + std::vector<bool> sequence;
|
| + bool element;
|
| + for (size_t i = 0; i < list->GetSize(); ++i) {
|
| + if (!list->GetBoolean(i, &element))
|
| + return false;
|
| + sequence.push_back(element);
|
| + }
|
| + *out = std::move(sequence);
|
| + return true;
|
| +}
|
| +
|
| +bool TestStatsDictionary::GetSequenceNumber(
|
| + const std::string& key,
|
| + std::vector<double>* out) const {
|
| + const base::ListValue* list;
|
| + if (!stats_->GetList(key, &list))
|
| + return false;
|
| + std::vector<double> sequence;
|
| + double element;
|
| + for (size_t i = 0; i < list->GetSize(); ++i) {
|
| + if (!list->GetDouble(i, &element))
|
| + return false;
|
| + sequence.push_back(element);
|
| + }
|
| + *out = std::move(sequence);
|
| + return true;
|
| +}
|
| +
|
| +bool TestStatsDictionary::GetSequenceString(
|
| + const std::string& key,
|
| + std::vector<std::string>* out) const {
|
| + const base::ListValue* list;
|
| + if (!stats_->GetList(key, &list))
|
| + return false;
|
| + std::vector<std::string> sequence;
|
| + std::string element;
|
| + for (size_t i = 0; i < list->GetSize(); ++i) {
|
| + if (!list->GetString(i, &element))
|
| + return false;
|
| + sequence.push_back(element);
|
| + }
|
| + *out = std::move(sequence);
|
| + return true;
|
| +}
|
| +
|
| +std::string TestStatsDictionary::ToString() const {
|
| + std::string str;
|
| + CHECK(base::JSONWriter::WriteWithOptions(
|
| + *stats_, base::JSONWriter::OPTIONS_PRETTY_PRINT, &str));
|
| + return str;
|
| +}
|
| +
|
| +} // namespace content
|
|
|