blob: 2505cb22e936534e17f74705f3dd78ee23cc833b [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 Wallcfb9a072017-02-17 20:53:18 -080029void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
30 hwc2_display_t display, int32_t connected);
Marissa Wall572a1ee2016-12-15 12:24:13 -080031void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
32 hwc2_display_t display, int64_t timestamp);
Marissa Wallcfb9a072017-02-17 20:53:18 -080033
Marissa Wall4d600052016-12-15 12:16:01 -080034class Hwc2Test : public testing::Test {
35public:
36
37 virtual void SetUp()
38 {
39 hw_module_t const* hwc2Module;
40
41 int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
42 ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
43 << strerror(-err);
44
45 /* The following method will fail if you have not run
46 * "adb shell stop" */
47 err = hwc2_open(hwc2Module, &mHwc2Device);
48 ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
49 << strerror(-err);
Marissa Wallcfb9a072017-02-17 20:53:18 -080050
51 populateDisplays();
Marissa Wall4d600052016-12-15 12:16:01 -080052 }
53
54 virtual void TearDown()
55 {
Marissa Wall1db2e372016-12-15 12:19:39 -080056
57 for (auto itr = mLayers.begin(); itr != mLayers.end();) {
58 hwc2_display_t display = itr->first;
59 hwc2_layer_t layer = itr->second;
60 itr++;
61 /* Destroys and removes the layer from mLayers */
62 destroyLayer(display, layer);
63 }
64
Marissa Wall03c91732016-12-15 12:23:16 -080065 for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) {
66 hwc2_display_t display = *itr;
67 itr++;
68 /* Sets power mode to off and removes the display from
69 * mActiveDisplays */
70 setPowerMode(display, HWC2_POWER_MODE_OFF);
71 }
72
Marissa Wall4d600052016-12-15 12:16:01 -080073 if (mHwc2Device)
74 hwc2_close(mHwc2Device);
75 }
76
Marissa Walla4b01482017-02-17 20:52:03 -080077 void registerCallback(hwc2_callback_descriptor_t descriptor,
78 hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
79 hwc2_error_t* outErr = nullptr)
80 {
81 auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
82 getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
83 ASSERT_TRUE(pfn) << "failed to get function";
84
85 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
86 callbackData, pointer));
87 if (outErr) {
88 *outErr = err;
89 } else {
90 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
91 }
92 }
93
Marissa Wallcfb9a072017-02-17 20:53:18 -080094 void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
95 hwc2_error_t* outErr = nullptr)
96 {
97 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
98 getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
99 ASSERT_TRUE(pfn) << "failed to get function";
100
101 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
102 reinterpret_cast<int32_t*>(outType)));
103 if (outErr) {
104 *outErr = err;
105 } else {
106 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
107 }
108 }
109
110 /* If the populateDisplays function is still receiving displays and the
111 * display is connected, the display handle is stored in mDisplays. */
112 void hotplugCallback(hwc2_display_t display, int32_t connected)
113 {
114 std::lock_guard<std::mutex> lock(mHotplugMutex);
115
116 if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
117 return;
118
119 if (connected == HWC2_CONNECTION_CONNECTED)
120 mDisplays.insert(display);
121
122 mHotplugCv.notify_all();
123 }
124
Marissa Wall1db2e372016-12-15 12:19:39 -0800125 void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
126 hwc2_error_t* outErr = nullptr)
127 {
128 auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
129 getFunction(HWC2_FUNCTION_CREATE_LAYER));
130 ASSERT_TRUE(pfn) << "failed to get function";
131
132 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
133 outLayer));
134
135 if (err == HWC2_ERROR_NONE)
136 mLayers.insert(std::make_pair(display, *outLayer));
137
138 if (outErr) {
139 *outErr = err;
140 } else {
141 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
142 }
143 }
144
145 void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
146 hwc2_error_t* outErr = nullptr)
147 {
148 auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
149 getFunction(HWC2_FUNCTION_DESTROY_LAYER));
150 ASSERT_TRUE(pfn) << "failed to get function";
151
152 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
153
154 if (err == HWC2_ERROR_NONE)
155 mLayers.erase(std::make_pair(display, layer));
156
157 if (outErr) {
158 *outErr = err;
159 } else {
160 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
161 << layer;
162 }
163 }
164
Marissa Wallcf935cb2016-12-15 12:20:47 -0800165 void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
166 hwc2_attribute_t attribute, int32_t* outValue,
167 hwc2_error_t* outErr = nullptr)
168 {
169 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
170 getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
171 ASSERT_TRUE(pfn) << "failed to get function";
172
173 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
174 attribute, outValue));
175
176 if (outErr) {
177 *outErr = err;
178 } else {
179 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
180 << getAttributeName(attribute) << " for config " << config;
181 }
182 }
183
184 void getDisplayConfigs(hwc2_display_t display,
185 std::vector<hwc2_config_t>* outConfigs,
186 hwc2_error_t* outErr = nullptr)
187 {
188 auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
189 getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
190 ASSERT_TRUE(pfn) << "failed to get function";
191
192 uint32_t numConfigs = 0;
193
194 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
195 &numConfigs, nullptr));
196
197 if (err == HWC2_ERROR_NONE) {
198 outConfigs->resize(numConfigs);
199
200 err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
201 &numConfigs, outConfigs->data()));
202 }
203
204 if (outErr) {
205 *outErr = err;
206 } else {
207 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
208 " display " << display;
209 }
210 }
211
Marissa Wall93dc04f2016-12-15 12:21:46 -0800212 void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig,
213 hwc2_error_t* outErr = nullptr)
214 {
215 auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>(
216 getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG));
217 ASSERT_TRUE(pfn) << "failed to get function";
218
219 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
220 outConfig));
221 if (outErr) {
222 *outErr = err;
223 } else {
224 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on"
225 " display " << display;
226 }
227 }
228
229 void setActiveConfig(hwc2_display_t display, hwc2_config_t config,
230 hwc2_error_t* outErr = nullptr)
231 {
232 auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>(
233 getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG));
234 ASSERT_TRUE(pfn) << "failed to get function";
235
236 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config));
237 if (outErr) {
238 *outErr = err;
239 } else {
240 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config "
241 << config;
242 }
243 }
244
Marissa Wall03c91732016-12-15 12:23:16 -0800245 void getDozeSupport(hwc2_display_t display, int32_t* outSupport,
246 hwc2_error_t* outErr = nullptr)
247 {
248 auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>(
249 getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT));
250 ASSERT_TRUE(pfn) << "failed to get function";
251
252 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
253 outSupport));
254 if (outErr) {
255 *outErr = err;
256 } else {
257 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on"
258 " display " << display;
259 }
260 }
261
262 void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode,
263 hwc2_error_t* outErr = nullptr)
264 {
265 auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>(
266 getFunction(HWC2_FUNCTION_SET_POWER_MODE));
267 ASSERT_TRUE(pfn) << "failed to get function";
268
269 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
270 mode));
271 if (outErr) {
272 *outErr = err;
273 if (err != HWC2_ERROR_NONE)
274 return;
275 } else {
276 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode "
277 << getPowerModeName(mode) << " on display " << display;
278 }
279
280 if (mode == HWC2_POWER_MODE_OFF) {
281 mActiveDisplays.erase(display);
282 } else {
283 mActiveDisplays.insert(display);
284 }
285 }
286
Marissa Wall572a1ee2016-12-15 12:24:13 -0800287 void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled,
288 hwc2_error_t* outErr = nullptr)
289 {
290 auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>(
291 getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED));
292 ASSERT_TRUE(pfn) << "failed to get function";
293
294 auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
295 enabled));
296 if (outErr) {
297 *outErr = err;
298 } else {
299 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled "
300 << getVsyncName(enabled);
301 }
302 }
303
304 void vsyncCallback(hwc2_display_t display, int64_t timestamp)
305 {
306 std::lock_guard<std::mutex> lock(mVsyncMutex);
307 mVsyncDisplay = display;
308 mVsyncTimestamp = timestamp;
309 mVsyncCv.notify_all();
310 }
311
Marissa Wall4d600052016-12-15 12:16:01 -0800312protected:
313 hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
314 {
315 return mHwc2Device->getFunction(mHwc2Device, descriptor);
316 }
317
318 void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
319 {
320 uint32_t num = 0;
321
322 mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
323
324 outCapabilities->resize(num);
325
326 mHwc2Device->getCapabilities(mHwc2Device, &num,
327 reinterpret_cast<int32_t*>(outCapabilities->data()));
328 }
329
Marissa Wallcfb9a072017-02-17 20:53:18 -0800330 /* Registers a hotplug callback and waits for hotplug callbacks. This
331 * function will have no effect if called more than once. */
332 void populateDisplays()
333 {
334 /* Sets the hotplug status to receiving */
335 {
336 std::lock_guard<std::mutex> lock(mHotplugMutex);
337
338 if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
339 return;
340 mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
341 }
342
343 /* Registers the callback. This function call cannot be locked because
344 * a callback could happen on the same thread */
345 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
346 reinterpret_cast<hwc2_function_pointer_t>(
347 hwc2TestHotplugCallback)));
348
349 /* Waits for hotplug events. If a hotplug event has not come within 1
350 * second, stop waiting. */
351 std::unique_lock<std::mutex> lock(mHotplugMutex);
352
353 while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
354 std::cv_status::timeout) { }
355
356 /* Sets the hotplug status to done. Future calls will have no effect */
357 mHotplugStatus = Hwc2TestHotplugStatus::Done;
358 }
359
360 void getBadDisplay(hwc2_display_t* outDisplay)
361 {
362 for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
363 if (mDisplays.count(display) == 0) {
364 *outDisplay = display;
365 return;
366 }
367 }
368 ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
369 " are registered. This should never happen.";
370 }
371
Marissa Wall1db2e372016-12-15 12:19:39 -0800372 /* NOTE: will create min(newlayerCnt, max supported layers) layers */
373 void createLayers(hwc2_display_t display,
374 std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
375 {
376 std::vector<hwc2_layer_t> newLayers;
377 hwc2_layer_t layer;
378 hwc2_error_t err = HWC2_ERROR_NONE;
379
380 for (size_t i = 0; i < newLayerCnt; i++) {
381
382 EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
383 if (err == HWC2_ERROR_NO_RESOURCES)
384 break;
385 if (err != HWC2_ERROR_NONE) {
386 newLayers.clear();
387 ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
388 }
389 newLayers.push_back(layer);
390 }
391
392 *outLayers = std::move(newLayers);
393 }
394
395 void destroyLayers(hwc2_display_t display,
396 std::vector<hwc2_layer_t>&& layers)
397 {
398 for (hwc2_layer_t layer : layers) {
399 EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
400 }
401 }
402
Marissa Wallcf935cb2016-12-15 12:20:47 -0800403 void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
404 {
405 std::vector<hwc2_config_t> configs;
406
407 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
408
409 hwc2_config_t CONFIG_MAX = UINT32_MAX;
410
411 ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
412 " (2^32 values) has been taken which shouldn't happen";
413
414 hwc2_config_t config;
415 for (config = 0; config < CONFIG_MAX; config++) {
416 if (std::count(configs.begin(), configs.end(), config) == 0)
417 break;
418 }
419
420 *outConfig = config;
421 }
422
Marissa Wall572a1ee2016-12-15 12:24:13 -0800423 void enableVsync(hwc2_display_t display)
424 {
425 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
426 reinterpret_cast<hwc2_function_pointer_t>(
427 hwc2TestVsyncCallback)));
428 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
429 }
430
431 void disableVsync(hwc2_display_t display)
432 {
433 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
434 }
435
436 void waitForVsync(hwc2_display_t* outDisplay = nullptr,
437 int64_t* outTimestamp = nullptr)
438 {
439 std::unique_lock<std::mutex> lock(mVsyncMutex);
440 ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
441 std::cv_status::no_timeout) << "timed out attempting to get"
442 " vsync callback";
443 if (outDisplay)
444 *outDisplay = mVsyncDisplay;
445 if (outTimestamp)
446 *outTimestamp = mVsyncTimestamp;
447 }
448
Marissa Wall4d600052016-12-15 12:16:01 -0800449 hwc2_device_t* mHwc2Device = nullptr;
Marissa Wallcfb9a072017-02-17 20:53:18 -0800450
451 enum class Hwc2TestHotplugStatus {
452 Init = 1,
453 Receiving,
454 Done,
455 };
456
457 std::mutex mHotplugMutex;
458 std::condition_variable mHotplugCv;
459 Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
460 std::unordered_set<hwc2_display_t> mDisplays;
Marissa Wall1db2e372016-12-15 12:19:39 -0800461
462 /* Store all created layers that have not been destroyed. If an ASSERT_*
463 * fails, then destroy the layers on exit */
464 std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
Marissa Wall03c91732016-12-15 12:23:16 -0800465
466 /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
467 * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
468 std::set<hwc2_display_t> mActiveDisplays;
Marissa Wall572a1ee2016-12-15 12:24:13 -0800469
470 std::mutex mVsyncMutex;
471 std::condition_variable mVsyncCv;
472 hwc2_display_t mVsyncDisplay;
473 int64_t mVsyncTimestamp = -1;
Marissa Wall4d600052016-12-15 12:16:01 -0800474};
475
Marissa Wallcfb9a072017-02-17 20:53:18 -0800476void hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
477 hwc2_display_t display, int32_t connection)
478{
479 if (callbackData)
480 static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
481 connection);
482}
483
Marissa Wall572a1ee2016-12-15 12:24:13 -0800484void hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
485 hwc2_display_t display, int64_t timestamp)
486{
487 if (callbackData)
488 static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
489 timestamp);
490}
491
Marissa Wall4d600052016-12-15 12:16:01 -0800492
493static const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
494 HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
495 HWC2_FUNCTION_CREATE_LAYER,
496 HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
497 HWC2_FUNCTION_DESTROY_LAYER,
498 HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
499 HWC2_FUNCTION_DUMP,
500 HWC2_FUNCTION_GET_ACTIVE_CONFIG,
501 HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
502 HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
503 HWC2_FUNCTION_GET_COLOR_MODES,
504 HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
505 HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
506 HWC2_FUNCTION_GET_DISPLAY_NAME,
507 HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
508 HWC2_FUNCTION_GET_DISPLAY_TYPE,
509 HWC2_FUNCTION_GET_DOZE_SUPPORT,
510 HWC2_FUNCTION_GET_HDR_CAPABILITIES,
511 HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
512 HWC2_FUNCTION_GET_RELEASE_FENCES,
513 HWC2_FUNCTION_PRESENT_DISPLAY,
514 HWC2_FUNCTION_REGISTER_CALLBACK,
515 HWC2_FUNCTION_SET_ACTIVE_CONFIG,
516 HWC2_FUNCTION_SET_CLIENT_TARGET,
517 HWC2_FUNCTION_SET_COLOR_MODE,
518 HWC2_FUNCTION_SET_COLOR_TRANSFORM,
519 HWC2_FUNCTION_SET_CURSOR_POSITION,
520 HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
521 HWC2_FUNCTION_SET_LAYER_BUFFER,
522 HWC2_FUNCTION_SET_LAYER_COLOR,
523 HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
524 HWC2_FUNCTION_SET_LAYER_DATASPACE,
525 HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
526 HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
527 HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
528 HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
529 HWC2_FUNCTION_SET_LAYER_TRANSFORM,
530 HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
531 HWC2_FUNCTION_SET_LAYER_Z_ORDER,
532 HWC2_FUNCTION_SET_OUTPUT_BUFFER,
533 HWC2_FUNCTION_SET_POWER_MODE,
534 HWC2_FUNCTION_SET_VSYNC_ENABLED,
535 HWC2_FUNCTION_VALIDATE_DISPLAY,
536}};
537
538/* TESTCASE: Tests that the HWC2 supports all required functions. */
539TEST_F(Hwc2Test, GET_FUNCTION)
540{
541 for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
542 hwc2_function_pointer_t pfn = getFunction(descriptor);
543 EXPECT_TRUE(pfn) << "failed to get function "
544 << getFunctionDescriptorName(descriptor);
545 }
546}
547
548/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
549TEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
550{
551 hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
552 EXPECT_FALSE(pfn) << "failed to get invalid function";
553}
554
555/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
556TEST_F(Hwc2Test, GET_CAPABILITIES)
557{
558 std::vector<hwc2_capability_t> capabilities;
559
560 getCapabilities(&capabilities);
561
562 EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
563 HWC2_CAPABILITY_INVALID), 0);
564}
Marissa Walla4b01482017-02-17 20:52:03 -0800565
566static const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
567 HWC2_CALLBACK_HOTPLUG,
568 HWC2_CALLBACK_REFRESH,
569 HWC2_CALLBACK_VSYNC,
570}};
571
572/* TESTCASE: Tests that the HWC2 can successfully register all required
573 * callback functions. */
574TEST_F(Hwc2Test, REGISTER_CALLBACK)
575{
576 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
577 const_cast<char*>("data"));
578
579 for (auto descriptor : callbackDescriptors) {
580 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
581 []() { return; }));
582 }
583}
584
585/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
586TEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
587{
588 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
589 const_cast<char*>("data"));
590 hwc2_error_t err = HWC2_ERROR_NONE;
591
592 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
593 []() { return; }, &err));
594 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
595}
596
597/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
598TEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
599{
600 hwc2_callback_data_t data = nullptr;
601
602 for (auto descriptor : callbackDescriptors) {
603 ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
604 []() { return; }));
605 }
606}
Marissa Wallcfb9a072017-02-17 20:53:18 -0800607
608/* TESTCASE: Tests that the HWC2 returns the correct display type for each
609 * physical display. */
610TEST_F(Hwc2Test, GET_DISPLAY_TYPE)
611{
612 for (auto display : mDisplays) {
613 hwc2_display_type_t type;
614
615 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
616 EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
617 " correct display type";
618 }
619}
620
621/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
622 * display is requested. */
623TEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
624{
625 hwc2_display_t display;
626 hwc2_display_type_t type;
627 hwc2_error_t err = HWC2_ERROR_NONE;
628
629 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
630
631 ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
632 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
633}
Marissa Wall1db2e372016-12-15 12:19:39 -0800634
635/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
636TEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
637{
638 for (auto display : mDisplays) {
639 hwc2_layer_t layer;
640
641 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
642
643 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
644 }
645}
646
647/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
648TEST_F(Hwc2Test, CREATE_LAYER_bad_display)
649{
650 hwc2_display_t display;
651 hwc2_layer_t layer;
652 hwc2_error_t err = HWC2_ERROR_NONE;
653
654 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
655
656 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
657 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
658}
659
660/* TESTCASE: Tests that the HWC2 will either support a large number of resources
661 * or will return no resources. */
662TEST_F(Hwc2Test, CREATE_LAYER_no_resources)
663{
664 const size_t layerCnt = 1000;
665
666 for (auto display : mDisplays) {
667 std::vector<hwc2_layer_t> layers;
668
669 ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
670
671 ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
672 }
673}
674
675/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
676TEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
677{
678 hwc2_display_t badDisplay;
679
680 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
681
682 for (auto display : mDisplays) {
683 hwc2_layer_t layer = 0;
684 hwc2_error_t err = HWC2_ERROR_NONE;
685
686 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
687 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
688
689 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
690
691 ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
692 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
693
694 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
695 }
696}
697
698/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
699TEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
700{
701 for (auto display : mDisplays) {
702 hwc2_layer_t layer;
703 hwc2_error_t err = HWC2_ERROR_NONE;
704
705 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
706 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
707
708 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
709 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
710
711 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
712 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
713
714 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
715 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
716
717 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
718 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
719
720 ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
721
722 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
723 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
724
725 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
726
727 ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
728 EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
729 }
730}
Marissa Wallcf935cb2016-12-15 12:20:47 -0800731
732static const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
733 HWC2_ATTRIBUTE_WIDTH,
734 HWC2_ATTRIBUTE_HEIGHT,
735}};
736
737static const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
738 HWC2_ATTRIBUTE_VSYNC_PERIOD,
739 HWC2_ATTRIBUTE_DPI_X,
740 HWC2_ATTRIBUTE_DPI_Y,
741}};
742
743/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
744 * config. */
745TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
746{
747 for (auto display : mDisplays) {
748 std::vector<hwc2_config_t> configs;
749
750 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
751
752 for (auto config : configs) {
753 int32_t value;
754
755 for (auto attribute : requiredAttributes) {
756 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
757 attribute, &value));
758 EXPECT_GE(value, 0) << "missing required attribute "
759 << getAttributeName(attribute) << " for config "
760 << config;
761 }
762 for (auto attribute : optionalAttributes) {
763 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
764 attribute, &value));
765 }
766 }
767 }
768}
769
770/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
771 * attribute */
772TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
773{
774 const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
775
776 for (auto display : mDisplays) {
777 std::vector<hwc2_config_t> configs;
778
779 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
780
781 for (auto config : configs) {
782 int32_t value;
783 hwc2_error_t err = HWC2_ERROR_NONE;
784
785 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
786 attribute, &value, &err));
787 EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
788 " attribute for config " << config;
789 }
790 }
791}
792
793/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
794TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
795{
796 hwc2_display_t display;
797 const hwc2_config_t config = 0;
798 int32_t value;
799 hwc2_error_t err = HWC2_ERROR_NONE;
800
801 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
802
803 for (auto attribute : requiredAttributes) {
804 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
805 &value, &err));
806 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
807 }
808
809 for (auto attribute : optionalAttributes) {
810 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
811 &value, &err));
812 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
813 }
814}
815
816/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
817TEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
818{
819 for (auto display : mDisplays) {
820 hwc2_config_t config;
821 int32_t value;
822 hwc2_error_t err = HWC2_ERROR_NONE;
823
824 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
825
826 for (auto attribute : requiredAttributes) {
827 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
828 attribute, &value, &err));
829 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
830 }
831
832 for (auto attribute : optionalAttributes) {
833 ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
834 attribute, &value, &err));
835 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
836 }
837 }
838}
839
840/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
841TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
842{
843 for (auto display : mDisplays) {
844 std::vector<hwc2_config_t> configs;
845
846 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
847 }
848}
849
850/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
851TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
852{
853 hwc2_display_t display;
854 std::vector<hwc2_config_t> configs;
855 hwc2_error_t err = HWC2_ERROR_NONE;
856
857 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
858
859 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
860
861 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
862 EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
863}
864
865/* TESTCASE: Tests that the HWC2 will return the same config list multiple
866 * times in a row. */
867TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
868{
869 for (auto display : mDisplays) {
870 std::vector<hwc2_config_t> configs1, configs2;
871
872 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
873 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
874
875 EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
876 configs2.begin())) << "returned two different config sets";
877 }
878}
879
880/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
881TEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
882{
883 for (auto display : mDisplays) {
884 std::vector<hwc2_config_t> configs;
885
886 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
887
888 std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
889 configs.end());
890 EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
891 " configs";
892 }
893}
Marissa Wall93dc04f2016-12-15 12:21:46 -0800894
895/* TESTCASE: Tests that the HWC2 returns the active config for a display */
896TEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
897{
898 for (auto display : mDisplays) {
899 std::vector<hwc2_config_t> configs;
900
901 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
902
903 for (auto config : configs) {
904 hwc2_config_t activeConfig;
905
906 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
907 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
908
909 EXPECT_EQ(activeConfig, config) << "failed to get active config";
910 }
911 }
912}
913
914/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
915 * display. */
916TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
917{
918 hwc2_display_t display;
919 hwc2_config_t activeConfig;
920 hwc2_error_t err = HWC2_ERROR_NONE;
921
922 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
923
924 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
925
926 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
927}
928
929/* TESTCASE: Tests that the HWC2 either begins with a valid active config
930 * or returns an error when getActiveConfig is called. */
931TEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
932{
933 for (auto display : mDisplays) {
934 std::vector<hwc2_config_t> configs;
935 hwc2_config_t activeConfig;
936 hwc2_error_t err = HWC2_ERROR_NONE;
937
938 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
939
940 if (configs.empty())
941 return;
942
943 ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
944 if (err == HWC2_ERROR_NONE) {
945 EXPECT_NE(std::count(configs.begin(), configs.end(),
946 activeConfig), 0) << "active config is not found in "
947 " configs for display";
948 } else {
949 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
950 }
951 }
952}
953
954/* TESTCASE: Tests that the HWC2 can set every display config as an active
955 * config */
956TEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
957{
958 for (auto display : mDisplays) {
959 std::vector<hwc2_config_t> configs;
960
961 ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
962
963 for (auto config : configs) {
964 EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
965 }
966 }
967}
968
969/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
970TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
971{
972 hwc2_display_t display;
973 const hwc2_config_t config = 0;
974 hwc2_error_t err = HWC2_ERROR_NONE;
975
976 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
977
978 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
979 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
980}
981
982/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
983TEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
984{
985 for (auto display : mDisplays) {
986 hwc2_config_t config;
987 hwc2_error_t err = HWC2_ERROR_NONE;
988
989 ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
990
991 ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
992 EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
993 }
994}
Marissa Wall03c91732016-12-15 12:23:16 -0800995
996/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
997TEST_F(Hwc2Test, GET_DOZE_SUPPORT)
998{
999 for (auto display : mDisplays) {
1000 int32_t support = -1;
1001
1002 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1003
1004 EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
1005 }
1006}
1007
1008/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
1009TEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
1010{
1011 hwc2_display_t display;
1012 int32_t support = -1;
1013 hwc2_error_t err = HWC2_ERROR_NONE;
1014
1015 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1016
1017 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1018
1019 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1020}
1021
1022/* TESTCASE: Tests that the HWC2 can set all supported power modes */
1023TEST_F(Hwc2Test, SET_POWER_MODE)
1024{
1025 for (auto display : mDisplays) {
1026 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1027 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1028
1029 int32_t support = -1;
1030 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1031 if (support != 1)
1032 return;
1033
1034 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1035 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1036 HWC2_POWER_MODE_DOZE_SUSPEND));
1037
1038 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1039 }
1040}
1041
1042/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
1043TEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
1044{
1045 hwc2_display_t display;
1046 hwc2_error_t err = HWC2_ERROR_NONE;
1047
1048 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1049
1050 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
1051 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1052
1053 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
1054 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1055
1056 int32_t support = -1;
1057 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1058 if (support != 1)
1059 return;
1060
1061 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
1062 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1063
1064 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
1065 &err));
1066 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1067}
1068
1069/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
1070TEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
1071{
1072 for (auto display : mDisplays) {
1073 hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
1074 HWC2_POWER_MODE_DOZE_SUSPEND + 1);
1075 hwc2_error_t err = HWC2_ERROR_NONE;
1076
1077 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
1078 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
1079 << mode;
1080 }
1081}
1082
1083/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
1084 * an optional power mode. */
1085TEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
1086{
1087 for (auto display : mDisplays) {
1088 int32_t support = -1;
1089 hwc2_error_t err = HWC2_ERROR_NONE;
1090
1091 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
1092 if (support == 1)
1093 return;
1094
1095 ASSERT_EQ(support, 0) << "invalid doze support value";
1096
1097 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
1098 &err));
1099 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
1100
1101 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1102 HWC2_POWER_MODE_DOZE_SUSPEND, &err));
1103 EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
1104 }
1105}
1106
1107/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
1108TEST_F(Hwc2Test, SET_POWER_MODE_stress)
1109{
1110 for (auto display : mDisplays) {
1111 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1112 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1113
1114 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1115 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1116
1117 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1118 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1119
1120 int32_t support = -1;
1121 ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
1122 if (support != 1)
1123 return;
1124
1125 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1126 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
1127
1128 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1129 HWC2_POWER_MODE_DOZE_SUSPEND));
1130 ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
1131 HWC2_POWER_MODE_DOZE_SUSPEND));
1132
1133 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1134 }
1135}
Marissa Wall572a1ee2016-12-15 12:24:13 -08001136
1137/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
1138 * displays */
1139TEST_F(Hwc2Test, SET_VSYNC_ENABLED)
1140{
1141 for (auto display : mDisplays) {
1142 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1143 const_cast<char*>("data"));
1144
1145 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1146
1147 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1148 []() { return; }));
1149
1150 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1151
1152 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1153
1154 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1155 }
1156}
1157
1158/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
1159TEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
1160{
1161 for (auto display : mDisplays) {
1162 hwc2_display_t receivedDisplay;
1163 int64_t receivedTimestamp;
1164
1165 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1166
1167 ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1168
1169 ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
1170 &receivedTimestamp));
1171
1172 EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
1173 EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
1174
1175 ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1176
1177 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1178 }
1179}
1180
1181/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
1182TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
1183{
1184 hwc2_display_t display;
1185 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1186 const_cast<char*>("data"));
1187 hwc2_error_t err = HWC2_ERROR_NONE;
1188
1189 ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1190
1191 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1192 []() { return; }));
1193
1194 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
1195 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1196
1197 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
1198 EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1199}
1200
1201/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
1202TEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
1203{
1204 for (auto display : mDisplays) {
1205 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1206 const_cast<char*>("data"));
1207 hwc2_error_t err = HWC2_ERROR_NONE;
1208
1209 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1210
1211 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1212 []() { return; }));
1213
1214 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
1215 &err));
1216 EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1217
1218 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1219 }
1220}
1221
1222/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
1223 * times. */
1224TEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
1225{
1226 for (auto display : mDisplays) {
1227 hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1228 const_cast<char*>("data"));
1229
1230 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1231
1232 ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1233 []() { return; }));
1234
1235 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1236
1237 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1238 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1239
1240 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1241 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1242
1243 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1244 }
1245}
1246
1247/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
1248 * is off and no callback is registered. */
1249TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
1250{
1251 const uint secs = 1;
1252
1253 for (auto display : mDisplays) {
1254 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1255
1256 sleep(secs);
1257
1258 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1259 }
1260}
1261
1262/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
1263 * is registered. */
1264TEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
1265{
1266 const uint secs = 1;
1267
1268 for (auto display : mDisplays) {
1269 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1270
1271 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1272
1273 sleep(secs);
1274
1275 ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1276
1277 ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1278 }
1279}