blob: b17b52979388845597f43c31fbada01b861657c9 [file] [log] [blame]
Leon Scroggins III85d4b222023-05-09 13:58:18 -04001/*
2 * Copyright 2023 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
Dominik Laskowskia42d5392022-09-29 14:26:53 -040020#include "DualDisplayTransactionTest.h"
Leon Scroggins III85d4b222023-05-09 13:58:18 -040021
22#include <gmock/gmock.h>
23#include <gtest/gtest.h>
24
25namespace android {
26namespace {
27
Dominik Laskowskia42d5392022-09-29 14:26:53 -040028struct ActiveDisplayRotationFlagsTest
29 : DualDisplayTransactionTest<hal::PowerMode::ON, hal::PowerMode::OFF> {
Leon Scroggins III85d4b222023-05-09 13:58:18 -040030 void SetUp() override {
Dominik Laskowskia42d5392022-09-29 14:26:53 -040031 DualDisplayTransactionTest::SetUp();
Leon Scroggins III85d4b222023-05-09 13:58:18 -040032
33 // The flags are a static variable, so by modifying them in the test, we
34 // are modifying the real ones used by SurfaceFlinger. Save the original
35 // flags so we can restore them on teardown. This isn't perfect - the
36 // phone may have been rotated during the test, so we're restoring the
37 // wrong flags. But if the phone is rotated, this may also fail the test.
38 mOldRotationFlags = mFlinger.mutableActiveDisplayRotationFlags();
39
40 // Reset to the expected default state.
41 mFlinger.mutableActiveDisplayRotationFlags() = ui::Transform::ROT_0;
42 }
43
44 void TearDown() override { mFlinger.mutableActiveDisplayRotationFlags() = mOldRotationFlags; }
45
Leon Scroggins III85d4b222023-05-09 13:58:18 -040046 ui::Transform::RotationFlags mOldRotationFlags;
47};
48
49TEST_F(ActiveDisplayRotationFlagsTest, defaultRotation) {
50 ASSERT_EQ(ui::Transform::ROT_0, SurfaceFlinger::getActiveDisplayRotationFlags());
51}
52
53TEST_F(ActiveDisplayRotationFlagsTest, rotate90) {
54 auto displayToken = mInnerDisplay->getDisplayToken().promote();
55 mFlinger.mutableDrawingState().displays.editValueFor(displayToken).orientation = ui::ROTATION_0;
56 mFlinger.mutableCurrentState().displays.editValueFor(displayToken).orientation =
57 ui::ROTATION_90;
58
59 mFlinger.commitTransactionsLocked(eDisplayTransactionNeeded);
60 ASSERT_EQ(ui::Transform::ROT_90, SurfaceFlinger::getActiveDisplayRotationFlags());
61}
62
Leon Scroggins III9b65fe52023-05-11 13:57:27 -040063TEST_F(ActiveDisplayRotationFlagsTest, rotate90inactive) {
Leon Scroggins III85d4b222023-05-09 13:58:18 -040064 auto displayToken = mOuterDisplay->getDisplayToken().promote();
65 mFlinger.mutableDrawingState().displays.editValueFor(displayToken).orientation = ui::ROTATION_0;
66 mFlinger.mutableCurrentState().displays.editValueFor(displayToken).orientation =
67 ui::ROTATION_90;
68
69 mFlinger.commitTransactionsLocked(eDisplayTransactionNeeded);
70 ASSERT_EQ(ui::Transform::ROT_0, SurfaceFlinger::getActiveDisplayRotationFlags());
71}
72
Leon Scroggins III9b65fe52023-05-11 13:57:27 -040073TEST_F(ActiveDisplayRotationFlagsTest, rotateBothInnerActive) {
Leon Scroggins III85d4b222023-05-09 13:58:18 -040074 auto displayToken = mInnerDisplay->getDisplayToken().promote();
75 mFlinger.mutableDrawingState().displays.editValueFor(displayToken).orientation = ui::ROTATION_0;
76 mFlinger.mutableCurrentState().displays.editValueFor(displayToken).orientation =
77 ui::ROTATION_180;
78
79 displayToken = mOuterDisplay->getDisplayToken().promote();
80 mFlinger.mutableDrawingState().displays.editValueFor(displayToken).orientation = ui::ROTATION_0;
81 mFlinger.mutableCurrentState().displays.editValueFor(displayToken).orientation =
82 ui::ROTATION_270;
83
84 mFlinger.commitTransactionsLocked(eDisplayTransactionNeeded);
85 ASSERT_EQ(ui::Transform::ROT_180, SurfaceFlinger::getActiveDisplayRotationFlags());
86}
87
Leon Scroggins III9b65fe52023-05-11 13:57:27 -040088TEST_F(ActiveDisplayRotationFlagsTest, rotateBothOuterActive) {
Leon Scroggins III85d4b222023-05-09 13:58:18 -040089 mFlinger.mutableActiveDisplayId() = kOuterDisplayId;
90 auto displayToken = mInnerDisplay->getDisplayToken().promote();
91 mFlinger.mutableDrawingState().displays.editValueFor(displayToken).orientation = ui::ROTATION_0;
92 mFlinger.mutableCurrentState().displays.editValueFor(displayToken).orientation =
93 ui::ROTATION_180;
94
95 displayToken = mOuterDisplay->getDisplayToken().promote();
96 mFlinger.mutableDrawingState().displays.editValueFor(displayToken).orientation = ui::ROTATION_0;
97 mFlinger.mutableCurrentState().displays.editValueFor(displayToken).orientation =
98 ui::ROTATION_270;
99
100 mFlinger.commitTransactionsLocked(eDisplayTransactionNeeded);
101 ASSERT_EQ(ui::Transform::ROT_270, SurfaceFlinger::getActiveDisplayRotationFlags());
102}
103
104TEST_F(ActiveDisplayRotationFlagsTest, onActiveDisplayChanged) {
105 auto displayToken = mInnerDisplay->getDisplayToken().promote();
106 mFlinger.mutableDrawingState().displays.editValueFor(displayToken).orientation = ui::ROTATION_0;
107 mFlinger.mutableCurrentState().displays.editValueFor(displayToken).orientation =
108 ui::ROTATION_180;
109
110 displayToken = mOuterDisplay->getDisplayToken().promote();
111 mFlinger.mutableDrawingState().displays.editValueFor(displayToken).orientation = ui::ROTATION_0;
112 mFlinger.mutableCurrentState().displays.editValueFor(displayToken).orientation =
113 ui::ROTATION_270;
114
115 mFlinger.commitTransactionsLocked(eDisplayTransactionNeeded);
116 ASSERT_EQ(ui::Transform::ROT_180, SurfaceFlinger::getActiveDisplayRotationFlags());
117
118 mFlinger.onActiveDisplayChanged(mInnerDisplay.get(), *mOuterDisplay);
119 ASSERT_EQ(ui::Transform::ROT_270, SurfaceFlinger::getActiveDisplayRotationFlags());
120}
121
122} // namespace
123} // namespace android