1 /*
2 * Copyright (C) 2019 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 // TODO(b/129481165): remove the #pragma below and fix conversion issues
18 #pragma clang diagnostic push
19 #pragma clang diagnostic ignored "-Wconversion"
20
21 #include <gui/BufferItemConsumer.h>
22 #include <private/android_filesystem_config.h>
23 #include "TransactionTestHarnesses.h"
24
25 namespace android {
26
27 using android::hardware::graphics::common::V1_1::BufferUsage;
28
29 class LayerTypeTransactionTest : public LayerTypeTransactionHarness,
30 public ::testing::WithParamInterface<uint32_t> {
31 public:
LayerTypeTransactionTest()32 LayerTypeTransactionTest() : LayerTypeTransactionHarness(GetParam()) {}
33 };
34
35 ::testing::Environment* const binderEnv =
36 ::testing::AddGlobalTestEnvironment(new BinderEnvironment());
37
38 INSTANTIATE_TEST_CASE_P(
39 LayerTypeTransactionTests, LayerTypeTransactionTest,
40 ::testing::Values(static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferQueue),
41 static_cast<uint32_t>(ISurfaceComposerClient::eFXSurfaceBufferState)));
42
TEST_P(LayerTypeTransactionTest,SetRelativeZNegative)43 TEST_P(LayerTypeTransactionTest, SetRelativeZNegative) {
44 sp<SurfaceControl> parent =
45 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
46 ISurfaceComposerClient::eFXSurfaceContainer);
47 Transaction().setCrop(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply();
48 sp<SurfaceControl> layerR;
49 sp<SurfaceControl> layerG;
50 sp<SurfaceControl> layerB;
51 ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
52 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED, 32, 32));
53 ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
54 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN, 32, 32));
55 ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test B", 32, 32));
56 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerB, Color::BLUE, 32, 32));
57
58 Transaction().reparent(layerB, parent).apply();
59
60 // layerR = mLayerZBase, layerG = layerR - 1, layerB = -2
61 Transaction().setRelativeLayer(layerG, layerR, -1).setLayer(layerB, -2).apply();
62
63 std::unique_ptr<ScreenCapture> screenshot;
64 // only layerB is in this range
65 LayerCaptureArgs captureArgs;
66 captureArgs.layerHandle = parent->getHandle();
67 captureArgs.sourceCrop = {0, 0, 32, 32};
68 ScreenCapture::captureLayers(&screenshot, captureArgs);
69 screenshot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
70 }
71
TEST_P(LayerTypeTransactionTest,SetLayerAndRelative)72 TEST_P(LayerTypeTransactionTest, SetLayerAndRelative) {
73 sp<SurfaceControl> parent =
74 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
75 ISurfaceComposerClient::eFXSurfaceEffect);
76
77 sp<SurfaceControl> childLayer;
78 ASSERT_NO_FATAL_FAILURE(
79 childLayer = LayerTransactionTest::createLayer("childLayer", 0 /* buffer width */,
80 0 /* buffer height */,
81 ISurfaceComposerClient::eFXSurfaceEffect,
82 parent.get()));
83 Transaction()
84 .setColor(childLayer, half3{1.0f, 0.0f, 0.0f})
85 .setColor(parent, half3{0.0f, 0.0f, 0.0f})
86 .show(childLayer)
87 .show(parent)
88 .setCrop(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight))
89 .setCrop(childLayer, Rect(0, 0, 20, 30))
90 .apply();
91
92 Transaction().setRelativeLayer(childLayer, parent, -1).setLayer(childLayer, 1).apply();
93
94 {
95 SCOPED_TRACE("setLayer above");
96 // Set layer should get applied and place the child above.
97 std::unique_ptr<ScreenCapture> screenshot;
98 ScreenCapture::captureScreen(&screenshot);
99 screenshot->expectColor(Rect(0, 0, 20, 30), Color::RED);
100 }
101
102 Transaction().setLayer(childLayer, 1).setRelativeLayer(childLayer, parent, -1).apply();
103
104 {
105 SCOPED_TRACE("setRelative below");
106 // Set relative layer should get applied and place the child below.
107 std::unique_ptr<ScreenCapture> screenshot;
108 ScreenCapture::captureScreen(&screenshot);
109 screenshot->expectColor(Rect(0, 0, 20, 30), Color::BLACK);
110 }
111 }
112
TEST_P(LayerTypeTransactionTest,HideRelativeParentHidesLayer)113 TEST_P(LayerTypeTransactionTest, HideRelativeParentHidesLayer) {
114 sp<SurfaceControl> parent =
115 LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */,
116 ISurfaceComposerClient::eFXSurfaceEffect);
117 sp<SurfaceControl> relativeParent =
118 LayerTransactionTest::createLayer("RelativeParent", 0 /* buffer width */,
119 0 /* buffer height */,
120 ISurfaceComposerClient::eFXSurfaceEffect);
121
122 sp<SurfaceControl> childLayer;
123 ASSERT_NO_FATAL_FAILURE(
124 childLayer = LayerTransactionTest::createLayer("childLayer", 0 /* buffer width */,
125 0 /* buffer height */,
126 ISurfaceComposerClient::eFXSurfaceEffect,
127 parent.get()));
128 Transaction()
129 .setColor(childLayer, half3{1.0f, 0.0f, 0.0f})
130 .setColor(parent, half3{0.0f, 0.0f, 0.0f})
131 .setColor(relativeParent, half3{0.0f, 1.0f, 0.0f})
132 .show(childLayer)
133 .show(parent)
134 .show(relativeParent)
135 .setLayer(parent, mLayerZBase - 1)
136 .setLayer(relativeParent, mLayerZBase)
137 .apply();
138
139 Transaction().setRelativeLayer(childLayer, relativeParent, 1).apply();
140
141 {
142 SCOPED_TRACE("setLayer above");
143 // Set layer should get applied and place the child above.
144 std::unique_ptr<ScreenCapture> screenshot;
145 ScreenCapture::captureScreen(&screenshot);
146 screenshot->expectColor(Rect(0, 0, 20, 30), Color::RED);
147 }
148
149 Transaction().hide(relativeParent).apply();
150
151 {
152 SCOPED_TRACE("hide relative parent");
153 // The relative should no longer be visible.
154 std::unique_ptr<ScreenCapture> screenshot;
155 ScreenCapture::captureScreen(&screenshot);
156 screenshot->expectColor(Rect(0, 0, 20, 30), Color::BLACK);
157 }
158 }
159
TEST_P(LayerTypeTransactionTest,SetFlagsSecure)160 TEST_P(LayerTypeTransactionTest, SetFlagsSecure) {
161 sp<SurfaceControl> layer;
162 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
163 ASSERT_NO_FATAL_FAILURE(fillLayerColor(layer, Color::RED, 32, 32));
164
165 sp<GraphicBuffer> outBuffer;
166 Transaction()
167 .setFlags(layer, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure)
168 .apply(true);
169
170 DisplayCaptureArgs args;
171 args.displayToken = mDisplay;
172
173 ScreenCaptureResults captureResults;
174 {
175 // Ensure the UID is not root because root has all permissions
176 UIDFaker f(AID_APP_START);
177 ASSERT_EQ(PERMISSION_DENIED, ScreenCapture::captureDisplay(args, captureResults));
178 }
179
180 Transaction().setFlags(layer, 0, layer_state_t::eLayerSecure).apply(true);
181 ASSERT_EQ(NO_ERROR, ScreenCapture::captureDisplay(args, captureResults));
182 }
183
TEST_P(LayerTypeTransactionTest,RefreshRateIsInitialized)184 TEST_P(LayerTypeTransactionTest, RefreshRateIsInitialized) {
185 sp<SurfaceControl> layer;
186 ASSERT_NO_FATAL_FAILURE(layer = createLayer("test", 32, 32));
187
188 sp<IBinder> handle = layer->getHandle();
189 ASSERT_TRUE(handle != nullptr);
190
191 FrameStats frameStats;
192 mClient->getLayerFrameStats(handle, &frameStats);
193
194 ASSERT_GT(frameStats.refreshPeriodNano, static_cast<nsecs_t>(0));
195 }
196
197 } // namespace android
198
199 // TODO(b/129481165): remove the #pragma below and fix conversion issues
200 #pragma clang diagnostic pop // ignored "-Wconversion"
201