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