gem5  v19.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
circlebuf.test.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015, 2018 ARM Limited
3  * All rights reserved
4  *
5  * The license below extends only to copyright in the software and shall
6  * not be construed as granting a license to any other intellectual
7  * property including but not limited to intellectual property relating
8  * to a hardware implementation of the functionality of the software
9  * licensed hereunder. You may use the software subject to the license
10  * terms below provided that you ensure that this notice is replicated
11  * unmodified and in its entirety in all distributions of the software,
12  * modified or unmodified, in source code or in binary form.
13  *
14  * Redistribution and use in source and binary forms, with or without
15  * modification, are permitted provided that the following conditions are
16  * met: redistributions of source code must retain the above copyright
17  * notice, this list of conditions and the following disclaimer;
18  * redistributions in binary form must reproduce the above copyright
19  * notice, this list of conditions and the following disclaimer in the
20  * documentation and/or other materials provided with the distribution;
21  * neither the name of the copyright holders nor the names of its
22  * contributors may be used to endorse or promote products derived from
23  * this software without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36  *
37  * Authors: Andreas Sandberg
38  */
39 
40 #include <gtest/gtest.h>
41 
42 #include "base/circlebuf.hh"
43 
44 const char data[] = {
45  0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
46  0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf,
47 };
48 
49 // Basic non-overflow functionality
50 TEST(CircleBufTest, BasicReadWriteNoOverflow)
51 {
52  CircleBuf<char> buf(8);
53  char foo[16];
54 
55  // Write empty buffer, no overflow
56  buf.write(data, 8);
57  EXPECT_EQ(buf.size(), 8);
58  buf.peek(foo, 8);
59  EXPECT_EQ(memcmp(foo, data, 8), 0);
60 
61  // Read 2
62  buf.read(foo, 2);
63  EXPECT_EQ(memcmp(foo, data, 2), 0);
64  EXPECT_EQ(buf.size(), 6);
65  buf.read(foo, 6);
66  EXPECT_EQ(memcmp(foo, data + 2, 6), 0);
67  EXPECT_EQ(buf.size(), 0);
68 }
69 
70 // Basic single write overflow functionality
71 TEST(CircleBufTest, SingleWriteOverflow)
72 {
73  CircleBuf<char> buf(8);
74  char foo[16];
75 
76  buf.write(data, 16);
77  EXPECT_EQ(buf.size(), 8);
78  buf.peek(foo, 8);
79  EXPECT_EQ(memcmp(data + 8, foo, 8), 0);
80 }
81 
82 
83 // Multi-write overflow functionality
84 TEST(CircleBufTest, MultiWriteOverflow)
85 {
86  CircleBuf<char> buf(8);
87  char foo[16];
88 
89  // Write, no overflow, write overflow
90  buf.write(data, 6);
91  buf.write(data + 8, 6);
92  EXPECT_EQ(buf.size(), 8);
93  buf.peek(foo, 8);
94  EXPECT_EQ(memcmp(data + 4, foo, 2), 0);
95  EXPECT_EQ(memcmp(data + 8, foo + 2, 6), 0);
96 }
97 
98 // Pointer wrap around
99 TEST(CircleBufTest, PointerWrapAround)
100 {
101  CircleBuf<char> buf(8);
102  char foo[16];
103 
104  // _start == 0, _stop = 8
105  buf.write(data, 8);
106  // _start == 4, _stop = 8
107  buf.read(foo, 4);
108  // _start == 4, _stop = 12
109  buf.write(data + 8, 4);
110  EXPECT_EQ(buf.size(), 8);
111  // _start == 10, _stop = 12
112  // Normalized: _start == 2, _stop = 4
113  buf.read(foo + 4, 6);
114  EXPECT_EQ(buf.size(), 2);
115  EXPECT_EQ(memcmp(data, foo, 10), 0);
116  // Normalized: _start == 4, _stop = 4
117  buf.read(foo + 10, 2);
118  EXPECT_EQ(buf.size(), 0);
119  EXPECT_EQ(memcmp(data, foo, 12), 0);
120 }
uint32_t size() const
void peek(OutputIterator out, size_t len) const
Copy buffer contents without advancing the read pointer.
Definition: circlebuf.hh:79
TEST(CircleBufTest, BasicReadWriteNoOverflow)
void write(InputIterator in, size_t len)
Add elements to the end of the ring buffers and advance.
Definition: circlebuf.hh:117
void read(OutputIterator out, size_t len)
Copy buffer contents and advance the read pointer.
Definition: circlebuf.hh:105
const char data[]
#define EXPECT_EQ(lhs, rhs)
A macro which verifies that lhs and rhs are equal to each other.
Definition: unittest.hh:112

Generated on Fri Feb 28 2020 16:26:58 for gem5 by doxygen 1.8.13