blob: 5d6baaa903aa9800330e7e7dc34e487ffa41a381 [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 Wall4d600052016-12-15 12:16:01 -0800393protected:
394 hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
395 {
396 return mHwc2Device->getFunction(mHwc2Device, descriptor);
397 }
398
399 void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
400 {
401 uint32_t num = 0;
402
403 mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
404
405 outCapabilities->resize(num);
406
407 mHwc2Device->getCapabilities(mHwc2Device, &num,
408 reinterpret_cast<int32_t*>(outCapabilities->data()));
409 }
410
Marissa Wallcfb9a072017-02-17 20:53:18 -0800411 /* Registers a hotplug callback and waits for hotplug callbacks. This
412 * function will have no effect if called more than once. */
413 void populateDisplays()
414 {
415 /* Sets the hotplug status to receiving */
416 {
417 std::lock_guard<std::mutex> lock(mHotplugMutex);
418
419 if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
420 return;
421 mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
422 }
423
424 /* Registers the callback. This function call cannot be locked because
425 * a callback could happen on the same thread */
426 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
427 reinterpret_cast<hwc2_function_pointer_t>(
428 hwc2TestHotplugCallback)));
429
430 /* Waits for hotplug events. If a hotplug event has not come within 1
431 * second, stop waiting. */
432 std::unique_lock<std::mutex> lock(mHotplugMutex);
433
434 while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
435 std::cv_status::timeout) { }
436
437 /* Sets the hotplug status to done. Future calls will have no effect */
438 mHotplugStatus = Hwc2TestHotplugStatus::Done;
439 }
440
441 void getBadDisplay(hwc2_display_t* outDisplay)
442 {
443 for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
444 if (mDisplays.count(display) == 0) {
445 *outDisplay = display;
446 return;
447 }
448 }
449 ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
450 " are registered. This should never happen.";
451 }
452
Marissa Wall1db2e372016-12-15 12:19:39 -0800453 /* NOTE: will create min(newlayerCnt, max supported layers) layers */
454 void createLayers(hwc2_display_t display,
455 std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
456 {
457 std::vector<hwc2_layer_t> newLayers;
458 hwc2_layer_t layer;
459 hwc2_error_t err = HWC2_ERROR_NONE;
460
461 for (size_t i = 0; i < newLayerCnt; i++) {
462
463 EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
464 if (err == HWC2_ERROR_NO_RESOURCES)
465 break;
466 if (err != HWC2_ERROR_NONE) {
467 newLayers.clear();
468 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
469 }
470 newLayers.push_back(layer);
471 }
472
473 *outLayers = std::move(newLayers);
474 }
475
476 void destroyLayers(hwc2_display_t display,
477 std::vector<hwc2_layer_t>&& layers)
478 {
479 for (hwc2_layer_t layer : layers) {
480 EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
481 }
482 }
483
Marissa Wallcf935cb2016-12-15 12:20:47 -0800484 void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
485 {
486 std::vector<hwc2_config_t> configs;
487
488 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
489
490 hwc2_config_t CONFIG_MAX = UINT32_MAX;
491
492 ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
493 " (2^32 values) has been taken which shouldn't happen";
494
495 hwc2_config_t config;
496 for (config = 0; config < CONFIG_MAX; config++) {
497 if (std::count(configs.begin(), configs.end(), config) == 0)
498 break;
499 }
500
501 *outConfig = config;
502 }
503
Marissa Wall572a1ee2016-12-15 12:24:13 -0800504 void enableVsync(hwc2_display_t display)
505 {
506 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
507 reinterpret_cast<hwc2_function_pointer_t>(
508 hwc2TestVsyncCallback)));
509 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
510 }
511
512 void disableVsync(hwc2_display_t display)
513 {
514 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
515 }
516
517 void waitForVsync(hwc2_display_t* outDisplay = nullptr,
518 int64_t* outTimestamp = nullptr)
519 {
520 std::unique_lock<std::mutex> lock(mVsyncMutex);
521 ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
522 std::cv_status::no_timeout) << "timed out attempting to get"
523 " vsync callback";
524 if (outDisplay)
525 *outDisplay = mVsyncDisplay;
526 if (outTimestamp)
527 *outTimestamp = mVsyncTimestamp;
528 }
529
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800530 /* Calls a set property function from Hwc2Test to set a property value from
531 * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
532 using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
533 hwc2_display_t display, hwc2_layer_t layer,
534 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr);
535
536 /* Calls a set property function from Hwc2Test to set a bad property value
537 * on hwc2_layer_t on hwc2_display_t */
538 using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
539 hwc2_display_t display, hwc2_layer_t layer,
540 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr);
541
542 /* Calls a set property function from Hwc2Test to set a bad property value
543 * on hwc2_layer_t on hwc2_display_t */
544 using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
545 hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
546
547 /* Advances a property of Hwc2TestLayer */
548 using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
549
550 /* For each active display it cycles through each display config and tests
551 * each property value. It creates a layer, sets the property and then
552 * destroys the layer */
553 void setLayerProperty(Hwc2TestCoverage coverage,
554 TestLayerPropertyFunction function, AdvanceProperty advance)
555 {
556 for (auto display : mDisplays) {
557 std::vector<hwc2_config_t> configs;
558
559 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
560
561 for (auto config : configs) {
562 hwc2_layer_t layer;
563
564 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
565 Hwc2TestLayer testLayer(coverage);
566
567 do {
568 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
569
570 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
571 testLayer, nullptr));
572
573 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
574 } while (advance(&testLayer));
575 }
576 }
577 }
578
579 /* For each active display it cycles through each display config and tests
580 * each property value. It creates a layer, cycles through each property
581 * value and updates the layer property value and then destroys the layer */
582 void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
583 TestLayerPropertyFunction function, AdvanceProperty advance)
584 {
585 for (auto display : mDisplays) {
586 std::vector<hwc2_config_t> configs;
587
588 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
589
590 for (auto config : configs) {
591 hwc2_layer_t layer;
592
593 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
594 Hwc2TestLayer testLayer(coverage);
595
596 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
597
598 do {
599 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
600 testLayer, nullptr));
601 } while (advance(&testLayer));
602
603 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
604 }
605 }
606 }
607
608 /* For each active display it cycles through each display config.
609 * 1) It attempts to set a valid property value to bad layer handle.
610 * 2) It creates a layer x and attempts to set a valid property value to
611 * layer x + 1
612 * 3) It destroys the layer x and attempts to set a valid property value to
613 * the destroyed layer x.
614 */
615 void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
616 TestLayerPropertyBadLayerFunction function)
617 {
618 for (auto display : mDisplays) {
619 std::vector<hwc2_config_t> configs;
620
621 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
622
623 for (auto config : configs) {
624 hwc2_layer_t layer = 0;
625 hwc2_error_t err = HWC2_ERROR_NONE;
626
627 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
628 Hwc2TestLayer testLayer(coverage);
629
630 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
631 testLayer, &err));
632 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
633
634 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
635
636 ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
637 testLayer, &err));
638 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
639
640 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
641
642 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
643 testLayer, &err));
644 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
645 }
646 }
647 }
648
649 /* For each active display it cycles through each display config and tests
650 * each property value. It creates a layer, sets a bad property value and
651 * then destroys the layer */
652 void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
653 {
654 for (auto display : mDisplays) {
655 std::vector<hwc2_config_t> configs;
656
657 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
658
659 for (auto config : configs) {
660 hwc2_layer_t layer;
661 hwc2_error_t err = HWC2_ERROR_NONE;
662
663 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
664
665 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
666
667 ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
668 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
669 " error code";
670
671 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
672 }
673 }
674 }
675
Marissa Wall4d600052016-12-15 12:16:01 -0800676 hwc2_device_t* mHwc2Device = nullptr;
Marissa Wallcfb9a072017-02-17 20:53:18 -0800677
678 enum class Hwc2TestHotplugStatus {
679 Init = 1,
680 Receiving,
681 Done,
682 };
683
684 std::mutex mHotplugMutex;
685 std::condition_variable mHotplugCv;
686 Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
687 std::unordered_set<hwc2_display_t> mDisplays;
Marissa Wall1db2e372016-12-15 12:19:39 -0800688
689 /* Store all created layers that have not been destroyed. If an ASSERT_*
690 * fails, then destroy the layers on exit */
691 std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
Marissa Wall03c91732016-12-15 12:23:16 -0800692
693 /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
694 * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
695 std::set<hwc2_display_t> mActiveDisplays;
Marissa Wall572a1ee2016-12-15 12:24:13 -0800696
697 std::mutex mVsyncMutex;
698 std::condition_variable mVsyncCv;
699 hwc2_display_t mVsyncDisplay;
700 int64_t mVsyncTimestamp = -1;
Marissa Wall4d600052016-12-15 12:16:01 -0800701};
702
Marissa Wallcfb9a072017-02-17 20:53:18 -0800703void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
704 hwc2_display_t display, int32_t connection)
705{
706 if (callbackData)
707 static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
708 connection);
709}
710
Marissa Wall572a1ee2016-12-15 12:24:13 -0800711void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
712 hwc2_display_t display, int64_t timestamp)
713{
714 if (callbackData)
715 static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
716 timestamp);
717}
718
Marissa Wallffc67da2016-12-15 12:26:09 -0800719void setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
720 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
721{
722 EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
723 testLayer.getBlendMode(), outErr));
724}
725
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800726void setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
727 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
728{
729 hwc2_composition_t composition = testLayer.getComposition();
730 hwc2_error_t err = HWC2_ERROR_NONE;
731
732 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
733 composition, &err));
734 if (outErr) {
735 *outErr = err;
736 return;
737 }
738
739 if (composition != HWC2_COMPOSITION_SIDEBAND) {
740 EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
741 } else {
742 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
743 << "returned wrong error code";
744 }
745}
746
Marissa Wallb72b5c92016-12-15 12:26:39 -0800747void setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
748 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
749{
750 EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
751 testLayer.getDataspace(), outErr));
752}
753
Marissa Wallffc67da2016-12-15 12:26:09 -0800754bool advanceBlendMode(Hwc2TestLayer* testLayer)
755{
756 return testLayer->advanceBlendMode();
757}
758
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800759bool advanceComposition(Hwc2TestLayer* testLayer)
760{
761 return testLayer->advanceComposition();
762}
763
Marissa Wallb72b5c92016-12-15 12:26:39 -0800764bool advanceDataspace(Hwc2TestLayer* testLayer)
765{
766 return testLayer->advanceDataspace();
767}
768
Marissa Wall4d600052016-12-15 12:16:01 -0800769
770static const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
771 HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
772 HWC2_FUNCTION_CREATE_LAYER,
773 HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
774 HWC2_FUNCTION_DESTROY_LAYER,
775 HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
776 HWC2_FUNCTION_DUMP,
777 HWC2_FUNCTION_GET_ACTIVE_CONFIG,
778 HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
779 HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
780 HWC2_FUNCTION_GET_COLOR_MODES,
781 HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
782 HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
783 HWC2_FUNCTION_GET_DISPLAY_NAME,
784 HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
785 HWC2_FUNCTION_GET_DISPLAY_TYPE,
786 HWC2_FUNCTION_GET_DOZE_SUPPORT,
787 HWC2_FUNCTION_GET_HDR_CAPABILITIES,
788 HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
789 HWC2_FUNCTION_GET_RELEASE_FENCES,
790 HWC2_FUNCTION_PRESENT_DISPLAY,
791 HWC2_FUNCTION_REGISTER_CALLBACK,
792 HWC2_FUNCTION_SET_ACTIVE_CONFIG,
793 HWC2_FUNCTION_SET_CLIENT_TARGET,
794 HWC2_FUNCTION_SET_COLOR_MODE,
795 HWC2_FUNCTION_SET_COLOR_TRANSFORM,
796 HWC2_FUNCTION_SET_CURSOR_POSITION,
797 HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
798 HWC2_FUNCTION_SET_LAYER_BUFFER,
799 HWC2_FUNCTION_SET_LAYER_COLOR,
800 HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
801 HWC2_FUNCTION_SET_LAYER_DATASPACE,
802 HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
803 HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
804 HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
805 HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
806 HWC2_FUNCTION_SET_LAYER_TRANSFORM,
807 HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
808 HWC2_FUNCTION_SET_LAYER_Z_ORDER,
809 HWC2_FUNCTION_SET_OUTPUT_BUFFER,
810 HWC2_FUNCTION_SET_POWER_MODE,
811 HWC2_FUNCTION_SET_VSYNC_ENABLED,
812 HWC2_FUNCTION_VALIDATE_DISPLAY,
813}};
814
815/* TESTCASE: Tests that the HWC2 supports all required functions. */
816TEST_F(Hwc2Test, GET_FUNCTION)
817{
818 for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
819 hwc2_function_pointer_t pfn = getFunction(descriptor);
820 EXPECT_TRUE(pfn) << "failed to get function "
821 << getFunctionDescriptorName(descriptor);
822 }
823}
824
825/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
826TEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
827{
828 hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
829 EXPECT_FALSE(pfn) << "failed to get invalid function";
830}
831
832/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
833TEST_F(Hwc2Test, GET_CAPABILITIES)
834{
835 std::vector<hwc2_capability_t> capabilities;
836
837 getCapabilities(&capabilities);
838
839 EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
840 HWC2_CAPABILITY_INVALID), 0);
841}
Marissa Walla4b01482017-02-17 20:52:03 -0800842
843static const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
844 HWC2_CALLBACK_HOTPLUG,
845 HWC2_CALLBACK_REFRESH,
846 HWC2_CALLBACK_VSYNC,
847}};
848
849/* TESTCASE: Tests that the HWC2 can successfully register all required
850 * callback functions. */
851TEST_F(Hwc2Test, REGISTER_CALLBACK)
852{
853 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
854 const_cast<char*>("data"));
855
856 for (auto descriptor : callbackDescriptors) {
857 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
858 []() { return; }));
859 }
860}
861
862/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
863TEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
864{
865 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
866 const_cast<char*>("data"));
867 hwc2_error_t err = HWC2_ERROR_NONE;
868
869 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
870 []() { return; }, &err));
871 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
872}
873
874/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
875TEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
876{
877 hwc2_callback_data_t data = nullptr;
878
879 for (auto descriptor : callbackDescriptors) {
880 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
881 []() { return; }));
882 }
883}
Marissa Wallcfb9a072017-02-17 20:53:18 -0800884
885/* TESTCASE: Tests that the HWC2 returns the correct display type for each
886 * physical display. */
887TEST_F(Hwc2Test, GET_DISPLAY_TYPE)
888{
889 for (auto display : mDisplays) {
890 hwc2_display_type_t type;
891
892 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
893 EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
894 " correct display type";
895 }
896}
897
898/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
899 * display is requested. */
900TEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
901{
902 hwc2_display_t display;
903 hwc2_display_type_t type;
904 hwc2_error_t err = HWC2_ERROR_NONE;
905
906 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
907
908 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
909 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
910}
Marissa Wall1db2e372016-12-15 12:19:39 -0800911
912/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
913TEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
914{
915 for (auto display : mDisplays) {
916 hwc2_layer_t layer;
917
918 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
919
920 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
921 }
922}
923
924/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
925TEST_F(Hwc2Test, CREATE_LAYER_bad_display)
926{
927 hwc2_display_t display;
928 hwc2_layer_t layer;
929 hwc2_error_t err = HWC2_ERROR_NONE;
930
931 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
932
933 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
934 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
935}
936
937/* TESTCASE: Tests that the HWC2 will either support a large number of resources
938 * or will return no resources. */
939TEST_F(Hwc2Test, CREATE_LAYER_no_resources)
940{
941 const size_t layerCnt = 1000;
942
943 for (auto display : mDisplays) {
944 std::vector<hwc2_layer_t> layers;
945
946 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
947
948 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
949 }
950}
951
952/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
953TEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
954{
955 hwc2_display_t badDisplay;
956
957 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
958
959 for (auto display : mDisplays) {
960 hwc2_layer_t layer = 0;
961 hwc2_error_t err = HWC2_ERROR_NONE;
962
963 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
964 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
965
966 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
967
968 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
969 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
970
971 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
972 }
973}
974
975/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
976TEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
977{
978 for (auto display : mDisplays) {
979 hwc2_layer_t layer;
980 hwc2_error_t err = HWC2_ERROR_NONE;
981
982 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
983 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
984
985 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
986 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
987
988 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
989 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
990
991 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
992 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
993
994 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
995 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
996
997 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
998
999 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
1000 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1001
1002 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1003
1004 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
1005 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1006 }
1007}
Marissa Wallcf935cb2016-12-15 12:20:47 -08001008
1009static const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
1010 HWC2_ATTRIBUTE_WIDTH,
1011 HWC2_ATTRIBUTE_HEIGHT,
1012}};
1013
1014static const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
1015 HWC2_ATTRIBUTE_VSYNC_PERIOD,
1016 HWC2_ATTRIBUTE_DPI_X,
1017 HWC2_ATTRIBUTE_DPI_Y,
1018}};
1019
1020/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
1021 * config. */
1022TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
1023{
1024 for (auto display : mDisplays) {
1025 std::vector<hwc2_config_t> configs;
1026
1027 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1028
1029 for (auto config : configs) {
1030 int32_t value;
1031
1032 for (auto attribute : requiredAttributes) {
1033 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1034 attribute, &value));
1035 EXPECT_GE(value, 0) << "missing required attribute "
1036 << getAttributeName(attribute) << " for config "
1037 << config;
1038 }
1039 for (auto attribute : optionalAttributes) {
1040 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1041 attribute, &value));
1042 }
1043 }
1044 }
1045}
1046
1047/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
1048 * attribute */
1049TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
1050{
1051 const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
1052
1053 for (auto display : mDisplays) {
1054 std::vector<hwc2_config_t> configs;
1055
1056 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1057
1058 for (auto config : configs) {
1059 int32_t value;
1060 hwc2_error_t err = HWC2_ERROR_NONE;
1061
1062 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1063 attribute, &value, &err));
1064 EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
1065 " attribute for config " << config;
1066 }
1067 }
1068}
1069
1070/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
1071TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
1072{
1073 hwc2_display_t display;
1074 const hwc2_config_t config = 0;
1075 int32_t value;
1076 hwc2_error_t err = HWC2_ERROR_NONE;
1077
1078 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1079
1080 for (auto attribute : requiredAttributes) {
1081 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1082 &value, &err));
1083 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1084 }
1085
1086 for (auto attribute : optionalAttributes) {
1087 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1088 &value, &err));
1089 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1090 }
1091}
1092
1093/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
1094TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
1095{
1096 for (auto display : mDisplays) {
1097 hwc2_config_t config;
1098 int32_t value;
1099 hwc2_error_t err = HWC2_ERROR_NONE;
1100
1101 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1102
1103 for (auto attribute : requiredAttributes) {
1104 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1105 attribute, &value, &err));
1106 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1107 }
1108
1109 for (auto attribute : optionalAttributes) {
1110 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1111 attribute, &value, &err));
1112 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1113 }
1114 }
1115}
1116
1117/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
1118TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
1119{
1120 for (auto display : mDisplays) {
1121 std::vector<hwc2_config_t> configs;
1122
1123 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1124 }
1125}
1126
1127/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
1128TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
1129{
1130 hwc2_display_t display;
1131 std::vector<hwc2_config_t> configs;
1132 hwc2_error_t err = HWC2_ERROR_NONE;
1133
1134 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1135
1136 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
1137
1138 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1139 EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
1140}
1141
1142/* TESTCASE: Tests that the HWC2 will return the same config list multiple
1143 * times in a row. */
1144TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
1145{
1146 for (auto display : mDisplays) {
1147 std::vector<hwc2_config_t> configs1, configs2;
1148
1149 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
1150 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
1151
1152 EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
1153 configs2.begin())) << "returned two different config sets";
1154 }
1155}
1156
1157/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
1158TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
1159{
1160 for (auto display : mDisplays) {
1161 std::vector<hwc2_config_t> configs;
1162
1163 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1164
1165 std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
1166 configs.end());
1167 EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
1168 " configs";
1169 }
1170}
Marissa Wall93dc04f2016-12-15 12:21:46 -08001171
1172/* TESTCASE: Tests that the HWC2 returns the active config for a display */
1173TEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
1174{
1175 for (auto display : mDisplays) {
1176 std::vector<hwc2_config_t> configs;
1177
1178 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1179
1180 for (auto config : configs) {
1181 hwc2_config_t activeConfig;
1182
1183 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1184 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
1185
1186 EXPECT_EQ(activeConfig, config) << "failed to get active config";
1187 }
1188 }
1189}
1190
1191/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
1192 * display. */
1193TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
1194{
1195 hwc2_display_t display;
1196 hwc2_config_t activeConfig;
1197 hwc2_error_t err = HWC2_ERROR_NONE;
1198
1199 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1200
1201 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
1202
1203 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1204}
1205
1206/* TESTCASE: Tests that the HWC2 either begins with a valid active config
1207 * or returns an error when getActiveConfig is called. */
1208TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
1209{
1210 for (auto display : mDisplays) {
1211 std::vector<hwc2_config_t> configs;
1212 hwc2_config_t activeConfig;
1213 hwc2_error_t err = HWC2_ERROR_NONE;
1214
1215 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1216
1217 if (configs.empty())
1218 return;
1219
1220 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
1221 if (err == HWC2_ERROR_NONE) {
1222 EXPECT_NE(std::count(configs.begin(), configs.end(),
1223 activeConfig), 0) << "active config is not found in "
1224 " configs for display";
1225 } else {
1226 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1227 }
1228 }
1229}
1230
1231/* TESTCASE: Tests that the HWC2 can set every display config as an active
1232 * config */
1233TEST_F(Hwc2Test, SET_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 EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1242 }
1243 }
1244}
1245
1246/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
1247TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
1248{
1249 hwc2_display_t display;
1250 const hwc2_config_t config = 0;
1251 hwc2_error_t err = HWC2_ERROR_NONE;
1252
1253 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1254
1255 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
1256 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1257}
1258
1259/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
1260TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
1261{
1262 for (auto display : mDisplays) {
1263 hwc2_config_t config;
1264 hwc2_error_t err = HWC2_ERROR_NONE;
1265
1266 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1267
1268 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
1269 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1270 }
1271}
Marissa Wall03c91732016-12-15 12:23:16 -08001272
1273/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
1274TEST_F(Hwc2Test, GET_DOZE_SUPPORT)
1275{
1276 for (auto display : mDisplays) {
1277 int32_t support = -1;
1278
1279 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1280
1281 EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
1282 }
1283}
1284
1285/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
1286TEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
1287{
1288 hwc2_display_t display;
1289 int32_t support = -1;
1290 hwc2_error_t err = HWC2_ERROR_NONE;
1291
1292 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1293
1294 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1295
1296 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1297}
1298
1299/* TESTCASE: Tests that the HWC2 can set all supported power modes */
1300TEST_F(Hwc2Test, SET_POWER_MODE)
1301{
1302 for (auto display : mDisplays) {
1303 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1304 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1305
1306 int32_t support = -1;
1307 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1308 if (support != 1)
1309 return;
1310
1311 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1312 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1313 HWC2_POWER_MODE_DOZE_SUSPEND));
1314
1315 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1316 }
1317}
1318
1319/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
1320TEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
1321{
1322 hwc2_display_t display;
1323 hwc2_error_t err = HWC2_ERROR_NONE;
1324
1325 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1326
1327 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
1328 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1329
1330 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
1331 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1332
1333 int32_t support = -1;
1334 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1335 if (support != 1)
1336 return;
1337
1338 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
1339 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1340
1341 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
1342 &err));
1343 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1344}
1345
1346/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
1347TEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
1348{
1349 for (auto display : mDisplays) {
1350 hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
1351 HWC2_POWER_MODE_DOZE_SUSPEND + 1);
1352 hwc2_error_t err = HWC2_ERROR_NONE;
1353
1354 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
1355 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
1356 << mode;
1357 }
1358}
1359
1360/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
1361 * an optional power mode. */
1362TEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
1363{
1364 for (auto display : mDisplays) {
1365 int32_t support = -1;
1366 hwc2_error_t err = HWC2_ERROR_NONE;
1367
1368 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1369 if (support == 1)
1370 return;
1371
1372 ASSERT_EQ(support, 0) << "invalid doze support value";
1373
1374 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
1375 &err));
1376 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
1377
1378 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1379 HWC2_POWER_MODE_DOZE_SUSPEND, &err));
1380 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
1381 }
1382}
1383
1384/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
1385TEST_F(Hwc2Test, SET_POWER_MODE_stress)
1386{
1387 for (auto display : mDisplays) {
1388 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1389 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1390
1391 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1392 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1393
1394 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1395 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1396
1397 int32_t support = -1;
1398 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1399 if (support != 1)
1400 return;
1401
1402 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1403 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1404
1405 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1406 HWC2_POWER_MODE_DOZE_SUSPEND));
1407 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1408 HWC2_POWER_MODE_DOZE_SUSPEND));
1409
1410 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1411 }
1412}
Marissa Wall572a1ee2016-12-15 12:24:13 -08001413
1414/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
1415 * displays */
1416TEST_F(Hwc2Test, SET_VSYNC_ENABLED)
1417{
1418 for (auto display : mDisplays) {
1419 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1420 const_cast<char*>("data"));
1421
1422 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1423
1424 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1425 []() { return; }));
1426
1427 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1428
1429 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1430
1431 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1432 }
1433}
1434
1435/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
1436TEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
1437{
1438 for (auto display : mDisplays) {
1439 hwc2_display_t receivedDisplay;
1440 int64_t receivedTimestamp;
1441
1442 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1443
1444 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1445
1446 ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
1447 &receivedTimestamp));
1448
1449 EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
1450 EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
1451
1452 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1453
1454 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1455 }
1456}
1457
1458/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
1459TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
1460{
1461 hwc2_display_t display;
1462 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1463 const_cast<char*>("data"));
1464 hwc2_error_t err = HWC2_ERROR_NONE;
1465
1466 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1467
1468 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1469 []() { return; }));
1470
1471 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
1472 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1473
1474 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
1475 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1476}
1477
1478/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
1479TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
1480{
1481 for (auto display : mDisplays) {
1482 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1483 const_cast<char*>("data"));
1484 hwc2_error_t err = HWC2_ERROR_NONE;
1485
1486 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1487
1488 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1489 []() { return; }));
1490
1491 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
1492 &err));
1493 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1494
1495 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1496 }
1497}
1498
1499/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
1500 * times. */
1501TEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
1502{
1503 for (auto display : mDisplays) {
1504 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1505 const_cast<char*>("data"));
1506
1507 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1508
1509 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1510 []() { return; }));
1511
1512 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1513
1514 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1515 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1516
1517 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1518 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1519
1520 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1521 }
1522}
1523
1524/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
1525 * is off and no callback is registered. */
1526TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
1527{
1528 const uint secs = 1;
1529
1530 for (auto display : mDisplays) {
1531 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1532
1533 sleep(secs);
1534
1535 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1536 }
1537}
1538
1539/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
1540 * is registered. */
1541TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
1542{
1543 const uint secs = 1;
1544
1545 for (auto display : mDisplays) {
1546 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1547
1548 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1549
1550 sleep(secs);
1551
1552 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1553
1554 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1555 }
1556}
Marissa Walldd4087f2016-12-15 12:24:52 -08001557
1558/* TESTCASE: Tests that the HWC2 returns a display name for each display */
1559TEST_F(Hwc2Test, GET_DISPLAY_NAME)
1560{
1561 for (auto display : mDisplays) {
1562 std::string name;
1563
1564 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
1565 }
1566}
1567
1568/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
1569 * display */
1570TEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
1571{
1572 hwc2_display_t display;
1573 std::string name;
1574 hwc2_error_t err = HWC2_ERROR_NONE;
1575
1576 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1577
1578 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
1579 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1580}
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001581
1582/* TESTCASE: Tests that the HWC2 can set basic composition types. */
1583TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
1584{
1585 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1586 setComposition, advanceComposition));
1587}
1588
1589/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
1590 * layer. */
1591TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
1592{
1593 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1594 setComposition, advanceComposition));
1595}
1596
1597/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
1598TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
1599{
1600 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1601 setComposition));
1602}
1603
1604/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
1605TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
1606{
1607 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
1608 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1609 hwc2_error_t* outErr) {
1610
1611 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1612 layer, HWC2_COMPOSITION_INVALID, outErr));
1613 }
1614 ));
1615}
Marissa Wallffc67da2016-12-15 12:26:09 -08001616
1617/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
1618TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
1619{
1620 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1621 setBlendMode, advanceBlendMode));
1622}
1623
1624/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
1625TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
1626{
1627 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1628 setBlendMode, advanceBlendMode));
1629}
1630
1631/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
1632TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
1633{
1634 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1635 setBlendMode));
1636}
1637
1638/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
1639TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
1640{
1641 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
1642 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1643 hwc2_error_t* outErr) {
1644
1645 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
1646 layer, HWC2_BLEND_MODE_INVALID, outErr));
1647 }
1648 ));
1649}
Marissa Wallb72b5c92016-12-15 12:26:39 -08001650
1651/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
1652TEST_F(Hwc2Test, SET_LAYER_DATASPACE)
1653{
1654 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1655 setDataspace, advanceDataspace));
1656}
1657
1658/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
1659TEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
1660{
1661 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1662 setDataspace, advanceDataspace));
1663}
1664
1665/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
1666TEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
1667{
1668 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1669 setDataspace));
1670}