• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2020 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 <com_android_graphics_surfaceflinger_flags.h>
21 #include <common/test/FlagUtils.h>
22 #include "DisplayTransactionTestHelpers.h"
23 
24 #include <gmock/gmock.h>
25 #include <gtest/gtest.h>
26 
27 using namespace com::android::graphics::surfaceflinger;
28 
29 namespace android {
30 namespace {
31 
32 MATCHER_P(DisplayModeFps, value, "equals") {
33     using fps_approx_ops::operator==;
34     return arg->getVsyncRate() == value;
35 }
36 
37 // Used when we simulate a display that supports doze.
38 template <typename Display>
39 struct DozeIsSupportedVariant {
40     static constexpr bool DOZE_SUPPORTED = true;
41     static constexpr IComposerClient::PowerMode ACTUAL_POWER_MODE_FOR_DOZE =
42             IComposerClient::PowerMode::DOZE;
43     static constexpr IComposerClient::PowerMode ACTUAL_POWER_MODE_FOR_DOZE_SUSPEND =
44             IComposerClient::PowerMode::DOZE_SUSPEND;
45 
setupComposerCallExpectationsandroid::__anon4deda48a0111::DozeIsSupportedVariant46     static void setupComposerCallExpectations(DisplayTransactionTest* test) {
47         EXPECT_CALL(*test->mComposer, getDisplayCapabilities(Display::HWC_DISPLAY_ID, _))
48                 .WillOnce(DoAll(SetArgPointee<1>(
49                                         std::vector<DisplayCapability>({DisplayCapability::DOZE})),
50                                 Return(Error::NONE)));
51     }
52 };
53 
54 template <typename Display>
55 // Used when we simulate a display that does not support doze.
56 struct DozeNotSupportedVariant {
57     static constexpr bool DOZE_SUPPORTED = false;
58     static constexpr IComposerClient::PowerMode ACTUAL_POWER_MODE_FOR_DOZE =
59             IComposerClient::PowerMode::ON;
60     static constexpr IComposerClient::PowerMode ACTUAL_POWER_MODE_FOR_DOZE_SUSPEND =
61             IComposerClient::PowerMode::ON;
62 
setupComposerCallExpectationsandroid::__anon4deda48a0111::DozeNotSupportedVariant63     static void setupComposerCallExpectations(DisplayTransactionTest* test) {
64         EXPECT_CALL(*test->mComposer, getDisplayCapabilities(Display::HWC_DISPLAY_ID, _))
65                 .WillOnce(DoAll(SetArgPointee<1>(std::vector<DisplayCapability>({})),
66                                 Return(Error::NONE)));
67     }
68 };
69 
70 struct EventThreadBaseSupportedVariant {
setupVsyncNoCallExpectationsandroid::__anon4deda48a0111::EventThreadBaseSupportedVariant71     static void setupVsyncNoCallExpectations(DisplayTransactionTest* test) {
72         // Expect no change to hardware nor synthetic VSYNC.
73         EXPECT_CALL(test->mFlinger.scheduler()->mockRequestHardwareVsync, Call(_, _)).Times(0);
74         EXPECT_CALL(*test->mEventThread, enableSyntheticVsync(_)).Times(0);
75     }
76 };
77 
78 struct EventThreadNotSupportedVariant : public EventThreadBaseSupportedVariant {
setupEnableVsyncCallExpectationsandroid::__anon4deda48a0111::EventThreadNotSupportedVariant79     static void setupEnableVsyncCallExpectations(DisplayTransactionTest* test) {
80         EXPECT_CALL(test->mFlinger.scheduler()->mockRequestHardwareVsync, Call(_, true)).Times(1);
81         EXPECT_CALL(*test->mEventThread, enableSyntheticVsync(_)).Times(0);
82     }
83 
setupDisableVsyncCallExpectationsandroid::__anon4deda48a0111::EventThreadNotSupportedVariant84     static void setupDisableVsyncCallExpectations(DisplayTransactionTest* test) {
85         EXPECT_CALL(test->mFlinger.scheduler()->mockRequestHardwareVsync, Call(_, false)).Times(1);
86         EXPECT_CALL(*test->mEventThread, enableSyntheticVsync(_)).Times(0);
87     }
88 };
89 
90 struct EventThreadIsSupportedVariant : public EventThreadBaseSupportedVariant {
setupEnableVsyncCallExpectationsandroid::__anon4deda48a0111::EventThreadIsSupportedVariant91     static void setupEnableVsyncCallExpectations(DisplayTransactionTest* test) {
92         // Expect to enable hardware VSYNC and disable synthetic VSYNC.
93         EXPECT_CALL(test->mFlinger.scheduler()->mockRequestHardwareVsync, Call(_, true)).Times(1);
94         EXPECT_CALL(*test->mEventThread, enableSyntheticVsync(false)).Times(1);
95     }
96 
setupDisableVsyncCallExpectationsandroid::__anon4deda48a0111::EventThreadIsSupportedVariant97     static void setupDisableVsyncCallExpectations(DisplayTransactionTest* test) {
98         // Expect to disable hardware VSYNC and enable synthetic VSYNC.
99         EXPECT_CALL(test->mFlinger.scheduler()->mockRequestHardwareVsync, Call(_, false)).Times(1);
100         EXPECT_CALL(*test->mEventThread, enableSyntheticVsync(true)).Times(1);
101     }
102 };
103 
104 struct DispSyncIsSupportedVariant {
setupResetModelCallExpectationsandroid::__anon4deda48a0111::DispSyncIsSupportedVariant105     static void setupResetModelCallExpectations(DisplayTransactionTest* test) {
106         auto vsyncSchedule = test->mFlinger.scheduler()->getVsyncSchedule();
107         EXPECT_CALL(static_cast<mock::VsyncController&>(vsyncSchedule->getController()),
108                     onDisplayModeChanged(DisplayModeFps(Fps::fromPeriodNsecs(DEFAULT_VSYNC_PERIOD)),
109                                          false))
110                 .Times(1);
111         EXPECT_CALL(static_cast<mock::VSyncTracker&>(vsyncSchedule->getTracker()), resetModel())
112                 .Times(1);
113     }
114 };
115 
116 struct DispSyncNotSupportedVariant {
setupResetModelCallExpectationsandroid::__anon4deda48a0111::DispSyncNotSupportedVariant117     static void setupResetModelCallExpectations(DisplayTransactionTest* /* test */) {}
118 };
119 
120 // --------------------------------------------------------------------
121 // Note:
122 //
123 // There are a large number of transitions we could test, however we only test a
124 // selected subset which provides complete test coverage of the implementation.
125 // --------------------------------------------------------------------
126 
127 template <PowerMode initialPowerMode, PowerMode targetPowerMode>
128 struct TransitionVariantCommon {
129     static constexpr auto INITIAL_POWER_MODE = initialPowerMode;
130     static constexpr auto TARGET_POWER_MODE = targetPowerMode;
131 
verifyPostconditionsandroid::__anon4deda48a0111::TransitionVariantCommon132     static void verifyPostconditions(DisplayTransactionTest*) {}
133 };
134 
135 struct TransitionOffToOnVariant : public TransitionVariantCommon<PowerMode::OFF, PowerMode::ON> {
136     template <typename Case>
setupCallExpectationsandroid::__anon4deda48a0111::TransitionOffToOnVariant137     static void setupCallExpectations(DisplayTransactionTest* test) {
138         Case::setupComposerCallExpectations(test, IComposerClient::PowerMode::ON);
139         Case::EventThread::setupEnableVsyncCallExpectations(test);
140         Case::DispSync::setupResetModelCallExpectations(test);
141         Case::setupRepaintEverythingCallExpectations(test);
142     }
143 
verifyPostconditionsandroid::__anon4deda48a0111::TransitionOffToOnVariant144     static void verifyPostconditions(DisplayTransactionTest* test) {
145         EXPECT_TRUE(test->mFlinger.getVisibleRegionsDirty());
146     }
147 };
148 
149 struct TransitionOffToDozeSuspendVariant
150       : public TransitionVariantCommon<PowerMode::OFF, PowerMode::DOZE_SUSPEND> {
151     template <typename Case>
setupCallExpectationsandroid::__anon4deda48a0111::TransitionOffToDozeSuspendVariant152     static void setupCallExpectations(DisplayTransactionTest* test) {
153         Case::setupComposerCallExpectations(test, Case::Doze::ACTUAL_POWER_MODE_FOR_DOZE_SUSPEND);
154         Case::EventThread::setupVsyncNoCallExpectations(test);
155         Case::setupRepaintEverythingCallExpectations(test);
156     }
157 
verifyPostconditionsandroid::__anon4deda48a0111::TransitionOffToDozeSuspendVariant158     static void verifyPostconditions(DisplayTransactionTest* test) {
159         EXPECT_TRUE(test->mFlinger.getVisibleRegionsDirty());
160     }
161 };
162 
163 struct TransitionOnToOffVariant : public TransitionVariantCommon<PowerMode::ON, PowerMode::OFF> {
164     template <typename Case>
setupCallExpectationsandroid::__anon4deda48a0111::TransitionOnToOffVariant165     static void setupCallExpectations(DisplayTransactionTest* test) {
166         Case::EventThread::setupDisableVsyncCallExpectations(test);
167         Case::setupComposerCallExpectations(test, IComposerClient::PowerMode::OFF);
168     }
169 
verifyPostconditionsandroid::__anon4deda48a0111::TransitionOnToOffVariant170     static void verifyPostconditions(DisplayTransactionTest* test) {
171         EXPECT_TRUE(test->mFlinger.getVisibleRegionsDirty());
172     }
173 };
174 
175 struct TransitionDozeSuspendToOffVariant
176       : public TransitionVariantCommon<PowerMode::DOZE_SUSPEND, PowerMode::OFF> {
177     template <typename Case>
setupCallExpectationsandroid::__anon4deda48a0111::TransitionDozeSuspendToOffVariant178     static void setupCallExpectations(DisplayTransactionTest* test) {
179         Case::EventThread::setupVsyncNoCallExpectations(test);
180         Case::setupComposerCallExpectations(test, IComposerClient::PowerMode::OFF);
181     }
182 
verifyPostconditionsandroid::__anon4deda48a0111::TransitionDozeSuspendToOffVariant183     static void verifyPostconditions(DisplayTransactionTest* test) {
184         EXPECT_TRUE(test->mFlinger.getVisibleRegionsDirty());
185     }
186 };
187 
188 struct TransitionOnToDozeVariant : public TransitionVariantCommon<PowerMode::ON, PowerMode::DOZE> {
189     template <typename Case>
setupCallExpectationsandroid::__anon4deda48a0111::TransitionOnToDozeVariant190     static void setupCallExpectations(DisplayTransactionTest* test) {
191         Case::EventThread::setupVsyncNoCallExpectations(test);
192         Case::setupComposerCallExpectations(test, Case::Doze::ACTUAL_POWER_MODE_FOR_DOZE);
193     }
194 };
195 
196 struct TransitionDozeSuspendToDozeVariant
197       : public TransitionVariantCommon<PowerMode::DOZE_SUSPEND, PowerMode::DOZE> {
198     template <typename Case>
setupCallExpectationsandroid::__anon4deda48a0111::TransitionDozeSuspendToDozeVariant199     static void setupCallExpectations(DisplayTransactionTest* test) {
200         Case::EventThread::setupEnableVsyncCallExpectations(test);
201         Case::DispSync::setupResetModelCallExpectations(test);
202         Case::setupComposerCallExpectations(test, Case::Doze::ACTUAL_POWER_MODE_FOR_DOZE);
203     }
204 };
205 
206 struct TransitionDozeToOnVariant : public TransitionVariantCommon<PowerMode::DOZE, PowerMode::ON> {
207     template <typename Case>
setupCallExpectationsandroid::__anon4deda48a0111::TransitionDozeToOnVariant208     static void setupCallExpectations(DisplayTransactionTest* test) {
209         Case::EventThread::setupVsyncNoCallExpectations(test);
210         Case::setupComposerCallExpectations(test, IComposerClient::PowerMode::ON);
211     }
212 };
213 
214 struct TransitionDozeSuspendToOnVariant
215       : public TransitionVariantCommon<PowerMode::DOZE_SUSPEND, PowerMode::ON> {
216     template <typename Case>
setupCallExpectationsandroid::__anon4deda48a0111::TransitionDozeSuspendToOnVariant217     static void setupCallExpectations(DisplayTransactionTest* test) {
218         Case::EventThread::setupEnableVsyncCallExpectations(test);
219         Case::DispSync::setupResetModelCallExpectations(test);
220         Case::setupComposerCallExpectations(test, IComposerClient::PowerMode::ON);
221     }
222 };
223 
224 struct TransitionOnToDozeSuspendVariant
225       : public TransitionVariantCommon<PowerMode::ON, PowerMode::DOZE_SUSPEND> {
226     template <typename Case>
setupCallExpectationsandroid::__anon4deda48a0111::TransitionOnToDozeSuspendVariant227     static void setupCallExpectations(DisplayTransactionTest* test) {
228         Case::EventThread::setupDisableVsyncCallExpectations(test);
229         Case::setupComposerCallExpectations(test, Case::Doze::ACTUAL_POWER_MODE_FOR_DOZE_SUSPEND);
230     }
231 };
232 
233 struct TransitionOnToUnknownVariant
234       : public TransitionVariantCommon<PowerMode::ON, static_cast<PowerMode>(POWER_MODE_LEET)> {
235     template <typename Case>
setupCallExpectationsandroid::__anon4deda48a0111::TransitionOnToUnknownVariant236     static void setupCallExpectations(DisplayTransactionTest* test) {
237         Case::EventThread::setupVsyncNoCallExpectations(test);
238         Case::setupNoComposerPowerModeCallExpectations(test);
239     }
240 };
241 
242 // --------------------------------------------------------------------
243 // Note:
244 //
245 // Rather than testing the cartesian product of
246 // DozeIsSupported/DozeNotSupported with all other options, we use one for one
247 // display type, and the other for another display type.
248 // --------------------------------------------------------------------
249 
250 template <typename DisplayVariant, typename DozeVariant, typename EventThreadVariant,
251           typename DispSyncVariant, typename TransitionVariant>
252 struct DisplayPowerCase {
253     using Display = DisplayVariant;
254     using Doze = DozeVariant;
255     using EventThread = EventThreadVariant;
256     using DispSync = DispSyncVariant;
257     using Transition = TransitionVariant;
258 
injectDisplayWithInitialPowerModeandroid::__anon4deda48a0111::DisplayPowerCase259     static sp<DisplayDevice> injectDisplayWithInitialPowerMode(DisplayTransactionTest* test,
260                                                                PowerMode mode) {
261         Display::injectHwcDisplayWithNoDefaultCapabilities(test);
262         auto injector = Display::makeFakeExistingDisplayInjector(test);
263         const auto display = injector.inject();
264         display->setPowerMode(mode);
265         return display;
266     }
267 
setInitialHwVsyncEnabledandroid::__anon4deda48a0111::DisplayPowerCase268     static void setInitialHwVsyncEnabled(DisplayTransactionTest* test, PhysicalDisplayId id,
269                                          bool enabled) {
270         test->mFlinger.scheduler()->setInitialHwVsyncEnabled(id, enabled);
271     }
272 
setupRepaintEverythingCallExpectationsandroid::__anon4deda48a0111::DisplayPowerCase273     static void setupRepaintEverythingCallExpectations(DisplayTransactionTest* test) {
274         EXPECT_CALL(*test->mFlinger.scheduler(), scheduleFrame()).Times(1);
275     }
276 
setupComposerCallExpectationsandroid::__anon4deda48a0111::DisplayPowerCase277     static void setupComposerCallExpectations(DisplayTransactionTest* test, PowerMode mode) {
278         // Any calls to get the active config will return a default value.
279         EXPECT_CALL(*test->mComposer, getActiveConfig(Display::HWC_DISPLAY_ID, _))
280                 .WillRepeatedly(DoAll(SetArgPointee<1>(Display::HWC_ACTIVE_CONFIG_ID),
281                                       Return(Error::NONE)));
282 
283         // Any calls to get whether the display supports dozing will return the value set by the
284         // policy variant.
285         EXPECT_CALL(*test->mComposer, getDozeSupport(Display::HWC_DISPLAY_ID, _))
286                 .WillRepeatedly(DoAll(SetArgPointee<1>(Doze::DOZE_SUPPORTED), Return(Error::NONE)));
287 
288         EXPECT_CALL(*test->mComposer, setPowerMode(Display::HWC_DISPLAY_ID, mode)).Times(1);
289     }
290 
setupNoComposerPowerModeCallExpectationsandroid::__anon4deda48a0111::DisplayPowerCase291     static void setupNoComposerPowerModeCallExpectations(DisplayTransactionTest* test) {
292         EXPECT_CALL(*test->mComposer, setPowerMode(Display::HWC_DISPLAY_ID, _)).Times(0);
293     }
294 };
295 
296 // A sample configuration for the primary display.
297 // In addition to having event thread support, we emulate doze support.
298 template <typename TransitionVariant>
299 using PrimaryDisplayPowerCase =
300         DisplayPowerCase<PrimaryDisplayVariant, DozeIsSupportedVariant<PrimaryDisplayVariant>,
301                          EventThreadIsSupportedVariant, DispSyncIsSupportedVariant,
302                          TransitionVariant>;
303 
304 // A sample configuration for the external display.
305 // In addition to not having event thread support, we emulate not having doze
306 // support.
307 // TODO (b/267483230): ExternalDisplay supports the features tracked in
308 // DispSyncIsSupportedVariant, but is the follower, so the
309 // expectations set by DispSyncIsSupportedVariant don't match (wrong schedule).
310 // We need a way to retrieve the proper DisplayId from
311 // setupResetModelCallExpectations (or pass it in).
312 template <typename TransitionVariant>
313 using ExternalDisplayPowerCase =
314         DisplayPowerCase<ExternalDisplayVariant, DozeNotSupportedVariant<ExternalDisplayVariant>,
315                          EventThreadNotSupportedVariant, DispSyncNotSupportedVariant,
316                          TransitionVariant>;
317 
318 class SetPowerModeInternalTest : public DisplayTransactionTest {
319 public:
320     template <typename Case>
321     void transitionDisplayCommon();
322 };
323 
324 template <PowerMode PowerMode>
325 struct PowerModeInitialVSyncEnabled : public std::false_type {};
326 
327 template <>
328 struct PowerModeInitialVSyncEnabled<PowerMode::ON> : public std::true_type {};
329 
330 template <>
331 struct PowerModeInitialVSyncEnabled<PowerMode::DOZE> : public std::true_type {};
332 
333 template <typename Case>
transitionDisplayCommon()334 void SetPowerModeInternalTest::transitionDisplayCommon() {
335     // --------------------------------------------------------------------
336     // Preconditions
337 
338     Case::Doze::setupComposerCallExpectations(this);
339     auto display =
340             Case::injectDisplayWithInitialPowerMode(this, Case::Transition::INITIAL_POWER_MODE);
341     auto displayId = display->getId();
342     if (auto physicalDisplayId = PhysicalDisplayId::tryCast(displayId)) {
343         Case::setInitialHwVsyncEnabled(this, *physicalDisplayId,
344                                        PowerModeInitialVSyncEnabled<
345                                                Case::Transition::INITIAL_POWER_MODE>::value);
346     }
347 
348     // --------------------------------------------------------------------
349     // Call Expectations
350 
351     Case::Transition::template setupCallExpectations<Case>(this);
352 
353     // --------------------------------------------------------------------
354     // Invocation
355 
356     mFlinger.setPowerModeInternal(display, Case::Transition::TARGET_POWER_MODE);
357 
358     // --------------------------------------------------------------------
359     // Postconditions
360 
361     Case::Transition::verifyPostconditions(this);
362 }
363 
TEST_F(SetPowerModeInternalTest,setPowerModeInternalDoesNothingIfNoChange)364 TEST_F(SetPowerModeInternalTest, setPowerModeInternalDoesNothingIfNoChange) {
365     using Case = SimplePrimaryDisplayCase;
366 
367     // --------------------------------------------------------------------
368     // Preconditions
369 
370     // A primary display device is set up
371     Case::Display::injectHwcDisplay(this);
372     auto display = Case::Display::makeFakeExistingDisplayInjector(this);
373     display.inject();
374 
375     // The display is already set to PowerMode::ON
376     display.mutableDisplayDevice()->setPowerMode(PowerMode::ON);
377 
378     // --------------------------------------------------------------------
379     // Invocation
380 
381     mFlinger.setPowerModeInternal(display.mutableDisplayDevice(), PowerMode::ON);
382 
383     // --------------------------------------------------------------------
384     // Postconditions
385 
386     EXPECT_EQ(PowerMode::ON, display.mutableDisplayDevice()->getPowerMode());
387 }
388 
TEST_F(SetPowerModeInternalTest,setPowerModeInternalDoesNothingIfVirtualDisplay)389 TEST_F(SetPowerModeInternalTest, setPowerModeInternalDoesNothingIfVirtualDisplay) {
390     using Case = HwcVirtualDisplayCase;
391 
392     // --------------------------------------------------------------------
393     // Preconditions
394 
395     // Insert display data so that the HWC thinks it created the virtual display.
396     const auto displayId = Case::Display::DISPLAY_ID::get();
397     ASSERT_TRUE(HalVirtualDisplayId::tryCast(displayId));
398     mFlinger.mutableHwcDisplayData().try_emplace(displayId);
399 
400     // A virtual display device is set up
401     Case::Display::injectHwcDisplay(this);
402     auto display = Case::Display::makeFakeExistingDisplayInjector(this);
403     display.inject();
404 
405     // The display is set to PowerMode::ON
406     display.mutableDisplayDevice()->setPowerMode(PowerMode::ON);
407 
408     // --------------------------------------------------------------------
409     // Invocation
410 
411     mFlinger.setPowerModeInternal(display.mutableDisplayDevice(), PowerMode::OFF);
412 
413     // --------------------------------------------------------------------
414     // Postconditions
415 
416     EXPECT_EQ(PowerMode::ON, display.mutableDisplayDevice()->getPowerMode());
417 }
418 
TEST_F(SetPowerModeInternalTest,transitionsDisplayFromOffToOnPrimaryDisplay)419 TEST_F(SetPowerModeInternalTest, transitionsDisplayFromOffToOnPrimaryDisplay) {
420     transitionDisplayCommon<PrimaryDisplayPowerCase<TransitionOffToOnVariant>>();
421 }
422 
TEST_F(SetPowerModeInternalTest,transitionsDisplayFromOffToDozeSuspendPrimaryDisplay)423 TEST_F(SetPowerModeInternalTest, transitionsDisplayFromOffToDozeSuspendPrimaryDisplay) {
424     transitionDisplayCommon<PrimaryDisplayPowerCase<TransitionOffToDozeSuspendVariant>>();
425 }
426 
TEST_F(SetPowerModeInternalTest,transitionsDisplayFromOnToOffPrimaryDisplay)427 TEST_F(SetPowerModeInternalTest, transitionsDisplayFromOnToOffPrimaryDisplay) {
428     transitionDisplayCommon<PrimaryDisplayPowerCase<TransitionOnToOffVariant>>();
429 }
430 
TEST_F(SetPowerModeInternalTest,transitionsDisplayFromDozeSuspendToOffPrimaryDisplay)431 TEST_F(SetPowerModeInternalTest, transitionsDisplayFromDozeSuspendToOffPrimaryDisplay) {
432     transitionDisplayCommon<PrimaryDisplayPowerCase<TransitionDozeSuspendToOffVariant>>();
433 }
434 
TEST_F(SetPowerModeInternalTest,transitionsDisplayFromOnToDozePrimaryDisplay)435 TEST_F(SetPowerModeInternalTest, transitionsDisplayFromOnToDozePrimaryDisplay) {
436     transitionDisplayCommon<PrimaryDisplayPowerCase<TransitionOnToDozeVariant>>();
437 }
438 
TEST_F(SetPowerModeInternalTest,transitionsDisplayFromDozeSuspendToDozePrimaryDisplay)439 TEST_F(SetPowerModeInternalTest, transitionsDisplayFromDozeSuspendToDozePrimaryDisplay) {
440     transitionDisplayCommon<PrimaryDisplayPowerCase<TransitionDozeSuspendToDozeVariant>>();
441 }
442 
TEST_F(SetPowerModeInternalTest,transitionsDisplayFromDozeToOnPrimaryDisplay)443 TEST_F(SetPowerModeInternalTest, transitionsDisplayFromDozeToOnPrimaryDisplay) {
444     transitionDisplayCommon<PrimaryDisplayPowerCase<TransitionDozeToOnVariant>>();
445 }
446 
TEST_F(SetPowerModeInternalTest,transitionsDisplayFromDozeSuspendToOnPrimaryDisplay)447 TEST_F(SetPowerModeInternalTest, transitionsDisplayFromDozeSuspendToOnPrimaryDisplay) {
448     transitionDisplayCommon<PrimaryDisplayPowerCase<TransitionDozeSuspendToOnVariant>>();
449 }
450 
TEST_F(SetPowerModeInternalTest,transitionsDisplayFromOnToDozeSuspendPrimaryDisplay)451 TEST_F(SetPowerModeInternalTest, transitionsDisplayFromOnToDozeSuspendPrimaryDisplay) {
452     transitionDisplayCommon<PrimaryDisplayPowerCase<TransitionOnToDozeSuspendVariant>>();
453 }
454 
TEST_F(SetPowerModeInternalTest,transitionsDisplayFromOnToUnknownPrimaryDisplay)455 TEST_F(SetPowerModeInternalTest, transitionsDisplayFromOnToUnknownPrimaryDisplay) {
456     transitionDisplayCommon<PrimaryDisplayPowerCase<TransitionOnToUnknownVariant>>();
457 }
458 
TEST_F(SetPowerModeInternalTest,transitionsDisplayFromOffToOnExternalDisplay)459 TEST_F(SetPowerModeInternalTest, transitionsDisplayFromOffToOnExternalDisplay) {
460     SET_FLAG_FOR_TEST(flags::multithreaded_present, true);
461     transitionDisplayCommon<ExternalDisplayPowerCase<TransitionOffToOnVariant>>();
462 }
463 
TEST_F(SetPowerModeInternalTest,transitionsDisplayFromOffToDozeSuspendExternalDisplay)464 TEST_F(SetPowerModeInternalTest, transitionsDisplayFromOffToDozeSuspendExternalDisplay) {
465     transitionDisplayCommon<ExternalDisplayPowerCase<TransitionOffToDozeSuspendVariant>>();
466 }
467 
TEST_F(SetPowerModeInternalTest,transitionsDisplayFromOnToOffExternalDisplay)468 TEST_F(SetPowerModeInternalTest, transitionsDisplayFromOnToOffExternalDisplay) {
469     SET_FLAG_FOR_TEST(flags::multithreaded_present, true);
470     transitionDisplayCommon<ExternalDisplayPowerCase<TransitionOnToOffVariant>>();
471 }
472 
TEST_F(SetPowerModeInternalTest,transitionsDisplayFromDozeSuspendToOffExternalDisplay)473 TEST_F(SetPowerModeInternalTest, transitionsDisplayFromDozeSuspendToOffExternalDisplay) {
474     transitionDisplayCommon<ExternalDisplayPowerCase<TransitionDozeSuspendToOffVariant>>();
475 }
476 
TEST_F(SetPowerModeInternalTest,transitionsDisplayFromOnToDozeExternalDisplay)477 TEST_F(SetPowerModeInternalTest, transitionsDisplayFromOnToDozeExternalDisplay) {
478     transitionDisplayCommon<ExternalDisplayPowerCase<TransitionOnToDozeVariant>>();
479 }
480 
TEST_F(SetPowerModeInternalTest,transitionsDisplayFromDozeSuspendToDozeExternalDisplay)481 TEST_F(SetPowerModeInternalTest, transitionsDisplayFromDozeSuspendToDozeExternalDisplay) {
482     SET_FLAG_FOR_TEST(flags::multithreaded_present, true);
483     transitionDisplayCommon<ExternalDisplayPowerCase<TransitionDozeSuspendToDozeVariant>>();
484 }
485 
TEST_F(SetPowerModeInternalTest,transitionsDisplayFromDozeToOnExternalDisplay)486 TEST_F(SetPowerModeInternalTest, transitionsDisplayFromDozeToOnExternalDisplay) {
487     transitionDisplayCommon<ExternalDisplayPowerCase<TransitionDozeToOnVariant>>();
488 }
489 
TEST_F(SetPowerModeInternalTest,transitionsDisplayFromDozeSuspendToOnExternalDisplay)490 TEST_F(SetPowerModeInternalTest, transitionsDisplayFromDozeSuspendToOnExternalDisplay) {
491     SET_FLAG_FOR_TEST(flags::multithreaded_present, true);
492     transitionDisplayCommon<ExternalDisplayPowerCase<TransitionDozeSuspendToOnVariant>>();
493 }
494 
TEST_F(SetPowerModeInternalTest,transitionsDisplayFromOnToDozeSuspendExternalDisplay)495 TEST_F(SetPowerModeInternalTest, transitionsDisplayFromOnToDozeSuspendExternalDisplay) {
496     SET_FLAG_FOR_TEST(flags::multithreaded_present, true);
497     transitionDisplayCommon<ExternalDisplayPowerCase<TransitionOnToDozeSuspendVariant>>();
498 }
499 
TEST_F(SetPowerModeInternalTest,transitionsDisplayFromOnToUnknownExternalDisplay)500 TEST_F(SetPowerModeInternalTest, transitionsDisplayFromOnToUnknownExternalDisplay) {
501     transitionDisplayCommon<ExternalDisplayPowerCase<TransitionOnToUnknownVariant>>();
502 }
503 
504 } // namespace
505 } // namespace android
506