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