1e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <gtest/gtest.h> 2e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <private/dvr/buffer_hub_client.h> 3e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 4e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <mutex> 5e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <thread> 6e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 74fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko#define RETRY_EINTR(fnc_call) \ 84fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko ([&]() -> decltype(fnc_call) { \ 94fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko decltype(fnc_call) result; \ 104fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko do { \ 114fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko result = (fnc_call); \ 124fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko } while (result == -1 && errno == EINTR); \ 134fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko return result; \ 144fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko })() 154fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko 16e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkousing android::dvr::BufferProducer; 17e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkousing android::dvr::BufferConsumer; 18e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkousing android::pdx::LocalHandle; 19e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 20e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoconst int kWidth = 640; 21e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoconst int kHeight = 480; 22e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoconst int kFormat = HAL_PIXEL_FORMAT_RGBA_8888; 23e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoconst int kUsage = 0; 24e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoconst uint64_t kContext = 42; 25e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 26e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkousing LibBufferHubTest = ::testing::Test; 27e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 28e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST_F(LibBufferHubTest, TestBasicUsage) { 29e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::unique_ptr<BufferProducer> p = BufferProducer::Create( 30e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko kWidth, kHeight, kFormat, kUsage, sizeof(uint64_t)); 31e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ASSERT_TRUE(p.get() != nullptr); 32e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::unique_ptr<BufferConsumer> c = 33e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko BufferConsumer::Import(p->CreateConsumer()); 34e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ASSERT_TRUE(c.get() != nullptr); 35e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Check that consumers can spawn other consumers. 36e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::unique_ptr<BufferConsumer> c2 = 37e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko BufferConsumer::Import(c->CreateConsumer()); 38e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ASSERT_TRUE(c2.get() != nullptr); 39e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 40e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(0, p->Post(LocalHandle(), kContext)); 41e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Both consumers should be triggered. 424fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko EXPECT_GE(0, RETRY_EINTR(p->Poll(0))); 434fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko EXPECT_LT(0, RETRY_EINTR(c->Poll(10))); 444fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko EXPECT_LT(0, RETRY_EINTR(c2->Poll(10))); 45e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 46e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko uint64_t context; 47e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko LocalHandle fence; 48e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_LE(0, c->Acquire(&fence, &context)); 49e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(kContext, context); 504fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko EXPECT_GE(0, RETRY_EINTR(c->Poll(0))); 51e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 52e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_LE(0, c2->Acquire(&fence, &context)); 53e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(kContext, context); 544fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko EXPECT_GE(0, RETRY_EINTR(c2->Poll(0))); 55e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 56e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(0, c->Release(LocalHandle())); 574fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko EXPECT_GE(0, RETRY_EINTR(p->Poll(0))); 58e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(0, c2->Discard()); 59e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 604fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko EXPECT_LE(0, RETRY_EINTR(p->Poll(0))); 61e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(0, p->Gain(&fence)); 624fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko EXPECT_GE(0, RETRY_EINTR(p->Poll(0))); 63e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 64e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 65e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST_F(LibBufferHubTest, TestWithCustomMetadata) { 66e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko struct Metadata { 67e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int64_t field1; 68e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int64_t field2; 69e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko }; 70e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::unique_ptr<BufferProducer> p = BufferProducer::Create( 71e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko kWidth, kHeight, kFormat, kUsage, sizeof(Metadata)); 72e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ASSERT_TRUE(p.get() != nullptr); 73e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::unique_ptr<BufferConsumer> c = 74e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko BufferConsumer::Import(p->CreateConsumer()); 75e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ASSERT_TRUE(c.get() != nullptr); 76e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 77e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Metadata m = {1, 3}; 78e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(0, p->Post(LocalHandle(), m)); 794fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko EXPECT_LE(0, RETRY_EINTR(c->Poll(10))); 80e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 81e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko LocalHandle fence; 82e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Metadata m2 = {}; 83e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(0, c->Acquire(&fence, &m2)); 84e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(m.field1, m2.field1); 85e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(m.field2, m2.field2); 86e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 87e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(0, c->Release(LocalHandle())); 884fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko EXPECT_LT(0, RETRY_EINTR(p->Poll(0))); 89e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 90e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 91e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST_F(LibBufferHubTest, TestPostWithWrongMetaSize) { 92e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko struct Metadata { 93e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int64_t field1; 94e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int64_t field2; 95e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko }; 96e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::unique_ptr<BufferProducer> p = BufferProducer::Create( 97e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko kWidth, kHeight, kFormat, kUsage, sizeof(Metadata)); 98e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ASSERT_TRUE(p.get() != nullptr); 99e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::unique_ptr<BufferConsumer> c = 100e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko BufferConsumer::Import(p->CreateConsumer()); 101e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ASSERT_TRUE(c.get() != nullptr); 102e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 103e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int64_t sequence = 3; 104e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_NE(0, p->Post(LocalHandle(), sequence)); 1054fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko EXPECT_GE(0, RETRY_EINTR(c->Poll(10))); 106e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 107e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 108e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST_F(LibBufferHubTest, TestAcquireWithWrongMetaSize) { 109e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko struct Metadata { 110e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int64_t field1; 111e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int64_t field2; 112e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko }; 113e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::unique_ptr<BufferProducer> p = BufferProducer::Create( 114e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko kWidth, kHeight, kFormat, kUsage, sizeof(Metadata)); 115e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ASSERT_TRUE(p.get() != nullptr); 116e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::unique_ptr<BufferConsumer> c = 117e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko BufferConsumer::Import(p->CreateConsumer()); 118e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ASSERT_TRUE(c.get() != nullptr); 119e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 120e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Metadata m = {1, 3}; 121e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(0, p->Post(LocalHandle(), m)); 122e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 123e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko LocalHandle fence; 124e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int64_t sequence; 125e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_NE(0, c->Acquire(&fence, &sequence)); 126e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 127e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 128e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST_F(LibBufferHubTest, TestAcquireWithNoMeta) { 129e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::unique_ptr<BufferProducer> p = BufferProducer::Create( 130e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko kWidth, kHeight, kFormat, kUsage, sizeof(uint64_t)); 131e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ASSERT_TRUE(p.get() != nullptr); 132e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::unique_ptr<BufferConsumer> c = 133e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko BufferConsumer::Import(p->CreateConsumer()); 134e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ASSERT_TRUE(c.get() != nullptr); 135e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 136e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int64_t sequence = 3; 137e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(0, p->Post(LocalHandle(), sequence)); 138e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 139e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko LocalHandle fence; 140e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(0, c->Acquire(&fence)); 141e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 142e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 143e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST_F(LibBufferHubTest, TestWithNoMeta) { 144e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::unique_ptr<BufferProducer> p = 145e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko BufferProducer::Create(kWidth, kHeight, kFormat, kUsage); 146e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ASSERT_TRUE(p.get() != nullptr); 147e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::unique_ptr<BufferConsumer> c = 148e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko BufferConsumer::Import(p->CreateConsumer()); 149e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ASSERT_TRUE(c.get() != nullptr); 150e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 151e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko LocalHandle fence; 152e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 153e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(0, p->Post<void>(LocalHandle())); 154e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(0, c->Acquire(&fence)); 155e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 156e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 157e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST_F(LibBufferHubTest, TestFailureToPostMetaFromABufferWithoutMeta) { 158e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::unique_ptr<BufferProducer> p = 159e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko BufferProducer::Create(kWidth, kHeight, kFormat, kUsage); 160e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ASSERT_TRUE(p.get() != nullptr); 161e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::unique_ptr<BufferConsumer> c = 162e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko BufferConsumer::Import(p->CreateConsumer()); 163e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ASSERT_TRUE(c.get() != nullptr); 164e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 165e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int64_t sequence = 3; 166e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_NE(0, p->Post(LocalHandle(), sequence)); 167e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 168e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 169e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST_F(LibBufferHubTest, TestPersistentBufferPersistence) { 170e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto p = BufferProducer::Create("TestPersistentBuffer", -1, -1, kWidth, 171e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko kHeight, kFormat, kUsage); 172e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ASSERT_NE(nullptr, p); 173e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 174e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Record the original buffer id for later comparison. 175e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko const int buffer_id = p->id(); 176e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 177e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto c = BufferConsumer::Import(p->CreateConsumer()); 178e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ASSERT_NE(nullptr, c); 179e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 180e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(0, p->Post<void>(LocalHandle())); 181e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 182e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Close the connection to the producer. This should not affect the consumer. 183e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko p = nullptr; 184e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 185e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko LocalHandle fence; 186e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(0, c->Acquire(&fence)); 187e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(0, c->Release(LocalHandle())); 188e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 189e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Attempt to reconnect to the persistent buffer. 190e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko p = BufferProducer::Create("TestPersistentBuffer"); 191e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ASSERT_NE(nullptr, p); 192e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(buffer_id, p->id()); 193e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(0, p->Gain(&fence)); 194e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 195e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 196e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST_F(LibBufferHubTest, TestPersistentBufferMismatchParams) { 197e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto p = BufferProducer::Create("TestPersistentBuffer", -1, -1, kWidth, 198e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko kHeight, kFormat, kUsage); 199e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ASSERT_NE(nullptr, p); 200e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 201e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Close the connection to the producer. 202e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko p = nullptr; 203e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 204e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Mismatch the params. 205e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko p = BufferProducer::Create("TestPersistentBuffer", -1, -1, kWidth * 2, 206e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko kHeight, kFormat, kUsage); 207e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ASSERT_EQ(nullptr, p); 208e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 209e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 210e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST_F(LibBufferHubTest, TestRemovePersistentBuffer) { 211e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto p = BufferProducer::Create("TestPersistentBuffer", -1, -1, kWidth, 212e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko kHeight, kFormat, kUsage); 213e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ASSERT_NE(nullptr, p); 214e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 215e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko LocalHandle fence; 216e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto c = BufferConsumer::Import(p->CreateConsumer()); 217e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ASSERT_NE(nullptr, c); 218e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_NE(-EPIPE, c->Acquire(&fence)); 219e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 220e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Test that removing persistence and closing the producer orphans the 221e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // consumer. 222e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(0, p->RemovePersistence()); 223e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko p = nullptr; 224e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 225e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko EXPECT_EQ(-EPIPE, c->Release(LocalHandle())); 226e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 227