1/*
2 *  Copyright 2015 The WebRTC Project Authors. All rights reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "webrtc/base/bufferqueue.h"
12#include "webrtc/base/gunit.h"
13
14namespace rtc {
15
16TEST(BufferQueueTest, TestAll) {
17  const size_t kSize = 16;
18  const char in[kSize * 2 + 1] = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
19  char out[kSize * 2];
20  size_t bytes;
21  BufferQueue queue1(1, kSize);
22  BufferQueue queue2(2, kSize);
23
24  // The queue is initially empty.
25  EXPECT_EQ(0u, queue1.size());
26  EXPECT_FALSE(queue1.ReadFront(out, kSize, &bytes));
27
28  // A write should succeed.
29  EXPECT_TRUE(queue1.WriteBack(in, kSize, &bytes));
30  EXPECT_EQ(kSize, bytes);
31  EXPECT_EQ(1u, queue1.size());
32
33  // The queue is full now (only one buffer allowed).
34  EXPECT_FALSE(queue1.WriteBack(in, kSize, &bytes));
35  EXPECT_EQ(1u, queue1.size());
36
37  // Reading previously written buffer.
38  EXPECT_TRUE(queue1.ReadFront(out, kSize, &bytes));
39  EXPECT_EQ(kSize, bytes);
40  EXPECT_EQ(0, memcmp(in, out, kSize));
41
42  // The queue is empty again now.
43  EXPECT_FALSE(queue1.ReadFront(out, kSize, &bytes));
44  EXPECT_EQ(0u, queue1.size());
45
46  // Reading only returns available data.
47  EXPECT_TRUE(queue1.WriteBack(in, kSize, &bytes));
48  EXPECT_EQ(kSize, bytes);
49  EXPECT_EQ(1u, queue1.size());
50  EXPECT_TRUE(queue1.ReadFront(out, kSize * 2, &bytes));
51  EXPECT_EQ(kSize, bytes);
52  EXPECT_EQ(0, memcmp(in, out, kSize));
53  EXPECT_EQ(0u, queue1.size());
54
55  // Reading maintains buffer boundaries.
56  EXPECT_TRUE(queue2.WriteBack(in, kSize / 2, &bytes));
57  EXPECT_EQ(1u, queue2.size());
58  EXPECT_TRUE(queue2.WriteBack(in + kSize / 2, kSize / 2, &bytes));
59  EXPECT_EQ(2u, queue2.size());
60  EXPECT_TRUE(queue2.ReadFront(out, kSize, &bytes));
61  EXPECT_EQ(kSize / 2, bytes);
62  EXPECT_EQ(0, memcmp(in, out, kSize / 2));
63  EXPECT_EQ(1u, queue2.size());
64  EXPECT_TRUE(queue2.ReadFront(out, kSize, &bytes));
65  EXPECT_EQ(kSize / 2, bytes);
66  EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 2));
67  EXPECT_EQ(0u, queue2.size());
68
69  // Reading truncates buffers.
70  EXPECT_TRUE(queue2.WriteBack(in, kSize / 2, &bytes));
71  EXPECT_EQ(1u, queue2.size());
72  EXPECT_TRUE(queue2.WriteBack(in + kSize / 2, kSize / 2, &bytes));
73  EXPECT_EQ(2u, queue2.size());
74  // Read first packet partially in too-small buffer.
75  EXPECT_TRUE(queue2.ReadFront(out, kSize / 4, &bytes));
76  EXPECT_EQ(kSize / 4, bytes);
77  EXPECT_EQ(0, memcmp(in, out, kSize / 4));
78  EXPECT_EQ(1u, queue2.size());
79  // Remainder of first packet is truncated, reading starts with next packet.
80  EXPECT_TRUE(queue2.ReadFront(out, kSize, &bytes));
81  EXPECT_EQ(kSize / 2, bytes);
82  EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 2));
83  EXPECT_EQ(0u, queue2.size());
84}
85
86}  // namespace rtc
87