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