Home | History | Annotate | Download | only in base
      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 
     14 namespace rtc {
     15 
     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