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