• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <base/logging.h>
2 #include <binder/Parcel.h>
3 #include <dvr/dvr_api.h>
4 #include <private/dvr/buffer_hub_queue_client.h>
5 #include <private/dvr/consumer_buffer.h>
6 #include <private/dvr/producer_buffer.h>
7 
8 #include <gtest/gtest.h>
9 #include <poll.h>
10 #include <sys/eventfd.h>
11 
12 #include <vector>
13 
14 // Enable/disable debug logging.
15 #define TRACE 0
16 
17 namespace android {
18 namespace dvr {
19 
20 using pdx::LocalChannelHandle;
21 using pdx::LocalHandle;
22 
23 namespace {
24 
25 constexpr uint32_t kBufferWidth = 100;
26 constexpr uint32_t kBufferHeight = 1;
27 constexpr uint32_t kBufferLayerCount = 1;
28 constexpr uint32_t kBufferFormat = HAL_PIXEL_FORMAT_BLOB;
29 constexpr uint64_t kBufferUsage = GRALLOC_USAGE_SW_READ_RARELY;
30 constexpr int kTimeoutMs = 100;
31 constexpr int kNoTimeout = 0;
32 
33 class BufferHubQueueTest : public ::testing::Test {
34  public:
CreateProducerQueue(const ProducerQueueConfig & config,const UsagePolicy & usage)35   bool CreateProducerQueue(const ProducerQueueConfig& config,
36                            const UsagePolicy& usage) {
37     producer_queue_ = ProducerQueue::Create(config, usage);
38     return producer_queue_ != nullptr;
39   }
40 
CreateConsumerQueue()41   bool CreateConsumerQueue() {
42     if (producer_queue_) {
43       consumer_queue_ = producer_queue_->CreateConsumerQueue();
44       return consumer_queue_ != nullptr;
45     } else {
46       return false;
47     }
48   }
49 
CreateQueues(const ProducerQueueConfig & config,const UsagePolicy & usage)50   bool CreateQueues(const ProducerQueueConfig& config,
51                     const UsagePolicy& usage) {
52     return CreateProducerQueue(config, usage) && CreateConsumerQueue();
53   }
54 
AllocateBuffer(size_t * slot_out=nullptr)55   void AllocateBuffer(size_t* slot_out = nullptr) {
56     // Create producer buffer.
57     auto status = producer_queue_->AllocateBuffer(kBufferWidth, kBufferHeight,
58                                                   kBufferLayerCount,
59                                                   kBufferFormat, kBufferUsage);
60 
61     ASSERT_TRUE(status.ok());
62     size_t slot = status.take();
63     if (slot_out)
64       *slot_out = slot;
65   }
66 
WaitAndHandleOnce(BufferHubQueue * queue,int timeout_ms)67   bool WaitAndHandleOnce(BufferHubQueue* queue, int timeout_ms) {
68     pollfd pfd{queue->queue_fd(), POLLIN, 0};
69     int ret;
70     do {
71       ret = poll(&pfd, 1, timeout_ms);
72     } while (ret == -1 && errno == EINTR);
73 
74     if (ret < 0) {
75       ALOGW("Failed to poll queue %d's event fd, error: %s.", queue->id(),
76             strerror(errno));
77       return false;
78     } else if (ret == 0) {
79       return false;
80     }
81     return queue->HandleQueueEvents();
82   }
83 
84  protected:
85   ProducerQueueConfigBuilder config_builder_;
86   std::unique_ptr<ProducerQueue> producer_queue_;
87   std::unique_ptr<ConsumerQueue> consumer_queue_;
88 };
89 
TEST_F(BufferHubQueueTest,TestDequeue)90 TEST_F(BufferHubQueueTest, TestDequeue) {
91   const int64_t nb_dequeue_times = 16;
92 
93   ASSERT_TRUE(CreateQueues(config_builder_.Build(), UsagePolicy{}));
94 
95   // Allocate only one buffer.
96   AllocateBuffer();
97 
98   // But dequeue multiple times.
99   for (int64_t i = 0; i < nb_dequeue_times; i++) {
100     size_t slot;
101     LocalHandle fence;
102     DvrNativeBufferMetadata mi, mo;
103 
104     // Producer gains a buffer.
105     auto p1_status = producer_queue_->Dequeue(kTimeoutMs, &slot, &mo, &fence);
106     EXPECT_TRUE(p1_status.ok());
107     auto p1 = p1_status.take();
108     ASSERT_NE(p1, nullptr);
109 
110     // Producer posts the buffer.
111     mi.index = i;
112     EXPECT_EQ(p1->PostAsync(&mi, LocalHandle()), 0);
113 
114     // Consumer acquires a buffer.
115     auto c1_status = consumer_queue_->Dequeue(kTimeoutMs, &slot, &mo, &fence);
116     EXPECT_TRUE(c1_status.ok()) << c1_status.GetErrorMessage();
117     auto c1 = c1_status.take();
118     ASSERT_NE(c1, nullptr);
119     EXPECT_EQ(mi.index, i);
120     EXPECT_EQ(mo.index, i);
121 
122     // Consumer releases the buffer.
123     EXPECT_EQ(c1->ReleaseAsync(&mi, LocalHandle()), 0);
124   }
125 }
126 
TEST_F(BufferHubQueueTest,TestDequeuePostedBufferIfNoAvailableReleasedBuffer_withConsumerBuffer)127 TEST_F(BufferHubQueueTest,
128        TestDequeuePostedBufferIfNoAvailableReleasedBuffer_withConsumerBuffer) {
129   ASSERT_TRUE(CreateQueues(config_builder_.Build(), UsagePolicy{}));
130 
131   // Allocate 3 buffers to use.
132   const size_t test_queue_capacity = 3;
133   for (int64_t i = 0; i < test_queue_capacity; i++) {
134     AllocateBuffer();
135   }
136   EXPECT_EQ(producer_queue_->capacity(), test_queue_capacity);
137 
138   size_t producer_slot, consumer_slot;
139   LocalHandle fence;
140   DvrNativeBufferMetadata mi, mo;
141 
142   // Producer posts 2 buffers and remember their posted sequence.
143   std::deque<size_t> posted_slots;
144   for (int64_t i = 0; i < 2; i++) {
145     auto p1_status =
146         producer_queue_->Dequeue(kTimeoutMs, &producer_slot, &mo, &fence, true);
147     EXPECT_TRUE(p1_status.ok());
148     auto p1 = p1_status.take();
149     ASSERT_NE(p1, nullptr);
150 
151     // Producer should not be gaining posted buffer when there are still
152     // available buffers to gain.
153     auto found_iter =
154         std::find(posted_slots.begin(), posted_slots.end(), producer_slot);
155     EXPECT_EQ(found_iter, posted_slots.end());
156     posted_slots.push_back(producer_slot);
157 
158     // Producer posts the buffer.
159     mi.index = i;
160     EXPECT_EQ(0, p1->PostAsync(&mi, LocalHandle()));
161   }
162 
163   // Consumer acquires one buffer.
164   auto c1_status =
165       consumer_queue_->Dequeue(kTimeoutMs, &consumer_slot, &mo, &fence);
166   EXPECT_TRUE(c1_status.ok());
167   auto c1 = c1_status.take();
168   ASSERT_NE(c1, nullptr);
169   // Consumer should get the oldest posted buffer. No checks here.
170   // posted_slots[0] should be in acquired state now.
171   EXPECT_EQ(mo.index, 0);
172   // Consumer releases the buffer.
173   EXPECT_EQ(c1->ReleaseAsync(&mi, LocalHandle()), 0);
174   // posted_slots[0] should be in released state now.
175 
176   // Producer gain and post 2 buffers.
177   for (int64_t i = 0; i < 2; i++) {
178     auto p1_status =
179         producer_queue_->Dequeue(kTimeoutMs, &producer_slot, &mo, &fence, true);
180     EXPECT_TRUE(p1_status.ok());
181     auto p1 = p1_status.take();
182     ASSERT_NE(p1, nullptr);
183 
184     // The gained buffer should be the one in released state or the one haven't
185     // been use.
186     EXPECT_NE(posted_slots[1], producer_slot);
187 
188     mi.index = i + 2;
189     EXPECT_EQ(0, p1->PostAsync(&mi, LocalHandle()));
190   }
191 
192   // Producer gains a buffer.
193   auto p1_status =
194       producer_queue_->Dequeue(kTimeoutMs, &producer_slot, &mo, &fence, true);
195   EXPECT_TRUE(p1_status.ok());
196   auto p1 = p1_status.take();
197   ASSERT_NE(p1, nullptr);
198 
199   // The gained buffer should be the oldest posted buffer.
200   EXPECT_EQ(posted_slots[1], producer_slot);
201 
202   // Producer posts the buffer.
203   mi.index = 4;
204   EXPECT_EQ(0, p1->PostAsync(&mi, LocalHandle()));
205 }
206 
TEST_F(BufferHubQueueTest,TestDequeuePostedBufferIfNoAvailableReleasedBuffer_noConsumerBuffer)207 TEST_F(BufferHubQueueTest,
208        TestDequeuePostedBufferIfNoAvailableReleasedBuffer_noConsumerBuffer) {
209   ASSERT_TRUE(CreateQueues(config_builder_.Build(), UsagePolicy{}));
210 
211   // Allocate 4 buffers to use.
212   const size_t test_queue_capacity = 4;
213   for (int64_t i = 0; i < test_queue_capacity; i++) {
214     AllocateBuffer();
215   }
216   EXPECT_EQ(producer_queue_->capacity(), test_queue_capacity);
217 
218   // Post all allowed buffers and remember their posted sequence.
219   std::deque<size_t> posted_slots;
220   for (int64_t i = 0; i < test_queue_capacity; i++) {
221     size_t slot;
222     LocalHandle fence;
223     DvrNativeBufferMetadata mi, mo;
224 
225     // Producer gains a buffer.
226     auto p1_status =
227         producer_queue_->Dequeue(kTimeoutMs, &slot, &mo, &fence, true);
228     EXPECT_TRUE(p1_status.ok());
229     auto p1 = p1_status.take();
230     ASSERT_NE(p1, nullptr);
231 
232     // Producer should not be gaining posted buffer when there are still
233     // available buffers to gain.
234     auto found_iter = std::find(posted_slots.begin(), posted_slots.end(), slot);
235     EXPECT_EQ(found_iter, posted_slots.end());
236     posted_slots.push_back(slot);
237 
238     // Producer posts the buffer.
239     mi.index = i;
240     EXPECT_EQ(p1->PostAsync(&mi, LocalHandle()), 0);
241   }
242 
243   // Gain posted buffers in sequence.
244   const int64_t nb_dequeue_all_times = 2;
245   for (int j = 0; j < nb_dequeue_all_times; ++j) {
246     for (int i = 0; i < test_queue_capacity; ++i) {
247       size_t slot;
248       LocalHandle fence;
249       DvrNativeBufferMetadata mi, mo;
250 
251       // Producer gains a buffer.
252       auto p1_status =
253           producer_queue_->Dequeue(kTimeoutMs, &slot, &mo, &fence, true);
254       EXPECT_TRUE(p1_status.ok());
255       auto p1 = p1_status.take();
256       ASSERT_NE(p1, nullptr);
257 
258       // The gained buffer should be the oldest posted buffer.
259       EXPECT_EQ(posted_slots[i], slot);
260 
261       // Producer posts the buffer.
262       mi.index = i + test_queue_capacity * (j + 1);
263       EXPECT_EQ(p1->PostAsync(&mi, LocalHandle()), 0);
264     }
265   }
266 }
267 
TEST_F(BufferHubQueueTest,TestProducerConsumer)268 TEST_F(BufferHubQueueTest, TestProducerConsumer) {
269   const size_t kBufferCount = 16;
270   size_t slot;
271   DvrNativeBufferMetadata mi, mo;
272   LocalHandle fence;
273 
274   ASSERT_TRUE(CreateQueues(config_builder_.Build(), UsagePolicy{}));
275 
276   for (size_t i = 0; i < kBufferCount; i++) {
277     AllocateBuffer();
278 
279     // Producer queue has all the available buffers on initialize.
280     ASSERT_EQ(producer_queue_->count(), i + 1);
281     ASSERT_EQ(producer_queue_->capacity(), i + 1);
282 
283     // Consumer queue has no avaiable buffer on initialize.
284     ASSERT_EQ(consumer_queue_->count(), 0U);
285     // Consumer queue does not import buffers until a dequeue is issued.
286     ASSERT_EQ(consumer_queue_->capacity(), i);
287     // Dequeue returns timeout since no buffer is ready to consumer, but
288     // this implicitly triggers buffer import and bump up |capacity|.
289     auto status = consumer_queue_->Dequeue(kNoTimeout, &slot, &mo, &fence);
290     ASSERT_FALSE(status.ok());
291     ASSERT_EQ(ETIMEDOUT, status.error());
292     ASSERT_EQ(consumer_queue_->capacity(), i + 1);
293   }
294 
295   // Use eventfd as a stand-in for a fence.
296   LocalHandle post_fence(eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK));
297 
298   for (size_t i = 0; i < kBufferCount; i++) {
299     // First time there is no buffer available to dequeue.
300     auto consumer_status =
301         consumer_queue_->Dequeue(kNoTimeout, &slot, &mo, &fence);
302     ASSERT_FALSE(consumer_status.ok());
303     ASSERT_EQ(consumer_status.error(), ETIMEDOUT);
304 
305     // Make sure Producer buffer is POSTED so that it's ready to Accquire
306     // in the consumer's Dequeue() function.
307     auto producer_status =
308         producer_queue_->Dequeue(kTimeoutMs, &slot, &mo, &fence);
309     ASSERT_TRUE(producer_status.ok());
310     auto producer = producer_status.take();
311     ASSERT_NE(nullptr, producer);
312 
313     mi.index = static_cast<int64_t>(i);
314     ASSERT_EQ(producer->PostAsync(&mi, post_fence), 0);
315 
316     // Second time the just the POSTED buffer should be dequeued.
317     consumer_status = consumer_queue_->Dequeue(kTimeoutMs, &slot, &mo, &fence);
318     ASSERT_TRUE(consumer_status.ok());
319     EXPECT_TRUE(fence.IsValid());
320 
321     auto consumer = consumer_status.take();
322     ASSERT_NE(nullptr, consumer);
323     ASSERT_EQ(mi.index, mo.index);
324   }
325 }
326 
TEST_F(BufferHubQueueTest,TestInsertBuffer)327 TEST_F(BufferHubQueueTest, TestInsertBuffer) {
328   ASSERT_TRUE(CreateProducerQueue(config_builder_.Build(), UsagePolicy{}));
329 
330   consumer_queue_ = producer_queue_->CreateConsumerQueue();
331   ASSERT_TRUE(consumer_queue_ != nullptr);
332   EXPECT_EQ(producer_queue_->capacity(), 0);
333   EXPECT_EQ(consumer_queue_->capacity(), 0);
334 
335   std::shared_ptr<ProducerBuffer> p1 = ProducerBuffer::Create(
336       kBufferWidth, kBufferHeight, kBufferFormat, kBufferUsage, 0);
337   ASSERT_TRUE(p1 != nullptr);
338   ASSERT_EQ(p1->GainAsync(), 0);
339 
340   // Inserting a posted buffer will fail.
341   DvrNativeBufferMetadata meta;
342   EXPECT_EQ(p1->PostAsync(&meta, LocalHandle()), 0);
343   auto status_or_slot = producer_queue_->InsertBuffer(p1);
344   EXPECT_FALSE(status_or_slot.ok());
345   EXPECT_EQ(status_or_slot.error(), EINVAL);
346 
347   // Inserting a gained buffer will succeed.
348   std::shared_ptr<ProducerBuffer> p2 = ProducerBuffer::Create(
349       kBufferWidth, kBufferHeight, kBufferFormat, kBufferUsage);
350   ASSERT_EQ(p2->GainAsync(), 0);
351   ASSERT_TRUE(p2 != nullptr);
352   status_or_slot = producer_queue_->InsertBuffer(p2);
353   EXPECT_TRUE(status_or_slot.ok()) << status_or_slot.GetErrorMessage();
354   // This is the first buffer inserted, should take slot 0.
355   size_t slot = status_or_slot.get();
356   EXPECT_EQ(slot, 0);
357 
358   // Wait and expect the consumer to kick up the newly inserted buffer.
359   WaitAndHandleOnce(consumer_queue_.get(), kTimeoutMs);
360   EXPECT_EQ(consumer_queue_->capacity(), 1ULL);
361 }
362 
TEST_F(BufferHubQueueTest,TestRemoveBuffer)363 TEST_F(BufferHubQueueTest, TestRemoveBuffer) {
364   ASSERT_TRUE(CreateProducerQueue(config_builder_.Build(), UsagePolicy{}));
365   DvrNativeBufferMetadata mo;
366 
367   // Allocate buffers.
368   const size_t kBufferCount = 4u;
369   for (size_t i = 0; i < kBufferCount; i++) {
370     AllocateBuffer();
371   }
372   ASSERT_EQ(kBufferCount, producer_queue_->count());
373   ASSERT_EQ(kBufferCount, producer_queue_->capacity());
374 
375   consumer_queue_ = producer_queue_->CreateConsumerQueue();
376   ASSERT_NE(nullptr, consumer_queue_);
377 
378   // Check that buffers are correctly imported on construction.
379   EXPECT_EQ(kBufferCount, consumer_queue_->capacity());
380   EXPECT_EQ(0u, consumer_queue_->count());
381 
382   // Dequeue all the buffers and keep track of them in an array. This prevents
383   // the producer queue ring buffer ref counts from interfering with the tests.
384   struct Entry {
385     std::shared_ptr<ProducerBuffer> buffer;
386     LocalHandle fence;
387     size_t slot;
388   };
389   std::array<Entry, kBufferCount> buffers;
390 
391   for (size_t i = 0; i < kBufferCount; i++) {
392     Entry* entry = &buffers[i];
393     auto producer_status =
394         producer_queue_->Dequeue(kTimeoutMs, &entry->slot, &mo, &entry->fence);
395     ASSERT_TRUE(producer_status.ok());
396     entry->buffer = producer_status.take();
397     ASSERT_NE(nullptr, entry->buffer);
398   }
399 
400   // Remove a buffer and make sure both queues reflect the change.
401   ASSERT_TRUE(producer_queue_->RemoveBuffer(buffers[0].slot));
402   EXPECT_EQ(kBufferCount - 1, producer_queue_->capacity());
403 
404   // As long as the removed buffer is still alive the consumer queue won't know
405   // its gone.
406   EXPECT_EQ(kBufferCount, consumer_queue_->capacity());
407   EXPECT_FALSE(consumer_queue_->HandleQueueEvents());
408   EXPECT_EQ(kBufferCount, consumer_queue_->capacity());
409 
410   // Release the removed buffer.
411   buffers[0].buffer = nullptr;
412 
413   // Now the consumer queue should know it's gone.
414   EXPECT_FALSE(WaitAndHandleOnce(consumer_queue_.get(), kTimeoutMs));
415   ASSERT_EQ(kBufferCount - 1, consumer_queue_->capacity());
416 
417   // Allocate a new buffer. This should take the first empty slot.
418   size_t slot;
419   AllocateBuffer(&slot);
420   ALOGE_IF(TRACE, "ALLOCATE %zu", slot);
421   EXPECT_EQ(buffers[0].slot, slot);
422   EXPECT_EQ(kBufferCount, producer_queue_->capacity());
423 
424   // The consumer queue should pick up the new buffer.
425   EXPECT_EQ(kBufferCount - 1, consumer_queue_->capacity());
426   EXPECT_FALSE(consumer_queue_->HandleQueueEvents());
427   EXPECT_EQ(kBufferCount, consumer_queue_->capacity());
428 
429   // Remove and allocate a buffer.
430   ASSERT_TRUE(producer_queue_->RemoveBuffer(buffers[1].slot));
431   EXPECT_EQ(kBufferCount - 1, producer_queue_->capacity());
432   buffers[1].buffer = nullptr;
433 
434   AllocateBuffer(&slot);
435   ALOGE_IF(TRACE, "ALLOCATE %zu", slot);
436   EXPECT_EQ(buffers[1].slot, slot);
437   EXPECT_EQ(kBufferCount, producer_queue_->capacity());
438 
439   // The consumer queue should pick up the new buffer but the count shouldn't
440   // change.
441   EXPECT_EQ(kBufferCount, consumer_queue_->capacity());
442   EXPECT_FALSE(consumer_queue_->HandleQueueEvents());
443   EXPECT_EQ(kBufferCount, consumer_queue_->capacity());
444 
445   // Remove and allocate a buffer, but don't free the buffer right away.
446   ASSERT_TRUE(producer_queue_->RemoveBuffer(buffers[2].slot));
447   EXPECT_EQ(kBufferCount - 1, producer_queue_->capacity());
448 
449   AllocateBuffer(&slot);
450   ALOGE_IF(TRACE, "ALLOCATE %zu", slot);
451   EXPECT_EQ(buffers[2].slot, slot);
452   EXPECT_EQ(kBufferCount, producer_queue_->capacity());
453 
454   EXPECT_EQ(kBufferCount, consumer_queue_->capacity());
455   EXPECT_FALSE(consumer_queue_->HandleQueueEvents());
456   EXPECT_EQ(kBufferCount, consumer_queue_->capacity());
457 
458   // Release the producer buffer to trigger a POLLHUP event for an already
459   // removed buffer.
460   buffers[2].buffer = nullptr;
461   EXPECT_EQ(kBufferCount, consumer_queue_->capacity());
462   EXPECT_FALSE(consumer_queue_->HandleQueueEvents());
463   EXPECT_EQ(kBufferCount, consumer_queue_->capacity());
464 }
465 
TEST_F(BufferHubQueueTest,TestMultipleConsumers)466 TEST_F(BufferHubQueueTest, TestMultipleConsumers) {
467   // ProducerConfigureBuilder doesn't set Metadata{size}, which means there
468   // is no metadata associated with this BufferQueue's buffer.
469   ASSERT_TRUE(CreateProducerQueue(config_builder_.Build(), UsagePolicy{}));
470 
471   // Allocate buffers.
472   const size_t kBufferCount = 4u;
473   for (size_t i = 0; i < kBufferCount; i++) {
474     AllocateBuffer();
475   }
476   ASSERT_EQ(kBufferCount, producer_queue_->count());
477 
478   // Build a silent consumer queue to test multi-consumer queue features.
479   auto silent_queue = producer_queue_->CreateSilentConsumerQueue();
480   ASSERT_NE(nullptr, silent_queue);
481 
482   // Check that silent queue doesn't import buffers on creation.
483   EXPECT_EQ(silent_queue->capacity(), 0U);
484 
485   // Dequeue and post a buffer.
486   size_t slot;
487   LocalHandle fence;
488   DvrNativeBufferMetadata mi, mo;
489   auto producer_status =
490       producer_queue_->Dequeue(kTimeoutMs, &slot, &mo, &fence);
491   EXPECT_TRUE(producer_status.ok());
492   auto producer_buffer = producer_status.take();
493   ASSERT_NE(producer_buffer, nullptr);
494   EXPECT_EQ(producer_buffer->PostAsync(&mi, {}), 0);
495   // After post, check the number of remaining available buffers.
496   EXPECT_EQ(producer_queue_->count(), kBufferCount - 1);
497 
498   // Currently we expect no buffer to be available prior to calling
499   // WaitForBuffers/HandleQueueEvents.
500   // TODO(eieio): Note this behavior may change in the future.
501   EXPECT_EQ(silent_queue->count(), 0U);
502   EXPECT_FALSE(silent_queue->HandleQueueEvents());
503   EXPECT_EQ(silent_queue->count(), 0U);
504 
505   // Build a new consumer queue to test multi-consumer queue features.
506   consumer_queue_ = silent_queue->CreateConsumerQueue();
507   ASSERT_NE(consumer_queue_, nullptr);
508 
509   // Check that buffers are correctly imported on construction.
510   EXPECT_EQ(consumer_queue_->capacity(), kBufferCount);
511   // Buffers are only imported, but their availability is not checked until
512   // first call to Dequeue().
513   EXPECT_EQ(consumer_queue_->count(), 0U);
514 
515   // Reclaim released/ignored buffers.
516   EXPECT_EQ(producer_queue_->count(), kBufferCount - 1);
517 
518   usleep(10000);
519   WaitAndHandleOnce(producer_queue_.get(), kTimeoutMs);
520   EXPECT_EQ(producer_queue_->count(), kBufferCount - 1);
521 
522   // Post another buffer.
523   producer_status = producer_queue_->Dequeue(kTimeoutMs, &slot, &mo, &fence);
524   EXPECT_TRUE(producer_status.ok());
525   producer_buffer = producer_status.take();
526   ASSERT_NE(producer_buffer, nullptr);
527   EXPECT_EQ(producer_buffer->PostAsync(&mi, {}), 0);
528 
529   // Verify that the consumer queue receives it.
530   size_t consumer_queue_count = consumer_queue_->count();
531   WaitAndHandleOnce(consumer_queue_.get(), kTimeoutMs);
532   EXPECT_GT(consumer_queue_->count(), consumer_queue_count);
533 
534   // Save the current consumer queue buffer count to compare after the dequeue.
535   consumer_queue_count = consumer_queue_->count();
536 
537   // Dequeue and acquire/release (discard) buffers on the consumer end.
538   auto consumer_status =
539       consumer_queue_->Dequeue(kTimeoutMs, &slot, &mo, &fence);
540   EXPECT_TRUE(consumer_status.ok());
541   auto consumer_buffer = consumer_status.take();
542   ASSERT_NE(consumer_buffer, nullptr);
543   consumer_buffer->Discard();
544 
545   // Buffer should be returned to the producer queue without being handled by
546   // the silent consumer queue.
547   EXPECT_LT(consumer_queue_->count(), consumer_queue_count);
548   EXPECT_EQ(producer_queue_->count(), kBufferCount - 2);
549 
550   WaitAndHandleOnce(producer_queue_.get(), kTimeoutMs);
551   EXPECT_EQ(producer_queue_->count(), kBufferCount - 1);
552 }
553 
554 struct TestUserMetadata {
555   char a;
556   int32_t b;
557   int64_t c;
558 };
559 
560 constexpr uint64_t kUserMetadataSize =
561     static_cast<uint64_t>(sizeof(TestUserMetadata));
562 
TEST_F(BufferHubQueueTest,TestUserMetadata)563 TEST_F(BufferHubQueueTest, TestUserMetadata) {
564   ASSERT_TRUE(CreateQueues(
565       config_builder_.SetMetadata<TestUserMetadata>().Build(), UsagePolicy{}));
566 
567   AllocateBuffer();
568 
569   std::vector<TestUserMetadata> user_metadata_list = {
570       {'0', 0, 0}, {'1', 10, 3333}, {'@', 123, 1000000000}};
571 
572   for (auto user_metadata : user_metadata_list) {
573     size_t slot;
574     LocalHandle fence;
575     DvrNativeBufferMetadata mi, mo;
576 
577     auto p1_status = producer_queue_->Dequeue(kTimeoutMs, &slot, &mo, &fence);
578     EXPECT_TRUE(p1_status.ok());
579     auto p1 = p1_status.take();
580     ASSERT_NE(p1, nullptr);
581 
582     // TODO(b/69469185): Test against metadata from consumer once we implement
583     // release metadata properly.
584     // EXPECT_EQ(mo.user_metadata_ptr, 0U);
585     // EXPECT_EQ(mo.user_metadata_size, 0U);
586 
587     mi.user_metadata_size = kUserMetadataSize;
588     mi.user_metadata_ptr = reinterpret_cast<uint64_t>(&user_metadata);
589     EXPECT_EQ(p1->PostAsync(&mi, {}), 0);
590     auto c1_status = consumer_queue_->Dequeue(kTimeoutMs, &slot, &mo, &fence);
591     EXPECT_TRUE(c1_status.ok()) << c1_status.GetErrorMessage();
592     auto c1 = c1_status.take();
593     ASSERT_NE(c1, nullptr);
594 
595     EXPECT_EQ(mo.user_metadata_size, kUserMetadataSize);
596     auto out_user_metadata =
597         reinterpret_cast<TestUserMetadata*>(mo.user_metadata_ptr);
598     EXPECT_EQ(user_metadata.a, out_user_metadata->a);
599     EXPECT_EQ(user_metadata.b, out_user_metadata->b);
600     EXPECT_EQ(user_metadata.c, out_user_metadata->c);
601 
602     // When release, empty metadata is also legit.
603     mi.user_metadata_size = 0U;
604     mi.user_metadata_ptr = 0U;
605     c1->ReleaseAsync(&mi, {});
606   }
607 }
608 
TEST_F(BufferHubQueueTest,TestUserMetadataMismatch)609 TEST_F(BufferHubQueueTest, TestUserMetadataMismatch) {
610   ASSERT_TRUE(CreateQueues(
611       config_builder_.SetMetadata<TestUserMetadata>().Build(), UsagePolicy{}));
612 
613   AllocateBuffer();
614 
615   TestUserMetadata user_metadata;
616   size_t slot;
617   LocalHandle fence;
618   DvrNativeBufferMetadata mi, mo;
619   auto p1_status = producer_queue_->Dequeue(kTimeoutMs, &slot, &mo, &fence);
620   EXPECT_TRUE(p1_status.ok());
621   auto p1 = p1_status.take();
622   ASSERT_NE(p1, nullptr);
623 
624   // Post with mismatched user metadata size will fail. But the producer buffer
625   // itself should stay untouched.
626   mi.user_metadata_ptr = reinterpret_cast<uint64_t>(&user_metadata);
627   mi.user_metadata_size = kUserMetadataSize + 1;
628   EXPECT_EQ(p1->PostAsync(&mi, {}), -E2BIG);
629   // Post with the exact same user metdata size can success.
630   mi.user_metadata_ptr = reinterpret_cast<uint64_t>(&user_metadata);
631   mi.user_metadata_size = kUserMetadataSize;
632   EXPECT_EQ(p1->PostAsync(&mi, {}), 0);
633 }
634 
TEST_F(BufferHubQueueTest,TestEnqueue)635 TEST_F(BufferHubQueueTest, TestEnqueue) {
636   ASSERT_TRUE(CreateQueues(config_builder_.SetMetadata<int64_t>().Build(),
637                            UsagePolicy{}));
638   AllocateBuffer();
639 
640   size_t slot;
641   LocalHandle fence;
642   DvrNativeBufferMetadata mo;
643   auto p1_status = producer_queue_->Dequeue(kTimeoutMs, &slot, &mo, &fence);
644   ASSERT_TRUE(p1_status.ok());
645   auto p1 = p1_status.take();
646   ASSERT_NE(nullptr, p1);
647 
648   producer_queue_->Enqueue(p1, slot, 0ULL);
649   auto c1_status = consumer_queue_->Dequeue(kTimeoutMs, &slot, &mo, &fence);
650   ASSERT_FALSE(c1_status.ok());
651 }
652 
TEST_F(BufferHubQueueTest,TestAllocateBuffer)653 TEST_F(BufferHubQueueTest, TestAllocateBuffer) {
654   ASSERT_TRUE(CreateQueues(config_builder_.Build(), UsagePolicy{}));
655 
656   size_t ps1;
657   AllocateBuffer();
658   LocalHandle fence;
659   DvrNativeBufferMetadata mi, mo;
660   auto p1_status = producer_queue_->Dequeue(kTimeoutMs, &ps1, &mo, &fence);
661   ASSERT_TRUE(p1_status.ok());
662   auto p1 = p1_status.take();
663   ASSERT_NE(p1, nullptr);
664 
665   // producer queue is exhausted
666   size_t ps2;
667   auto p2_status = producer_queue_->Dequeue(kTimeoutMs, &ps2, &mo, &fence);
668   ASSERT_FALSE(p2_status.ok());
669   ASSERT_EQ(ETIMEDOUT, p2_status.error());
670 
671   // dynamically add buffer.
672   AllocateBuffer();
673   ASSERT_EQ(producer_queue_->count(), 1U);
674   ASSERT_EQ(producer_queue_->capacity(), 2U);
675 
676   // now we can dequeue again
677   p2_status = producer_queue_->Dequeue(kTimeoutMs, &ps2, &mo, &fence);
678   ASSERT_TRUE(p2_status.ok());
679   auto p2 = p2_status.take();
680   ASSERT_NE(p2, nullptr);
681   ASSERT_EQ(producer_queue_->count(), 0U);
682   // p1 and p2 should have different slot number
683   ASSERT_NE(ps1, ps2);
684 
685   // Consumer queue does not import buffers until |Dequeue| or |ImportBuffers|
686   // are called. So far consumer_queue_ should be empty.
687   ASSERT_EQ(consumer_queue_->count(), 0U);
688 
689   int64_t seq = 1;
690   mi.index = seq;
691   ASSERT_EQ(p1->PostAsync(&mi, {}), 0);
692 
693   size_t cs1, cs2;
694   auto c1_status = consumer_queue_->Dequeue(kTimeoutMs, &cs1, &mo, &fence);
695   ASSERT_TRUE(c1_status.ok()) << c1_status.GetErrorMessage();
696   auto c1 = c1_status.take();
697   ASSERT_NE(c1, nullptr);
698   ASSERT_EQ(consumer_queue_->count(), 0U);
699   ASSERT_EQ(consumer_queue_->capacity(), 2U);
700   ASSERT_EQ(cs1, ps1);
701 
702   ASSERT_EQ(p2->PostAsync(&mi, {}), 0);
703   auto c2_status = consumer_queue_->Dequeue(kTimeoutMs, &cs2, &mo, &fence);
704   ASSERT_TRUE(c2_status.ok());
705   auto c2 = c2_status.take();
706   ASSERT_NE(c2, nullptr);
707   ASSERT_EQ(cs2, ps2);
708 }
709 
TEST_F(BufferHubQueueTest,TestAllocateTwoBuffers)710 TEST_F(BufferHubQueueTest, TestAllocateTwoBuffers) {
711   ASSERT_TRUE(CreateQueues(config_builder_.Build(), UsagePolicy{}));
712   ASSERT_EQ(producer_queue_->capacity(), 0);
713   auto status = producer_queue_->AllocateBuffers(
714       kBufferWidth, kBufferHeight, kBufferLayerCount, kBufferFormat,
715       kBufferUsage, /*buffer_count=*/2);
716   ASSERT_TRUE(status.ok());
717   std::vector<size_t> buffer_slots = status.take();
718   ASSERT_EQ(buffer_slots.size(), 2);
719   ASSERT_EQ(producer_queue_->capacity(), 2);
720 }
721 
TEST_F(BufferHubQueueTest,TestAllocateZeroBuffers)722 TEST_F(BufferHubQueueTest, TestAllocateZeroBuffers) {
723   ASSERT_TRUE(CreateQueues(config_builder_.Build(), UsagePolicy{}));
724   ASSERT_EQ(producer_queue_->capacity(), 0);
725   auto status = producer_queue_->AllocateBuffers(
726       kBufferWidth, kBufferHeight, kBufferLayerCount, kBufferFormat,
727       kBufferUsage, /*buffer_count=*/0);
728   ASSERT_TRUE(status.ok());
729   std::vector<size_t> buffer_slots = status.take();
730   ASSERT_EQ(buffer_slots.size(), 0);
731   ASSERT_EQ(producer_queue_->capacity(), 0);
732 }
733 
TEST_F(BufferHubQueueTest,TestUsageSetMask)734 TEST_F(BufferHubQueueTest, TestUsageSetMask) {
735   const uint32_t set_mask = GRALLOC_USAGE_SW_WRITE_OFTEN;
736   ASSERT_TRUE(
737       CreateQueues(config_builder_.Build(), UsagePolicy{set_mask, 0, 0, 0}));
738 
739   // When allocation, leave out |set_mask| from usage bits on purpose.
740   auto status = producer_queue_->AllocateBuffer(
741       kBufferWidth, kBufferHeight, kBufferLayerCount, kBufferFormat,
742       kBufferUsage & ~set_mask);
743   ASSERT_TRUE(status.ok());
744 
745   LocalHandle fence;
746   size_t slot;
747   DvrNativeBufferMetadata mo;
748   auto p1_status = producer_queue_->Dequeue(kTimeoutMs, &slot, &mo, &fence);
749   ASSERT_TRUE(p1_status.ok());
750   auto p1 = p1_status.take();
751   ASSERT_EQ(p1->usage() & set_mask, set_mask);
752 }
753 
TEST_F(BufferHubQueueTest,TestUsageClearMask)754 TEST_F(BufferHubQueueTest, TestUsageClearMask) {
755   const uint32_t clear_mask = GRALLOC_USAGE_SW_WRITE_OFTEN;
756   ASSERT_TRUE(
757       CreateQueues(config_builder_.Build(), UsagePolicy{0, clear_mask, 0, 0}));
758 
759   // When allocation, add |clear_mask| into usage bits on purpose.
760   auto status = producer_queue_->AllocateBuffer(
761       kBufferWidth, kBufferHeight, kBufferLayerCount, kBufferFormat,
762       kBufferUsage | clear_mask);
763   ASSERT_TRUE(status.ok());
764 
765   LocalHandle fence;
766   size_t slot;
767   DvrNativeBufferMetadata mo;
768   auto p1_status = producer_queue_->Dequeue(kTimeoutMs, &slot, &mo, &fence);
769   ASSERT_TRUE(p1_status.ok());
770   auto p1 = p1_status.take();
771   ASSERT_EQ(p1->usage() & clear_mask, 0U);
772 }
773 
TEST_F(BufferHubQueueTest,TestUsageDenySetMask)774 TEST_F(BufferHubQueueTest, TestUsageDenySetMask) {
775   const uint32_t deny_set_mask = GRALLOC_USAGE_SW_WRITE_OFTEN;
776   ASSERT_TRUE(CreateQueues(config_builder_.SetMetadata<int64_t>().Build(),
777                            UsagePolicy{0, 0, deny_set_mask, 0}));
778 
779   // Now that |deny_set_mask| is illegal, allocation without those bits should
780   // be able to succeed.
781   auto status = producer_queue_->AllocateBuffer(
782       kBufferWidth, kBufferHeight, kBufferLayerCount, kBufferFormat,
783       kBufferUsage & ~deny_set_mask);
784   ASSERT_TRUE(status.ok());
785 
786   // While allocation with those bits should fail.
787   status = producer_queue_->AllocateBuffer(kBufferWidth, kBufferHeight,
788                                            kBufferLayerCount, kBufferFormat,
789                                            kBufferUsage | deny_set_mask);
790   ASSERT_FALSE(status.ok());
791   ASSERT_EQ(EINVAL, status.error());
792 }
793 
TEST_F(BufferHubQueueTest,TestUsageDenyClearMask)794 TEST_F(BufferHubQueueTest, TestUsageDenyClearMask) {
795   const uint32_t deny_clear_mask = GRALLOC_USAGE_SW_WRITE_OFTEN;
796   ASSERT_TRUE(CreateQueues(config_builder_.SetMetadata<int64_t>().Build(),
797                            UsagePolicy{0, 0, 0, deny_clear_mask}));
798 
799   // Now that clearing |deny_clear_mask| is illegal (i.e. setting these bits are
800   // mandatory), allocation with those bits should be able to succeed.
801   auto status = producer_queue_->AllocateBuffer(
802       kBufferWidth, kBufferHeight, kBufferLayerCount, kBufferFormat,
803       kBufferUsage | deny_clear_mask);
804   ASSERT_TRUE(status.ok());
805 
806   // While allocation without those bits should fail.
807   status = producer_queue_->AllocateBuffer(kBufferWidth, kBufferHeight,
808                                            kBufferLayerCount, kBufferFormat,
809                                            kBufferUsage & ~deny_clear_mask);
810   ASSERT_FALSE(status.ok());
811   ASSERT_EQ(EINVAL, status.error());
812 }
813 
TEST_F(BufferHubQueueTest,TestQueueInfo)814 TEST_F(BufferHubQueueTest, TestQueueInfo) {
815   static const bool kIsAsync = true;
816   ASSERT_TRUE(CreateQueues(config_builder_.SetIsAsync(kIsAsync)
817                                .SetDefaultWidth(kBufferWidth)
818                                .SetDefaultHeight(kBufferHeight)
819                                .SetDefaultFormat(kBufferFormat)
820                                .Build(),
821                            UsagePolicy{}));
822 
823   EXPECT_EQ(producer_queue_->default_width(), kBufferWidth);
824   EXPECT_EQ(producer_queue_->default_height(), kBufferHeight);
825   EXPECT_EQ(producer_queue_->default_format(), kBufferFormat);
826   EXPECT_EQ(producer_queue_->is_async(), kIsAsync);
827 
828   EXPECT_EQ(consumer_queue_->default_width(), kBufferWidth);
829   EXPECT_EQ(consumer_queue_->default_height(), kBufferHeight);
830   EXPECT_EQ(consumer_queue_->default_format(), kBufferFormat);
831   EXPECT_EQ(consumer_queue_->is_async(), kIsAsync);
832 }
833 
TEST_F(BufferHubQueueTest,TestFreeAllBuffers)834 TEST_F(BufferHubQueueTest, TestFreeAllBuffers) {
835   constexpr size_t kBufferCount = 2;
836 
837 #define CHECK_NO_BUFFER_THEN_ALLOCATE(num_buffers)  \
838   EXPECT_EQ(consumer_queue_->count(), 0U);          \
839   EXPECT_EQ(consumer_queue_->capacity(), 0U);       \
840   EXPECT_EQ(producer_queue_->count(), 0U);          \
841   EXPECT_EQ(producer_queue_->capacity(), 0U);       \
842   for (size_t i = 0; i < num_buffers; i++) {        \
843     AllocateBuffer();                               \
844   }                                                 \
845   EXPECT_EQ(producer_queue_->count(), num_buffers); \
846   EXPECT_EQ(producer_queue_->capacity(), num_buffers);
847 
848   size_t slot;
849   LocalHandle fence;
850   pdx::Status<void> status;
851   pdx::Status<std::shared_ptr<ConsumerBuffer>> consumer_status;
852   pdx::Status<std::shared_ptr<ProducerBuffer>> producer_status;
853   std::shared_ptr<ConsumerBuffer> consumer_buffer;
854   std::shared_ptr<ProducerBuffer> producer_buffer;
855   DvrNativeBufferMetadata mi, mo;
856 
857   ASSERT_TRUE(CreateQueues(config_builder_.Build(), UsagePolicy{}));
858 
859   // Free all buffers when buffers are avaible for dequeue.
860   CHECK_NO_BUFFER_THEN_ALLOCATE(kBufferCount);
861   status = producer_queue_->FreeAllBuffers();
862   EXPECT_TRUE(status.ok());
863 
864   // Free all buffers when one buffer is dequeued.
865   CHECK_NO_BUFFER_THEN_ALLOCATE(kBufferCount);
866   producer_status = producer_queue_->Dequeue(kTimeoutMs, &slot, &mo, &fence);
867   ASSERT_TRUE(producer_status.ok());
868   status = producer_queue_->FreeAllBuffers();
869   EXPECT_TRUE(status.ok());
870 
871   // Free all buffers when all buffers are dequeued.
872   CHECK_NO_BUFFER_THEN_ALLOCATE(kBufferCount);
873   for (size_t i = 0; i < kBufferCount; i++) {
874     producer_status = producer_queue_->Dequeue(kTimeoutMs, &slot, &mo, &fence);
875     ASSERT_TRUE(producer_status.ok());
876   }
877   status = producer_queue_->FreeAllBuffers();
878   EXPECT_TRUE(status.ok());
879 
880   // Free all buffers when one buffer is posted.
881   CHECK_NO_BUFFER_THEN_ALLOCATE(kBufferCount);
882   producer_status = producer_queue_->Dequeue(kTimeoutMs, &slot, &mo, &fence);
883   ASSERT_TRUE(producer_status.ok());
884   producer_buffer = producer_status.take();
885   ASSERT_NE(nullptr, producer_buffer);
886   ASSERT_EQ(0, producer_buffer->PostAsync(&mi, fence));
887   status = producer_queue_->FreeAllBuffers();
888   EXPECT_TRUE(status.ok());
889 
890   // Free all buffers when all buffers are posted.
891   CHECK_NO_BUFFER_THEN_ALLOCATE(kBufferCount);
892   for (size_t i = 0; i < kBufferCount; i++) {
893     producer_status = producer_queue_->Dequeue(kTimeoutMs, &slot, &mo, &fence);
894     ASSERT_TRUE(producer_status.ok());
895     producer_buffer = producer_status.take();
896     ASSERT_NE(producer_buffer, nullptr);
897     ASSERT_EQ(producer_buffer->PostAsync(&mi, fence), 0);
898   }
899   status = producer_queue_->FreeAllBuffers();
900   EXPECT_TRUE(status.ok());
901 
902   // Free all buffers when all buffers are acquired.
903   CHECK_NO_BUFFER_THEN_ALLOCATE(kBufferCount);
904   for (size_t i = 0; i < kBufferCount; i++) {
905     producer_status = producer_queue_->Dequeue(kTimeoutMs, &slot, &mo, &fence);
906     ASSERT_TRUE(producer_status.ok());
907     producer_buffer = producer_status.take();
908     ASSERT_NE(producer_buffer, nullptr);
909     ASSERT_EQ(producer_buffer->PostAsync(&mi, fence), 0);
910     consumer_status = consumer_queue_->Dequeue(kTimeoutMs, &slot, &mo, &fence);
911     ASSERT_TRUE(consumer_status.ok()) << consumer_status.GetErrorMessage();
912   }
913 
914   status = producer_queue_->FreeAllBuffers();
915   EXPECT_TRUE(status.ok());
916 
917   // In addition to FreeAllBuffers() from the queue, it is also required to
918   // delete all references to the ProducerBuffer (i.e. the PDX client).
919   producer_buffer = nullptr;
920 
921   // Crank consumer queue events to pickup EPOLLHUP events on the queue.
922   consumer_queue_->HandleQueueEvents();
923 
924   // One last check.
925   CHECK_NO_BUFFER_THEN_ALLOCATE(kBufferCount);
926 
927 #undef CHECK_NO_BUFFER_THEN_ALLOCATE
928 }
929 
TEST_F(BufferHubQueueTest,TestProducerToParcelableNotEmpty)930 TEST_F(BufferHubQueueTest, TestProducerToParcelableNotEmpty) {
931   ASSERT_TRUE(CreateQueues(config_builder_.SetMetadata<uint64_t>().Build(),
932                            UsagePolicy{}));
933 
934   // Allocate only one buffer.
935   AllocateBuffer();
936 
937   // Export should fail as the queue is not empty.
938   auto status = producer_queue_->TakeAsParcelable();
939   EXPECT_FALSE(status.ok());
940 }
941 
TEST_F(BufferHubQueueTest,TestProducerExportToParcelable)942 TEST_F(BufferHubQueueTest, TestProducerExportToParcelable) {
943   ASSERT_TRUE(CreateQueues(config_builder_.Build(), UsagePolicy{}));
944 
945   auto s1 = producer_queue_->TakeAsParcelable();
946   EXPECT_TRUE(s1.ok());
947 
948   ProducerQueueParcelable output_parcelable = s1.take();
949   EXPECT_TRUE(output_parcelable.IsValid());
950 
951   Parcel parcel;
952   status_t res;
953   res = output_parcelable.writeToParcel(&parcel);
954   EXPECT_EQ(res, OK);
955 
956   // After written into parcelable, the output_parcelable is still valid has
957   // keeps the producer channel alive.
958   EXPECT_TRUE(output_parcelable.IsValid());
959 
960   // Creating producer buffer should fail.
961   auto s2 = producer_queue_->AllocateBuffer(kBufferWidth, kBufferHeight,
962                                             kBufferLayerCount, kBufferFormat,
963                                             kBufferUsage);
964   ASSERT_FALSE(s2.ok());
965 
966   // Reset the data position so that we can read back from the same parcel
967   // without doing actually Binder IPC.
968   parcel.setDataPosition(0);
969   producer_queue_ = nullptr;
970 
971   // Recreate the producer queue from the parcel.
972   ProducerQueueParcelable input_parcelable;
973   EXPECT_FALSE(input_parcelable.IsValid());
974 
975   res = input_parcelable.readFromParcel(&parcel);
976   EXPECT_EQ(res, OK);
977   EXPECT_TRUE(input_parcelable.IsValid());
978 
979   EXPECT_EQ(producer_queue_, nullptr);
980   producer_queue_ = ProducerQueue::Import(input_parcelable.TakeChannelHandle());
981   EXPECT_FALSE(input_parcelable.IsValid());
982   ASSERT_NE(producer_queue_, nullptr);
983 
984   // Newly created queue from the parcel can allocate buffer, post buffer to
985   // consumer.
986   EXPECT_NO_FATAL_FAILURE(AllocateBuffer());
987   EXPECT_EQ(producer_queue_->count(), 1U);
988   EXPECT_EQ(producer_queue_->capacity(), 1U);
989 
990   size_t slot;
991   DvrNativeBufferMetadata producer_meta;
992   DvrNativeBufferMetadata consumer_meta;
993   LocalHandle fence;
994   auto s3 = producer_queue_->Dequeue(0, &slot, &producer_meta, &fence);
995   EXPECT_TRUE(s3.ok());
996 
997   std::shared_ptr<ProducerBuffer> p1 = s3.take();
998   ASSERT_NE(p1, nullptr);
999 
1000   producer_meta.timestamp = 42;
1001   EXPECT_EQ(p1->PostAsync(&producer_meta, LocalHandle()), 0);
1002 
1003   // Make sure the buffer can be dequeued from consumer side.
1004   auto s4 = consumer_queue_->Dequeue(kTimeoutMs, &slot, &consumer_meta, &fence);
1005   EXPECT_TRUE(s4.ok()) << s4.GetErrorMessage();
1006   EXPECT_EQ(consumer_queue_->capacity(), 1U);
1007 
1008   auto consumer = s4.take();
1009   ASSERT_NE(consumer, nullptr);
1010   EXPECT_EQ(producer_meta.timestamp, consumer_meta.timestamp);
1011 }
1012 
TEST_F(BufferHubQueueTest,TestCreateConsumerParcelable)1013 TEST_F(BufferHubQueueTest, TestCreateConsumerParcelable) {
1014   ASSERT_TRUE(CreateProducerQueue(config_builder_.Build(), UsagePolicy{}));
1015 
1016   auto s1 = producer_queue_->CreateConsumerQueueParcelable();
1017   EXPECT_TRUE(s1.ok());
1018   ConsumerQueueParcelable output_parcelable = s1.take();
1019   EXPECT_TRUE(output_parcelable.IsValid());
1020 
1021   // Write to a Parcel new object.
1022   Parcel parcel;
1023   status_t res;
1024   res = output_parcelable.writeToParcel(&parcel);
1025 
1026   // Reset the data position so that we can read back from the same parcel
1027   // without doing actually Binder IPC.
1028   parcel.setDataPosition(0);
1029 
1030   // No consumer queue created yet.
1031   EXPECT_EQ(consumer_queue_, nullptr);
1032 
1033   // If the parcel contains a consumer queue, read into a
1034   // ProducerQueueParcelable should fail.
1035   ProducerQueueParcelable wrongly_typed_parcelable;
1036   EXPECT_FALSE(wrongly_typed_parcelable.IsValid());
1037   res = wrongly_typed_parcelable.readFromParcel(&parcel);
1038   EXPECT_EQ(res, -EINVAL);
1039   parcel.setDataPosition(0);
1040 
1041   // Create the consumer queue from the parcel.
1042   ConsumerQueueParcelable input_parcelable;
1043   EXPECT_FALSE(input_parcelable.IsValid());
1044 
1045   res = input_parcelable.readFromParcel(&parcel);
1046   EXPECT_EQ(res, OK);
1047   EXPECT_TRUE(input_parcelable.IsValid());
1048 
1049   consumer_queue_ = ConsumerQueue::Import(input_parcelable.TakeChannelHandle());
1050   EXPECT_FALSE(input_parcelable.IsValid());
1051   ASSERT_NE(consumer_queue_, nullptr);
1052 
1053   EXPECT_NO_FATAL_FAILURE(AllocateBuffer());
1054   EXPECT_EQ(producer_queue_->count(), 1U);
1055   EXPECT_EQ(producer_queue_->capacity(), 1U);
1056 
1057   size_t slot;
1058   DvrNativeBufferMetadata producer_meta;
1059   DvrNativeBufferMetadata consumer_meta;
1060   LocalHandle fence;
1061   auto s2 = producer_queue_->Dequeue(0, &slot, &producer_meta, &fence);
1062   EXPECT_TRUE(s2.ok());
1063 
1064   std::shared_ptr<ProducerBuffer> p1 = s2.take();
1065   ASSERT_NE(p1, nullptr);
1066 
1067   producer_meta.timestamp = 42;
1068   EXPECT_EQ(p1->PostAsync(&producer_meta, LocalHandle()), 0);
1069 
1070   // Make sure the buffer can be dequeued from consumer side.
1071   auto s3 = consumer_queue_->Dequeue(kTimeoutMs, &slot, &consumer_meta, &fence);
1072   EXPECT_TRUE(s3.ok()) << s3.GetErrorMessage();
1073   EXPECT_EQ(consumer_queue_->capacity(), 1U);
1074 
1075   auto consumer = s3.take();
1076   ASSERT_NE(consumer, nullptr);
1077   EXPECT_EQ(producer_meta.timestamp, consumer_meta.timestamp);
1078 }
1079 
1080 }  // namespace
1081 
1082 }  // namespace dvr
1083 }  // namespace android
1084