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