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