diff options
Diffstat (limited to 'cc/scheduler/vsync_time_source_unittest.cc')
-rw-r--r-- | cc/scheduler/vsync_time_source_unittest.cc | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/cc/scheduler/vsync_time_source_unittest.cc b/cc/scheduler/vsync_time_source_unittest.cc new file mode 100644 index 0000000..ea9c79d --- /dev/null +++ b/cc/scheduler/vsync_time_source_unittest.cc @@ -0,0 +1,103 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "cc/scheduler/vsync_time_source.h" + +#include "cc/test/scheduler_test_common.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace cc { +namespace { + +class FakeVSyncProvider : public VSyncProvider { + public: + FakeVSyncProvider() + : client_(NULL) {} + + // VSyncProvider implementation. + virtual void RequestVSyncNotification(VSyncClient* client) OVERRIDE { + client_ = client; + } + + bool IsVSyncNotificationEnabled() const { return client_ != NULL; } + + void Trigger(base::TimeTicks frame_time) { + if (client_) + client_->DidVSync(frame_time); + } + + private: + VSyncClient* client_; +}; + +class VSyncTimeSourceTest : public testing::Test { + public: + VSyncTimeSourceTest() + : timer_(VSyncTimeSource::create(&provider_)) { + timer_->setClient(&client_); + } + + protected: + FakeTimeSourceClient client_; + FakeVSyncProvider provider_; + scoped_refptr<VSyncTimeSource> timer_; +}; + +TEST_F(VSyncTimeSourceTest, TaskPostedAndTickCalled) +{ + EXPECT_FALSE(provider_.IsVSyncNotificationEnabled()); + + timer_->setActive(true); + EXPECT_TRUE(provider_.IsVSyncNotificationEnabled()); + + base::TimeTicks frame_time = base::TimeTicks::Now(); + provider_.Trigger(frame_time); + EXPECT_TRUE(client_.tickCalled()); + EXPECT_EQ(timer_->lastTickTime(), frame_time); +} + +TEST_F(VSyncTimeSourceTest, NotificationDisabledLazily) +{ + base::TimeTicks frame_time = base::TimeTicks::Now(); + + // Enable timer and trigger sync once. + timer_->setActive(true); + EXPECT_TRUE(provider_.IsVSyncNotificationEnabled()); + provider_.Trigger(frame_time); + EXPECT_TRUE(client_.tickCalled()); + + // Disabling the timer should not disable vsync notification immediately. + client_.reset(); + timer_->setActive(false); + EXPECT_TRUE(provider_.IsVSyncNotificationEnabled()); + + // At the next vsync the notification is disabled, but the timer isn't ticked. + provider_.Trigger(frame_time); + EXPECT_FALSE(provider_.IsVSyncNotificationEnabled()); + EXPECT_FALSE(client_.tickCalled()); + + // The notification should not be disabled multiple times. + provider_.RequestVSyncNotification(timer_.get()); + provider_.Trigger(frame_time); + EXPECT_TRUE(provider_.IsVSyncNotificationEnabled()); + EXPECT_FALSE(client_.tickCalled()); +} + +TEST_F(VSyncTimeSourceTest, ValidNextTickTime) +{ + base::TimeTicks frame_time = base::TimeTicks::Now(); + base::TimeDelta interval = base::TimeDelta::FromSeconds(1); + + ASSERT_EQ(timer_->nextTickTime(), base::TimeTicks()); + + timer_->setActive(true); + provider_.Trigger(frame_time); + ASSERT_EQ(timer_->nextTickTime(), frame_time); + + timer_->setTimebaseAndInterval(frame_time, interval); + ASSERT_EQ(timer_->nextTickTime(), frame_time + interval); +} + +} // namespace +} // namespace cc |