gem5  v20.1.0.0
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 
38 #include <gtest/gtest.h>
39 
40 #include "base/circlebuf.hh"
41 
42 const char data[] = {
43  0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
44  0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf,
45 };
46 
47 // Basic non-overflow functionality
48 TEST(CircleBufTest, BasicReadWriteNoOverflow)
49 {
50  CircleBuf<char> buf(8);
51  char foo[16];
52 
53  // Write empty buffer, no overflow
54  buf.write(data, 8);
55  EXPECT_EQ(buf.size(), 8);
56  buf.peek(foo, 8);
57  EXPECT_EQ(memcmp(foo, data, 8), 0);
58 
59  // Read 2
60  buf.read(foo, 2);
61  EXPECT_EQ(memcmp(foo, data, 2), 0);
62  EXPECT_EQ(buf.size(), 6);
63  buf.read(foo, 6);
64  EXPECT_EQ(memcmp(foo, data + 2, 6), 0);
65  EXPECT_EQ(buf.size(), 0);
66 }
67 
68 // Basic single write overflow functionality
69 TEST(CircleBufTest, SingleWriteOverflow)
70 {
71  CircleBuf<char> buf(8);
72  char foo[16];
73 
74  buf.write(data, 16);
75  EXPECT_EQ(buf.size(), 8);
76  buf.peek(foo, 8);
77  EXPECT_EQ(memcmp(data + 8, foo, 8), 0);
78 }
79 
80 
81 // Multi-write overflow functionality
82 TEST(CircleBufTest, MultiWriteOverflow)
83 {
84  CircleBuf<char> buf(8);
85  char foo[16];
86 
87  // Write, no overflow, write overflow
88  buf.write(data, 6);
89  buf.write(data + 8, 6);
90  EXPECT_EQ(buf.size(), 8);
91  buf.peek(foo, 8);
92  EXPECT_EQ(memcmp(data + 4, foo, 2), 0);
93  EXPECT_EQ(memcmp(data + 8, foo + 2, 6), 0);
94 }
95 
96 // Pointer wrap around
97 TEST(CircleBufTest, PointerWrapAround)
98 {
99  CircleBuf<char> buf(8);
100  char foo[16];
101 
102  // _start == 0, _stop = 8
103  buf.write(data, 8);
104  // _start == 4, _stop = 8
105  buf.read(foo, 4);
106  // _start == 4, _stop = 12
107  buf.write(data + 8, 4);
108  EXPECT_EQ(buf.size(), 8);
109  // _start == 10, _stop = 12
110  // Normalized: _start == 2, _stop = 4
111  buf.read(foo + 4, 6);
112  EXPECT_EQ(buf.size(), 2);
113  EXPECT_EQ(memcmp(data, foo, 10), 0);
114  // Normalized: _start == 4, _stop = 4
115  buf.read(foo + 10, 2);
116  EXPECT_EQ(buf.size(), 0);
117  EXPECT_EQ(memcmp(data, foo, 12), 0);
118 }
data
const char data[]
Definition: circlebuf.test.cc:42
circlebuf.hh
EXPECT_EQ
#define EXPECT_EQ(lhs, rhs)
A macro which verifies that lhs and rhs are equal to each other.
Definition: unittest.hh:110
CircularQueue::size
uint32_t size() const
Definition: circular_queue.hh:633
CircleBuf::write
void write(InputIterator in, size_t len)
Add elements to the end of the ring buffers and advance.
Definition: circlebuf.hh:115
CircleBuf::peek
void peek(OutputIterator out, size_t len) const
Copy buffer contents without advancing the read pointer.
Definition: circlebuf.hh:77
CircleBuf::read
void read(OutputIterator out, size_t len)
Copy buffer contents and advance the read pointer.
Definition: circlebuf.hh:103
TEST
TEST(CircleBufTest, BasicReadWriteNoOverflow)
Definition: circlebuf.test.cc:48
CircleBuf< char >
GuestABI::foo
std::true_type foo(void(*)(ThreadContext *, const Ret &ret, State &state))

Generated on Wed Sep 30 2020 14:02:07 for gem5 by doxygen 1.8.17