File: media_router_debugger_impl_unittest.cc

package info (click to toggle)
chromium 139.0.7258.127-1~deb13u1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,096 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (134 lines) | stat: -rw-r--r-- 4,981 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/media/router/mojo/media_router_debugger_impl.h"

#include "base/test/scoped_feature_list.h"
#include "chrome/browser/media/router/discovery/access_code/access_code_cast_feature.h"
#include "chrome/test/base/testing_profile.h"
#include "components/sync_preferences/testing_pref_service_syncable.h"
#include "content/public/test/browser_task_environment.h"
#include "media/base/media_switches.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

using ::testing::_;

namespace media_router {

namespace {

class MockMirroringStatsObserver
    : public MediaRouterDebugger::MirroringStatsObserver {
 public:
  MOCK_METHOD(void, OnMirroringStatsUpdated, (const base::Value::Dict&));
};
}  // namespace

class MediaRouterDebuggerImplTest : public ::testing::Test {
 public:
  MediaRouterDebuggerImplTest() = default;
  MediaRouterDebuggerImplTest(const MediaRouterDebuggerImplTest&) = delete;
  ~MediaRouterDebuggerImplTest() override = default;
  MediaRouterDebuggerImplTest& operator=(const MediaRouterDebuggerImplTest&) =
      delete;

 protected:
  void SetUp() override {
    debugger_ = std::make_unique<MediaRouterDebuggerImpl>(&profile_);
    debugger_->AddObserver(observer_);
  }
  void TearDown() override { debugger_->RemoveObserver(observer_); }

  content::BrowserTaskEnvironment task_environment_;
  std::unique_ptr<MediaRouterDebuggerImpl> debugger_;
  testing::NiceMock<MockMirroringStatsObserver> observer_;
  TestingProfile profile_;
};

TEST_F(MediaRouterDebuggerImplTest, ShouldFetchMirroringStats) {
  // By default reports should be enabled.
  debugger_->ShouldFetchMirroringStats(
      base::BindOnce([](bool enabled) { EXPECT_TRUE(enabled); }));
}

TEST_F(MediaRouterDebuggerImplTest, ShouldFetchMirroringStatsFeatureDisabled) {
  // If the feature is disabled, then stats can still be fetched by enabling
  // them.
  base::test::ScopedFeatureList feature_list;
  feature_list.InitAndDisableFeature(media::kEnableRtcpReporting);

  EXPECT_CALL(observer_, OnMirroringStatsUpdated(_)).Times(0);
  debugger_->NotifyGetMirroringStats(base::Value::Dict());

  // Reports should now be disabled.
  debugger_->ShouldFetchMirroringStats(
      base::BindOnce([](bool enabled) { EXPECT_FALSE(enabled); }));

  debugger_->EnableRtcpReports();
  debugger_->ShouldFetchMirroringStats(
      base::BindOnce([](bool enabled) { EXPECT_TRUE(enabled); }));
}

TEST_F(MediaRouterDebuggerImplTest,
       ShouldFetchMirroringStatsAccessCodeCastFeature) {
  // If the feature is disabled, then fall back to the value of
  // AccessCodeCastEnabled.
  base::test::ScopedFeatureList feature_list;
  feature_list.InitAndDisableFeature(media::kEnableRtcpReporting);
  profile_.GetTestingPrefService()->SetManagedPref(
      prefs::kAccessCodeCastEnabled, std::make_unique<base::Value>(true));
  auto debugger_with_feature =
      std::make_unique<MediaRouterDebuggerImpl>(&profile_);
  debugger_with_feature->ShouldFetchMirroringStats(
      base::BindOnce([](bool enabled) { EXPECT_TRUE(enabled); }));

  // User settings should override policy pref.
  debugger_with_feature->DisableRtcpReports();
  debugger_with_feature->ShouldFetchMirroringStats(
      base::BindOnce([](bool enabled) { EXPECT_FALSE(enabled); }));
}

TEST_F(MediaRouterDebuggerImplTest, OnMirroringStats) {
  base::Value non_dict = base::Value("foo");
  base::Value::Dict empty_dict = base::Value::Dict();

  base::Value::Dict dict = base::Value::Dict();
  dict.Set("foo_key", "foo_value");

  // Verify that a non dict value will call notify the observers with a newly
  // constructed empty base::Value::Dict();
  EXPECT_CALL(observer_, OnMirroringStatsUpdated)
      .WillOnce(testing::Invoke([&](const base::Value::Dict& json_logs) {
        EXPECT_EQ(empty_dict, json_logs);
      }));
  debugger_->OnMirroringStats(non_dict.Clone());

  // Verify that a valid dict will notify observers of that value.
  EXPECT_CALL(observer_, OnMirroringStatsUpdated)
      .WillOnce(testing::Invoke([&](const base::Value::Dict& json_logs) {
        EXPECT_EQ(dict, json_logs);
      }));
  debugger_->OnMirroringStats(base::Value(dict.Clone()));
}

TEST_F(MediaRouterDebuggerImplTest, GetMirroringStats) {
  base::test::ScopedFeatureList feature_list;
  feature_list.InitAndDisableFeature(media::kEnableRtcpReporting);
  EXPECT_TRUE(debugger_->GetMirroringStats().empty());

  base::Value::Dict dict = base::Value::Dict();
  dict.Set("foo_key", "foo_value");
  debugger_->OnMirroringStats(base::Value(dict.Clone()));

  // GetLogs should only work if logs have been enabled.
  EXPECT_TRUE(debugger_->GetMirroringStats().empty());

  debugger_->EnableRtcpReports();
  debugger_->OnMirroringStats(base::Value(dict.Clone()));

  EXPECT_EQ(dict, debugger_->GetMirroringStats());
}

}  // namespace media_router