Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(121)

Side by Side Diff: ui/display/chromeos/display_configurator_unittest.cc

Issue 1456623002: Add support for virtual displays (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/display/chromeos/display_configurator.h" 5 #include "ui/display/chromeos/display_configurator.h"
6 6
7 #include "base/memory/scoped_vector.h" 7 #include "base/memory/scoped_vector.h"
8 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
9 #include "testing/gtest/include/gtest/gtest.h" 9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "ui/display/chromeos/test/action_logger_util.h" 10 #include "ui/display/chromeos/test/action_logger_util.h"
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 bool SoftwareMirroringEnabled() const override { 105 bool SoftwareMirroringEnabled() const override {
106 return software_mirroring_enabled_; 106 return software_mirroring_enabled_;
107 } 107 }
108 108
109 private: 109 private:
110 bool software_mirroring_enabled_; 110 bool software_mirroring_enabled_;
111 111
112 DISALLOW_COPY_AND_ASSIGN(TestMirroringController); 112 DISALLOW_COPY_AND_ASSIGN(TestMirroringController);
113 }; 113 };
114 114
115 } // namespace
116
115 class DisplayConfiguratorTest : public testing::Test { 117 class DisplayConfiguratorTest : public testing::Test {
116 public: 118 public:
117 enum CallbackResult { 119 enum CallbackResult {
118 CALLBACK_FAILURE, 120 CALLBACK_FAILURE,
119 CALLBACK_SUCCESS, 121 CALLBACK_SUCCESS,
120 CALLBACK_NOT_CALLED, 122 CALLBACK_NOT_CALLED,
121 }; 123 };
122 124
123 DisplayConfiguratorTest() 125 DisplayConfiguratorTest()
124 : small_mode_(gfx::Size(1366, 768), false, 60.0f), 126 : small_mode_(gfx::Size(1366, 768), false, 60.0f),
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 254
253 TestDisplaySnapshot outputs_[2]; 255 TestDisplaySnapshot outputs_[2];
254 256
255 CallbackResult callback_result_; 257 CallbackResult callback_result_;
256 CallbackResult display_control_result_; 258 CallbackResult display_control_result_;
257 259
258 private: 260 private:
259 DISALLOW_COPY_AND_ASSIGN(DisplayConfiguratorTest); 261 DISALLOW_COPY_AND_ASSIGN(DisplayConfiguratorTest);
260 }; 262 };
261 263
262 } // namespace
263
264 TEST_F(DisplayConfiguratorTest, FindDisplayModeMatchingSize) { 264 TEST_F(DisplayConfiguratorTest, FindDisplayModeMatchingSize) {
265 ScopedVector<const DisplayMode> modes; 265 ScopedVector<const DisplayMode> modes;
266 266
267 // Fields are width, height, interlaced, refresh rate. 267 // Fields are width, height, interlaced, refresh rate.
268 modes.push_back(new DisplayMode(gfx::Size(1920, 1200), false, 60.0)); 268 modes.push_back(new DisplayMode(gfx::Size(1920, 1200), false, 60.0));
269 DisplayMode* native_mode = 269 DisplayMode* native_mode =
270 new DisplayMode(gfx::Size(1920, 1200), false, 50.0); 270 new DisplayMode(gfx::Size(1920, 1200), false, 50.0);
271 modes.push_back(native_mode); 271 modes.push_back(native_mode);
272 // Different rates. 272 // Different rates.
273 modes.push_back(new DisplayMode(gfx::Size(1920, 1080), false, 30.0)); 273 modes.push_back(new DisplayMode(gfx::Size(1920, 1080), false, 30.0));
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 EXPECT_EQ(modes[15], 330 EXPECT_EQ(modes[15],
331 DisplayConfigurator::FindDisplayModeMatchingSize( 331 DisplayConfigurator::FindDisplayModeMatchingSize(
332 output, gfx::Size(320, 200))); 332 output, gfx::Size(320, 200)));
333 333
334 // No mode found. 334 // No mode found.
335 EXPECT_EQ(NULL, 335 EXPECT_EQ(NULL,
336 DisplayConfigurator::FindDisplayModeMatchingSize( 336 DisplayConfigurator::FindDisplayModeMatchingSize(
337 output, gfx::Size(1440, 900))); 337 output, gfx::Size(1440, 900)));
338 } 338 }
339 339
340 TEST_F(DisplayConfiguratorTest, EnableVirtualDisplay) {
341 InitWithSingleOutput();
342
343 observer_.Reset();
344 const DisplayConfigurator::DisplayStateList* cached =
345 &configurator_.cached_displays();
346 ASSERT_EQ(static_cast<size_t>(1), cached->size());
347 EXPECT_EQ(small_mode_.size(), (*cached)[0]->current_mode()->size());
348
349 // Add virtual display.
350 int64_t virtual_display_id =
351 configurator_.AddVirtualDisplay(big_mode_.size());
352 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
353 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED,
354 configurator_.display_state());
355
356 // Virtual should not trigger addition of added crtc but does change FB
357 // height.
358 const int kVirtualHeight = small_mode_.size().height() +
359 DisplayConfigurator::kVerticalGap +
360 big_mode_.size().height();
361 EXPECT_EQ(
362 JoinActions(
363 kGrab, GetFramebufferAction(
364 gfx::Size(big_mode_.size().width(), kVirtualHeight),
365 &outputs_[0], NULL)
366 .c_str(),
367 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
368 kUngrab, NULL),
369 log_->GetActionsAndClear());
370 EXPECT_EQ(1, observer_.num_changes());
371 cached = &configurator_.cached_displays();
372 ASSERT_EQ(static_cast<size_t>(2), cached->size());
373 EXPECT_EQ(small_mode_.size(), (*cached)[0]->current_mode()->size());
374 EXPECT_EQ(big_mode_.size(), (*cached)[1]->current_mode()->size());
375 EXPECT_EQ(virtual_display_id, (*cached)[1]->display_id());
376
377 // Remove virtual display.
378 observer_.Reset();
379 EXPECT_TRUE(configurator_.RemoveVirtualDisplay(virtual_display_id));
380 EXPECT_EQ(
381 JoinActions(
382 kGrab,
383 GetFramebufferAction(small_mode_.size(), &outputs_[0], NULL).c_str(),
384 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
385 kUngrab, NULL),
386 log_->GetActionsAndClear());
387 EXPECT_EQ(1, observer_.num_changes());
388 cached = &configurator_.cached_displays();
389 ASSERT_EQ(static_cast<size_t>(1), cached->size());
390 EXPECT_EQ(small_mode_.size(), (*cached)[0]->current_mode()->size());
391 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_SINGLE, configurator_.display_state());
392 }
393
394 TEST_F(DisplayConfiguratorTest, EnableTwoVirtualDisplays) {
395 InitWithSingleOutput();
396
397 observer_.Reset();
398 const DisplayConfigurator::DisplayStateList* cached =
jdufault 2015/11/17 20:10:21 Any reason this is a pointer? Can we just copy cac
robert.bradford 2015/11/18 12:46:10 Good catch. As you spotted, I must have copied thi
399 &configurator_.cached_displays();
400 ASSERT_EQ(static_cast<size_t>(1), cached->size());
401 EXPECT_EQ(small_mode_.size(), (*cached)[0]->current_mode()->size());
402
403 // Add 1st virtual display.
404 int64_t virtual_display_id_1 =
405 configurator_.AddVirtualDisplay(big_mode_.size());
406 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
407 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED,
408 configurator_.display_state());
409
410 // Virtual should not trigger addition of added crtc but does change FB
411 // height.
412 const int kSingleVirtualHeight = small_mode_.size().height() +
413 DisplayConfigurator::kVerticalGap +
414 big_mode_.size().height();
415 EXPECT_EQ(
416 JoinActions(
417 kGrab, GetFramebufferAction(
418 gfx::Size(big_mode_.size().width(), kSingleVirtualHeight),
419 &outputs_[0], NULL)
420 .c_str(),
421 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
422 kUngrab, NULL),
423 log_->GetActionsAndClear());
424 EXPECT_EQ(1, observer_.num_changes());
425 cached = &configurator_.cached_displays();
jdufault 2015/11/17 20:10:21 If cached remains a pointer/reference, is this nee
robert.bradford 2015/11/18 12:46:10 Acknowledged.
426 ASSERT_EQ(static_cast<size_t>(2), cached->size());
427 EXPECT_EQ(small_mode_.size(), (*cached)[0]->current_mode()->size());
428 EXPECT_EQ(big_mode_.size(), (*cached)[1]->current_mode()->size());
429 EXPECT_EQ(virtual_display_id_1, (*cached)[1]->display_id());
430
431 // Add 2nd virtual display
432 int64_t virtual_display_id_2 =
433 configurator_.AddVirtualDisplay(big_mode_.size());
434 EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
435 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED,
436 configurator_.display_state());
437
438 const int kDualVirtualHeight =
439 small_mode_.size().height() +
440 (DisplayConfigurator::kVerticalGap + big_mode_.size().height()) * 2;
441 EXPECT_EQ(
442 JoinActions(
443 kGrab, GetFramebufferAction(
444 gfx::Size(big_mode_.size().width(), kDualVirtualHeight),
445 &outputs_[0], NULL)
446 .c_str(),
447 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
448 kUngrab, NULL),
449 log_->GetActionsAndClear());
450 EXPECT_EQ(2, observer_.num_changes());
451 cached = &configurator_.cached_displays();
452 ASSERT_EQ(static_cast<size_t>(3), cached->size());
453 EXPECT_EQ(small_mode_.size(), (*cached)[0]->current_mode()->size());
454 EXPECT_EQ(big_mode_.size(), (*cached)[1]->current_mode()->size());
455 EXPECT_EQ(big_mode_.size(), (*cached)[2]->current_mode()->size());
456 EXPECT_EQ(virtual_display_id_1, (*cached)[1]->display_id());
457 EXPECT_EQ(virtual_display_id_2, (*cached)[2]->display_id());
458
459 // Remove 1st virtual display.
460 observer_.Reset();
461 EXPECT_TRUE(configurator_.RemoveVirtualDisplay(virtual_display_id_1));
462 EXPECT_EQ(
463 JoinActions(
464 kGrab, GetFramebufferAction(
465 gfx::Size(big_mode_.size().width(), kSingleVirtualHeight),
466 &outputs_[0], NULL)
467 .c_str(),
468 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
469 kUngrab, NULL),
470 log_->GetActionsAndClear());
471 EXPECT_EQ(1, observer_.num_changes());
472 cached = &configurator_.cached_displays();
473 ASSERT_EQ(static_cast<size_t>(2), cached->size());
474 EXPECT_EQ(small_mode_.size(), (*cached)[0]->current_mode()->size());
475 EXPECT_EQ(big_mode_.size(), (*cached)[1]->current_mode()->size());
476 EXPECT_EQ(virtual_display_id_2, (*cached)[1]->display_id());
477 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED,
478 configurator_.display_state());
479
480 // Remove 2nd virtual display.
481 observer_.Reset();
482 EXPECT_TRUE(configurator_.RemoveVirtualDisplay(virtual_display_id_2));
483 EXPECT_EQ(
484 JoinActions(
485 kGrab,
486 GetFramebufferAction(small_mode_.size(), &outputs_[0], NULL).c_str(),
487 GetCrtcAction(outputs_[0], &small_mode_, gfx::Point(0, 0)).c_str(),
488 kUngrab, NULL),
489 log_->GetActionsAndClear());
490 EXPECT_EQ(1, observer_.num_changes());
491 cached = &configurator_.cached_displays();
492 ASSERT_EQ(static_cast<size_t>(1), cached->size());
493 EXPECT_EQ(small_mode_.size(), (*cached)[0]->current_mode()->size());
494 EXPECT_EQ(MULTIPLE_DISPLAY_STATE_SINGLE, configurator_.display_state());
495 }
496
340 TEST_F(DisplayConfiguratorTest, ConnectSecondOutput) { 497 TEST_F(DisplayConfiguratorTest, ConnectSecondOutput) {
341 InitWithSingleOutput(); 498 InitWithSingleOutput();
342 499
343 // Connect a second output and check that the configurator enters 500 // Connect a second output and check that the configurator enters
344 // extended mode. 501 // extended mode.
345 observer_.Reset(); 502 observer_.Reset();
346 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED); 503 state_controller_.set_state(MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED);
347 UpdateOutputs(2, true); 504 UpdateOutputs(2, true);
348 const int kDualHeight = small_mode_.size().height() + 505 const int kDualHeight = small_mode_.size().height() +
349 DisplayConfigurator::kVerticalGap + 506 DisplayConfigurator::kVerticalGap +
(...skipping 1114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1464 GetFramebufferAction(small_mode_.size(), &outputs_[0], 1621 GetFramebufferAction(small_mode_.size(), &outputs_[0],
1465 nullptr).c_str(), 1622 nullptr).c_str(),
1466 GetCrtcAction(outputs_[0], &small_mode_, 1623 GetCrtcAction(outputs_[0], &small_mode_,
1467 gfx::Point(0, 0)).c_str(), 1624 gfx::Point(0, 0)).c_str(),
1468 kUngrab, NULL), 1625 kUngrab, NULL),
1469 log_->GetActionsAndClear()); 1626 log_->GetActionsAndClear());
1470 } 1627 }
1471 1628
1472 } // namespace test 1629 } // namespace test
1473 } // namespace ui 1630 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698