1/* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#undef LOG_TAG 18#define LOG_TAG "LibSurfaceFlingerUnittests" 19 20#include <gmock/gmock.h> 21#include <gtest/gtest.h> 22 23#include <log/log.h> 24 25#include "AsyncCallRecorder.h" 26#include "EventControlThread.h" 27 28namespace android { 29namespace { 30 31using namespace std::chrono_literals; 32using testing::_; 33 34class EventControlThreadTest : public testing::Test { 35protected: 36 EventControlThreadTest(); 37 ~EventControlThreadTest() override; 38 39 void createThread(); 40 41 void expectVSyncEnableCallbackCalled(bool enable); 42 43 AsyncCallRecorder<void (*)(bool)> mVSyncSetEnabledCallRecorder; 44 45 std::unique_ptr<EventControlThread> mThread; 46}; 47 48EventControlThreadTest::EventControlThreadTest() { 49 const ::testing::TestInfo* const test_info = 50 ::testing::UnitTest::GetInstance()->current_test_info(); 51 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name()); 52} 53 54EventControlThreadTest::~EventControlThreadTest() { 55 const ::testing::TestInfo* const test_info = 56 ::testing::UnitTest::GetInstance()->current_test_info(); 57 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name()); 58} 59 60void EventControlThreadTest::createThread() { 61 mThread = std::make_unique<android::impl::EventControlThread>( 62 mVSyncSetEnabledCallRecorder.getInvocable()); 63} 64 65void EventControlThreadTest::expectVSyncEnableCallbackCalled(bool expectedEnabled) { 66 auto args = mVSyncSetEnabledCallRecorder.waitForCall(); 67 ASSERT_TRUE(args.has_value()); 68 EXPECT_EQ(std::get<0>(args.value()), expectedEnabled); 69} 70 71/* ------------------------------------------------------------------------ 72 * Test cases 73 */ 74 75TEST_F(EventControlThreadTest, signalsVSyncDisabledOnStartup) { 76 createThread(); 77 78 // On thread start, there should be an automatic explicit call to disable 79 // vsyncs 80 expectVSyncEnableCallbackCalled(false); 81} 82 83TEST_F(EventControlThreadTest, signalsVSyncDisabledOnce) { 84 createThread(); 85 expectVSyncEnableCallbackCalled(false); 86 87 mThread->setVsyncEnabled(false); 88 89 EXPECT_FALSE(mVSyncSetEnabledCallRecorder.waitForUnexpectedCall().has_value()); 90} 91 92TEST_F(EventControlThreadTest, signalsVSyncEnabledThenDisabled) { 93 createThread(); 94 expectVSyncEnableCallbackCalled(false); 95 96 mThread->setVsyncEnabled(true); 97 98 expectVSyncEnableCallbackCalled(true); 99 100 mThread->setVsyncEnabled(false); 101 102 expectVSyncEnableCallbackCalled(false); 103} 104 105TEST_F(EventControlThreadTest, signalsVSyncEnabledOnce) { 106 createThread(); 107 expectVSyncEnableCallbackCalled(false); 108 109 mThread->setVsyncEnabled(true); 110 111 expectVSyncEnableCallbackCalled(true); 112 113 mThread->setVsyncEnabled(true); 114 115 EXPECT_FALSE(mVSyncSetEnabledCallRecorder.waitForUnexpectedCall().has_value()); 116} 117 118} // namespace 119} // namespace android 120