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

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

Powered by Google App Engine
This is Rietveld 408576698