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

Side by Side Diff: chromeos/display/output_configurator_unittest.cc

Issue 22875019: chromeos: Notify observers after display power changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: make NotifyObservers take a success argument Created 7 years, 4 months 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "chromeos/display/output_configurator.h" 5 #include "chromeos/display/output_configurator.h"
6 6
7 #include <cstdarg> 7 #include <cstdarg>
8 #include <map> 8 #include <map>
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 std::vector<OutputConfigurator::OutputSnapshot> outputs_; 185 std::vector<OutputConfigurator::OutputSnapshot> outputs_;
186 186
187 std::string actions_; 187 std::string actions_;
188 188
189 // Return value returned by ConfigureCrtc(). 189 // Return value returned by ConfigureCrtc().
190 bool configure_crtc_result_; 190 bool configure_crtc_result_;
191 191
192 DISALLOW_COPY_AND_ASSIGN(TestDelegate); 192 DISALLOW_COPY_AND_ASSIGN(TestDelegate);
193 }; 193 };
194 194
195 class TestObserver : public OutputConfigurator::Observer {
196 public:
197 explicit TestObserver(OutputConfigurator* configurator)
198 : configurator_(configurator) {
199 Reset();
200 configurator_->AddObserver(this);
201 }
202 ~TestObserver() {
oshima 2013/08/16 16:19:14 virtual
Daniel Erat 2013/08/16 16:42:16 Done.
203 configurator_->RemoveObserver(this);
204 }
205
206 int num_changes() const { return num_changes_; }
207 int num_failures() const { return num_failures_; }
208 std::vector<OutputConfigurator::OutputSnapshot> latest_outputs() const {
209 return latest_outputs_;
210 }
211 OutputState latest_failed_state() const { return latest_failed_state_; }
212
213 void Reset() {
214 num_changes_ = 0;
215 num_failures_ = 0;
216 latest_outputs_.clear();
217 latest_failed_state_ = STATE_INVALID;
218 }
219
220 // OutputConfigurator::Observer overrides:
221 virtual void OnDisplayModeChanged(
222 const std::vector<OutputConfigurator::OutputSnapshot>& outputs) OVERRIDE {
223 num_changes_++;
224 latest_outputs_ = outputs;
225 }
226
227 virtual void OnDisplayModeChangeFailed(OutputState failed_new_state) {
oshima 2013/08/16 16:19:14 OVERRIDE
Daniel Erat 2013/08/16 16:42:16 Done.
228 num_failures_++;
229 latest_failed_state_ = failed_new_state;
230 }
231
232 private:
233 OutputConfigurator* configurator_; // Not owned.
234
235 // Number of times that OnDisplayMode*() has been called.
236 int num_changes_;
237 int num_failures_;
238
239 // Parameters most recently passed to OnDisplayMode*().
240 std::vector<OutputConfigurator::OutputSnapshot> latest_outputs_;
241 OutputState latest_failed_state_;
242
243 DISALLOW_COPY_AND_ASSIGN(TestObserver);
244 };
245
195 class TestStateController : public OutputConfigurator::StateController { 246 class TestStateController : public OutputConfigurator::StateController {
196 public: 247 public:
197 TestStateController() : state_(STATE_DUAL_EXTENDED) {} 248 TestStateController() : state_(STATE_DUAL_EXTENDED) {}
198 virtual ~TestStateController() {} 249 virtual ~TestStateController() {}
199 250
200 void set_state(OutputState state) { state_ = state; } 251 void set_state(OutputState state) { state_ = state; }
201 252
202 // OutputConfigurator::StateController overrides: 253 // OutputConfigurator::StateController overrides:
203 virtual OutputState GetStateForDisplayIds( 254 virtual OutputState GetStateForDisplayIds(
204 const std::vector<int64>& outputs) const OVERRIDE { return state_; } 255 const std::vector<int64>& outputs) const OVERRIDE { return state_; }
(...skipping 26 matching lines...) Expand all
231 282
232 private: 283 private:
233 bool software_mirroring_enabled_; 284 bool software_mirroring_enabled_;
234 285
235 DISALLOW_COPY_AND_ASSIGN(TestMirroringController); 286 DISALLOW_COPY_AND_ASSIGN(TestMirroringController);
236 }; 287 };
237 288
238 class OutputConfiguratorTest : public testing::Test { 289 class OutputConfiguratorTest : public testing::Test {
239 public: 290 public:
240 OutputConfiguratorTest() 291 OutputConfiguratorTest()
241 : test_api_(&configurator_, TestDelegate::kXRandREventBase) {} 292 : observer_(&configurator_),
293 test_api_(&configurator_, TestDelegate::kXRandREventBase) {}
242 virtual ~OutputConfiguratorTest() {} 294 virtual ~OutputConfiguratorTest() {}
243 295
244 virtual void SetUp() OVERRIDE { 296 virtual void SetUp() OVERRIDE {
245 delegate_ = new TestDelegate(); 297 delegate_ = new TestDelegate();
246 configurator_.SetDelegateForTesting( 298 configurator_.SetDelegateForTesting(
247 scoped_ptr<OutputConfigurator::Delegate>(delegate_)); 299 scoped_ptr<OutputConfigurator::Delegate>(delegate_));
248 configurator_.set_state_controller(&state_controller_); 300 configurator_.set_state_controller(&state_controller_);
249 configurator_.set_mirroring_controller(&mirroring_controller_); 301 configurator_.set_mirroring_controller(&mirroring_controller_);
250 302
251 OutputConfigurator::ModeInfo small_mode_info; 303 OutputConfigurator::ModeInfo small_mode_info;
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, 392 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId,
341 outputs_[0].output).c_str(), 393 outputs_[0].output).c_str(),
342 kForceDPMS, kUngrab, kProjectingOff, NULL), 394 kForceDPMS, kUngrab, kProjectingOff, NULL),
343 delegate_->GetActionsAndClear()); 395 delegate_->GetActionsAndClear());
344 } 396 }
345 397
346 base::MessageLoop message_loop_; 398 base::MessageLoop message_loop_;
347 TestStateController state_controller_; 399 TestStateController state_controller_;
348 TestMirroringController mirroring_controller_; 400 TestMirroringController mirroring_controller_;
349 OutputConfigurator configurator_; 401 OutputConfigurator configurator_;
402 TestObserver observer_;
350 TestDelegate* delegate_; // not owned 403 TestDelegate* delegate_; // not owned
351 OutputConfigurator::TestApi test_api_; 404 OutputConfigurator::TestApi test_api_;
352 405
353 OutputConfigurator::OutputSnapshot outputs_[2]; 406 OutputConfigurator::OutputSnapshot outputs_[2];
354 407
355 private: 408 private:
356 DISALLOW_COPY_AND_ASSIGN(OutputConfiguratorTest); 409 DISALLOW_COPY_AND_ASSIGN(OutputConfiguratorTest);
357 }; 410 };
358 411
359 } // namespace 412 } // namespace
360 413
361 TEST_F(OutputConfiguratorTest, ConnectSecondOutput) { 414 TEST_F(OutputConfiguratorTest, ConnectSecondOutput) {
362 InitWithSingleOutput(); 415 InitWithSingleOutput();
363 416
364 // Connect a second output and check that the configurator enters 417 // Connect a second output and check that the configurator enters
365 // extended mode. 418 // extended mode.
419 observer_.Reset();
366 state_controller_.set_state(STATE_DUAL_EXTENDED); 420 state_controller_.set_state(STATE_DUAL_EXTENDED);
367 UpdateOutputs(2, true); 421 UpdateOutputs(2, true);
368 const int kDualHeight = 422 const int kDualHeight =
369 kSmallModeHeight + OutputConfigurator::kVerticalGap + kBigModeHeight; 423 kSmallModeHeight + OutputConfigurator::kVerticalGap + kBigModeHeight;
370 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab, 424 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab,
371 GetFramebufferAction(kBigModeWidth, kDualHeight, 425 GetFramebufferAction(kBigModeWidth, kDualHeight,
372 outputs_[0].crtc, outputs_[1].crtc).c_str(), 426 outputs_[0].crtc, outputs_[1].crtc).c_str(),
373 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, 427 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId,
374 outputs_[0].output).c_str(), 428 outputs_[0].output).c_str(),
375 GetCrtcAction(outputs_[1].crtc, 0, 429 GetCrtcAction(outputs_[1].crtc, 0,
376 kSmallModeHeight + OutputConfigurator::kVerticalGap, 430 kSmallModeHeight + OutputConfigurator::kVerticalGap,
377 kBigModeId, outputs_[1].output).c_str(), 431 kBigModeId, outputs_[1].output).c_str(),
378 kUngrab, kProjectingOn, NULL), 432 kUngrab, kProjectingOn, NULL),
379 delegate_->GetActionsAndClear()); 433 delegate_->GetActionsAndClear());
380 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); 434 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled());
435 EXPECT_EQ(1, observer_.num_changes());
381 436
437 observer_.Reset();
382 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR)); 438 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR));
383 EXPECT_EQ(JoinActions(kGrab, 439 EXPECT_EQ(JoinActions(kGrab,
384 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight, 440 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight,
385 outputs_[0].crtc, outputs_[1].crtc).c_str(), 441 outputs_[0].crtc, outputs_[1].crtc).c_str(),
386 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, 442 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId,
387 outputs_[0].output).c_str(), 443 outputs_[0].output).c_str(),
388 GetCrtcAction(outputs_[1].crtc, 0, 0, kSmallModeId, 444 GetCrtcAction(outputs_[1].crtc, 0, 0, kSmallModeId,
389 outputs_[1].output).c_str(), 445 outputs_[1].output).c_str(),
390 kUngrab, NULL), 446 kUngrab, NULL),
391 delegate_->GetActionsAndClear()); 447 delegate_->GetActionsAndClear());
392 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); 448 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled());
449 EXPECT_EQ(1, observer_.num_changes());
393 450
394 // Disconnect the second output. 451 // Disconnect the second output.
452 observer_.Reset();
395 UpdateOutputs(1, true); 453 UpdateOutputs(1, true);
396 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab, 454 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab,
397 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight, 455 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight,
398 outputs_[0].crtc, 0).c_str(), 456 outputs_[0].crtc, 0).c_str(),
399 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, 457 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId,
400 outputs_[0].output).c_str(), 458 outputs_[0].output).c_str(),
401 kUngrab, kProjectingOff, NULL), 459 kUngrab, kProjectingOff, NULL),
402 delegate_->GetActionsAndClear()); 460 delegate_->GetActionsAndClear());
403 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); 461 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled());
462 EXPECT_EQ(1, observer_.num_changes());
404 463
405 // Software Mirroring 464 // Software Mirroring
406 DisableNativeMirroring(); 465 DisableNativeMirroring();
407 state_controller_.set_state(STATE_DUAL_EXTENDED); 466 state_controller_.set_state(STATE_DUAL_EXTENDED);
408 UpdateOutputs(2, true); 467 UpdateOutputs(2, true);
409 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab, 468 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab,
410 GetFramebufferAction(kBigModeWidth, kDualHeight, 469 GetFramebufferAction(kBigModeWidth, kDualHeight,
411 outputs_[0].crtc, outputs_[1].crtc).c_str(), 470 outputs_[0].crtc, outputs_[1].crtc).c_str(),
412 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, 471 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId,
413 outputs_[0].output).c_str(), 472 outputs_[0].output).c_str(),
414 GetCrtcAction(outputs_[1].crtc, 0, 473 GetCrtcAction(outputs_[1].crtc, 0,
415 kSmallModeHeight + OutputConfigurator::kVerticalGap, 474 kSmallModeHeight + OutputConfigurator::kVerticalGap,
416 kBigModeId, outputs_[1].output).c_str(), 475 kBigModeId, outputs_[1].output).c_str(),
417 kUngrab, kProjectingOn, NULL), 476 kUngrab, kProjectingOn, NULL),
418 delegate_->GetActionsAndClear()); 477 delegate_->GetActionsAndClear());
419 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); 478 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled());
420 479
480 observer_.Reset();
481 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR));
482 EXPECT_EQ(JoinActions(kGrab, kUngrab, NULL), delegate_->GetActionsAndClear());
483 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state());
484 EXPECT_TRUE(mirroring_controller_.software_mirroring_enabled());
485 EXPECT_EQ(1, observer_.num_changes());
486
487 // Setting STATE_DUAL_MIRROR should try to reconfigure.
488 observer_.Reset();
489 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_EXTENDED));
490 EXPECT_EQ(JoinActions(NULL), delegate_->GetActionsAndClear());
491 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled());
492 EXPECT_EQ(1, observer_.num_changes());
493
494 // Set back to software mirror mode.
495 observer_.Reset();
421 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR)); 496 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR));
422 EXPECT_EQ(JoinActions(kGrab, kUngrab, NULL), 497 EXPECT_EQ(JoinActions(kGrab, kUngrab, NULL),
423 delegate_->GetActionsAndClear()); 498 delegate_->GetActionsAndClear());
424 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state()); 499 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state());
425 EXPECT_TRUE(mirroring_controller_.software_mirroring_enabled()); 500 EXPECT_TRUE(mirroring_controller_.software_mirroring_enabled());
426 501 EXPECT_EQ(1, observer_.num_changes());
427 // Setting STATE_DUAL_MIRROR should try to reconfigure
428 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_EXTENDED));
429 EXPECT_EQ(JoinActions(NULL), delegate_->GetActionsAndClear());
430 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled());
431
432 // Set back to software mirror mode.
433 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR));
434 EXPECT_EQ(JoinActions(kGrab, kUngrab, NULL),
435 delegate_->GetActionsAndClear());
436 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state());
437 EXPECT_TRUE(mirroring_controller_.software_mirroring_enabled());
438 502
439 // Disconnect the second output. 503 // Disconnect the second output.
504 observer_.Reset();
440 UpdateOutputs(1, true); 505 UpdateOutputs(1, true);
441 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab, 506 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab,
442 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight, 507 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight,
443 outputs_[0].crtc, 0).c_str(), 508 outputs_[0].crtc, 0).c_str(),
444 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, 509 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId,
445 outputs_[0].output).c_str(), 510 outputs_[0].output).c_str(),
446 kUngrab, kProjectingOff, NULL), 511 kUngrab, kProjectingOff, NULL),
447 delegate_->GetActionsAndClear()); 512 delegate_->GetActionsAndClear());
448 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); 513 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled());
514 EXPECT_EQ(1, observer_.num_changes());
449 } 515 }
450 516
451 TEST_F(OutputConfiguratorTest, SetDisplayPower) { 517 TEST_F(OutputConfiguratorTest, SetDisplayPower) {
452 InitWithSingleOutput(); 518 InitWithSingleOutput();
453 519
454 state_controller_.set_state(STATE_DUAL_MIRROR); 520 state_controller_.set_state(STATE_DUAL_MIRROR);
521 observer_.Reset();
455 UpdateOutputs(2, true); 522 UpdateOutputs(2, true);
456 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab, 523 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab,
457 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight, 524 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight,
458 outputs_[0].crtc, outputs_[1].crtc).c_str(), 525 outputs_[0].crtc, outputs_[1].crtc).c_str(),
459 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, 526 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId,
460 outputs_[0].output).c_str(), 527 outputs_[0].output).c_str(),
461 GetCrtcAction(outputs_[1].crtc, 0, 0, kSmallModeId, 528 GetCrtcAction(outputs_[1].crtc, 0, 0, kSmallModeId,
462 outputs_[1].output).c_str(), 529 outputs_[1].output).c_str(),
463 kUngrab, kProjectingOn, NULL), 530 kUngrab, kProjectingOn, NULL),
464 delegate_->GetActionsAndClear()); 531 delegate_->GetActionsAndClear());
465 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); 532 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled());
533 EXPECT_EQ(1, observer_.num_changes());
466 534
467 // Turning off the internal display should switch the external display to 535 // Turning off the internal display should switch the external display to
468 // its native mode. 536 // its native mode.
537 observer_.Reset();
469 configurator_.SetDisplayPower(DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON, 538 configurator_.SetDisplayPower(DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON,
470 OutputConfigurator::kSetDisplayPowerNoFlags); 539 OutputConfigurator::kSetDisplayPowerNoFlags);
471 EXPECT_EQ(JoinActions(kGrab, 540 EXPECT_EQ(JoinActions(kGrab,
472 GetFramebufferAction(kBigModeWidth, kBigModeHeight, 541 GetFramebufferAction(kBigModeWidth, kBigModeHeight,
473 outputs_[0].crtc, outputs_[1].crtc).c_str(), 542 outputs_[0].crtc, outputs_[1].crtc).c_str(),
474 GetCrtcAction(outputs_[0].crtc, 0, 0, 0, 543 GetCrtcAction(outputs_[0].crtc, 0, 0, 0,
475 outputs_[0].output).c_str(), 544 outputs_[0].output).c_str(),
476 GetCrtcAction(outputs_[1].crtc, 0, 0, kBigModeId, 545 GetCrtcAction(outputs_[1].crtc, 0, 0, kBigModeId,
477 outputs_[1].output).c_str(), 546 outputs_[1].output).c_str(),
478 kForceDPMS, kUngrab, NULL), 547 kForceDPMS, kUngrab, NULL),
479 delegate_->GetActionsAndClear()); 548 delegate_->GetActionsAndClear());
480 EXPECT_EQ(STATE_SINGLE, configurator_.output_state()); 549 EXPECT_EQ(STATE_SINGLE, configurator_.output_state());
550 EXPECT_EQ(1, observer_.num_changes());
481 551
482 // When all displays are turned off, the framebuffer should switch back 552 // When all displays are turned off, the framebuffer should switch back
483 // to the mirrored size. 553 // to the mirrored size.
554 observer_.Reset();
484 configurator_.SetDisplayPower(DISPLAY_POWER_ALL_OFF, 555 configurator_.SetDisplayPower(DISPLAY_POWER_ALL_OFF,
485 OutputConfigurator::kSetDisplayPowerNoFlags); 556 OutputConfigurator::kSetDisplayPowerNoFlags);
486 EXPECT_EQ(JoinActions(kGrab, 557 EXPECT_EQ(JoinActions(kGrab,
487 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight, 558 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight,
488 outputs_[0].crtc, outputs_[1].crtc).c_str(), 559 outputs_[0].crtc, outputs_[1].crtc).c_str(),
489 GetCrtcAction(outputs_[0].crtc, 0, 0, 0, 560 GetCrtcAction(outputs_[0].crtc, 0, 0, 0,
490 outputs_[0].output).c_str(), 561 outputs_[0].output).c_str(),
491 GetCrtcAction(outputs_[1].crtc, 0, 0, 0, 562 GetCrtcAction(outputs_[1].crtc, 0, 0, 0,
492 outputs_[1].output).c_str(), 563 outputs_[1].output).c_str(),
493 kUngrab, NULL), 564 kUngrab, NULL),
494 delegate_->GetActionsAndClear()); 565 delegate_->GetActionsAndClear());
495 EXPECT_EQ(STATE_DUAL_MIRROR, configurator_.output_state()); 566 EXPECT_EQ(STATE_DUAL_MIRROR, configurator_.output_state());
496 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); 567 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled());
568 EXPECT_EQ(1, observer_.num_changes());
497 569
498 // Turn all displays on and check that mirroring is still used. 570 // Turn all displays on and check that mirroring is still used.
571 observer_.Reset();
499 configurator_.SetDisplayPower(DISPLAY_POWER_ALL_ON, 572 configurator_.SetDisplayPower(DISPLAY_POWER_ALL_ON,
500 OutputConfigurator::kSetDisplayPowerNoFlags); 573 OutputConfigurator::kSetDisplayPowerNoFlags);
501 EXPECT_EQ(JoinActions(kGrab, 574 EXPECT_EQ(JoinActions(kGrab,
502 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight, 575 GetFramebufferAction(kSmallModeWidth, kSmallModeHeight,
503 outputs_[0].crtc, outputs_[1].crtc).c_str(), 576 outputs_[0].crtc, outputs_[1].crtc).c_str(),
504 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, 577 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId,
505 outputs_[0].output).c_str(), 578 outputs_[0].output).c_str(),
506 GetCrtcAction(outputs_[1].crtc, 0, 0, kSmallModeId, 579 GetCrtcAction(outputs_[1].crtc, 0, 0, kSmallModeId,
507 outputs_[1].output).c_str(), 580 outputs_[1].output).c_str(),
508 kForceDPMS, kUngrab, NULL), 581 kForceDPMS, kUngrab, NULL),
509 delegate_->GetActionsAndClear()); 582 delegate_->GetActionsAndClear());
510 EXPECT_EQ(STATE_DUAL_MIRROR, configurator_.output_state()); 583 EXPECT_EQ(STATE_DUAL_MIRROR, configurator_.output_state());
511 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); 584 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled());
585 EXPECT_EQ(1, observer_.num_changes());
512 586
513 // Software Mirroring 587 // Software Mirroring
514 DisableNativeMirroring(); 588 DisableNativeMirroring();
515 state_controller_.set_state(STATE_DUAL_MIRROR); 589 state_controller_.set_state(STATE_DUAL_MIRROR);
590 observer_.Reset();
516 UpdateOutputs(2, true); 591 UpdateOutputs(2, true);
517 const int kDualHeight = 592 const int kDualHeight =
518 kSmallModeHeight + OutputConfigurator::kVerticalGap + kBigModeHeight; 593 kSmallModeHeight + OutputConfigurator::kVerticalGap + kBigModeHeight;
519 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab, 594 EXPECT_EQ(JoinActions(kUpdateXRandR, kGrab,
520 GetFramebufferAction(kBigModeWidth, kDualHeight, 595 GetFramebufferAction(kBigModeWidth, kDualHeight,
521 outputs_[0].crtc, outputs_[1].crtc).c_str(), 596 outputs_[0].crtc, outputs_[1].crtc).c_str(),
522 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, 597 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId,
523 outputs_[0].output).c_str(), 598 outputs_[0].output).c_str(),
524 GetCrtcAction(outputs_[1].crtc, 0, 599 GetCrtcAction(outputs_[1].crtc, 0,
525 kSmallModeHeight + OutputConfigurator::kVerticalGap, 600 kSmallModeHeight + OutputConfigurator::kVerticalGap,
526 kBigModeId, outputs_[1].output).c_str(), 601 kBigModeId, outputs_[1].output).c_str(),
527 kUngrab, kProjectingOn, NULL), 602 kUngrab, kProjectingOn, NULL),
528 delegate_->GetActionsAndClear()); 603 delegate_->GetActionsAndClear());
529 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state()); 604 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state());
530 EXPECT_TRUE(mirroring_controller_.software_mirroring_enabled()); 605 EXPECT_TRUE(mirroring_controller_.software_mirroring_enabled());
606 EXPECT_EQ(1, observer_.num_changes());
531 607
532 // Turning off the internal display should switch the external display to 608 // Turning off the internal display should switch the external display to
533 // its native mode. 609 // its native mode.
610 observer_.Reset();
534 configurator_.SetDisplayPower(DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON, 611 configurator_.SetDisplayPower(DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON,
535 OutputConfigurator::kSetDisplayPowerNoFlags); 612 OutputConfigurator::kSetDisplayPowerNoFlags);
536 EXPECT_EQ(JoinActions(kGrab, 613 EXPECT_EQ(JoinActions(kGrab,
537 GetFramebufferAction(kBigModeWidth, kBigModeHeight, 614 GetFramebufferAction(kBigModeWidth, kBigModeHeight,
538 outputs_[0].crtc, outputs_[1].crtc).c_str(), 615 outputs_[0].crtc, outputs_[1].crtc).c_str(),
539 GetCrtcAction(outputs_[0].crtc, 0, 0, 0, 616 GetCrtcAction(outputs_[0].crtc, 0, 0, 0,
540 outputs_[0].output).c_str(), 617 outputs_[0].output).c_str(),
541 GetCrtcAction(outputs_[1].crtc, 0, 0, kBigModeId, 618 GetCrtcAction(outputs_[1].crtc, 0, 0, kBigModeId,
542 outputs_[1].output).c_str(), 619 outputs_[1].output).c_str(),
543 kForceDPMS, kUngrab, NULL), 620 kForceDPMS, kUngrab, NULL),
544 delegate_->GetActionsAndClear()); 621 delegate_->GetActionsAndClear());
545 EXPECT_EQ(STATE_SINGLE, configurator_.output_state()); 622 EXPECT_EQ(STATE_SINGLE, configurator_.output_state());
546 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled()); 623 EXPECT_FALSE(mirroring_controller_.software_mirroring_enabled());
624 EXPECT_EQ(1, observer_.num_changes());
547 625
548 // When all displays are turned off, the framebuffer should switch back 626 // When all displays are turned off, the framebuffer should switch back
549 // to the extended + software mirroring. 627 // to the extended + software mirroring.
628 observer_.Reset();
550 configurator_.SetDisplayPower(DISPLAY_POWER_ALL_OFF, 629 configurator_.SetDisplayPower(DISPLAY_POWER_ALL_OFF,
551 OutputConfigurator::kSetDisplayPowerNoFlags); 630 OutputConfigurator::kSetDisplayPowerNoFlags);
552 EXPECT_EQ(JoinActions(kGrab, 631 EXPECT_EQ(JoinActions(kGrab,
553 GetFramebufferAction(kBigModeWidth, kDualHeight, 632 GetFramebufferAction(kBigModeWidth, kDualHeight,
554 outputs_[0].crtc, outputs_[1].crtc).c_str(), 633 outputs_[0].crtc, outputs_[1].crtc).c_str(),
555 GetCrtcAction(outputs_[0].crtc, 0, 0, 0, 634 GetCrtcAction(outputs_[0].crtc, 0, 0, 0,
556 outputs_[0].output).c_str(), 635 outputs_[0].output).c_str(),
557 GetCrtcAction(outputs_[1].crtc, 0, 636 GetCrtcAction(outputs_[1].crtc, 0,
558 kSmallModeHeight + OutputConfigurator::kVerticalGap, 637 kSmallModeHeight + OutputConfigurator::kVerticalGap,
559 0, outputs_[1].output).c_str(), 638 0, outputs_[1].output).c_str(),
560 kUngrab, NULL), 639 kUngrab, NULL),
561 delegate_->GetActionsAndClear()); 640 delegate_->GetActionsAndClear());
562 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state()); 641 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state());
563 EXPECT_TRUE(mirroring_controller_.software_mirroring_enabled()); 642 EXPECT_TRUE(mirroring_controller_.software_mirroring_enabled());
643 EXPECT_EQ(1, observer_.num_changes());
564 644
565 // Turn all displays on and check that mirroring is still used. 645 // Turn all displays on and check that mirroring is still used.
646 observer_.Reset();
566 configurator_.SetDisplayPower(DISPLAY_POWER_ALL_ON, 647 configurator_.SetDisplayPower(DISPLAY_POWER_ALL_ON,
567 OutputConfigurator::kSetDisplayPowerNoFlags); 648 OutputConfigurator::kSetDisplayPowerNoFlags);
568 EXPECT_EQ(JoinActions(kGrab, 649 EXPECT_EQ(JoinActions(kGrab,
569 GetFramebufferAction(kBigModeWidth, kDualHeight, 650 GetFramebufferAction(kBigModeWidth, kDualHeight,
570 outputs_[0].crtc, outputs_[1].crtc).c_str(), 651 outputs_[0].crtc, outputs_[1].crtc).c_str(),
571 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, 652 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId,
572 outputs_[0].output).c_str(), 653 outputs_[0].output).c_str(),
573 GetCrtcAction(outputs_[1].crtc, 0, 654 GetCrtcAction(outputs_[1].crtc, 0,
574 kSmallModeHeight + OutputConfigurator::kVerticalGap, 655 kSmallModeHeight + OutputConfigurator::kVerticalGap,
575 kBigModeId, outputs_[1].output).c_str(), 656 kBigModeId, outputs_[1].output).c_str(),
576 kForceDPMS, kUngrab, NULL), 657 kForceDPMS, kUngrab, NULL),
577 delegate_->GetActionsAndClear()); 658 delegate_->GetActionsAndClear());
578 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state()); 659 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state());
579 EXPECT_TRUE(mirroring_controller_.software_mirroring_enabled()); 660 EXPECT_TRUE(mirroring_controller_.software_mirroring_enabled());
580 661 EXPECT_EQ(1, observer_.num_changes());
581 } 662 }
582 663
583 TEST_F(OutputConfiguratorTest, SuspendAndResume) { 664 TEST_F(OutputConfiguratorTest, SuspendAndResume) {
584 InitWithSingleOutput(); 665 InitWithSingleOutput();
585 666
586 // No preparation is needed before suspending when the display is already 667 // No preparation is needed before suspending when the display is already
587 // on. The configurator should still reprobe on resume in case a display 668 // on. The configurator should still reprobe on resume in case a display
588 // was connected while suspended. 669 // was connected while suspended.
589 configurator_.SuspendDisplays(); 670 configurator_.SuspendDisplays();
590 EXPECT_EQ(kNoActions, delegate_->GetActionsAndClear()); 671 EXPECT_EQ(kNoActions, delegate_->GetActionsAndClear());
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
719 outputs_[1].output).c_str(), 800 outputs_[1].output).c_str(),
720 kForceDPMS, kUngrab, kProjectingOn, NULL), 801 kForceDPMS, kUngrab, kProjectingOn, NULL),
721 delegate_->GetActionsAndClear()); 802 delegate_->GetActionsAndClear());
722 } 803 }
723 804
724 TEST_F(OutputConfiguratorTest, InvalidOutputStates) { 805 TEST_F(OutputConfiguratorTest, InvalidOutputStates) {
725 UpdateOutputs(0, false); 806 UpdateOutputs(0, false);
726 EXPECT_EQ(kNoActions, delegate_->GetActionsAndClear()); 807 EXPECT_EQ(kNoActions, delegate_->GetActionsAndClear());
727 configurator_.Init(false); 808 configurator_.Init(false);
728 configurator_.Start(0); 809 configurator_.Start(0);
810 observer_.Reset();
729 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_HEADLESS)); 811 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_HEADLESS));
730 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_SINGLE)); 812 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_SINGLE));
731 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR)); 813 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR));
732 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_DUAL_EXTENDED)); 814 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_DUAL_EXTENDED));
815 EXPECT_EQ(1, observer_.num_changes());
816 EXPECT_EQ(3, observer_.num_failures());
733 817
734 UpdateOutputs(1, true); 818 UpdateOutputs(1, true);
819 observer_.Reset();
735 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_HEADLESS)); 820 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_HEADLESS));
736 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_SINGLE)); 821 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_SINGLE));
737 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR)); 822 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR));
738 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_DUAL_EXTENDED)); 823 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_DUAL_EXTENDED));
824 EXPECT_EQ(1, observer_.num_changes());
825 EXPECT_EQ(3, observer_.num_failures());
739 826
740 state_controller_.set_state(STATE_DUAL_EXTENDED); 827 state_controller_.set_state(STATE_DUAL_EXTENDED);
741 UpdateOutputs(2, true); 828 UpdateOutputs(2, true);
829 observer_.Reset();
742 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_HEADLESS)); 830 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_HEADLESS));
743 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_SINGLE)); 831 EXPECT_FALSE(configurator_.SetDisplayMode(STATE_SINGLE));
744 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR)); 832 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_MIRROR));
745 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_EXTENDED)); 833 EXPECT_TRUE(configurator_.SetDisplayMode(STATE_DUAL_EXTENDED));
834 EXPECT_EQ(2, observer_.num_changes());
835 EXPECT_EQ(2, observer_.num_failures());
746 } 836 }
747 837
748 TEST_F(OutputConfiguratorTest, GetOutputStateForDisplaysWithoutId) { 838 TEST_F(OutputConfiguratorTest, GetOutputStateForDisplaysWithoutId) {
749 outputs_[0].has_display_id = false; 839 outputs_[0].has_display_id = false;
750 UpdateOutputs(2, false); 840 UpdateOutputs(2, false);
751 configurator_.Init(false); 841 configurator_.Init(false);
752 state_controller_.set_state(STATE_DUAL_MIRROR); 842 state_controller_.set_state(STATE_DUAL_MIRROR);
753 configurator_.Start(0); 843 configurator_.Start(0);
754 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state()); 844 EXPECT_EQ(STATE_DUAL_EXTENDED, configurator_.output_state());
755 } 845 }
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
853 outputs_[0].crtc, outputs_[1].crtc).c_str(), 943 outputs_[0].crtc, outputs_[1].crtc).c_str(),
854 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId, 944 GetCrtcAction(outputs_[0].crtc, 0, 0, kSmallModeId,
855 outputs_[0].output).c_str(), 945 outputs_[0].output).c_str(),
856 GetCrtcAction(outputs_[1].crtc, 0, 0, kSmallModeId, 946 GetCrtcAction(outputs_[1].crtc, 0, 0, kSmallModeId,
857 outputs_[1].output).c_str(), 947 outputs_[1].output).c_str(),
858 kUngrab, kProjectingOn, NULL), 948 kUngrab, kProjectingOn, NULL),
859 delegate_->GetActionsAndClear()); 949 delegate_->GetActionsAndClear());
860 } 950 }
861 951
862 } // namespace chromeos 952 } // namespace chromeos
OLDNEW
« chromeos/display/output_configurator.cc ('K') | « chromeos/display/output_configurator.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698