OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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 "config.h" | 5 #include "config.h" |
6 | 6 |
7 #include "CCTextureUpdateController.h" | 7 #include "CCTextureUpdateController.h" |
8 | 8 |
9 #include "CCSchedulerTestCommon.h" | 9 #include "CCSchedulerTestCommon.h" |
10 #include "CCSingleThreadProxy.h" // For DebugScopedSetImplThread | 10 #include "CCSingleThreadProxy.h" // For DebugScopedSetImplThread |
(...skipping 500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
511 | 511 |
512 EXPECT_EQ(3, m_numBeginUploads); | 512 EXPECT_EQ(3, m_numBeginUploads); |
513 EXPECT_EQ(3, m_numEndUploads); | 513 EXPECT_EQ(3, m_numEndUploads); |
514 EXPECT_LE(m_numPreviousUploads, kMaxUploadsPerUpdate); | 514 EXPECT_LE(m_numPreviousUploads, kMaxUploadsPerUpdate); |
515 // Be lenient on the exact number of flushes here as well. | 515 // Be lenient on the exact number of flushes here as well. |
516 | 516 |
517 // Final sanity checks | 517 // Final sanity checks |
518 EXPECT_EQ(kFullUploads + kPartialUploads, m_numTotalUploads); | 518 EXPECT_EQ(kFullUploads + kPartialUploads, m_numTotalUploads); |
519 } | 519 } |
520 | 520 |
| 521 class FakeCCTextureUpdateControllerClient : public WebCore::CCTextureUpdateContr
ollerClient { |
| 522 public: |
| 523 FakeCCTextureUpdateControllerClient() { reset(); } |
| 524 void reset() { m_completedCalled = false; } |
| 525 bool completedCalled() const { return m_completedCalled; } |
| 526 |
| 527 virtual void updateTexturesCompleted() OVERRIDE { m_completedCalled = true;
} |
| 528 |
| 529 protected: |
| 530 bool m_completedCalled; |
| 531 }; |
| 532 |
521 class FakeCCTextureUpdateController : public WebCore::CCTextureUpdateController
{ | 533 class FakeCCTextureUpdateController : public WebCore::CCTextureUpdateController
{ |
522 public: | 534 public: |
523 static PassOwnPtr<FakeCCTextureUpdateController> create(WebCore::CCThread* t
hread, PassOwnPtr<CCTextureUpdateQueue> queue, CCResourceProvider* resourceProvi
der, TextureCopier* copier, TextureUploader* uploader) | 535 static PassOwnPtr<FakeCCTextureUpdateController> create(WebCore::CCTextureUp
dateControllerClient* client, WebCore::CCThread* thread, PassOwnPtr<CCTextureUpd
ateQueue> queue, CCResourceProvider* resourceProvider, TextureCopier* copier, Te
xtureUploader* uploader) |
524 { | 536 { |
525 return adoptPtr(new FakeCCTextureUpdateController(thread, queue, resourc
eProvider, copier, uploader)); | 537 return adoptPtr(new FakeCCTextureUpdateController(client, thread, queue,
resourceProvider, copier, uploader)); |
526 } | 538 } |
527 | 539 |
528 void setMonotonicTimeNow(double time) { m_monotonicTimeNow = time; } | 540 void setMonotonicTimeNow(double time) { m_monotonicTimeNow = time; } |
529 virtual double monotonicTimeNow() const OVERRIDE { return m_monotonicTimeNow
; } | 541 virtual double monotonicTimeNow() const OVERRIDE { return m_monotonicTimeNow
; } |
530 void setUpdateMoreTexturesTime(double time) { m_updateMoreTexturesTime = tim
e; } | 542 void setUpdateMoreTexturesTime(double time) { m_updateMoreTexturesTime = tim
e; } |
531 virtual double updateMoreTexturesTime() const OVERRIDE { return m_updateMore
TexturesTime; } | 543 virtual double updateMoreTexturesTime() const OVERRIDE { return m_updateMore
TexturesTime; } |
532 void setUpdateMoreTexturesSize(size_t size) { m_updateMoreTexturesSize = siz
e; } | 544 void setUpdateMoreTexturesSize(size_t size) { m_updateMoreTexturesSize = siz
e; } |
533 virtual size_t updateMoreTexturesSize() const OVERRIDE { return m_updateMore
TexturesSize; } | 545 virtual size_t updateMoreTexturesSize() const OVERRIDE { return m_updateMore
TexturesSize; } |
534 | 546 |
535 protected: | 547 protected: |
536 FakeCCTextureUpdateController(WebCore::CCThread* thread, PassOwnPtr<CCTextur
eUpdateQueue> queue, CCResourceProvider* resourceProvider, TextureCopier* copier
, TextureUploader* uploader) | 548 FakeCCTextureUpdateController(WebCore::CCTextureUpdateControllerClient* clie
nt, WebCore::CCThread* thread, PassOwnPtr<CCTextureUpdateQueue> queue, CCResourc
eProvider* resourceProvider, TextureCopier* copier, TextureUploader* uploader) |
537 : WebCore::CCTextureUpdateController(thread, queue, resourceProvider, co
pier, uploader) | 549 : WebCore::CCTextureUpdateController(client, thread, queue, resourceProv
ider, copier, uploader) |
538 , m_monotonicTimeNow(0) | 550 , m_monotonicTimeNow(0) |
539 , m_updateMoreTexturesTime(0) | 551 , m_updateMoreTexturesTime(0) |
540 , m_updateMoreTexturesSize(0) { } | 552 , m_updateMoreTexturesSize(0) { } |
541 | 553 |
542 double m_monotonicTimeNow; | 554 double m_monotonicTimeNow; |
543 double m_updateMoreTexturesTime; | 555 double m_updateMoreTexturesTime; |
544 size_t m_updateMoreTexturesSize; | 556 size_t m_updateMoreTexturesSize; |
545 }; | 557 }; |
546 | 558 |
| 559 static void runPendingTask(FakeCCThread* thread, FakeCCTextureUpdateController*
controller) |
| 560 { |
| 561 EXPECT_TRUE(thread->hasPendingTask()); |
| 562 controller->setMonotonicTimeNow(controller->monotonicTimeNow() + thread->pen
dingDelayMs() / 1000.0); |
| 563 thread->runPendingTask(); |
| 564 } |
| 565 |
547 TEST_F(CCTextureUpdateControllerTest, UpdateMoreTextures) | 566 TEST_F(CCTextureUpdateControllerTest, UpdateMoreTextures) |
548 { | 567 { |
| 568 FakeCCTextureUpdateControllerClient client; |
549 FakeCCThread thread; | 569 FakeCCThread thread; |
550 | 570 |
551 setMaxUploadCountPerUpdate(1); | 571 setMaxUploadCountPerUpdate(1); |
552 appendFullUploadsToUpdateQueue(3); | 572 appendFullUploadsToUpdateQueue(3); |
553 appendPartialUploadsToUpdateQueue(0); | 573 appendPartialUploadsToUpdateQueue(0); |
554 | 574 |
555 DebugScopedSetImplThread implThread; | 575 DebugScopedSetImplThread implThread; |
556 OwnPtr<FakeCCTextureUpdateController> controller(FakeCCTextureUpdateControll
er::create(&thread, m_queue.release(), m_resourceProvider.get(), &m_copier, &m_u
ploader)); | 576 OwnPtr<FakeCCTextureUpdateController> controller(FakeCCTextureUpdateControll
er::create(&client, &thread, m_queue.release(), m_resourceProvider.get(), &m_cop
ier, &m_uploader)); |
557 | 577 |
558 controller->setMonotonicTimeNow(0); | 578 controller->setMonotonicTimeNow(0); |
559 controller->setUpdateMoreTexturesTime(0.1); | 579 controller->setUpdateMoreTexturesTime(0.1); |
560 controller->setUpdateMoreTexturesSize(1); | 580 controller->setUpdateMoreTexturesSize(1); |
561 // Not enough time for any updates. | 581 // Not enough time for any updates. |
562 controller->updateMoreTextures(0.09); | 582 controller->updateMoreTextures(0.09); |
563 EXPECT_FALSE(thread.hasPendingTask()); | 583 EXPECT_FALSE(thread.hasPendingTask()); |
564 EXPECT_EQ(0, m_numBeginUploads); | 584 EXPECT_EQ(0, m_numBeginUploads); |
565 EXPECT_EQ(0, m_numEndUploads); | 585 EXPECT_EQ(0, m_numEndUploads); |
566 | 586 |
567 thread.reset(); | |
568 controller->setMonotonicTimeNow(0); | 587 controller->setMonotonicTimeNow(0); |
569 controller->setUpdateMoreTexturesTime(0.1); | 588 controller->setUpdateMoreTexturesTime(0.1); |
570 controller->setUpdateMoreTexturesSize(1); | 589 controller->setUpdateMoreTexturesSize(1); |
571 // Only enough time for 1 update. | 590 // Only enough time for 1 update. |
572 controller->updateMoreTextures(0.12); | 591 controller->updateMoreTextures(0.12); |
573 EXPECT_TRUE(thread.hasPendingTask()); | 592 runPendingTask(&thread, controller.get()); |
574 controller->setMonotonicTimeNow(thread.pendingDelayMs() / 1000.0); | 593 EXPECT_FALSE(thread.hasPendingTask()); |
575 thread.runPendingTask(); | |
576 EXPECT_EQ(1, m_numBeginUploads); | 594 EXPECT_EQ(1, m_numBeginUploads); |
577 EXPECT_EQ(1, m_numEndUploads); | 595 EXPECT_EQ(1, m_numEndUploads); |
578 EXPECT_EQ(1, m_numTotalUploads); | 596 EXPECT_EQ(1, m_numTotalUploads); |
579 | 597 |
580 thread.reset(); | |
581 controller->setMonotonicTimeNow(0); | 598 controller->setMonotonicTimeNow(0); |
582 controller->setUpdateMoreTexturesTime(0.1); | 599 controller->setUpdateMoreTexturesTime(0.1); |
583 controller->setUpdateMoreTexturesSize(1); | 600 controller->setUpdateMoreTexturesSize(1); |
584 // Enough time for 2 updates. | 601 // Enough time for 2 updates. |
585 controller->updateMoreTextures(0.22); | 602 controller->updateMoreTextures(0.22); |
586 EXPECT_TRUE(thread.hasPendingTask()); | 603 runPendingTask(&thread, controller.get()); |
587 controller->setMonotonicTimeNow(controller->monotonicTimeNow() + thread.pend
ingDelayMs() / 1000.0); | 604 runPendingTask(&thread, controller.get()); |
588 thread.runPendingTask(); | 605 EXPECT_FALSE(thread.hasPendingTask()); |
| 606 EXPECT_TRUE(client.completedCalled()); |
589 EXPECT_EQ(3, m_numBeginUploads); | 607 EXPECT_EQ(3, m_numBeginUploads); |
590 EXPECT_EQ(3, m_numEndUploads); | 608 EXPECT_EQ(3, m_numEndUploads); |
591 EXPECT_EQ(3, m_numTotalUploads); | 609 EXPECT_EQ(3, m_numTotalUploads); |
592 } | 610 } |
593 | 611 |
594 TEST_F(CCTextureUpdateControllerTest, NoMoreUpdates) | 612 TEST_F(CCTextureUpdateControllerTest, NoMoreUpdates) |
595 { | 613 { |
| 614 FakeCCTextureUpdateControllerClient client; |
596 FakeCCThread thread; | 615 FakeCCThread thread; |
597 | 616 |
598 setMaxUploadCountPerUpdate(1); | 617 setMaxUploadCountPerUpdate(1); |
599 appendFullUploadsToUpdateQueue(2); | 618 appendFullUploadsToUpdateQueue(2); |
600 appendPartialUploadsToUpdateQueue(0); | 619 appendPartialUploadsToUpdateQueue(0); |
601 | 620 |
602 DebugScopedSetImplThread implThread; | 621 DebugScopedSetImplThread implThread; |
603 OwnPtr<FakeCCTextureUpdateController> controller(FakeCCTextureUpdateControll
er::create(&thread, m_queue.release(), m_resourceProvider.get(), &m_copier, &m_u
ploader)); | 622 OwnPtr<FakeCCTextureUpdateController> controller(FakeCCTextureUpdateControll
er::create(&client, &thread, m_queue.release(), m_resourceProvider.get(), &m_cop
ier, &m_uploader)); |
604 | 623 |
605 controller->setMonotonicTimeNow(0); | 624 controller->setMonotonicTimeNow(0); |
606 controller->setUpdateMoreTexturesTime(0.1); | 625 controller->setUpdateMoreTexturesTime(0.1); |
607 controller->setUpdateMoreTexturesSize(1); | 626 controller->setUpdateMoreTexturesSize(1); |
608 // Enough time for 3 updates but only 2 necessary. | 627 // Enough time for 3 updates but only 2 necessary. |
609 controller->updateMoreTextures(0.31); | 628 controller->updateMoreTextures(0.31); |
610 EXPECT_TRUE(thread.hasPendingTask()); | 629 runPendingTask(&thread, controller.get()); |
611 controller->setMonotonicTimeNow(controller->monotonicTimeNow() + thread.pend
ingDelayMs() / 1000.0); | 630 runPendingTask(&thread, controller.get()); |
612 thread.runPendingTask(); | 631 EXPECT_FALSE(thread.hasPendingTask()); |
613 EXPECT_TRUE(thread.hasPendingTask()); | 632 EXPECT_TRUE(client.completedCalled()); |
614 controller->setMonotonicTimeNow(controller->monotonicTimeNow() + thread.pend
ingDelayMs() / 1000.0); | |
615 thread.runPendingTask(); | |
616 EXPECT_EQ(2, m_numBeginUploads); | 633 EXPECT_EQ(2, m_numBeginUploads); |
617 EXPECT_EQ(2, m_numEndUploads); | 634 EXPECT_EQ(2, m_numEndUploads); |
618 EXPECT_EQ(2, m_numTotalUploads); | 635 EXPECT_EQ(2, m_numTotalUploads); |
619 | 636 |
620 thread.reset(); | |
621 controller->setMonotonicTimeNow(0); | 637 controller->setMonotonicTimeNow(0); |
622 controller->setUpdateMoreTexturesTime(0.1); | 638 controller->setUpdateMoreTexturesTime(0.1); |
623 controller->setUpdateMoreTexturesSize(1); | 639 controller->setUpdateMoreTexturesSize(1); |
624 // Enough time for updates but no more updates left. | 640 // Enough time for updates but no more updates left. |
625 controller->updateMoreTextures(0.31); | 641 controller->updateMoreTextures(0.31); |
| 642 // 0-delay task used to call updateTexturesCompleted(). |
| 643 runPendingTask(&thread, controller.get()); |
626 EXPECT_FALSE(thread.hasPendingTask()); | 644 EXPECT_FALSE(thread.hasPendingTask()); |
| 645 EXPECT_TRUE(client.completedCalled()); |
627 EXPECT_EQ(2, m_numBeginUploads); | 646 EXPECT_EQ(2, m_numBeginUploads); |
628 EXPECT_EQ(2, m_numEndUploads); | 647 EXPECT_EQ(2, m_numEndUploads); |
629 EXPECT_EQ(2, m_numTotalUploads); | 648 EXPECT_EQ(2, m_numTotalUploads); |
630 } | 649 } |
631 | 650 |
632 TEST_F(CCTextureUpdateControllerTest, UpdatesCompleteInFiniteTime) | 651 TEST_F(CCTextureUpdateControllerTest, UpdatesCompleteInFiniteTime) |
633 { | 652 { |
| 653 FakeCCTextureUpdateControllerClient client; |
634 FakeCCThread thread; | 654 FakeCCThread thread; |
635 | 655 |
636 setMaxUploadCountPerUpdate(1); | 656 setMaxUploadCountPerUpdate(1); |
637 appendFullUploadsToUpdateQueue(2); | 657 appendFullUploadsToUpdateQueue(2); |
638 appendPartialUploadsToUpdateQueue(0); | 658 appendPartialUploadsToUpdateQueue(0); |
639 | 659 |
640 DebugScopedSetImplThread implThread; | 660 DebugScopedSetImplThread implThread; |
641 OwnPtr<FakeCCTextureUpdateController> controller(FakeCCTextureUpdateControll
er::create(&thread, m_queue.release(), m_resourceProvider.get(), &m_copier, &m_u
ploader)); | 661 OwnPtr<FakeCCTextureUpdateController> controller(FakeCCTextureUpdateControll
er::create(&client, &thread, m_queue.release(), m_resourceProvider.get(), &m_cop
ier, &m_uploader)); |
642 | 662 |
643 controller->setMonotonicTimeNow(0); | 663 controller->setMonotonicTimeNow(0); |
644 controller->setUpdateMoreTexturesTime(0.5); | 664 controller->setUpdateMoreTexturesTime(0.5); |
645 controller->setUpdateMoreTexturesSize(1); | 665 controller->setUpdateMoreTexturesSize(1); |
646 | 666 |
647 for (int i = 0; i < 100; i++) { | 667 for (int i = 0; i < 100; i++) { |
648 if (!controller->hasMoreUpdates()) | 668 if (client.completedCalled()) |
649 break; | 669 break; |
650 | 670 |
651 // Not enough time for any updates. | 671 // Not enough time for any updates. |
652 controller->updateMoreTextures(0.4); | 672 controller->updateMoreTextures(0.4); |
653 | 673 |
654 if (thread.hasPendingTask()) { | 674 if (thread.hasPendingTask()) |
655 controller->setMonotonicTimeNow(controller->monotonicTimeNow() + thr
ead.pendingDelayMs() / 1000.0); | 675 runPendingTask(&thread, controller.get()); |
656 thread.runPendingTask(); | |
657 } | |
658 } | 676 } |
659 | 677 |
| 678 EXPECT_FALSE(thread.hasPendingTask()); |
| 679 EXPECT_TRUE(client.completedCalled()); |
660 EXPECT_EQ(2, m_numBeginUploads); | 680 EXPECT_EQ(2, m_numBeginUploads); |
661 EXPECT_EQ(2, m_numEndUploads); | 681 EXPECT_EQ(2, m_numEndUploads); |
662 EXPECT_EQ(2, m_numTotalUploads); | 682 EXPECT_EQ(2, m_numTotalUploads); |
663 } | 683 } |
664 | 684 |
665 } // namespace | 685 } // namespace |
OLD | NEW |