blob: 7404e3b8d763b2368e4a70ae25a60d9234371cb3 [file] [log] [blame]
dnicoaradc1e3732015-04-22 14:35:371// Copyright 2015 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
Joone Hurd3ae8732018-04-17 18:05:095#include "ui/display/manager/query_content_protection_task.h"
dcheng023d4882015-12-31 04:55:156
avice85b4292015-12-24 21:08:257#include <stdint.h>
leon.han687a112b2017-02-23 06:08:098#include <memory>
dcheng023d4882015-12-31 04:55:159#include <utility>
leon.han687a112b2017-02-23 06:08:0910#include <vector>
avice85b4292015-12-24 21:08:2511
dnicoaradc1e3732015-04-22 14:35:3712#include "base/bind.h"
avice85b4292015-12-24 21:08:2513#include "base/macros.h"
Dominik Laskowski447274b2019-04-05 22:14:0114#include "base/optional.h"
dnicoaradc1e3732015-04-22 14:35:3715#include "testing/gtest/include/gtest/gtest.h"
Daniel Bratell249416b2019-04-12 22:26:2816#include "ui/display/fake/fake_display_snapshot.h"
Joone Hurd3ae8732018-04-17 18:05:0917#include "ui/display/manager/display_layout_manager.h"
Joone Hurd3ae8732018-04-17 18:05:0918#include "ui/display/manager/test/action_logger_util.h"
19#include "ui/display/manager/test/test_display_layout_manager.h"
20#include "ui/display/manager/test/test_native_display_delegate.h"
dnicoaradc1e3732015-04-22 14:35:3721
kylechar7a067ec2017-01-07 01:16:2822namespace display {
dnicoaradc1e3732015-04-22 14:35:3723namespace test {
24
25namespace {
26
danakj25c52c32016-04-12 21:51:0827std::unique_ptr<DisplaySnapshot> CreateDisplaySnapshot(
28 int64_t id,
29 DisplayConnectionType type) {
kylechar7a067ec2017-01-07 01:16:2830 return FakeDisplaySnapshot::Builder()
kylecharc354dd22016-10-24 21:03:5631 .SetId(id)
32 .SetNativeMode(gfx::Size(1024, 768))
33 .SetType(type)
34 .Build();
dnicoaradc1e3732015-04-22 14:35:3735}
36
37} // namespace
38
39class QueryContentProtectionTaskTest : public testing::Test {
40 public:
Dominik Laskowskif206ba52019-04-09 19:49:5641 using Status = QueryContentProtectionTask::Status;
42
Dominik Laskowski447274b2019-04-05 22:14:0143 QueryContentProtectionTaskTest() = default;
44 ~QueryContentProtectionTaskTest() override = default;
dnicoaradc1e3732015-04-22 14:35:3745
Dominik Laskowskif206ba52019-04-09 19:49:5646 void ResponseCallback(Status status,
Dominik Laskowski447274b2019-04-05 22:14:0147 uint32_t connection_mask,
48 uint32_t protection_mask) {
Dominik Laskowskif206ba52019-04-09 19:49:5649 response_ = Response{status, connection_mask, protection_mask};
dnicoaradc1e3732015-04-22 14:35:3750 }
51
52 protected:
53 ActionLogger log_;
Dominik Laskowski447274b2019-04-05 22:14:0154 TestNativeDisplayDelegate display_delegate_{&log_};
dnicoaradc1e3732015-04-22 14:35:3755
Dominik Laskowski447274b2019-04-05 22:14:0156 struct Response {
Dominik Laskowskif206ba52019-04-09 19:49:5657 Status status;
Dominik Laskowski447274b2019-04-05 22:14:0158 uint32_t connection_mask;
59 uint32_t protection_mask;
60 };
61
62 base::Optional<Response> response_;
dnicoaradc1e3732015-04-22 14:35:3763
64 private:
65 DISALLOW_COPY_AND_ASSIGN(QueryContentProtectionTaskTest);
66};
67
Dominik Laskowski447274b2019-04-05 22:14:0168TEST_F(QueryContentProtectionTaskTest, QueryInternalDisplay) {
leon.han687a112b2017-02-23 06:08:0969 std::vector<std::unique_ptr<DisplaySnapshot>> displays;
dnicoaradc1e3732015-04-22 14:35:3770 displays.push_back(
71 CreateDisplaySnapshot(1, DISPLAY_CONNECTION_TYPE_INTERNAL));
dcheng023d4882015-12-31 04:55:1572 TestDisplayLayoutManager layout_manager(std::move(displays),
dnicoaradc1e3732015-04-22 14:35:3773 MULTIPLE_DISPLAY_STATE_SINGLE);
74
75 QueryContentProtectionTask task(
76 &layout_manager, &display_delegate_, 1,
77 base::Bind(&QueryContentProtectionTaskTest::ResponseCallback,
78 base::Unretained(this)));
79 task.Run();
80
Dominik Laskowski447274b2019-04-05 22:14:0181 ASSERT_TRUE(response_);
Dominik Laskowskif206ba52019-04-09 19:49:5682 EXPECT_EQ(Status::SUCCESS, response_->status);
Dominik Laskowski447274b2019-04-05 22:14:0183 EXPECT_EQ(DISPLAY_CONNECTION_TYPE_INTERNAL, response_->connection_mask);
Dominik Laskowskiea9fbb92019-07-23 17:22:4084 EXPECT_EQ(CONTENT_PROTECTION_METHOD_NONE, response_->protection_mask);
dnicoaradc1e3732015-04-22 14:35:3785}
86
Dominik Laskowski447274b2019-04-05 22:14:0187TEST_F(QueryContentProtectionTaskTest, QueryUnknownDisplay) {
leon.han687a112b2017-02-23 06:08:0988 std::vector<std::unique_ptr<DisplaySnapshot>> displays;
dnicoaradc1e3732015-04-22 14:35:3789 displays.push_back(CreateDisplaySnapshot(1, DISPLAY_CONNECTION_TYPE_UNKNOWN));
dcheng023d4882015-12-31 04:55:1590 TestDisplayLayoutManager layout_manager(std::move(displays),
dnicoaradc1e3732015-04-22 14:35:3791 MULTIPLE_DISPLAY_STATE_SINGLE);
92
93 QueryContentProtectionTask task(
94 &layout_manager, &display_delegate_, 1,
95 base::Bind(&QueryContentProtectionTaskTest::ResponseCallback,
96 base::Unretained(this)));
97 task.Run();
98
Dominik Laskowski447274b2019-04-05 22:14:0199 ASSERT_TRUE(response_);
Dominik Laskowskif206ba52019-04-09 19:49:56100 EXPECT_EQ(Status::FAILURE, response_->status);
Dominik Laskowski447274b2019-04-05 22:14:01101 EXPECT_EQ(DISPLAY_CONNECTION_TYPE_UNKNOWN, response_->connection_mask);
Dominik Laskowskiea9fbb92019-07-23 17:22:40102 EXPECT_EQ(CONTENT_PROTECTION_METHOD_NONE, response_->protection_mask);
dnicoaradc1e3732015-04-22 14:35:37103}
104
Dominik Laskowski447274b2019-04-05 22:14:01105TEST_F(QueryContentProtectionTaskTest, QueryDisplayThatCannotGetHdcp) {
leon.han687a112b2017-02-23 06:08:09106 std::vector<std::unique_ptr<DisplaySnapshot>> displays;
dnicoaradc1e3732015-04-22 14:35:37107 displays.push_back(CreateDisplaySnapshot(1, DISPLAY_CONNECTION_TYPE_HDMI));
dcheng023d4882015-12-31 04:55:15108 TestDisplayLayoutManager layout_manager(std::move(displays),
dnicoaradc1e3732015-04-22 14:35:37109 MULTIPLE_DISPLAY_STATE_SINGLE);
110 display_delegate_.set_get_hdcp_state_expectation(false);
111
112 QueryContentProtectionTask task(
113 &layout_manager, &display_delegate_, 1,
114 base::Bind(&QueryContentProtectionTaskTest::ResponseCallback,
115 base::Unretained(this)));
116 task.Run();
117
Dominik Laskowski447274b2019-04-05 22:14:01118 ASSERT_TRUE(response_);
Dominik Laskowskif206ba52019-04-09 19:49:56119 EXPECT_EQ(Status::FAILURE, response_->status);
Dominik Laskowski447274b2019-04-05 22:14:01120 EXPECT_EQ(DISPLAY_CONNECTION_TYPE_HDMI, response_->connection_mask);
dnicoaradc1e3732015-04-22 14:35:37121}
122
Dominik Laskowski447274b2019-04-05 22:14:01123TEST_F(QueryContentProtectionTaskTest, QueryDisplayWithHdcpDisabled) {
leon.han687a112b2017-02-23 06:08:09124 std::vector<std::unique_ptr<DisplaySnapshot>> displays;
dnicoaradc1e3732015-04-22 14:35:37125 displays.push_back(CreateDisplaySnapshot(1, DISPLAY_CONNECTION_TYPE_HDMI));
dcheng023d4882015-12-31 04:55:15126 TestDisplayLayoutManager layout_manager(std::move(displays),
dnicoaradc1e3732015-04-22 14:35:37127 MULTIPLE_DISPLAY_STATE_SINGLE);
128
129 QueryContentProtectionTask task(
130 &layout_manager, &display_delegate_, 1,
131 base::Bind(&QueryContentProtectionTaskTest::ResponseCallback,
132 base::Unretained(this)));
133 task.Run();
134
Dominik Laskowski447274b2019-04-05 22:14:01135 ASSERT_TRUE(response_);
Dominik Laskowskif206ba52019-04-09 19:49:56136 EXPECT_EQ(Status::SUCCESS, response_->status);
Dominik Laskowski447274b2019-04-05 22:14:01137 EXPECT_EQ(DISPLAY_CONNECTION_TYPE_HDMI, response_->connection_mask);
Dominik Laskowskiea9fbb92019-07-23 17:22:40138 EXPECT_EQ(CONTENT_PROTECTION_METHOD_NONE, response_->protection_mask);
dnicoaradc1e3732015-04-22 14:35:37139}
140
Dominik Laskowski447274b2019-04-05 22:14:01141TEST_F(QueryContentProtectionTaskTest, QueryDisplayWithHdcpEnabled) {
leon.han687a112b2017-02-23 06:08:09142 std::vector<std::unique_ptr<DisplaySnapshot>> displays;
dnicoaradc1e3732015-04-22 14:35:37143 displays.push_back(CreateDisplaySnapshot(1, DISPLAY_CONNECTION_TYPE_HDMI));
dcheng023d4882015-12-31 04:55:15144 TestDisplayLayoutManager layout_manager(std::move(displays),
dnicoaradc1e3732015-04-22 14:35:37145 MULTIPLE_DISPLAY_STATE_SINGLE);
146 display_delegate_.set_hdcp_state(HDCP_STATE_ENABLED);
147
148 QueryContentProtectionTask task(
149 &layout_manager, &display_delegate_, 1,
150 base::Bind(&QueryContentProtectionTaskTest::ResponseCallback,
151 base::Unretained(this)));
152 task.Run();
153
Dominik Laskowski447274b2019-04-05 22:14:01154 ASSERT_TRUE(response_);
Dominik Laskowskif206ba52019-04-09 19:49:56155 EXPECT_EQ(Status::SUCCESS, response_->status);
Dominik Laskowski447274b2019-04-05 22:14:01156 EXPECT_EQ(DISPLAY_CONNECTION_TYPE_HDMI, response_->connection_mask);
157 EXPECT_EQ(CONTENT_PROTECTION_METHOD_HDCP, response_->protection_mask);
dnicoaradc1e3732015-04-22 14:35:37158}
159
Dominik Laskowski447274b2019-04-05 22:14:01160TEST_F(QueryContentProtectionTaskTest, QueryInMultiDisplayMode) {
leon.han687a112b2017-02-23 06:08:09161 std::vector<std::unique_ptr<DisplaySnapshot>> displays;
dnicoaradc1e3732015-04-22 14:35:37162 displays.push_back(CreateDisplaySnapshot(1, DISPLAY_CONNECTION_TYPE_HDMI));
163 displays.push_back(CreateDisplaySnapshot(2, DISPLAY_CONNECTION_TYPE_DVI));
Weidong Guo70654b32017-10-12 02:12:03164 TestDisplayLayoutManager layout_manager(
165 std::move(displays), MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED);
dnicoaradc1e3732015-04-22 14:35:37166
167 QueryContentProtectionTask task(
168 &layout_manager, &display_delegate_, 1,
169 base::Bind(&QueryContentProtectionTaskTest::ResponseCallback,
170 base::Unretained(this)));
171 task.Run();
172
Dominik Laskowski447274b2019-04-05 22:14:01173 ASSERT_TRUE(response_);
Dominik Laskowskif206ba52019-04-09 19:49:56174 EXPECT_EQ(Status::SUCCESS, response_->status);
Dominik Laskowski447274b2019-04-05 22:14:01175 EXPECT_EQ(DISPLAY_CONNECTION_TYPE_HDMI, response_->connection_mask);
Dominik Laskowskiea9fbb92019-07-23 17:22:40176 EXPECT_EQ(CONTENT_PROTECTION_METHOD_NONE, response_->protection_mask);
dnicoaradc1e3732015-04-22 14:35:37177}
178
Dominik Laskowski447274b2019-04-05 22:14:01179TEST_F(QueryContentProtectionTaskTest, QueryInMirroringMode) {
leon.han687a112b2017-02-23 06:08:09180 std::vector<std::unique_ptr<DisplaySnapshot>> displays;
dnicoaradc1e3732015-04-22 14:35:37181 displays.push_back(CreateDisplaySnapshot(1, DISPLAY_CONNECTION_TYPE_HDMI));
182 displays.push_back(CreateDisplaySnapshot(2, DISPLAY_CONNECTION_TYPE_DVI));
dcheng023d4882015-12-31 04:55:15183 TestDisplayLayoutManager layout_manager(std::move(displays),
Weidong Guoacd64362019-02-26 01:05:04184 MULTIPLE_DISPLAY_STATE_MULTI_MIRROR);
dnicoaradc1e3732015-04-22 14:35:37185
186 QueryContentProtectionTask task(
187 &layout_manager, &display_delegate_, 1,
188 base::Bind(&QueryContentProtectionTaskTest::ResponseCallback,
189 base::Unretained(this)));
190 task.Run();
191
Dominik Laskowski447274b2019-04-05 22:14:01192 ASSERT_TRUE(response_);
Dominik Laskowskif206ba52019-04-09 19:49:56193 EXPECT_EQ(Status::SUCCESS, response_->status);
dnicoaradc1e3732015-04-22 14:35:37194 EXPECT_EQ(static_cast<uint32_t>(DISPLAY_CONNECTION_TYPE_HDMI |
195 DISPLAY_CONNECTION_TYPE_DVI),
Dominik Laskowski447274b2019-04-05 22:14:01196 response_->connection_mask);
Dominik Laskowskiea9fbb92019-07-23 17:22:40197 EXPECT_EQ(CONTENT_PROTECTION_METHOD_NONE, response_->protection_mask);
198}
199
200TEST_F(QueryContentProtectionTaskTest, QueryAnalogDisplay) {
201 std::vector<std::unique_ptr<DisplaySnapshot>> displays;
202 displays.push_back(CreateDisplaySnapshot(1, DISPLAY_CONNECTION_TYPE_VGA));
203 TestDisplayLayoutManager layout_manager(std::move(displays),
204 MULTIPLE_DISPLAY_STATE_SINGLE);
205
206 QueryContentProtectionTask task(
207 &layout_manager, &display_delegate_, 1,
208 base::Bind(&QueryContentProtectionTaskTest::ResponseCallback,
209 base::Unretained(this)));
210 task.Run();
211
212 ASSERT_TRUE(response_);
213 EXPECT_EQ(Status::SUCCESS, response_->status);
214 EXPECT_EQ(DISPLAY_CONNECTION_TYPE_VGA, response_->connection_mask);
215 EXPECT_EQ(CONTENT_PROTECTION_METHOD_NONE, response_->protection_mask);
216}
217
218TEST_F(QueryContentProtectionTaskTest, QueryAnalogDisplayMirror) {
219 std::vector<std::unique_ptr<DisplaySnapshot>> displays;
220 displays.push_back(CreateDisplaySnapshot(1, DISPLAY_CONNECTION_TYPE_HDMI));
221 displays.push_back(CreateDisplaySnapshot(2, DISPLAY_CONNECTION_TYPE_VGA));
222 TestDisplayLayoutManager layout_manager(std::move(displays),
223 MULTIPLE_DISPLAY_STATE_MULTI_MIRROR);
224
225 display_delegate_.set_hdcp_state(HDCP_STATE_ENABLED);
226
227 QueryContentProtectionTask task1(
228 &layout_manager, &display_delegate_, 1,
229 base::Bind(&QueryContentProtectionTaskTest::ResponseCallback,
230 base::Unretained(this)));
231 task1.Run();
232
233 ASSERT_TRUE(response_);
234 EXPECT_EQ(Status::SUCCESS, response_->status);
235 EXPECT_EQ(static_cast<uint32_t>(DISPLAY_CONNECTION_TYPE_HDMI |
236 DISPLAY_CONNECTION_TYPE_VGA),
237 response_->connection_mask);
238 EXPECT_EQ(CONTENT_PROTECTION_METHOD_NONE, response_->protection_mask);
239
240 response_.reset();
241
242 QueryContentProtectionTask task2(
243 &layout_manager, &display_delegate_, 2,
244 base::Bind(&QueryContentProtectionTaskTest::ResponseCallback,
245 base::Unretained(this)));
246 task2.Run();
247
248 ASSERT_TRUE(response_);
249 EXPECT_EQ(Status::SUCCESS, response_->status);
250 EXPECT_EQ(static_cast<uint32_t>(DISPLAY_CONNECTION_TYPE_HDMI |
251 DISPLAY_CONNECTION_TYPE_VGA),
252 response_->connection_mask);
253 EXPECT_EQ(CONTENT_PROTECTION_METHOD_NONE, response_->protection_mask);
dnicoaradc1e3732015-04-22 14:35:37254}
255
256} // namespace test
kylechar7a067ec2017-01-07 01:16:28257} // namespace display