blob: dbce9d5d04c8cea03ea137e190774f66a92e6ec3 [file] [log] [blame]
Marissa Wall4d600052016-12-15 12:16:01 -08001/*
2 * Copyright (C) 2016 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#include <array>
Marissa Wallcfb9a072017-02-17 20:53:18 -080018#include <unordered_set>
Marissa Wall4d600052016-12-15 12:16:01 -080019#include <gtest/gtest.h>
20#include <dlfcn.h>
21#include <hardware/hardware.h>
22
23#define HWC2_INCLUDE_STRINGIFICATION
24#define HWC2_USE_CPP11
25#include <hardware/hwcomposer2.h>
26#undef HWC2_INCLUDE_STRINGIFICATION
27#undef HWC2_USE_CPP11
28
Marissa Wall6bd8bfd2016-12-15 12:25:31 -080029#include "Hwc2TestLayer.h"
30
Marissa Wallcfb9a072017-02-17 20:53:18 -080031void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
32 hwc2_display_t display, int32_t connected);
Marissa Wall572a1ee2016-12-15 12:24:13 -080033void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
34 hwc2_display_t display, int64_t timestamp);
Marissa Wallcfb9a072017-02-17 20:53:18 -080035
Marissa Wall4d600052016-12-15 12:16:01 -080036class Hwc2Test : public testing::Test {
37public:
38
39 virtual void SetUp()
40 {
41 hw_module_t const* hwc2Module;
42
43 int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
44 ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
45 << strerror(-err);
46
47 /* The following method will fail if you have not run
48 * "adb shell stop" */
49 err = hwc2_open(hwc2Module, &mHwc2Device);
50 ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
51 << strerror(-err);
Marissa Wallcfb9a072017-02-17 20:53:18 -080052
53 populateDisplays();
Marissa Wall4d600052016-12-15 12:16:01 -080054 }
55
56 virtual void TearDown()
57 {
Marissa Wall1db2e372016-12-15 12:19:39 -080058
59 for (auto itr = mLayers.begin(); itr != mLayers.end();) {
60 hwc2_display_t display = itr->first;
61 hwc2_layer_t layer = itr->second;
62 itr++;
63 /* Destroys and removes the layer from mLayers */
64 destroyLayer(display, layer);
65 }
66
Marissa Wall03c91732016-12-15 12:23:16 -080067 for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) {
68 hwc2_display_t display = *itr;
69 itr++;
70 /* Sets power mode to off and removes the display from
71 * mActiveDisplays */
72 setPowerMode(display, HWC2_POWER_MODE_OFF);
73 }
74
Marissa Wall4d600052016-12-15 12:16:01 -080075 if (mHwc2Device)
76 hwc2_close(mHwc2Device);
77 }
78
Marissa Walla4b01482017-02-17 20:52:03 -080079 void registerCallback(hwc2_callback_descriptor_t descriptor,
80 hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
81 hwc2_error_t* outErr = nullptr)
82 {
83 auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
84 getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
85 ASSERT_TRUE(pfn) << "failed to get function";
86
87 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
88 callbackData, pointer));
89 if (outErr) {
90 *outErr = err;
91 } else {
92 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
93 }
94 }
95
Marissa Wallcfb9a072017-02-17 20:53:18 -080096 void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
97 hwc2_error_t* outErr = nullptr)
98 {
99 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
100 getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
101 ASSERT_TRUE(pfn) << "failed to get function";
102
103 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
104 reinterpret_cast<int32_t*>(outType)));
105 if (outErr) {
106 *outErr = err;
107 } else {
108 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
109 }
110 }
111
112 /* If the populateDisplays function is still receiving displays and the
113 * display is connected, the display handle is stored in mDisplays. */
114 void hotplugCallback(hwc2_display_t display, int32_t connected)
115 {
116 std::lock_guard<std::mutex> lock(mHotplugMutex);
117
118 if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
119 return;
120
121 if (connected == HWC2_CONNECTION_CONNECTED)
122 mDisplays.insert(display);
123
124 mHotplugCv.notify_all();
125 }
126
Marissa Wall1db2e372016-12-15 12:19:39 -0800127 void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
128 hwc2_error_t* outErr = nullptr)
129 {
130 auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
131 getFunction(HWC2_FUNCTION_CREATE_LAYER));
132 ASSERT_TRUE(pfn) << "failed to get function";
133
134 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
135 outLayer));
136
137 if (err == HWC2_ERROR_NONE)
138 mLayers.insert(std::make_pair(display, *outLayer));
139
140 if (outErr) {
141 *outErr = err;
142 } else {
143 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
144 }
145 }
146
147 void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
148 hwc2_error_t* outErr = nullptr)
149 {
150 auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
151 getFunction(HWC2_FUNCTION_DESTROY_LAYER));
152 ASSERT_TRUE(pfn) << "failed to get function";
153
154 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
155
156 if (err == HWC2_ERROR_NONE)
157 mLayers.erase(std::make_pair(display, layer));
158
159 if (outErr) {
160 *outErr = err;
161 } else {
162 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
163 << layer;
164 }
165 }
166
Marissa Wallcf935cb2016-12-15 12:20:47 -0800167 void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
168 hwc2_attribute_t attribute, int32_t* outValue,
169 hwc2_error_t* outErr = nullptr)
170 {
171 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
172 getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
173 ASSERT_TRUE(pfn) << "failed to get function";
174
175 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
176 attribute, outValue));
177
178 if (outErr) {
179 *outErr = err;
180 } else {
181 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
182 << getAttributeName(attribute) << " for config " << config;
183 }
184 }
185
186 void getDisplayConfigs(hwc2_display_t display,
187 std::vector<hwc2_config_t>* outConfigs,
188 hwc2_error_t* outErr = nullptr)
189 {
190 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
191 getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
192 ASSERT_TRUE(pfn) << "failed to get function";
193
194 uint32_t numConfigs = 0;
195
196 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
197 &numConfigs, nullptr));
198
199 if (err == HWC2_ERROR_NONE) {
200 outConfigs->resize(numConfigs);
201
202 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
203 &numConfigs, outConfigs->data()));
204 }
205
206 if (outErr) {
207 *outErr = err;
208 } else {
209 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
210 " display " << display;
211 }
212 }
213
Marissa Wall93dc04f2016-12-15 12:21:46 -0800214 void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig,
215 hwc2_error_t* outErr = nullptr)
216 {
217 auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>(
218 getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG));
219 ASSERT_TRUE(pfn) << "failed to get function";
220
221 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
222 outConfig));
223 if (outErr) {
224 *outErr = err;
225 } else {
226 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on"
227 " display " << display;
228 }
229 }
230
231 void setActiveConfig(hwc2_display_t display, hwc2_config_t config,
232 hwc2_error_t* outErr = nullptr)
233 {
234 auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>(
235 getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG));
236 ASSERT_TRUE(pfn) << "failed to get function";
237
238 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config));
239 if (outErr) {
240 *outErr = err;
241 } else {
242 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config "
243 << config;
244 }
245 }
246
Marissa Wall03c91732016-12-15 12:23:16 -0800247 void getDozeSupport(hwc2_display_t display, int32_t* outSupport,
248 hwc2_error_t* outErr = nullptr)
249 {
250 auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>(
251 getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT));
252 ASSERT_TRUE(pfn) << "failed to get function";
253
254 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
255 outSupport));
256 if (outErr) {
257 *outErr = err;
258 } else {
259 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on"
260 " display " << display;
261 }
262 }
263
264 void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode,
265 hwc2_error_t* outErr = nullptr)
266 {
267 auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>(
268 getFunction(HWC2_FUNCTION_SET_POWER_MODE));
269 ASSERT_TRUE(pfn) << "failed to get function";
270
271 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
272 mode));
273 if (outErr) {
274 *outErr = err;
275 if (err != HWC2_ERROR_NONE)
276 return;
277 } else {
278 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode "
279 << getPowerModeName(mode) << " on display " << display;
280 }
281
282 if (mode == HWC2_POWER_MODE_OFF) {
283 mActiveDisplays.erase(display);
284 } else {
285 mActiveDisplays.insert(display);
286 }
287 }
288
Marissa Wall572a1ee2016-12-15 12:24:13 -0800289 void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled,
290 hwc2_error_t* outErr = nullptr)
291 {
292 auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>(
293 getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED));
294 ASSERT_TRUE(pfn) << "failed to get function";
295
296 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
297 enabled));
298 if (outErr) {
299 *outErr = err;
300 } else {
301 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled "
302 << getVsyncName(enabled);
303 }
304 }
305
306 void vsyncCallback(hwc2_display_t display, int64_t timestamp)
307 {
308 std::lock_guard<std::mutex> lock(mVsyncMutex);
309 mVsyncDisplay = display;
310 mVsyncTimestamp = timestamp;
311 mVsyncCv.notify_all();
312 }
313
Marissa Walldd4087f2016-12-15 12:24:52 -0800314 void getDisplayName(hwc2_display_t display, std::string* outName,
315 hwc2_error_t* outErr = nullptr)
316 {
317 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_NAME>(
318 getFunction(HWC2_FUNCTION_GET_DISPLAY_NAME));
319 ASSERT_TRUE(pfn) << "failed to get function";
320
321 uint32_t size = 0;
322
323 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
324 nullptr));
325
326 if (err == HWC2_ERROR_NONE) {
327 std::vector<char> name(size);
328
329 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
330 name.data()));
331
332 outName->assign(name.data());
333 }
334
335 if (outErr) {
336 *outErr = err;
337 } else {
338 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display name for "
339 << display;
340 }
341 }
342
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800343 void setLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer,
344 hwc2_composition_t composition, hwc2_error_t* outErr = nullptr)
345 {
346 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
347 getFunction(HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE));
348 ASSERT_TRUE(pfn) << "failed to get function";
349
350 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
351 composition));
352 if (outErr) {
353 *outErr = err;
354 } else {
355 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer composition"
356 " type " << getCompositionName(composition);
357 }
358 }
359
Marissa Wallffc67da2016-12-15 12:26:09 -0800360 void setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer,
361 hwc2_blend_mode_t mode, hwc2_error_t* outErr = nullptr)
362 {
363 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BLEND_MODE>(
364 getFunction(HWC2_FUNCTION_SET_LAYER_BLEND_MODE));
365 ASSERT_TRUE(pfn) << "failed to get function";
366
367 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
368 mode));
369 if (outErr) {
370 *outErr = err;
371 } else {
372 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer blend mode "
373 << getBlendModeName(mode);
374 }
375 }
376
Marissa Wallb72b5c92016-12-15 12:26:39 -0800377 void setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer,
378 android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
379 {
380 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DATASPACE>(
381 getFunction(HWC2_FUNCTION_SET_LAYER_DATASPACE));
382 ASSERT_TRUE(pfn) << "failed to get function";
383
384 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
385 layer, dataspace));
386 if (outErr) {
387 *outErr = err;
388 } else {
389 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer dataspace";
390 }
391 }
392
Marissa Wall2b1f5302016-12-15 12:27:20 -0800393 void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer,
394 float alpha, hwc2_error_t* outErr = nullptr)
395 {
396 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
397 getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA));
398 ASSERT_TRUE(pfn) << "failed to get function";
399
400 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
401 alpha));
402 if (outErr) {
403 *outErr = err;
404 } else {
405 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha "
406 << alpha;
407 }
408 }
409
Marissa Wallac108192016-12-15 12:27:48 -0800410 void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
411 hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
412 {
413 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
414 getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
415 ASSERT_TRUE(pfn) << "failed to get function";
416
417 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
418 transform));
419 if (outErr) {
420 *outErr = err;
421 } else {
422 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
423 << getTransformName(transform);
424 }
425 }
426
Marissa Wall4d600052016-12-15 12:16:01 -0800427protected:
428 hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
429 {
430 return mHwc2Device->getFunction(mHwc2Device, descriptor);
431 }
432
433 void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
434 {
435 uint32_t num = 0;
436
437 mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
438
439 outCapabilities->resize(num);
440
441 mHwc2Device->getCapabilities(mHwc2Device, &num,
442 reinterpret_cast<int32_t*>(outCapabilities->data()));
443 }
444
Marissa Wallcfb9a072017-02-17 20:53:18 -0800445 /* Registers a hotplug callback and waits for hotplug callbacks. This
446 * function will have no effect if called more than once. */
447 void populateDisplays()
448 {
449 /* Sets the hotplug status to receiving */
450 {
451 std::lock_guard<std::mutex> lock(mHotplugMutex);
452
453 if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
454 return;
455 mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
456 }
457
458 /* Registers the callback. This function call cannot be locked because
459 * a callback could happen on the same thread */
460 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
461 reinterpret_cast<hwc2_function_pointer_t>(
462 hwc2TestHotplugCallback)));
463
464 /* Waits for hotplug events. If a hotplug event has not come within 1
465 * second, stop waiting. */
466 std::unique_lock<std::mutex> lock(mHotplugMutex);
467
468 while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
469 std::cv_status::timeout) { }
470
471 /* Sets the hotplug status to done. Future calls will have no effect */
472 mHotplugStatus = Hwc2TestHotplugStatus::Done;
473 }
474
475 void getBadDisplay(hwc2_display_t* outDisplay)
476 {
477 for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
478 if (mDisplays.count(display) == 0) {
479 *outDisplay = display;
480 return;
481 }
482 }
483 ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
484 " are registered. This should never happen.";
485 }
486
Marissa Wall1db2e372016-12-15 12:19:39 -0800487 /* NOTE: will create min(newlayerCnt, max supported layers) layers */
488 void createLayers(hwc2_display_t display,
489 std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
490 {
491 std::vector<hwc2_layer_t> newLayers;
492 hwc2_layer_t layer;
493 hwc2_error_t err = HWC2_ERROR_NONE;
494
495 for (size_t i = 0; i < newLayerCnt; i++) {
496
497 EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
498 if (err == HWC2_ERROR_NO_RESOURCES)
499 break;
500 if (err != HWC2_ERROR_NONE) {
501 newLayers.clear();
502 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
503 }
504 newLayers.push_back(layer);
505 }
506
507 *outLayers = std::move(newLayers);
508 }
509
510 void destroyLayers(hwc2_display_t display,
511 std::vector<hwc2_layer_t>&& layers)
512 {
513 for (hwc2_layer_t layer : layers) {
514 EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
515 }
516 }
517
Marissa Wallcf935cb2016-12-15 12:20:47 -0800518 void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
519 {
520 std::vector<hwc2_config_t> configs;
521
522 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
523
524 hwc2_config_t CONFIG_MAX = UINT32_MAX;
525
526 ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
527 " (2^32 values) has been taken which shouldn't happen";
528
529 hwc2_config_t config;
530 for (config = 0; config < CONFIG_MAX; config++) {
531 if (std::count(configs.begin(), configs.end(), config) == 0)
532 break;
533 }
534
535 *outConfig = config;
536 }
537
Marissa Wall572a1ee2016-12-15 12:24:13 -0800538 void enableVsync(hwc2_display_t display)
539 {
540 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
541 reinterpret_cast<hwc2_function_pointer_t>(
542 hwc2TestVsyncCallback)));
543 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
544 }
545
546 void disableVsync(hwc2_display_t display)
547 {
548 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
549 }
550
551 void waitForVsync(hwc2_display_t* outDisplay = nullptr,
552 int64_t* outTimestamp = nullptr)
553 {
554 std::unique_lock<std::mutex> lock(mVsyncMutex);
555 ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
556 std::cv_status::no_timeout) << "timed out attempting to get"
557 " vsync callback";
558 if (outDisplay)
559 *outDisplay = mVsyncDisplay;
560 if (outTimestamp)
561 *outTimestamp = mVsyncTimestamp;
562 }
563
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800564 /* Calls a set property function from Hwc2Test to set a property value from
565 * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
566 using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
567 hwc2_display_t display, hwc2_layer_t layer,
568 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr);
569
570 /* Calls a set property function from Hwc2Test to set a bad property value
571 * on hwc2_layer_t on hwc2_display_t */
572 using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
573 hwc2_display_t display, hwc2_layer_t layer,
574 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr);
575
576 /* Calls a set property function from Hwc2Test to set a bad property value
577 * on hwc2_layer_t on hwc2_display_t */
578 using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
579 hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
580
581 /* Advances a property of Hwc2TestLayer */
582 using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
583
584 /* For each active display it cycles through each display config and tests
585 * each property value. It creates a layer, sets the property and then
586 * destroys the layer */
587 void setLayerProperty(Hwc2TestCoverage coverage,
588 TestLayerPropertyFunction function, AdvanceProperty advance)
589 {
590 for (auto display : mDisplays) {
591 std::vector<hwc2_config_t> configs;
592
593 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
594
595 for (auto config : configs) {
596 hwc2_layer_t layer;
597
598 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
599 Hwc2TestLayer testLayer(coverage);
600
601 do {
602 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
603
604 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
605 testLayer, nullptr));
606
607 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
608 } while (advance(&testLayer));
609 }
610 }
611 }
612
613 /* For each active display it cycles through each display config and tests
614 * each property value. It creates a layer, cycles through each property
615 * value and updates the layer property value and then destroys the layer */
616 void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
617 TestLayerPropertyFunction function, AdvanceProperty advance)
618 {
619 for (auto display : mDisplays) {
620 std::vector<hwc2_config_t> configs;
621
622 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
623
624 for (auto config : configs) {
625 hwc2_layer_t layer;
626
627 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
628 Hwc2TestLayer testLayer(coverage);
629
630 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
631
632 do {
633 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
634 testLayer, nullptr));
635 } while (advance(&testLayer));
636
637 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
638 }
639 }
640 }
641
642 /* For each active display it cycles through each display config.
643 * 1) It attempts to set a valid property value to bad layer handle.
644 * 2) It creates a layer x and attempts to set a valid property value to
645 * layer x + 1
646 * 3) It destroys the layer x and attempts to set a valid property value to
647 * the destroyed layer x.
648 */
649 void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
650 TestLayerPropertyBadLayerFunction function)
651 {
652 for (auto display : mDisplays) {
653 std::vector<hwc2_config_t> configs;
654
655 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
656
657 for (auto config : configs) {
658 hwc2_layer_t layer = 0;
659 hwc2_error_t err = HWC2_ERROR_NONE;
660
661 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
662 Hwc2TestLayer testLayer(coverage);
663
664 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
665 testLayer, &err));
666 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
667
668 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
669
670 ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
671 testLayer, &err));
672 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
673
674 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
675
676 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
677 testLayer, &err));
678 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
679 }
680 }
681 }
682
683 /* For each active display it cycles through each display config and tests
684 * each property value. It creates a layer, sets a bad property value and
685 * then destroys the layer */
686 void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
687 {
688 for (auto display : mDisplays) {
689 std::vector<hwc2_config_t> configs;
690
691 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
692
693 for (auto config : configs) {
694 hwc2_layer_t layer;
695 hwc2_error_t err = HWC2_ERROR_NONE;
696
697 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
698
699 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
700
701 ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
702 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
703 " error code";
704
705 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
706 }
707 }
708 }
709
Marissa Wall4d600052016-12-15 12:16:01 -0800710 hwc2_device_t* mHwc2Device = nullptr;
Marissa Wallcfb9a072017-02-17 20:53:18 -0800711
712 enum class Hwc2TestHotplugStatus {
713 Init = 1,
714 Receiving,
715 Done,
716 };
717
718 std::mutex mHotplugMutex;
719 std::condition_variable mHotplugCv;
720 Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
721 std::unordered_set<hwc2_display_t> mDisplays;
Marissa Wall1db2e372016-12-15 12:19:39 -0800722
723 /* Store all created layers that have not been destroyed. If an ASSERT_*
724 * fails, then destroy the layers on exit */
725 std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
Marissa Wall03c91732016-12-15 12:23:16 -0800726
727 /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
728 * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
729 std::set<hwc2_display_t> mActiveDisplays;
Marissa Wall572a1ee2016-12-15 12:24:13 -0800730
731 std::mutex mVsyncMutex;
732 std::condition_variable mVsyncCv;
733 hwc2_display_t mVsyncDisplay;
734 int64_t mVsyncTimestamp = -1;
Marissa Wall4d600052016-12-15 12:16:01 -0800735};
736
Marissa Wallcfb9a072017-02-17 20:53:18 -0800737void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
738 hwc2_display_t display, int32_t connection)
739{
740 if (callbackData)
741 static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
742 connection);
743}
744
Marissa Wall572a1ee2016-12-15 12:24:13 -0800745void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
746 hwc2_display_t display, int64_t timestamp)
747{
748 if (callbackData)
749 static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
750 timestamp);
751}
752
Marissa Wallffc67da2016-12-15 12:26:09 -0800753void setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
754 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
755{
756 EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
757 testLayer.getBlendMode(), outErr));
758}
759
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800760void setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
761 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
762{
763 hwc2_composition_t composition = testLayer.getComposition();
764 hwc2_error_t err = HWC2_ERROR_NONE;
765
766 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
767 composition, &err));
768 if (outErr) {
769 *outErr = err;
770 return;
771 }
772
773 if (composition != HWC2_COMPOSITION_SIDEBAND) {
774 EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
775 } else {
776 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
777 << "returned wrong error code";
778 }
779}
780
Marissa Wallb72b5c92016-12-15 12:26:39 -0800781void setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
782 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
783{
784 EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
785 testLayer.getDataspace(), outErr));
786}
787
Marissa Wall2b1f5302016-12-15 12:27:20 -0800788void setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
789 const Hwc2TestLayer& testLayer, hwc2_error_t *outErr)
790{
791 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
792 testLayer.getBlendMode()));
793 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
794 testLayer.getPlaneAlpha(), outErr));
795}
796
Marissa Wallac108192016-12-15 12:27:48 -0800797void setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
798 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
799{
800 EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
801 testLayer.getTransform(), outErr));
802}
803
Marissa Wallffc67da2016-12-15 12:26:09 -0800804bool advanceBlendMode(Hwc2TestLayer* testLayer)
805{
806 return testLayer->advanceBlendMode();
807}
808
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800809bool advanceComposition(Hwc2TestLayer* testLayer)
810{
811 return testLayer->advanceComposition();
812}
813
Marissa Wallb72b5c92016-12-15 12:26:39 -0800814bool advanceDataspace(Hwc2TestLayer* testLayer)
815{
816 return testLayer->advanceDataspace();
817}
818
Marissa Wall2b1f5302016-12-15 12:27:20 -0800819bool advancePlaneAlpha(Hwc2TestLayer* testLayer)
820{
821 return testLayer->advancePlaneAlpha();
822}
823
Marissa Wallac108192016-12-15 12:27:48 -0800824bool advanceTransform(Hwc2TestLayer* testLayer)
825{
826 return testLayer->advanceTransform();
827}
828
Marissa Wall4d600052016-12-15 12:16:01 -0800829
830static const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
831 HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
832 HWC2_FUNCTION_CREATE_LAYER,
833 HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
834 HWC2_FUNCTION_DESTROY_LAYER,
835 HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
836 HWC2_FUNCTION_DUMP,
837 HWC2_FUNCTION_GET_ACTIVE_CONFIG,
838 HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
839 HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
840 HWC2_FUNCTION_GET_COLOR_MODES,
841 HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
842 HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
843 HWC2_FUNCTION_GET_DISPLAY_NAME,
844 HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
845 HWC2_FUNCTION_GET_DISPLAY_TYPE,
846 HWC2_FUNCTION_GET_DOZE_SUPPORT,
847 HWC2_FUNCTION_GET_HDR_CAPABILITIES,
848 HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
849 HWC2_FUNCTION_GET_RELEASE_FENCES,
850 HWC2_FUNCTION_PRESENT_DISPLAY,
851 HWC2_FUNCTION_REGISTER_CALLBACK,
852 HWC2_FUNCTION_SET_ACTIVE_CONFIG,
853 HWC2_FUNCTION_SET_CLIENT_TARGET,
854 HWC2_FUNCTION_SET_COLOR_MODE,
855 HWC2_FUNCTION_SET_COLOR_TRANSFORM,
856 HWC2_FUNCTION_SET_CURSOR_POSITION,
857 HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
858 HWC2_FUNCTION_SET_LAYER_BUFFER,
859 HWC2_FUNCTION_SET_LAYER_COLOR,
860 HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
861 HWC2_FUNCTION_SET_LAYER_DATASPACE,
862 HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
863 HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
864 HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
865 HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
866 HWC2_FUNCTION_SET_LAYER_TRANSFORM,
867 HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
868 HWC2_FUNCTION_SET_LAYER_Z_ORDER,
869 HWC2_FUNCTION_SET_OUTPUT_BUFFER,
870 HWC2_FUNCTION_SET_POWER_MODE,
871 HWC2_FUNCTION_SET_VSYNC_ENABLED,
872 HWC2_FUNCTION_VALIDATE_DISPLAY,
873}};
874
875/* TESTCASE: Tests that the HWC2 supports all required functions. */
876TEST_F(Hwc2Test, GET_FUNCTION)
877{
878 for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
879 hwc2_function_pointer_t pfn = getFunction(descriptor);
880 EXPECT_TRUE(pfn) << "failed to get function "
881 << getFunctionDescriptorName(descriptor);
882 }
883}
884
885/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
886TEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
887{
888 hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
889 EXPECT_FALSE(pfn) << "failed to get invalid function";
890}
891
892/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
893TEST_F(Hwc2Test, GET_CAPABILITIES)
894{
895 std::vector<hwc2_capability_t> capabilities;
896
897 getCapabilities(&capabilities);
898
899 EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
900 HWC2_CAPABILITY_INVALID), 0);
901}
Marissa Walla4b01482017-02-17 20:52:03 -0800902
903static const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
904 HWC2_CALLBACK_HOTPLUG,
905 HWC2_CALLBACK_REFRESH,
906 HWC2_CALLBACK_VSYNC,
907}};
908
909/* TESTCASE: Tests that the HWC2 can successfully register all required
910 * callback functions. */
911TEST_F(Hwc2Test, REGISTER_CALLBACK)
912{
913 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
914 const_cast<char*>("data"));
915
916 for (auto descriptor : callbackDescriptors) {
917 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
918 []() { return; }));
919 }
920}
921
922/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
923TEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
924{
925 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
926 const_cast<char*>("data"));
927 hwc2_error_t err = HWC2_ERROR_NONE;
928
929 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
930 []() { return; }, &err));
931 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
932}
933
934/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
935TEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
936{
937 hwc2_callback_data_t data = nullptr;
938
939 for (auto descriptor : callbackDescriptors) {
940 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
941 []() { return; }));
942 }
943}
Marissa Wallcfb9a072017-02-17 20:53:18 -0800944
945/* TESTCASE: Tests that the HWC2 returns the correct display type for each
946 * physical display. */
947TEST_F(Hwc2Test, GET_DISPLAY_TYPE)
948{
949 for (auto display : mDisplays) {
950 hwc2_display_type_t type;
951
952 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
953 EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
954 " correct display type";
955 }
956}
957
958/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
959 * display is requested. */
960TEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
961{
962 hwc2_display_t display;
963 hwc2_display_type_t type;
964 hwc2_error_t err = HWC2_ERROR_NONE;
965
966 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
967
968 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
969 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
970}
Marissa Wall1db2e372016-12-15 12:19:39 -0800971
972/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
973TEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
974{
975 for (auto display : mDisplays) {
976 hwc2_layer_t layer;
977
978 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
979
980 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
981 }
982}
983
984/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
985TEST_F(Hwc2Test, CREATE_LAYER_bad_display)
986{
987 hwc2_display_t display;
988 hwc2_layer_t layer;
989 hwc2_error_t err = HWC2_ERROR_NONE;
990
991 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
992
993 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
994 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
995}
996
997/* TESTCASE: Tests that the HWC2 will either support a large number of resources
998 * or will return no resources. */
999TEST_F(Hwc2Test, CREATE_LAYER_no_resources)
1000{
1001 const size_t layerCnt = 1000;
1002
1003 for (auto display : mDisplays) {
1004 std::vector<hwc2_layer_t> layers;
1005
1006 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1007
1008 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1009 }
1010}
1011
1012/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
1013TEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
1014{
1015 hwc2_display_t badDisplay;
1016
1017 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
1018
1019 for (auto display : mDisplays) {
1020 hwc2_layer_t layer = 0;
1021 hwc2_error_t err = HWC2_ERROR_NONE;
1022
1023 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
1024 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1025
1026 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1027
1028 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
1029 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1030
1031 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1032 }
1033}
1034
1035/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
1036TEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
1037{
1038 for (auto display : mDisplays) {
1039 hwc2_layer_t layer;
1040 hwc2_error_t err = HWC2_ERROR_NONE;
1041
1042 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
1043 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1044
1045 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
1046 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1047
1048 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
1049 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1050
1051 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
1052 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1053
1054 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
1055 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1056
1057 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1058
1059 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
1060 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1061
1062 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1063
1064 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
1065 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1066 }
1067}
Marissa Wallcf935cb2016-12-15 12:20:47 -08001068
1069static const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
1070 HWC2_ATTRIBUTE_WIDTH,
1071 HWC2_ATTRIBUTE_HEIGHT,
1072}};
1073
1074static const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
1075 HWC2_ATTRIBUTE_VSYNC_PERIOD,
1076 HWC2_ATTRIBUTE_DPI_X,
1077 HWC2_ATTRIBUTE_DPI_Y,
1078}};
1079
1080/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
1081 * config. */
1082TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
1083{
1084 for (auto display : mDisplays) {
1085 std::vector<hwc2_config_t> configs;
1086
1087 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1088
1089 for (auto config : configs) {
1090 int32_t value;
1091
1092 for (auto attribute : requiredAttributes) {
1093 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1094 attribute, &value));
1095 EXPECT_GE(value, 0) << "missing required attribute "
1096 << getAttributeName(attribute) << " for config "
1097 << config;
1098 }
1099 for (auto attribute : optionalAttributes) {
1100 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1101 attribute, &value));
1102 }
1103 }
1104 }
1105}
1106
1107/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
1108 * attribute */
1109TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
1110{
1111 const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
1112
1113 for (auto display : mDisplays) {
1114 std::vector<hwc2_config_t> configs;
1115
1116 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1117
1118 for (auto config : configs) {
1119 int32_t value;
1120 hwc2_error_t err = HWC2_ERROR_NONE;
1121
1122 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1123 attribute, &value, &err));
1124 EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
1125 " attribute for config " << config;
1126 }
1127 }
1128}
1129
1130/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
1131TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
1132{
1133 hwc2_display_t display;
1134 const hwc2_config_t config = 0;
1135 int32_t value;
1136 hwc2_error_t err = HWC2_ERROR_NONE;
1137
1138 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1139
1140 for (auto attribute : requiredAttributes) {
1141 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1142 &value, &err));
1143 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1144 }
1145
1146 for (auto attribute : optionalAttributes) {
1147 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1148 &value, &err));
1149 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1150 }
1151}
1152
1153/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
1154TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
1155{
1156 for (auto display : mDisplays) {
1157 hwc2_config_t config;
1158 int32_t value;
1159 hwc2_error_t err = HWC2_ERROR_NONE;
1160
1161 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1162
1163 for (auto attribute : requiredAttributes) {
1164 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1165 attribute, &value, &err));
1166 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1167 }
1168
1169 for (auto attribute : optionalAttributes) {
1170 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1171 attribute, &value, &err));
1172 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1173 }
1174 }
1175}
1176
1177/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
1178TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
1179{
1180 for (auto display : mDisplays) {
1181 std::vector<hwc2_config_t> configs;
1182
1183 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1184 }
1185}
1186
1187/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
1188TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
1189{
1190 hwc2_display_t display;
1191 std::vector<hwc2_config_t> configs;
1192 hwc2_error_t err = HWC2_ERROR_NONE;
1193
1194 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1195
1196 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
1197
1198 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1199 EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
1200}
1201
1202/* TESTCASE: Tests that the HWC2 will return the same config list multiple
1203 * times in a row. */
1204TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
1205{
1206 for (auto display : mDisplays) {
1207 std::vector<hwc2_config_t> configs1, configs2;
1208
1209 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
1210 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
1211
1212 EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
1213 configs2.begin())) << "returned two different config sets";
1214 }
1215}
1216
1217/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
1218TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
1219{
1220 for (auto display : mDisplays) {
1221 std::vector<hwc2_config_t> configs;
1222
1223 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1224
1225 std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
1226 configs.end());
1227 EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
1228 " configs";
1229 }
1230}
Marissa Wall93dc04f2016-12-15 12:21:46 -08001231
1232/* TESTCASE: Tests that the HWC2 returns the active config for a display */
1233TEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
1234{
1235 for (auto display : mDisplays) {
1236 std::vector<hwc2_config_t> configs;
1237
1238 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1239
1240 for (auto config : configs) {
1241 hwc2_config_t activeConfig;
1242
1243 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1244 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
1245
1246 EXPECT_EQ(activeConfig, config) << "failed to get active config";
1247 }
1248 }
1249}
1250
1251/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
1252 * display. */
1253TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
1254{
1255 hwc2_display_t display;
1256 hwc2_config_t activeConfig;
1257 hwc2_error_t err = HWC2_ERROR_NONE;
1258
1259 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1260
1261 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
1262
1263 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1264}
1265
1266/* TESTCASE: Tests that the HWC2 either begins with a valid active config
1267 * or returns an error when getActiveConfig is called. */
1268TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
1269{
1270 for (auto display : mDisplays) {
1271 std::vector<hwc2_config_t> configs;
1272 hwc2_config_t activeConfig;
1273 hwc2_error_t err = HWC2_ERROR_NONE;
1274
1275 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1276
1277 if (configs.empty())
1278 return;
1279
1280 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
1281 if (err == HWC2_ERROR_NONE) {
1282 EXPECT_NE(std::count(configs.begin(), configs.end(),
1283 activeConfig), 0) << "active config is not found in "
1284 " configs for display";
1285 } else {
1286 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1287 }
1288 }
1289}
1290
1291/* TESTCASE: Tests that the HWC2 can set every display config as an active
1292 * config */
1293TEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
1294{
1295 for (auto display : mDisplays) {
1296 std::vector<hwc2_config_t> configs;
1297
1298 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1299
1300 for (auto config : configs) {
1301 EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1302 }
1303 }
1304}
1305
1306/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
1307TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
1308{
1309 hwc2_display_t display;
1310 const hwc2_config_t config = 0;
1311 hwc2_error_t err = HWC2_ERROR_NONE;
1312
1313 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1314
1315 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
1316 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1317}
1318
1319/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
1320TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
1321{
1322 for (auto display : mDisplays) {
1323 hwc2_config_t config;
1324 hwc2_error_t err = HWC2_ERROR_NONE;
1325
1326 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1327
1328 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
1329 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1330 }
1331}
Marissa Wall03c91732016-12-15 12:23:16 -08001332
1333/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
1334TEST_F(Hwc2Test, GET_DOZE_SUPPORT)
1335{
1336 for (auto display : mDisplays) {
1337 int32_t support = -1;
1338
1339 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1340
1341 EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
1342 }
1343}
1344
1345/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
1346TEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
1347{
1348 hwc2_display_t display;
1349 int32_t support = -1;
1350 hwc2_error_t err = HWC2_ERROR_NONE;
1351
1352 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1353
1354 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1355
1356 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1357}
1358
1359/* TESTCASE: Tests that the HWC2 can set all supported power modes */
1360TEST_F(Hwc2Test, SET_POWER_MODE)
1361{
1362 for (auto display : mDisplays) {
1363 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1364 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1365
1366 int32_t support = -1;
1367 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1368 if (support != 1)
1369 return;
1370
1371 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1372 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1373 HWC2_POWER_MODE_DOZE_SUSPEND));
1374
1375 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1376 }
1377}
1378
1379/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
1380TEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
1381{
1382 hwc2_display_t display;
1383 hwc2_error_t err = HWC2_ERROR_NONE;
1384
1385 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1386
1387 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
1388 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1389
1390 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
1391 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1392
1393 int32_t support = -1;
1394 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1395 if (support != 1)
1396 return;
1397
1398 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
1399 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1400
1401 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
1402 &err));
1403 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1404}
1405
1406/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
1407TEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
1408{
1409 for (auto display : mDisplays) {
1410 hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
1411 HWC2_POWER_MODE_DOZE_SUSPEND + 1);
1412 hwc2_error_t err = HWC2_ERROR_NONE;
1413
1414 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
1415 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
1416 << mode;
1417 }
1418}
1419
1420/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
1421 * an optional power mode. */
1422TEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
1423{
1424 for (auto display : mDisplays) {
1425 int32_t support = -1;
1426 hwc2_error_t err = HWC2_ERROR_NONE;
1427
1428 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1429 if (support == 1)
1430 return;
1431
1432 ASSERT_EQ(support, 0) << "invalid doze support value";
1433
1434 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
1435 &err));
1436 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
1437
1438 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1439 HWC2_POWER_MODE_DOZE_SUSPEND, &err));
1440 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
1441 }
1442}
1443
1444/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
1445TEST_F(Hwc2Test, SET_POWER_MODE_stress)
1446{
1447 for (auto display : mDisplays) {
1448 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1449 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1450
1451 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1452 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1453
1454 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1455 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1456
1457 int32_t support = -1;
1458 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1459 if (support != 1)
1460 return;
1461
1462 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1463 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1464
1465 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1466 HWC2_POWER_MODE_DOZE_SUSPEND));
1467 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1468 HWC2_POWER_MODE_DOZE_SUSPEND));
1469
1470 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1471 }
1472}
Marissa Wall572a1ee2016-12-15 12:24:13 -08001473
1474/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
1475 * displays */
1476TEST_F(Hwc2Test, SET_VSYNC_ENABLED)
1477{
1478 for (auto display : mDisplays) {
1479 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1480 const_cast<char*>("data"));
1481
1482 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1483
1484 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1485 []() { return; }));
1486
1487 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1488
1489 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1490
1491 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1492 }
1493}
1494
1495/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
1496TEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
1497{
1498 for (auto display : mDisplays) {
1499 hwc2_display_t receivedDisplay;
1500 int64_t receivedTimestamp;
1501
1502 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1503
1504 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1505
1506 ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
1507 &receivedTimestamp));
1508
1509 EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
1510 EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
1511
1512 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1513
1514 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1515 }
1516}
1517
1518/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
1519TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
1520{
1521 hwc2_display_t display;
1522 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1523 const_cast<char*>("data"));
1524 hwc2_error_t err = HWC2_ERROR_NONE;
1525
1526 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1527
1528 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1529 []() { return; }));
1530
1531 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
1532 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1533
1534 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
1535 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1536}
1537
1538/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
1539TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
1540{
1541 for (auto display : mDisplays) {
1542 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1543 const_cast<char*>("data"));
1544 hwc2_error_t err = HWC2_ERROR_NONE;
1545
1546 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1547
1548 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1549 []() { return; }));
1550
1551 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
1552 &err));
1553 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1554
1555 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1556 }
1557}
1558
1559/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
1560 * times. */
1561TEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
1562{
1563 for (auto display : mDisplays) {
1564 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1565 const_cast<char*>("data"));
1566
1567 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1568
1569 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1570 []() { return; }));
1571
1572 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1573
1574 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1575 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1576
1577 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1578 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1579
1580 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1581 }
1582}
1583
1584/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
1585 * is off and no callback is registered. */
1586TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
1587{
1588 const uint secs = 1;
1589
1590 for (auto display : mDisplays) {
1591 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1592
1593 sleep(secs);
1594
1595 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1596 }
1597}
1598
1599/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
1600 * is registered. */
1601TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
1602{
1603 const uint secs = 1;
1604
1605 for (auto display : mDisplays) {
1606 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1607
1608 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1609
1610 sleep(secs);
1611
1612 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1613
1614 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1615 }
1616}
Marissa Walldd4087f2016-12-15 12:24:52 -08001617
1618/* TESTCASE: Tests that the HWC2 returns a display name for each display */
1619TEST_F(Hwc2Test, GET_DISPLAY_NAME)
1620{
1621 for (auto display : mDisplays) {
1622 std::string name;
1623
1624 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
1625 }
1626}
1627
1628/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
1629 * display */
1630TEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
1631{
1632 hwc2_display_t display;
1633 std::string name;
1634 hwc2_error_t err = HWC2_ERROR_NONE;
1635
1636 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1637
1638 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
1639 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1640}
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001641
1642/* TESTCASE: Tests that the HWC2 can set basic composition types. */
1643TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
1644{
1645 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1646 setComposition, advanceComposition));
1647}
1648
1649/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
1650 * layer. */
1651TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
1652{
1653 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1654 setComposition, advanceComposition));
1655}
1656
1657/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
1658TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
1659{
1660 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1661 setComposition));
1662}
1663
1664/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
1665TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
1666{
1667 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
1668 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1669 hwc2_error_t* outErr) {
1670
1671 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1672 layer, HWC2_COMPOSITION_INVALID, outErr));
1673 }
1674 ));
1675}
Marissa Wallffc67da2016-12-15 12:26:09 -08001676
1677/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
1678TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
1679{
1680 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1681 setBlendMode, advanceBlendMode));
1682}
1683
1684/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
1685TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
1686{
1687 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1688 setBlendMode, advanceBlendMode));
1689}
1690
1691/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
1692TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
1693{
1694 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1695 setBlendMode));
1696}
1697
1698/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
1699TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
1700{
1701 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
1702 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1703 hwc2_error_t* outErr) {
1704
1705 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
1706 layer, HWC2_BLEND_MODE_INVALID, outErr));
1707 }
1708 ));
1709}
Marissa Wallb72b5c92016-12-15 12:26:39 -08001710
1711/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
1712TEST_F(Hwc2Test, SET_LAYER_DATASPACE)
1713{
1714 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1715 setDataspace, advanceDataspace));
1716}
1717
1718/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
1719TEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
1720{
1721 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1722 setDataspace, advanceDataspace));
1723}
1724
1725/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
1726TEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
1727{
1728 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1729 setDataspace));
1730}
Marissa Wall2b1f5302016-12-15 12:27:20 -08001731
1732/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
1733TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
1734{
1735 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1736 setPlaneAlpha, advancePlaneAlpha));
1737}
1738
1739/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
1740TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
1741{
1742 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1743 setPlaneAlpha, advancePlaneAlpha));
1744}
1745
1746/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
1747TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
1748{
1749 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1750 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
1751 const Hwc2TestLayer& testLayer, hwc2_error_t *outErr) {
1752
1753 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
1754 badLayer, testLayer.getPlaneAlpha(), outErr));
1755 }
1756 ));
1757}
Marissa Wallac108192016-12-15 12:27:48 -08001758
1759/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
1760TEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
1761{
1762 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1763 setTransform, advanceTransform));
1764}
1765
1766/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
1767TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
1768{
1769 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1770 setTransform, advanceTransform));
1771}
1772
1773/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
1774TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
1775{
1776 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1777 setTransform));
1778}