12251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <base/logging.h> 22251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <gtest/gtest.h> 32251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <poll.h> 42251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 52251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <android/hardware_buffer.h> 62251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 72251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <algorithm> 82251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <set> 92251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <thread> 102251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <vector> 112251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 122251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <dvr/dvr_deleter.h> 132251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <dvr/dvr_display_manager.h> 142251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <dvr/dvr_surface.h> 152251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 162251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <pdx/status.h> 172251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 182251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing android::pdx::ErrorStatus; 192251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing android::pdx::Status; 202251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 212251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakanamespace android { 222251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakanamespace dvr { 232251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 242251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakanamespace { 252251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 262251d822dac2a96aad4184a6fdc2690f0a58af7cCorey TabakaDvrSurfaceAttribute GetAttribute(DvrSurfaceAttributeKey key, bool value) { 272251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka DvrSurfaceAttribute attribute; 282251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka attribute.key = key; 292251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka attribute.value.type = DVR_SURFACE_ATTRIBUTE_TYPE_BOOL; 302251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka attribute.value.bool_value = value; 312251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return attribute; 322251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} 332251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 342251d822dac2a96aad4184a6fdc2690f0a58af7cCorey TabakaDvrSurfaceAttribute GetAttribute(DvrSurfaceAttributeKey key, int32_t value) { 352251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka DvrSurfaceAttribute attribute; 362251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka attribute.key = key; 372251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka attribute.value.type = DVR_SURFACE_ATTRIBUTE_TYPE_INT32; 382251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka attribute.value.bool_value = value; 392251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return attribute; 402251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} 412251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 422251d822dac2a96aad4184a6fdc2690f0a58af7cCorey TabakaStatus<UniqueDvrSurface> CreateApplicationSurface(bool visible = false, 432251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka int32_t z_order = 0) { 442251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka DvrSurface* surface = nullptr; 452251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka DvrSurfaceAttribute attributes[] = { 462251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka GetAttribute(DVR_SURFACE_ATTRIBUTE_Z_ORDER, z_order), 472251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka GetAttribute(DVR_SURFACE_ATTRIBUTE_VISIBLE, visible)}; 482251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 492251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const int ret = dvrSurfaceCreate( 502251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka attributes, std::extent<decltype(attributes)>::value, &surface); 512251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (ret < 0) 522251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return ErrorStatus(-ret); 532251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka else 542251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return {UniqueDvrSurface(surface)}; 552251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} 562251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 572251d822dac2a96aad4184a6fdc2690f0a58af7cCorey TabakaStatus<UniqueDvrWriteBufferQueue> CreateSurfaceQueue( 582251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const UniqueDvrSurface& surface, uint32_t width, uint32_t height, 59108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar uint32_t format, uint32_t layer_count, uint64_t usage, size_t capacity) { 602251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka DvrWriteBufferQueue* queue; 61108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar const int ret = 62108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar dvrSurfaceCreateWriteBufferQueue(surface.get(), width, height, format, 63108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar layer_count, usage, capacity, &queue); 642251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (ret < 0) 652251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return ErrorStatus(-ret); 662251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka else 672251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return {UniqueDvrWriteBufferQueue(queue)}; 682251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} 692251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 702251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaclass TestDisplayManager { 712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka public: 722251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka TestDisplayManager(UniqueDvrDisplayManager display_manager, 732251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka UniqueDvrSurfaceState surface_state) 742251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka : display_manager_(std::move(display_manager)), 752251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka surface_state_(std::move(surface_state)) { 762251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const int fd = dvrDisplayManagerGetEventFd(display_manager_.get()); 772251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka LOG_IF(INFO, fd < 0) << "Failed to get event fd: " << strerror(-fd); 782251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka display_manager_event_fd_ = fd; 792251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } 802251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 812251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka Status<UniqueDvrReadBufferQueue> GetReadBufferQueue(int surface_id, 822251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka int queue_id) { 832251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka DvrReadBufferQueue* queue; 842251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const int ret = dvrDisplayManagerGetReadBufferQueue( 852251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka display_manager_.get(), surface_id, queue_id, &queue); 862251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (ret < 0) 872251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return ErrorStatus(-ret); 882251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka else 892251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return {UniqueDvrReadBufferQueue(queue)}; 902251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } 912251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 922251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka Status<void> UpdateSurfaceState() { 932251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const int ret = dvrDisplayManagerGetSurfaceState(display_manager_.get(), 942251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka surface_state_.get()); 952251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (ret < 0) 962251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return ErrorStatus(-ret); 972251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka else 982251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return {}; 992251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } 1002251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 1012251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka Status<void> WaitForUpdate() { 1022251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (display_manager_event_fd_ < 0) 1032251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return ErrorStatus(-display_manager_event_fd_); 1042251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 1052251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const int kTimeoutMs = 10000; // 10s 1062251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka pollfd pfd = {display_manager_event_fd_, POLLIN, 0}; 1072251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const int count = poll(&pfd, 1, kTimeoutMs); 1082251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (count < 0) 1092251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return ErrorStatus(errno); 1102251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka else if (count == 0) 1112251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return ErrorStatus(ETIMEDOUT); 1122251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 1132251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka int events; 1142251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const int ret = dvrDisplayManagerTranslateEpollEventMask( 1152251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka display_manager_.get(), pfd.revents, &events); 1162251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (ret < 0) 1172251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return ErrorStatus(-ret); 1182251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka else if (events & POLLIN) 1192251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return UpdateSurfaceState(); 1202251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka else 1212251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return ErrorStatus(EPROTO); 1222251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } 1232251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 1242251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka Status<size_t> GetSurfaceCount() { 1252251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka size_t count = 0; 1262251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const int ret = 1272251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka dvrSurfaceStateGetSurfaceCount(surface_state_.get(), &count); 1282251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (ret < 0) 1292251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return ErrorStatus(-ret); 1302251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka else 1312251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return {count}; 1322251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } 1332251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 1342251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka Status<DvrSurfaceUpdateFlags> GetUpdateFlags(size_t surface_index) { 1352251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka DvrSurfaceUpdateFlags update_flags; 1362251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const int ret = dvrSurfaceStateGetUpdateFlags(surface_state_.get(), 1372251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka surface_index, &update_flags); 1382251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (ret < 0) 1392251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return ErrorStatus(-ret); 1402251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka else 1412251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return {update_flags}; 1422251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } 1432251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 1442251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka Status<int> GetSurfaceId(size_t surface_index) { 1452251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka int surface_id; 1462251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const int ret = dvrSurfaceStateGetSurfaceId(surface_state_.get(), 1472251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka surface_index, &surface_id); 1482251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (ret < 0) 1492251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return ErrorStatus(-ret); 1502251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka else 1512251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return {surface_id}; 1522251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } 1532251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 1542251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka Status<int> GetProcessId(size_t surface_index) { 1552251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka int process_id; 1562251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const int ret = dvrSurfaceStateGetProcessId(surface_state_.get(), 1572251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka surface_index, &process_id); 1582251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (ret < 0) 1592251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return ErrorStatus(-ret); 1602251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka else 1612251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return {process_id}; 1622251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } 1632251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 1642251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka Status<std::vector<DvrSurfaceAttribute>> GetAttributes(size_t surface_index) { 1652251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka std::vector<DvrSurfaceAttribute> attributes; 1662251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka size_t count = 0; 1672251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const int ret = dvrSurfaceStateGetAttributeCount(surface_state_.get(), 1682251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka surface_index, &count); 1692251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (ret < 0) 1702251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return ErrorStatus(-ret); 1712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 1722251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka attributes.resize(count); 1732251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const ssize_t return_count = dvrSurfaceStateGetAttributes( 1742251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka surface_state_.get(), surface_index, attributes.data(), count); 1752251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (return_count < 0) 1762251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return ErrorStatus(-return_count); 1772251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 1782251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka attributes.resize(return_count); 1792251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return {std::move(attributes)}; 1802251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } 1812251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 1822251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka Status<std::vector<int>> GetQueueIds(size_t surface_index) { 1832251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka std::vector<int> queue_ids; 1842251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka size_t count = 0; 1852251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const int ret = dvrSurfaceStateGetQueueCount(surface_state_.get(), 1862251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka surface_index, &count); 1872251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (ret < 0) 1882251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return ErrorStatus(-ret); 1892251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 1902251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (count > 0) { 1912251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka queue_ids.resize(count); 1922251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const ssize_t return_count = dvrSurfaceStateGetQueueIds( 1932251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka surface_state_.get(), surface_index, queue_ids.data(), count); 1942251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (return_count < 0) 1952251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return ErrorStatus(-return_count); 1962251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 1972251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka queue_ids.resize(return_count); 1982251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } 1992251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 2002251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return {std::move(queue_ids)}; 2012251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } 2022251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 2032251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka private: 2042251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka UniqueDvrDisplayManager display_manager_; 2052251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka UniqueDvrSurfaceState surface_state_; 2062251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 2072251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // Owned by object in display_manager_, do not explicitly close. 2082251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka int display_manager_event_fd_; 2092251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 2102251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka TestDisplayManager(const TestDisplayManager&) = delete; 2112251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka void operator=(const TestDisplayManager&) = delete; 2122251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}; 2132251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 2142251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaclass DvrDisplayManagerTest : public ::testing::Test { 2152251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka protected: 2162251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka void SetUp() override { 2172251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka int ret; 2182251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka DvrDisplayManager* display_manager; 2192251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka DvrSurfaceState* surface_state; 2202251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 2212251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ret = dvrDisplayManagerCreate(&display_manager); 2222251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_EQ(0, ret) << "Failed to create display manager client"; 2232251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_NE(nullptr, display_manager); 2242251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 2252251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ret = dvrSurfaceStateCreate(&surface_state); 2262251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_EQ(0, ret) << "Failed to create surface state object"; 2272251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_NE(nullptr, surface_state); 2282251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 2292251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka manager_.reset( 2302251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka new TestDisplayManager(UniqueDvrDisplayManager(display_manager), 2312251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka UniqueDvrSurfaceState(surface_state))); 2322251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } 2332251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka void TearDown() override {} 2342251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 2352251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka std::unique_ptr<TestDisplayManager> manager_; 2362251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}; 2372251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 2382251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// TODO(eieio): Consider moving these somewhere more central because they are 2392251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// broadly useful. 2402251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 2412251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatemplate <typename T> 2422251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatesting::AssertionResult StatusOk(const char* status_expression, 2432251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const Status<T>& status) { 2442251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!status.ok()) { 2452251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return testing::AssertionFailure() 2462251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka << "(" << status_expression 2472251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka << ") expected to indicate success but actually contains error (" 2482251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka << status.error() << ")"; 2492251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } else { 2502251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return testing::AssertionSuccess(); 2512251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } 2522251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} 2532251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 2542251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatemplate <typename T> 2552251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatesting::AssertionResult StatusError(const char* status_expression, 2562251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const Status<T>& status) { 2572251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (status.ok()) { 2582251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return testing::AssertionFailure() 2592251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka << "(" << status_expression 2602251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka << ") expected to indicate error but instead indicates success."; 2612251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } else { 2622251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return testing::AssertionSuccess(); 2632251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } 2642251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} 2652251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 2662251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatemplate <typename T> 2672251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatesting::AssertionResult StatusHasError(const char* status_expression, 2682251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const char* /*error_code_expression*/, 2692251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const Status<T>& status, 2702251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka int error_code) { 2712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (status.ok()) { 2722251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return StatusError(status_expression, status); 2732251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } else if (status.error() != error_code) { 2742251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return testing::AssertionFailure() 2752251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka << "(" << status_expression << ") expected to indicate error (" 2762251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka << error_code << ") but actually indicates error (" << status.error() 2772251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka << ")"; 2782251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } else { 2792251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return testing::AssertionSuccess(); 2802251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } 2812251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} 2822251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 2832251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatemplate <typename T, typename U> 2842251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatesting::AssertionResult StatusHasValue(const char* status_expression, 2852251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const char* /*value_expression*/, 2862251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const Status<T>& status, 2872251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const U& value) { 2882251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!status.ok()) { 2892251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return StatusOk(status_expression, status); 2902251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } else if (status.get() != value) { 2912251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return testing::AssertionFailure() 2922251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka << "(" << status_expression << ") expected to contain value (" 2932251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka << testing::PrintToString(value) << ") but actually contains value (" 2942251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka << testing::PrintToString(status.get()) << ")"; 2952251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } else { 2962251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return testing::AssertionSuccess(); 2972251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } 2982251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} 2992251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 3002251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatemplate <typename T, typename Op> 3012251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatesting::AssertionResult StatusPred(const char* status_expression, 3022251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const char* pred_expression, 3032251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const Status<T>& status, Op pred) { 3042251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!status.ok()) { 3052251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return StatusOk(status_expression, status); 3062251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } else if (!pred(status.get())) { 3072251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return testing::AssertionFailure() 3082251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka << status_expression << " value (" 3092251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka << testing::PrintToString(status.get()) 3102251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka << ") failed to pass predicate " << pred_expression; 3112251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } else { 3122251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return testing::AssertionSuccess(); 3132251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } 3142251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} 3152251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 3162251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#define ASSERT_STATUS_OK(status) ASSERT_PRED_FORMAT1(StatusOk, status) 3172251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#define ASSERT_STATUS_ERROR(status) ASSERT_PRED_FORMAT1(StatusError, status) 3182251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 3192251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#define ASSERT_STATUS_ERROR_VALUE(value, status) \ 3202251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_PRED_FORMAT2(StatusHasError, status, value) 3212251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 3222251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#define ASSERT_STATUS_EQ(value, status) \ 3232251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_PRED_FORMAT2(StatusHasValue, status, value) 3242251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 3252251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#define EXPECT_STATUS_OK(status) EXPECT_PRED_FORMAT1(StatusOk, status) 3262251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#define EXPECT_STATUS_ERROR(status) EXPECT_PRED_FORMAT1(StatusError, status) 3272251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 3282251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#define EXPECT_STATUS_ERROR_VALUE(value, status) \ 3292251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_PRED_FORMAT2(StatusHasError, status, value) 3302251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 3312251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#define EXPECT_STATUS_EQ(value, status) \ 3322251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_PRED_FORMAT2(StatusHasValue, status, value) 3332251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 3342251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#define EXPECT_STATUS_PRED(pred, status) \ 3352251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_PRED_FORMAT2(StatusPred, status, pred) 3362251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 3372251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#if 0 3382251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Verify utility predicate/macro functionality. This section is commented out 3392251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// because it is designed to fail in some cases to validate the helpers. 3402251d822dac2a96aad4184a6fdc2690f0a58af7cCorey TabakaTEST_F(DvrDisplayManagerTest, ExpectVoid) { 3412251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka Status<void> status_error{ErrorStatus{EINVAL}}; 3422251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka Status<void> status_ok{}; 3432251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 3442251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_ERROR(status_error); 3452251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_ERROR(status_ok); 3462251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_OK(status_error); 3472251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_OK(status_ok); 3482251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 3492251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_ERROR_VALUE(EINVAL, status_error); 3502251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_ERROR_VALUE(ENOMEM, status_error); 3512251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_ERROR_VALUE(EINVAL, status_ok); 3522251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_ERROR_VALUE(ENOMEM, status_ok); 3532251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} 3542251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 3552251d822dac2a96aad4184a6fdc2690f0a58af7cCorey TabakaTEST_F(DvrDisplayManagerTest, ExpectInt) { 3562251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka Status<int> status_error{ErrorStatus{EINVAL}}; 3572251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka Status<int> status_ok{10}; 3582251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 3592251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_ERROR(status_error); 3602251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_ERROR(status_ok); 3612251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_OK(status_error); 3622251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_OK(status_ok); 3632251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 3642251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_ERROR_VALUE(EINVAL, status_error); 3652251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_ERROR_VALUE(ENOMEM, status_error); 3662251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_ERROR_VALUE(EINVAL, status_ok); 3672251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_ERROR_VALUE(ENOMEM, status_ok); 3682251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 3692251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_EQ(10, status_error); 3702251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_EQ(20, status_error); 3712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_EQ(10, status_ok); 3722251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_EQ(20, status_ok); 3732251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 3742251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka auto pred1 = [](const auto& value) { return value < 15; }; 3752251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka auto pred2 = [](const auto& value) { return value > 5; }; 3762251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka auto pred3 = [](const auto& value) { return value > 15; }; 3772251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka auto pred4 = [](const auto& value) { return value < 5; }; 3782251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 3792251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_PRED(pred1, status_error); 3802251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_PRED(pred2, status_error); 3812251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_PRED(pred3, status_error); 3822251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_PRED(pred4, status_error); 3832251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_PRED(pred1, status_ok); 3842251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_PRED(pred2, status_ok); 3852251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_PRED(pred3, status_ok); 3862251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_PRED(pred4, status_ok); 3872251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} 3882251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#endif 3892251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 3902251d822dac2a96aad4184a6fdc2690f0a58af7cCorey TabakaTEST_F(DvrDisplayManagerTest, SurfaceCreateEvent) { 3912251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // Get surface state and verify there are no surfaces. 3922251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_STATUS_OK(manager_->UpdateSurfaceState()); 3932251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_STATUS_EQ(0u, manager_->GetSurfaceCount()); 3942251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 3952251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // Get flags for invalid surface index. 3962251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_ERROR_VALUE(EINVAL, manager_->GetUpdateFlags(0)); 3972251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 3982251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // Create an application surface. 3992251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka auto surface_status = CreateApplicationSurface(); 4002251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_STATUS_OK(surface_status); 4012251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka UniqueDvrSurface surface = surface_status.take(); 4022251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_NE(nullptr, surface.get()); 4032251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 4042251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const int surface_id = dvrSurfaceGetId(surface.get()); 4052251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_GE(surface_id, 0); 4062251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 4072251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // Now there should be one new surface. 4082251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_STATUS_OK(manager_->WaitForUpdate()); 4092251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_EQ(1u, manager_->GetSurfaceCount()); 4102251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 4112251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // Verify the new surface flag is set. 4122251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka auto check_flags = [](const auto& value) { 4132251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return value & DVR_SURFACE_UPDATE_FLAGS_NEW_SURFACE; 4142251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka }; 4152251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_PRED(check_flags, manager_->GetUpdateFlags(0)); 4162251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 4172251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // Verify the surface id matches. 4182251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_EQ(surface_id, manager_->GetSurfaceId(0)); 4192251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 4202251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // Verify the owning process of the surface. 4212251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_EQ(getpid(), manager_->GetProcessId(0)); 4222251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 4232251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka surface.reset(); 4242251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 4252251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_STATUS_OK(manager_->WaitForUpdate()); 4262251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_EQ(0u, manager_->GetSurfaceCount()); 4272251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} 4282251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 4292251d822dac2a96aad4184a6fdc2690f0a58af7cCorey TabakaTEST_F(DvrDisplayManagerTest, SurfaceAttributeEvent) { 4302251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // Get surface state and verify there are no surfaces. 4312251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_STATUS_OK(manager_->UpdateSurfaceState()); 4322251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_STATUS_EQ(0u, manager_->GetSurfaceCount()); 4332251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 4342251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // Get attributes for an invalid surface index. 4352251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_ERROR_VALUE(EINVAL, manager_->GetAttributes(0)); 4362251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 4372251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const bool kInitialVisibility = true; 4382251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const int32_t kInitialZOrder = 10; 4392251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka auto surface_status = 4402251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka CreateApplicationSurface(kInitialVisibility, kInitialZOrder); 4412251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_STATUS_OK(surface_status); 4422251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka auto surface = surface_status.take(); 4432251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_NE(nullptr, surface.get()); 4442251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 4452251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_STATUS_OK(manager_->WaitForUpdate()); 4462251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_STATUS_EQ(1u, manager_->GetSurfaceCount()); 4472251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 4482251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // Check the initial attribute values. 4492251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka auto attribute_status = manager_->GetAttributes(0); 4502251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_STATUS_OK(attribute_status); 4512251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka auto attributes = attribute_status.take(); 4522251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_GE(attributes.size(), 2u); 4532251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 4542251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const std::set<int32_t> expected_keys = {DVR_SURFACE_ATTRIBUTE_Z_ORDER, 4552251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka DVR_SURFACE_ATTRIBUTE_VISIBLE}; 4562251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 4572251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // Collect all the keys in attributes that match the expected keys. 4582251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka std::set<int32_t> actual_keys; 4592251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka std::for_each(attributes.begin(), attributes.end(), 4602251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka [&expected_keys, &actual_keys](const auto& attribute) { 4612251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (expected_keys.find(attribute.key) != expected_keys.end()) 4622251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka actual_keys.emplace(attribute.key); 4632251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka }); 4642251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 4652251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // If the sets match then attributes contained at least the expected keys, 4662251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // even if other keys were also present. 4672251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_EQ(expected_keys, actual_keys); 4682251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} 4692251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 4702251d822dac2a96aad4184a6fdc2690f0a58af7cCorey TabakaTEST_F(DvrDisplayManagerTest, SurfaceQueueEvent) { 4712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // Create an application surface. 4722251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka auto surface_status = CreateApplicationSurface(); 4732251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_STATUS_OK(surface_status); 4742251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka UniqueDvrSurface surface = surface_status.take(); 4752251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_NE(nullptr, surface.get()); 4762251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 4772251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const int surface_id = dvrSurfaceGetId(surface.get()); 4782251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_GE(surface_id, 0); 4792251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // Get surface state and verify there is one surface. 4802251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_STATUS_OK(manager_->WaitForUpdate()); 4812251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_STATUS_EQ(1u, manager_->GetSurfaceCount()); 4822251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 4832251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // Verify there are no queues for the surface recorded in the state snapshot. 4842251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_EQ(std::vector<int>{}, manager_->GetQueueIds(0)); 4852251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 4862251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // Create a new queue in the surface. 4872251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka auto write_queue_status = CreateSurfaceQueue( 488108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar surface, 320, 240, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM, 1, 4892251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka AHARDWAREBUFFER_USAGE_CPU_READ_RARELY, 1); 4902251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_STATUS_OK(write_queue_status); 4912251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka UniqueDvrWriteBufferQueue write_queue = write_queue_status.take(); 4922251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_NE(nullptr, write_queue.get()); 4932251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 4942251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka const int queue_id = dvrWriteBufferQueueGetId(write_queue.get()); 4952251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_GE(queue_id, 0); 4962251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 4972251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // Update surface state. 4982251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_STATUS_OK(manager_->WaitForUpdate()); 4992251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_STATUS_EQ(1u, manager_->GetSurfaceCount()); 5002251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 5012251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // Verify the buffers changed flag is set. 5022251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka auto check_flags = [](const auto& value) { 5032251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return value & DVR_SURFACE_UPDATE_FLAGS_BUFFERS_CHANGED; 5042251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka }; 5052251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_PRED(check_flags, manager_->GetUpdateFlags(0)); 5062251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 5072251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka auto queue_ids_status = manager_->GetQueueIds(0); 5082251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_STATUS_OK(queue_ids_status); 5092251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 5102251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka auto queue_ids = queue_ids_status.take(); 5112251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_EQ(1u, queue_ids.size()); 5122251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_EQ(queue_id, queue_ids[0]); 5132251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 5142251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka auto read_queue_status = manager_->GetReadBufferQueue(surface_id, queue_id); 5152251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_STATUS_OK(read_queue_status); 5162251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka UniqueDvrReadBufferQueue read_queue = read_queue_status.take(); 5172251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_NE(nullptr, read_queue.get()); 5182251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_EQ(queue_id, dvrReadBufferQueueGetId(read_queue.get())); 5192251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 5202251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka write_queue.reset(); 5212251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 5222251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // Verify that destroying the queue generates a surface update event. 5232251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_STATUS_OK(manager_->WaitForUpdate()); 5242251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_STATUS_EQ(1u, manager_->GetSurfaceCount()); 5252251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 5262251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // Verify that the buffers changed flag is set. 5272251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka EXPECT_STATUS_PRED(check_flags, manager_->GetUpdateFlags(0)); 5282251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 5292251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka // Verify that the queue ids reflect the change. 5302251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka queue_ids_status = manager_->GetQueueIds(0); 5312251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_STATUS_OK(queue_ids_status); 5322251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 5332251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka queue_ids = queue_ids_status.take(); 5342251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka ASSERT_EQ(0u, queue_ids.size()); 5352251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} 5362251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 537108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik WagenaarTEST_F(DvrDisplayManagerTest, MultiLayerBufferQueue) { 538108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar // Create an application surface. 539108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar auto surface_status = CreateApplicationSurface(); 540108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar ASSERT_STATUS_OK(surface_status); 541108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar UniqueDvrSurface surface = surface_status.take(); 542108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar ASSERT_NE(nullptr, surface.get()); 543108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar 544108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar // Get surface state and verify there is one surface. 545108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar ASSERT_STATUS_OK(manager_->WaitForUpdate()); 546108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar ASSERT_STATUS_EQ(1u, manager_->GetSurfaceCount()); 547108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar 548108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar // Create a new queue in the surface. 549108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar const uint32_t kLayerCount = 3; 550108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar auto write_queue_status = CreateSurfaceQueue( 551108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar surface, 320, 240, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM, kLayerCount, 552108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar AHARDWAREBUFFER_USAGE_CPU_READ_RARELY, 1); 553108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar ASSERT_STATUS_OK(write_queue_status); 554108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar UniqueDvrWriteBufferQueue write_queue = write_queue_status.take(); 555108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar ASSERT_NE(nullptr, write_queue.get()); 556108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar 557108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar DvrWriteBuffer* buffer = nullptr; 558108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar dvrWriteBufferCreateEmpty(&buffer); 559108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar int fence_fd = -1; 560108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar int error = 561108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar dvrWriteBufferQueueDequeue(write_queue.get(), 1000, buffer, &fence_fd); 562108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar ASSERT_EQ(0, error); 563108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar 564108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar AHardwareBuffer* hardware_buffer = nullptr; 565108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar error = dvrWriteBufferGetAHardwareBuffer(buffer, &hardware_buffer); 566108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar ASSERT_EQ(0, error); 567108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar 568108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar AHardwareBuffer_Desc desc = {}; 569108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar AHardwareBuffer_describe(hardware_buffer, &desc); 570108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar ASSERT_EQ(kLayerCount, desc.layers); 571108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar 572108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar AHardwareBuffer_release(hardware_buffer); 573108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar dvrWriteBufferDestroy(buffer); 574108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar} 575108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar 5762251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} // namespace 5772251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 5782251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} // namespace dvr 5792251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} // namespace android 580