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