| Index: chrome/browser/media/webrtc/test_stats_dictionary_unittest.cc
|
| diff --git a/chrome/browser/media/webrtc/test_stats_dictionary_unittest.cc b/chrome/browser/media/webrtc/test_stats_dictionary_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..85acdaf17838ce942d227959649654835d9e3abc
|
| --- /dev/null
|
| +++ b/chrome/browser/media/webrtc/test_stats_dictionary_unittest.cc
|
| @@ -0,0 +1,167 @@
|
| +// 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 <memory>
|
| +#include <set>
|
| +#include <vector>
|
| +
|
| +#include "base/json/json_reader.h"
|
| +#include "base/logging.h"
|
| +#include "base/macros.h"
|
| +#include "base/memory/ref_counted.h"
|
| +#include "base/values.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace content {
|
| +
|
| +namespace {
|
| +
|
| +const char kTestStatsReportJson[] =
|
| + R"({
|
| + "GarbageA": {
|
| + "id": "GarbageA",
|
| + "timestamp": 0.0,
|
| + "type": "garbage"
|
| + },
|
| + "RTCTestStatsID": {
|
| + "id": "RTCTestStatsID",
|
| + "timestamp": 13.37,
|
| + "type": "test",
|
| + "boolean": true,
|
| + "number": 42,
|
| + "string": "text",
|
| + "sequenceBoolean": [ true ],
|
| + "sequenceNumber": [ 42 ],
|
| + "sequenceString": [ "text" ]
|
| + },
|
| + "GarbageB": {
|
| + "id": "GarbageB",
|
| + "timestamp": 0.0,
|
| + "type": "garbage"
|
| + }
|
| +})";
|
| +
|
| +class TestStatsDictionaryTest : public testing::Test {
|
| + public:
|
| + TestStatsDictionaryTest() {
|
| + std::unique_ptr<base::Value> value =
|
| + base::JSONReader::Read(kTestStatsReportJson);
|
| + CHECK(value);
|
| + base::DictionaryValue* dictionary;
|
| + CHECK(value->GetAsDictionary(&dictionary));
|
| + ignore_result(value.release());
|
| + report_ = new TestStatsReportDictionary(
|
| + std::unique_ptr<base::DictionaryValue>(dictionary));
|
| + }
|
| +
|
| + protected:
|
| + scoped_refptr<TestStatsReportDictionary> report_;
|
| +};
|
| +
|
| +TEST_F(TestStatsDictionaryTest, ReportGetStats) {
|
| + EXPECT_FALSE(report_->Get("InvalidID"));
|
| + EXPECT_TRUE(report_->Get("GarbageA"));
|
| + EXPECT_TRUE(report_->Get("RTCTestStatsID"));
|
| + EXPECT_TRUE(report_->Get("GarbageB"));
|
| +}
|
| +
|
| +TEST_F(TestStatsDictionaryTest, ReportForEach) {
|
| + std::set<std::string> remaining;
|
| + remaining.insert("GarbageA");
|
| + remaining.insert("RTCTestStatsID");
|
| + remaining.insert("GarbageB");
|
| + report_->ForEach([&remaining](const TestStatsDictionary& stats) {
|
| + remaining.erase(stats.GetString("id"));
|
| + });
|
| + EXPECT_TRUE(remaining.empty());
|
| +}
|
| +
|
| +TEST_F(TestStatsDictionaryTest, ReportFilterStats) {
|
| + std::vector<TestStatsDictionary> filtered_stats = report_->Filter(
|
| + [](const TestStatsDictionary& stats) -> bool {
|
| + return false;
|
| + });
|
| + EXPECT_EQ(filtered_stats.size(), 0u);
|
| +
|
| + filtered_stats = report_->Filter(
|
| + [](const TestStatsDictionary& stats) -> bool {
|
| + return true;
|
| + });
|
| + EXPECT_EQ(filtered_stats.size(), 3u);
|
| +
|
| + filtered_stats = report_->Filter(
|
| + [](const TestStatsDictionary& stats) -> bool {
|
| + return stats.GetString("id") == "RTCTestStatsID";
|
| + });
|
| + EXPECT_EQ(filtered_stats.size(), 1u);
|
| +}
|
| +
|
| +TEST_F(TestStatsDictionaryTest, ReportGetAll) {
|
| + std::set<std::string> remaining;
|
| + remaining.insert("GarbageA");
|
| + remaining.insert("RTCTestStatsID");
|
| + remaining.insert("GarbageB");
|
| + for (const TestStatsDictionary& stats : report_->GetAll()) {
|
| + remaining.erase(stats.GetString("id"));
|
| + }
|
| + EXPECT_TRUE(remaining.empty());
|
| +}
|
| +
|
| +TEST_F(TestStatsDictionaryTest, ReportGetByType) {
|
| + std::vector<TestStatsDictionary> stats = report_->GetByType("garbage");
|
| + EXPECT_EQ(stats.size(), 2u);
|
| + std::set<std::string> remaining;
|
| + remaining.insert("GarbageA");
|
| + remaining.insert("GarbageB");
|
| + report_->ForEach([&remaining](const TestStatsDictionary& stats) {
|
| + remaining.erase(stats.GetString("id"));
|
| + });
|
| + EXPECT_TRUE(remaining.empty());
|
| +}
|
| +
|
| +TEST_F(TestStatsDictionaryTest, StatsVerifyMembers) {
|
| + std::unique_ptr<TestStatsDictionary> stats = report_->Get("RTCTestStatsID");
|
| + EXPECT_TRUE(stats);
|
| +
|
| + EXPECT_FALSE(stats->IsBoolean("nonexistentMember"));
|
| + EXPECT_FALSE(stats->IsNumber("nonexistentMember"));
|
| + EXPECT_FALSE(stats->IsString("nonexistentMember"));
|
| + EXPECT_FALSE(stats->IsSequenceBoolean("nonexistentMember"));
|
| + EXPECT_FALSE(stats->IsSequenceNumber("nonexistentMember"));
|
| + EXPECT_FALSE(stats->IsSequenceString("nonexistentMember"));
|
| +
|
| + ASSERT_TRUE(stats->IsBoolean("boolean"));
|
| + EXPECT_EQ(stats->GetBoolean("boolean"), true);
|
| +
|
| + ASSERT_TRUE(stats->IsNumber("number"));
|
| + EXPECT_EQ(stats->GetNumber("number"), 42.0);
|
| +
|
| + ASSERT_TRUE(stats->IsString("string"));
|
| + EXPECT_EQ(stats->GetString("string"), "text");
|
| +
|
| + ASSERT_TRUE(stats->IsSequenceBoolean("sequenceBoolean"));
|
| + EXPECT_EQ(stats->GetSequenceBoolean("sequenceBoolean"),
|
| + std::vector<bool> { true });
|
| +
|
| + ASSERT_TRUE(stats->IsSequenceNumber("sequenceNumber"));
|
| + EXPECT_EQ(stats->GetSequenceNumber("sequenceNumber"),
|
| + std::vector<double> { 42.0 });
|
| +
|
| + ASSERT_TRUE(stats->IsSequenceString("sequenceString"));
|
| + EXPECT_EQ(stats->GetSequenceString("sequenceString"),
|
| + std::vector<std::string> { "text" });
|
| +}
|
| +
|
| +TEST_F(TestStatsDictionaryTest, TestStatsDictionaryShouldKeepReportAlive) {
|
| + std::unique_ptr<TestStatsDictionary> stats = report_->Get("RTCTestStatsID");
|
| + EXPECT_TRUE(stats);
|
| + report_ = nullptr;
|
| + EXPECT_EQ(stats->GetString("string"), "text");
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +} // namespace content
|
|
|