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 "rtc_base/bufferqueue.h"
12 #include "rtc_base/gunit.h"
13 
14 namespace rtc {
15 
TEST(BufferQueueTest,TestAll)16 TEST(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