blob: c092f222be120ac48d54728309180c2918d0f5cb [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 Wall600a73b2016-12-15 12:30:39 -0800394 void setLayerDisplayFrame(hwc2_display_t display, hwc2_layer_t layer,
395 const hwc_rect_t& displayFrame, hwc2_error_t* outErr = nullptr)
396 {
397 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
398 getFunction(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME));
399 ASSERT_TRUE(pfn) << "failed to get function";
400
401 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
402 displayFrame));
403 if (outErr) {
404 *outErr = err;
405 } else {
406 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer display"
407 " frame";
408 }
409 }
410
Marissa Wall2b1f5302016-12-15 12:27:20 -0800411 void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer,
412 float alpha, hwc2_error_t* outErr = nullptr)
413 {
414 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
415 getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA));
416 ASSERT_TRUE(pfn) << "failed to get function";
417
418 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
419 alpha));
420 if (outErr) {
421 *outErr = err;
422 } else {
423 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha "
424 << alpha;
425 }
426 }
427
Marissa Wallac108192016-12-15 12:27:48 -0800428 void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
429 hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
430 {
431 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
432 getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
433 ASSERT_TRUE(pfn) << "failed to get function";
434
435 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
436 transform));
437 if (outErr) {
438 *outErr = err;
439 } else {
440 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
441 << getTransformName(transform);
442 }
443 }
444
Marissa Wall273b1df2016-12-15 12:28:47 -0800445 void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer,
446 uint32_t zOrder, hwc2_error_t* outErr = nullptr)
447 {
448 auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>(
449 getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER));
450 ASSERT_TRUE(pfn) << "failed to get function";
451
452 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
453 zOrder));
454 if (outErr) {
455 *outErr = err;
456 } else {
457 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order "
458 << zOrder;
459 }
460 }
461
Marissa Wall4d600052016-12-15 12:16:01 -0800462protected:
463 hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
464 {
465 return mHwc2Device->getFunction(mHwc2Device, descriptor);
466 }
467
468 void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
469 {
470 uint32_t num = 0;
471
472 mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
473
474 outCapabilities->resize(num);
475
476 mHwc2Device->getCapabilities(mHwc2Device, &num,
477 reinterpret_cast<int32_t*>(outCapabilities->data()));
478 }
479
Marissa Wallcfb9a072017-02-17 20:53:18 -0800480 /* Registers a hotplug callback and waits for hotplug callbacks. This
481 * function will have no effect if called more than once. */
482 void populateDisplays()
483 {
484 /* Sets the hotplug status to receiving */
485 {
486 std::lock_guard<std::mutex> lock(mHotplugMutex);
487
488 if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
489 return;
490 mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
491 }
492
493 /* Registers the callback. This function call cannot be locked because
494 * a callback could happen on the same thread */
495 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
496 reinterpret_cast<hwc2_function_pointer_t>(
497 hwc2TestHotplugCallback)));
498
499 /* Waits for hotplug events. If a hotplug event has not come within 1
500 * second, stop waiting. */
501 std::unique_lock<std::mutex> lock(mHotplugMutex);
502
503 while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
504 std::cv_status::timeout) { }
505
506 /* Sets the hotplug status to done. Future calls will have no effect */
507 mHotplugStatus = Hwc2TestHotplugStatus::Done;
508 }
509
510 void getBadDisplay(hwc2_display_t* outDisplay)
511 {
512 for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
513 if (mDisplays.count(display) == 0) {
514 *outDisplay = display;
515 return;
516 }
517 }
518 ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
519 " are registered. This should never happen.";
520 }
521
Marissa Wall1db2e372016-12-15 12:19:39 -0800522 /* NOTE: will create min(newlayerCnt, max supported layers) layers */
523 void createLayers(hwc2_display_t display,
524 std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
525 {
526 std::vector<hwc2_layer_t> newLayers;
527 hwc2_layer_t layer;
528 hwc2_error_t err = HWC2_ERROR_NONE;
529
530 for (size_t i = 0; i < newLayerCnt; i++) {
531
532 EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
533 if (err == HWC2_ERROR_NO_RESOURCES)
534 break;
535 if (err != HWC2_ERROR_NONE) {
536 newLayers.clear();
537 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
538 }
539 newLayers.push_back(layer);
540 }
541
542 *outLayers = std::move(newLayers);
543 }
544
545 void destroyLayers(hwc2_display_t display,
546 std::vector<hwc2_layer_t>&& layers)
547 {
548 for (hwc2_layer_t layer : layers) {
549 EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
550 }
551 }
552
Marissa Wallcf935cb2016-12-15 12:20:47 -0800553 void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
554 {
555 std::vector<hwc2_config_t> configs;
556
557 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
558
559 hwc2_config_t CONFIG_MAX = UINT32_MAX;
560
561 ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
562 " (2^32 values) has been taken which shouldn't happen";
563
564 hwc2_config_t config;
565 for (config = 0; config < CONFIG_MAX; config++) {
566 if (std::count(configs.begin(), configs.end(), config) == 0)
567 break;
568 }
569
570 *outConfig = config;
571 }
572
Marissa Wall572a1ee2016-12-15 12:24:13 -0800573 void enableVsync(hwc2_display_t display)
574 {
575 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
576 reinterpret_cast<hwc2_function_pointer_t>(
577 hwc2TestVsyncCallback)));
578 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
579 }
580
581 void disableVsync(hwc2_display_t display)
582 {
583 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
584 }
585
586 void waitForVsync(hwc2_display_t* outDisplay = nullptr,
587 int64_t* outTimestamp = nullptr)
588 {
589 std::unique_lock<std::mutex> lock(mVsyncMutex);
590 ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
591 std::cv_status::no_timeout) << "timed out attempting to get"
592 " vsync callback";
593 if (outDisplay)
594 *outDisplay = mVsyncDisplay;
595 if (outTimestamp)
596 *outTimestamp = mVsyncTimestamp;
597 }
598
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800599 /* Calls a set property function from Hwc2Test to set a property value from
600 * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
601 using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
602 hwc2_display_t display, hwc2_layer_t layer,
603 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr);
604
Marissa Wall273b1df2016-12-15 12:28:47 -0800605 /* Calls a set property function from Hwc2Test to set property values from
606 * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
607 using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
608 hwc2_display_t display, hwc2_layer_t layer,
609 const Hwc2TestLayers& testLayers);
610
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800611 /* Calls a set property function from Hwc2Test to set a bad property value
612 * on hwc2_layer_t on hwc2_display_t */
613 using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
614 hwc2_display_t display, hwc2_layer_t layer,
615 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr);
616
617 /* Calls a set property function from Hwc2Test to set a bad property value
618 * on hwc2_layer_t on hwc2_display_t */
619 using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
620 hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
621
622 /* Advances a property of Hwc2TestLayer */
623 using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
624
625 /* For each active display it cycles through each display config and tests
626 * each property value. It creates a layer, sets the property and then
627 * destroys the layer */
628 void setLayerProperty(Hwc2TestCoverage coverage,
629 TestLayerPropertyFunction function, AdvanceProperty advance)
630 {
631 for (auto display : mDisplays) {
632 std::vector<hwc2_config_t> configs;
633
634 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
635
636 for (auto config : configs) {
637 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -0800638 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800639
640 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800641 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
642 &displayArea));
643 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800644
645 do {
646 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
647
648 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
649 testLayer, nullptr));
650
651 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
652 } while (advance(&testLayer));
653 }
654 }
655 }
656
657 /* For each active display it cycles through each display config and tests
658 * each property value. It creates a layer, cycles through each property
659 * value and updates the layer property value and then destroys the layer */
660 void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
661 TestLayerPropertyFunction function, AdvanceProperty advance)
662 {
663 for (auto display : mDisplays) {
664 std::vector<hwc2_config_t> configs;
665
666 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
667
668 for (auto config : configs) {
669 hwc2_layer_t layer;
Marissa Wall600a73b2016-12-15 12:30:39 -0800670 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800671
672 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800673 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
674 &displayArea));
675 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800676
677 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
678
679 do {
680 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
681 testLayer, nullptr));
682 } while (advance(&testLayer));
683
684 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
685 }
686 }
687 }
688
Marissa Wall273b1df2016-12-15 12:28:47 -0800689 /* For each active display it cycles through each display config and tests
690 * each property value. It creates multiple layers, calls the
691 * TestLayerPropertiesFunction to set property values and then
692 * destroys the layers */
693 void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
694 TestLayerPropertiesFunction function)
695 {
696 for (auto display : mDisplays) {
697 std::vector<hwc2_config_t> configs;
698
699 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
700
701 for (auto config : configs) {
702 std::vector<hwc2_layer_t> layers;
Marissa Wall600a73b2016-12-15 12:30:39 -0800703 Area displayArea;
Marissa Wall273b1df2016-12-15 12:28:47 -0800704
705 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800706 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
707 &displayArea));
Marissa Wall273b1df2016-12-15 12:28:47 -0800708
709 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
Marissa Wall600a73b2016-12-15 12:30:39 -0800710 Hwc2TestLayers testLayers(layers, coverage, displayArea);
Marissa Wall273b1df2016-12-15 12:28:47 -0800711
712 for (auto layer : layers) {
713 EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
714 testLayers));
715 }
716
717 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
718 }
719 }
720 }
721
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800722 /* For each active display it cycles through each display config.
723 * 1) It attempts to set a valid property value to bad layer handle.
724 * 2) It creates a layer x and attempts to set a valid property value to
725 * layer x + 1
726 * 3) It destroys the layer x and attempts to set a valid property value to
727 * the destroyed layer x.
728 */
729 void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
730 TestLayerPropertyBadLayerFunction function)
731 {
732 for (auto display : mDisplays) {
733 std::vector<hwc2_config_t> configs;
734
735 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
736
737 for (auto config : configs) {
738 hwc2_layer_t layer = 0;
Marissa Wall600a73b2016-12-15 12:30:39 -0800739 Area displayArea;
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800740 hwc2_error_t err = HWC2_ERROR_NONE;
741
742 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
Marissa Wall600a73b2016-12-15 12:30:39 -0800743 ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
744 &displayArea));
745 Hwc2TestLayer testLayer(coverage, displayArea);
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800746
747 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
748 testLayer, &err));
749 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
750
751 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
752
753 ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
754 testLayer, &err));
755 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
756
757 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
758
759 ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
760 testLayer, &err));
761 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
762 }
763 }
764 }
765
766 /* For each active display it cycles through each display config and tests
767 * each property value. It creates a layer, sets a bad property value and
768 * then destroys the layer */
769 void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
770 {
771 for (auto display : mDisplays) {
772 std::vector<hwc2_config_t> configs;
773
774 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
775
776 for (auto config : configs) {
777 hwc2_layer_t layer;
778 hwc2_error_t err = HWC2_ERROR_NONE;
779
780 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
781
782 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
783
784 ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
785 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
786 " error code";
787
788 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
789 }
790 }
791 }
792
Marissa Wall600a73b2016-12-15 12:30:39 -0800793 void getActiveConfigAttribute(hwc2_display_t display,
794 hwc2_attribute_t attribute, int32_t* outValue)
795 {
796 hwc2_config_t config;
797 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
798 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
799 attribute, outValue));
800 ASSERT_GE(*outValue, 0) << "failed to get valid "
801 << getAttributeName(attribute);
802 }
803
804 void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
805 {
806 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
807 HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
808 ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
809 HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
810 }
811
Marissa Wall4d600052016-12-15 12:16:01 -0800812 hwc2_device_t* mHwc2Device = nullptr;
Marissa Wallcfb9a072017-02-17 20:53:18 -0800813
814 enum class Hwc2TestHotplugStatus {
815 Init = 1,
816 Receiving,
817 Done,
818 };
819
820 std::mutex mHotplugMutex;
821 std::condition_variable mHotplugCv;
822 Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
823 std::unordered_set<hwc2_display_t> mDisplays;
Marissa Wall1db2e372016-12-15 12:19:39 -0800824
825 /* Store all created layers that have not been destroyed. If an ASSERT_*
826 * fails, then destroy the layers on exit */
827 std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
Marissa Wall03c91732016-12-15 12:23:16 -0800828
829 /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
830 * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
831 std::set<hwc2_display_t> mActiveDisplays;
Marissa Wall572a1ee2016-12-15 12:24:13 -0800832
833 std::mutex mVsyncMutex;
834 std::condition_variable mVsyncCv;
835 hwc2_display_t mVsyncDisplay;
836 int64_t mVsyncTimestamp = -1;
Marissa Wall4d600052016-12-15 12:16:01 -0800837};
838
Marissa Wallcfb9a072017-02-17 20:53:18 -0800839void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
840 hwc2_display_t display, int32_t connection)
841{
842 if (callbackData)
843 static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
844 connection);
845}
846
Marissa Wall572a1ee2016-12-15 12:24:13 -0800847void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
848 hwc2_display_t display, int64_t timestamp)
849{
850 if (callbackData)
851 static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
852 timestamp);
853}
854
Marissa Wallffc67da2016-12-15 12:26:09 -0800855void setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
856 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
857{
858 EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
859 testLayer.getBlendMode(), outErr));
860}
861
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800862void setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
863 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
864{
865 hwc2_composition_t composition = testLayer.getComposition();
866 hwc2_error_t err = HWC2_ERROR_NONE;
867
868 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
869 composition, &err));
870 if (outErr) {
871 *outErr = err;
872 return;
873 }
874
875 if (composition != HWC2_COMPOSITION_SIDEBAND) {
876 EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
877 } else {
878 EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
879 << "returned wrong error code";
880 }
881}
882
Marissa Wallb72b5c92016-12-15 12:26:39 -0800883void setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
884 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
885{
886 EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
887 testLayer.getDataspace(), outErr));
888}
889
Marissa Wall600a73b2016-12-15 12:30:39 -0800890void setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
891 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
892{
893 EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
894 testLayer.getDisplayFrame(), outErr));
895}
896
Marissa Wall2b1f5302016-12-15 12:27:20 -0800897void setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
898 const Hwc2TestLayer& testLayer, hwc2_error_t *outErr)
899{
900 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
901 testLayer.getBlendMode()));
902 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
903 testLayer.getPlaneAlpha(), outErr));
904}
905
Marissa Wallac108192016-12-15 12:27:48 -0800906void setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
907 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
908{
909 EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
910 testLayer.getTransform(), outErr));
911}
912
Marissa Wall273b1df2016-12-15 12:28:47 -0800913void setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
914 const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
915{
916 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
917 testLayer.getZOrder(), outErr));
918}
919
Marissa Wallffc67da2016-12-15 12:26:09 -0800920bool advanceBlendMode(Hwc2TestLayer* testLayer)
921{
922 return testLayer->advanceBlendMode();
923}
924
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800925bool advanceComposition(Hwc2TestLayer* testLayer)
926{
927 return testLayer->advanceComposition();
928}
929
Marissa Wallb72b5c92016-12-15 12:26:39 -0800930bool advanceDataspace(Hwc2TestLayer* testLayer)
931{
932 return testLayer->advanceDataspace();
933}
934
Marissa Wall600a73b2016-12-15 12:30:39 -0800935bool advanceDisplayFrame(Hwc2TestLayer* testLayer)
936{
937 return testLayer->advanceDisplayFrame();
938}
939
Marissa Wall2b1f5302016-12-15 12:27:20 -0800940bool advancePlaneAlpha(Hwc2TestLayer* testLayer)
941{
942 return testLayer->advancePlaneAlpha();
943}
944
Marissa Wallac108192016-12-15 12:27:48 -0800945bool advanceTransform(Hwc2TestLayer* testLayer)
946{
947 return testLayer->advanceTransform();
948}
949
Marissa Wall4d600052016-12-15 12:16:01 -0800950
951static const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
952 HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
953 HWC2_FUNCTION_CREATE_LAYER,
954 HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
955 HWC2_FUNCTION_DESTROY_LAYER,
956 HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
957 HWC2_FUNCTION_DUMP,
958 HWC2_FUNCTION_GET_ACTIVE_CONFIG,
959 HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
960 HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
961 HWC2_FUNCTION_GET_COLOR_MODES,
962 HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
963 HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
964 HWC2_FUNCTION_GET_DISPLAY_NAME,
965 HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
966 HWC2_FUNCTION_GET_DISPLAY_TYPE,
967 HWC2_FUNCTION_GET_DOZE_SUPPORT,
968 HWC2_FUNCTION_GET_HDR_CAPABILITIES,
969 HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
970 HWC2_FUNCTION_GET_RELEASE_FENCES,
971 HWC2_FUNCTION_PRESENT_DISPLAY,
972 HWC2_FUNCTION_REGISTER_CALLBACK,
973 HWC2_FUNCTION_SET_ACTIVE_CONFIG,
974 HWC2_FUNCTION_SET_CLIENT_TARGET,
975 HWC2_FUNCTION_SET_COLOR_MODE,
976 HWC2_FUNCTION_SET_COLOR_TRANSFORM,
977 HWC2_FUNCTION_SET_CURSOR_POSITION,
978 HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
979 HWC2_FUNCTION_SET_LAYER_BUFFER,
980 HWC2_FUNCTION_SET_LAYER_COLOR,
981 HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
982 HWC2_FUNCTION_SET_LAYER_DATASPACE,
983 HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
984 HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
985 HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
986 HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
987 HWC2_FUNCTION_SET_LAYER_TRANSFORM,
988 HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
989 HWC2_FUNCTION_SET_LAYER_Z_ORDER,
990 HWC2_FUNCTION_SET_OUTPUT_BUFFER,
991 HWC2_FUNCTION_SET_POWER_MODE,
992 HWC2_FUNCTION_SET_VSYNC_ENABLED,
993 HWC2_FUNCTION_VALIDATE_DISPLAY,
994}};
995
996/* TESTCASE: Tests that the HWC2 supports all required functions. */
997TEST_F(Hwc2Test, GET_FUNCTION)
998{
999 for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
1000 hwc2_function_pointer_t pfn = getFunction(descriptor);
1001 EXPECT_TRUE(pfn) << "failed to get function "
1002 << getFunctionDescriptorName(descriptor);
1003 }
1004}
1005
1006/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
1007TEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
1008{
1009 hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
1010 EXPECT_FALSE(pfn) << "failed to get invalid function";
1011}
1012
1013/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
1014TEST_F(Hwc2Test, GET_CAPABILITIES)
1015{
1016 std::vector<hwc2_capability_t> capabilities;
1017
1018 getCapabilities(&capabilities);
1019
1020 EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
1021 HWC2_CAPABILITY_INVALID), 0);
1022}
Marissa Walla4b01482017-02-17 20:52:03 -08001023
1024static const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
1025 HWC2_CALLBACK_HOTPLUG,
1026 HWC2_CALLBACK_REFRESH,
1027 HWC2_CALLBACK_VSYNC,
1028}};
1029
1030/* TESTCASE: Tests that the HWC2 can successfully register all required
1031 * callback functions. */
1032TEST_F(Hwc2Test, REGISTER_CALLBACK)
1033{
1034 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1035 const_cast<char*>("data"));
1036
1037 for (auto descriptor : callbackDescriptors) {
1038 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1039 []() { return; }));
1040 }
1041}
1042
1043/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
1044TEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
1045{
1046 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1047 const_cast<char*>("data"));
1048 hwc2_error_t err = HWC2_ERROR_NONE;
1049
1050 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
1051 []() { return; }, &err));
1052 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1053}
1054
1055/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
1056TEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
1057{
1058 hwc2_callback_data_t data = nullptr;
1059
1060 for (auto descriptor : callbackDescriptors) {
1061 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1062 []() { return; }));
1063 }
1064}
Marissa Wallcfb9a072017-02-17 20:53:18 -08001065
1066/* TESTCASE: Tests that the HWC2 returns the correct display type for each
1067 * physical display. */
1068TEST_F(Hwc2Test, GET_DISPLAY_TYPE)
1069{
1070 for (auto display : mDisplays) {
1071 hwc2_display_type_t type;
1072
1073 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
1074 EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
1075 " correct display type";
1076 }
1077}
1078
1079/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
1080 * display is requested. */
1081TEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
1082{
1083 hwc2_display_t display;
1084 hwc2_display_type_t type;
1085 hwc2_error_t err = HWC2_ERROR_NONE;
1086
1087 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1088
1089 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
1090 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1091}
Marissa Wall1db2e372016-12-15 12:19:39 -08001092
1093/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
1094TEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
1095{
1096 for (auto display : mDisplays) {
1097 hwc2_layer_t layer;
1098
1099 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1100
1101 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1102 }
1103}
1104
1105/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
1106TEST_F(Hwc2Test, CREATE_LAYER_bad_display)
1107{
1108 hwc2_display_t display;
1109 hwc2_layer_t layer;
1110 hwc2_error_t err = HWC2_ERROR_NONE;
1111
1112 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1113
1114 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
1115 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1116}
1117
1118/* TESTCASE: Tests that the HWC2 will either support a large number of resources
1119 * or will return no resources. */
1120TEST_F(Hwc2Test, CREATE_LAYER_no_resources)
1121{
1122 const size_t layerCnt = 1000;
1123
1124 for (auto display : mDisplays) {
1125 std::vector<hwc2_layer_t> layers;
1126
1127 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1128
1129 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1130 }
1131}
1132
1133/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
1134TEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
1135{
1136 hwc2_display_t badDisplay;
1137
1138 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
1139
1140 for (auto display : mDisplays) {
1141 hwc2_layer_t layer = 0;
1142 hwc2_error_t err = HWC2_ERROR_NONE;
1143
1144 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
1145 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1146
1147 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1148
1149 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
1150 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1151
1152 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1153 }
1154}
1155
1156/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
1157TEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
1158{
1159 for (auto display : mDisplays) {
1160 hwc2_layer_t layer;
1161 hwc2_error_t err = HWC2_ERROR_NONE;
1162
1163 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
1164 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1165
1166 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
1167 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1168
1169 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
1170 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1171
1172 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
1173 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1174
1175 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
1176 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1177
1178 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1179
1180 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
1181 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1182
1183 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1184
1185 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
1186 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
1187 }
1188}
Marissa Wallcf935cb2016-12-15 12:20:47 -08001189
1190static const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
1191 HWC2_ATTRIBUTE_WIDTH,
1192 HWC2_ATTRIBUTE_HEIGHT,
1193}};
1194
1195static const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
1196 HWC2_ATTRIBUTE_VSYNC_PERIOD,
1197 HWC2_ATTRIBUTE_DPI_X,
1198 HWC2_ATTRIBUTE_DPI_Y,
1199}};
1200
1201/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
1202 * config. */
1203TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
1204{
1205 for (auto display : mDisplays) {
1206 std::vector<hwc2_config_t> configs;
1207
1208 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1209
1210 for (auto config : configs) {
1211 int32_t value;
1212
1213 for (auto attribute : requiredAttributes) {
1214 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1215 attribute, &value));
1216 EXPECT_GE(value, 0) << "missing required attribute "
1217 << getAttributeName(attribute) << " for config "
1218 << config;
1219 }
1220 for (auto attribute : optionalAttributes) {
1221 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1222 attribute, &value));
1223 }
1224 }
1225 }
1226}
1227
1228/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
1229 * attribute */
1230TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
1231{
1232 const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
1233
1234 for (auto display : mDisplays) {
1235 std::vector<hwc2_config_t> configs;
1236
1237 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1238
1239 for (auto config : configs) {
1240 int32_t value;
1241 hwc2_error_t err = HWC2_ERROR_NONE;
1242
1243 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1244 attribute, &value, &err));
1245 EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
1246 " attribute for config " << config;
1247 }
1248 }
1249}
1250
1251/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
1252TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
1253{
1254 hwc2_display_t display;
1255 const hwc2_config_t config = 0;
1256 int32_t value;
1257 hwc2_error_t err = HWC2_ERROR_NONE;
1258
1259 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1260
1261 for (auto attribute : requiredAttributes) {
1262 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1263 &value, &err));
1264 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1265 }
1266
1267 for (auto attribute : optionalAttributes) {
1268 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1269 &value, &err));
1270 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1271 }
1272}
1273
1274/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
1275TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
1276{
1277 for (auto display : mDisplays) {
1278 hwc2_config_t config;
1279 int32_t value;
1280 hwc2_error_t err = HWC2_ERROR_NONE;
1281
1282 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1283
1284 for (auto attribute : requiredAttributes) {
1285 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1286 attribute, &value, &err));
1287 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1288 }
1289
1290 for (auto attribute : optionalAttributes) {
1291 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1292 attribute, &value, &err));
1293 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1294 }
1295 }
1296}
1297
1298/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
1299TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
1300{
1301 for (auto display : mDisplays) {
1302 std::vector<hwc2_config_t> configs;
1303
1304 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1305 }
1306}
1307
1308/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
1309TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
1310{
1311 hwc2_display_t display;
1312 std::vector<hwc2_config_t> configs;
1313 hwc2_error_t err = HWC2_ERROR_NONE;
1314
1315 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1316
1317 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
1318
1319 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1320 EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
1321}
1322
1323/* TESTCASE: Tests that the HWC2 will return the same config list multiple
1324 * times in a row. */
1325TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
1326{
1327 for (auto display : mDisplays) {
1328 std::vector<hwc2_config_t> configs1, configs2;
1329
1330 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
1331 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
1332
1333 EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
1334 configs2.begin())) << "returned two different config sets";
1335 }
1336}
1337
1338/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
1339TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
1340{
1341 for (auto display : mDisplays) {
1342 std::vector<hwc2_config_t> configs;
1343
1344 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1345
1346 std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
1347 configs.end());
1348 EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
1349 " configs";
1350 }
1351}
Marissa Wall93dc04f2016-12-15 12:21:46 -08001352
1353/* TESTCASE: Tests that the HWC2 returns the active config for a display */
1354TEST_F(Hwc2Test, GET_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 hwc2_config_t activeConfig;
1363
1364 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1365 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
1366
1367 EXPECT_EQ(activeConfig, config) << "failed to get active config";
1368 }
1369 }
1370}
1371
1372/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
1373 * display. */
1374TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
1375{
1376 hwc2_display_t display;
1377 hwc2_config_t activeConfig;
1378 hwc2_error_t err = HWC2_ERROR_NONE;
1379
1380 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1381
1382 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
1383
1384 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1385}
1386
1387/* TESTCASE: Tests that the HWC2 either begins with a valid active config
1388 * or returns an error when getActiveConfig is called. */
1389TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
1390{
1391 for (auto display : mDisplays) {
1392 std::vector<hwc2_config_t> configs;
1393 hwc2_config_t activeConfig;
1394 hwc2_error_t err = HWC2_ERROR_NONE;
1395
1396 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1397
1398 if (configs.empty())
1399 return;
1400
1401 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
1402 if (err == HWC2_ERROR_NONE) {
1403 EXPECT_NE(std::count(configs.begin(), configs.end(),
1404 activeConfig), 0) << "active config is not found in "
1405 " configs for display";
1406 } else {
1407 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1408 }
1409 }
1410}
1411
1412/* TESTCASE: Tests that the HWC2 can set every display config as an active
1413 * config */
1414TEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
1415{
1416 for (auto display : mDisplays) {
1417 std::vector<hwc2_config_t> configs;
1418
1419 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1420
1421 for (auto config : configs) {
1422 EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1423 }
1424 }
1425}
1426
1427/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
1428TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
1429{
1430 hwc2_display_t display;
1431 const hwc2_config_t config = 0;
1432 hwc2_error_t err = HWC2_ERROR_NONE;
1433
1434 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1435
1436 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
1437 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1438}
1439
1440/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
1441TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
1442{
1443 for (auto display : mDisplays) {
1444 hwc2_config_t config;
1445 hwc2_error_t err = HWC2_ERROR_NONE;
1446
1447 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1448
1449 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
1450 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1451 }
1452}
Marissa Wall03c91732016-12-15 12:23:16 -08001453
1454/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
1455TEST_F(Hwc2Test, GET_DOZE_SUPPORT)
1456{
1457 for (auto display : mDisplays) {
1458 int32_t support = -1;
1459
1460 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1461
1462 EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
1463 }
1464}
1465
1466/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
1467TEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
1468{
1469 hwc2_display_t display;
1470 int32_t support = -1;
1471 hwc2_error_t err = HWC2_ERROR_NONE;
1472
1473 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1474
1475 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1476
1477 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1478}
1479
1480/* TESTCASE: Tests that the HWC2 can set all supported power modes */
1481TEST_F(Hwc2Test, SET_POWER_MODE)
1482{
1483 for (auto display : mDisplays) {
1484 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1485 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1486
1487 int32_t support = -1;
1488 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1489 if (support != 1)
1490 return;
1491
1492 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1493 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1494 HWC2_POWER_MODE_DOZE_SUSPEND));
1495
1496 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1497 }
1498}
1499
1500/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
1501TEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
1502{
1503 hwc2_display_t display;
1504 hwc2_error_t err = HWC2_ERROR_NONE;
1505
1506 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1507
1508 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
1509 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1510
1511 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
1512 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1513
1514 int32_t support = -1;
1515 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1516 if (support != 1)
1517 return;
1518
1519 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
1520 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1521
1522 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
1523 &err));
1524 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1525}
1526
1527/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
1528TEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
1529{
1530 for (auto display : mDisplays) {
1531 hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
1532 HWC2_POWER_MODE_DOZE_SUSPEND + 1);
1533 hwc2_error_t err = HWC2_ERROR_NONE;
1534
1535 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
1536 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
1537 << mode;
1538 }
1539}
1540
1541/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
1542 * an optional power mode. */
1543TEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
1544{
1545 for (auto display : mDisplays) {
1546 int32_t support = -1;
1547 hwc2_error_t err = HWC2_ERROR_NONE;
1548
1549 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1550 if (support == 1)
1551 return;
1552
1553 ASSERT_EQ(support, 0) << "invalid doze support value";
1554
1555 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
1556 &err));
1557 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
1558
1559 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1560 HWC2_POWER_MODE_DOZE_SUSPEND, &err));
1561 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
1562 }
1563}
1564
1565/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
1566TEST_F(Hwc2Test, SET_POWER_MODE_stress)
1567{
1568 for (auto display : mDisplays) {
1569 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1570 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1571
1572 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1573 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1574
1575 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1576 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1577
1578 int32_t support = -1;
1579 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1580 if (support != 1)
1581 return;
1582
1583 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1584 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1585
1586 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1587 HWC2_POWER_MODE_DOZE_SUSPEND));
1588 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1589 HWC2_POWER_MODE_DOZE_SUSPEND));
1590
1591 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1592 }
1593}
Marissa Wall572a1ee2016-12-15 12:24:13 -08001594
1595/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
1596 * displays */
1597TEST_F(Hwc2Test, SET_VSYNC_ENABLED)
1598{
1599 for (auto display : mDisplays) {
1600 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1601 const_cast<char*>("data"));
1602
1603 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1604
1605 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1606 []() { return; }));
1607
1608 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1609
1610 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1611
1612 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1613 }
1614}
1615
1616/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
1617TEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
1618{
1619 for (auto display : mDisplays) {
1620 hwc2_display_t receivedDisplay;
1621 int64_t receivedTimestamp;
1622
1623 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1624
1625 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1626
1627 ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
1628 &receivedTimestamp));
1629
1630 EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
1631 EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
1632
1633 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1634
1635 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1636 }
1637}
1638
1639/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
1640TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
1641{
1642 hwc2_display_t display;
1643 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1644 const_cast<char*>("data"));
1645 hwc2_error_t err = HWC2_ERROR_NONE;
1646
1647 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1648
1649 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1650 []() { return; }));
1651
1652 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
1653 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1654
1655 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
1656 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1657}
1658
1659/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
1660TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
1661{
1662 for (auto display : mDisplays) {
1663 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1664 const_cast<char*>("data"));
1665 hwc2_error_t err = HWC2_ERROR_NONE;
1666
1667 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1668
1669 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1670 []() { return; }));
1671
1672 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
1673 &err));
1674 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1675
1676 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1677 }
1678}
1679
1680/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
1681 * times. */
1682TEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
1683{
1684 for (auto display : mDisplays) {
1685 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1686 const_cast<char*>("data"));
1687
1688 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1689
1690 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1691 []() { return; }));
1692
1693 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1694
1695 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1696 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1697
1698 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1699 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1700
1701 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1702 }
1703}
1704
1705/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
1706 * is off and no callback is registered. */
1707TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
1708{
1709 const uint secs = 1;
1710
1711 for (auto display : mDisplays) {
1712 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1713
1714 sleep(secs);
1715
1716 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1717 }
1718}
1719
1720/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
1721 * is registered. */
1722TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
1723{
1724 const uint secs = 1;
1725
1726 for (auto display : mDisplays) {
1727 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1728
1729 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1730
1731 sleep(secs);
1732
1733 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1734
1735 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1736 }
1737}
Marissa Walldd4087f2016-12-15 12:24:52 -08001738
1739/* TESTCASE: Tests that the HWC2 returns a display name for each display */
1740TEST_F(Hwc2Test, GET_DISPLAY_NAME)
1741{
1742 for (auto display : mDisplays) {
1743 std::string name;
1744
1745 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
1746 }
1747}
1748
1749/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
1750 * display */
1751TEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
1752{
1753 hwc2_display_t display;
1754 std::string name;
1755 hwc2_error_t err = HWC2_ERROR_NONE;
1756
1757 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1758
1759 ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
1760 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1761}
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001762
1763/* TESTCASE: Tests that the HWC2 can set basic composition types. */
1764TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
1765{
1766 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1767 setComposition, advanceComposition));
1768}
1769
1770/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
1771 * layer. */
1772TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
1773{
1774 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1775 setComposition, advanceComposition));
1776}
1777
1778/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
1779TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
1780{
1781 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1782 setComposition));
1783}
1784
1785/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
1786TEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
1787{
1788 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
1789 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1790 hwc2_error_t* outErr) {
1791
1792 ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1793 layer, HWC2_COMPOSITION_INVALID, outErr));
1794 }
1795 ));
1796}
Marissa Wallffc67da2016-12-15 12:26:09 -08001797
1798/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
1799TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
1800{
1801 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1802 setBlendMode, advanceBlendMode));
1803}
1804
1805/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
1806TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
1807{
1808 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1809 setBlendMode, advanceBlendMode));
1810}
1811
1812/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
1813TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
1814{
1815 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1816 setBlendMode));
1817}
1818
1819/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
1820TEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
1821{
1822 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
1823 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1824 hwc2_error_t* outErr) {
1825
1826 ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
1827 layer, HWC2_BLEND_MODE_INVALID, outErr));
1828 }
1829 ));
1830}
Marissa Wallb72b5c92016-12-15 12:26:39 -08001831
1832/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
1833TEST_F(Hwc2Test, SET_LAYER_DATASPACE)
1834{
1835 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1836 setDataspace, advanceDataspace));
1837}
1838
1839/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
1840TEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
1841{
1842 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1843 setDataspace, advanceDataspace));
1844}
1845
1846/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
1847TEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
1848{
1849 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1850 setDataspace));
1851}
Marissa Wall2b1f5302016-12-15 12:27:20 -08001852
Marissa Wall600a73b2016-12-15 12:30:39 -08001853/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
1854TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
1855{
1856 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1857 setDisplayFrame, advanceDisplayFrame));
1858}
1859
1860/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
1861TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
1862{
1863 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1864 setDisplayFrame, advanceDisplayFrame));
1865}
1866
1867/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
1868TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
1869{
1870 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1871 setDisplayFrame));
1872}
1873
Marissa Wall2b1f5302016-12-15 12:27:20 -08001874/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
1875TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
1876{
1877 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1878 setPlaneAlpha, advancePlaneAlpha));
1879}
1880
1881/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
1882TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
1883{
1884 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1885 setPlaneAlpha, advancePlaneAlpha));
1886}
1887
1888/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
1889TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
1890{
1891 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1892 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
1893 const Hwc2TestLayer& testLayer, hwc2_error_t *outErr) {
1894
1895 EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
1896 badLayer, testLayer.getPlaneAlpha(), outErr));
1897 }
1898 ));
1899}
Marissa Wallac108192016-12-15 12:27:48 -08001900
1901/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
1902TEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
1903{
1904 ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1905 setTransform, advanceTransform));
1906}
1907
1908/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
1909TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
1910{
1911 ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1912 setTransform, advanceTransform));
1913}
1914
1915/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
1916TEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
1917{
1918 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1919 setTransform));
1920}
Marissa Wall273b1df2016-12-15 12:28:47 -08001921
1922/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
1923TEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
1924{
1925 ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
1926 [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1927 const Hwc2TestLayers& testLayers) {
1928
1929 EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
1930 testLayers.getZOrder(layer)));
1931 }
1932 ));
1933}
1934
1935/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
1936TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
1937{
1938 const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
1939 static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
1940 static_cast<uint32_t>(UINT32_MAX / 2),
1941 static_cast<uint32_t>(UINT32_MAX) };
1942
1943 for (auto display : mDisplays) {
1944 std::vector<hwc2_config_t> configs;
1945
1946 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1947
1948 for (auto config : configs) {
1949 hwc2_layer_t layer;
1950
1951 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1952
1953 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
1954
1955 for (uint32_t zOrder : zOrders) {
1956 EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
1957 }
1958
1959 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
1960 }
1961 }
1962}
1963
1964/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
1965TEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
1966{
1967 ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1968 setZOrder));
1969}