OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // The test buffer data is 52 bytes, wrap position is set to 20 (this is | 5 // The test buffer data is 52 bytes, wrap position is set to 20 (this is |
6 // arbitrarily chosen). The total buffer size is allocated dynamically based on | 6 // arbitrarily chosen). The total buffer size is allocated dynamically based on |
7 // the actual header size. This gives: | 7 // the actual header size. This gives: |
8 // Header of some size, non-wrapping part 20 bytes, wrapping part 32 bytes. | 8 // Header of some size, non-wrapping part 20 bytes, wrapping part 32 bytes. |
9 // As input data, a 14 byte array is used and repeatedly written. It's chosen | 9 // As input data, a 14 byte array is used and repeatedly written. It's chosen |
10 // not to be an integer factor smaller than the wrapping part. This ensures that | 10 // not to be an integer factor smaller than the wrapping part. This ensures that |
11 // the wrapped data isn't repeated at the same position. | 11 // the wrapped data isn't repeated at the same position. |
12 // Note that desipte the number of wraps (if one or more), the reference output | 12 // Note that desipte the number of wraps (if one or more), the reference output |
13 // data is the same since the offset at each wrap is always the same. | 13 // data is the same since the offset at each wrap is always the same. |
14 | 14 |
| 15 #include <stddef.h> |
| 16 #include <stdint.h> |
| 17 |
| 18 #include "base/macros.h" |
15 #include "base/memory/scoped_ptr.h" | 19 #include "base/memory/scoped_ptr.h" |
16 #include "chrome/common/partial_circular_buffer.h" | 20 #include "chrome/common/partial_circular_buffer.h" |
17 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
18 | 22 |
19 const uint32 kWrapPosition = 20; | 23 const uint32_t kWrapPosition = 20; |
20 const uint8 kInputData[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; | 24 const uint8_t kInputData[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; |
21 const uint8 kOutputRefDataWrap[] = | 25 const uint8_t kOutputRefDataWrap[] = |
22 // The 20 bytes in the non-wrapping part. | 26 // The 20 bytes in the non-wrapping part. |
23 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 1, 2, 3, 4, 5, 6, | 27 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 1, 2, 3, 4, 5, 6, |
24 // The 32 bytes in wrapping part. | 28 // The 32 bytes in wrapping part. |
25 11, 12, 13, 14, | 29 11, 12, 13, 14, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 1, 2, 3, 4, |
26 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, | 30 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; |
27 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; | |
28 | 31 |
29 class PartialCircularBufferTest : public testing::Test { | 32 class PartialCircularBufferTest : public testing::Test { |
30 public: | 33 public: |
31 PartialCircularBufferTest() { | 34 PartialCircularBufferTest() { |
32 PartialCircularBuffer::BufferData test_struct; | 35 PartialCircularBuffer::BufferData test_struct; |
33 buffer_header_size_ = | 36 buffer_header_size_ = |
34 &test_struct.data[0] - reinterpret_cast<uint8*>(&test_struct); | 37 &test_struct.data[0] - reinterpret_cast<uint8_t*>(&test_struct); |
35 | 38 |
36 buffer_.reset(new uint8[buffer_header_size_ + sizeof(kOutputRefDataWrap)]); | 39 buffer_.reset( |
| 40 new uint8_t[buffer_header_size_ + sizeof(kOutputRefDataWrap)]); |
37 } | 41 } |
38 | 42 |
39 void InitWriteBuffer(bool append) { | 43 void InitWriteBuffer(bool append) { |
40 pcb_write_.reset(new PartialCircularBuffer( | 44 pcb_write_.reset(new PartialCircularBuffer( |
41 buffer_.get(), | 45 buffer_.get(), |
42 buffer_header_size_ + sizeof(kOutputRefDataWrap), | 46 buffer_header_size_ + sizeof(kOutputRefDataWrap), |
43 kWrapPosition, | 47 kWrapPosition, |
44 append)); | 48 append)); |
45 } | 49 } |
46 | 50 |
47 void WriteToBuffer(int num) { | 51 void WriteToBuffer(int num) { |
48 for (int i = 0; i < num; ++i) | 52 for (int i = 0; i < num; ++i) |
49 pcb_write_->Write(kInputData, sizeof(kInputData)); | 53 pcb_write_->Write(kInputData, sizeof(kInputData)); |
50 } | 54 } |
51 | 55 |
52 void InitReadBuffer() { | 56 void InitReadBuffer() { |
53 pcb_read_.reset(new PartialCircularBuffer( | 57 pcb_read_.reset(new PartialCircularBuffer( |
54 buffer_.get(), buffer_header_size_ + sizeof(kOutputRefDataWrap))); | 58 buffer_.get(), buffer_header_size_ + sizeof(kOutputRefDataWrap))); |
55 } | 59 } |
56 | 60 |
57 protected: | 61 protected: |
58 scoped_ptr<PartialCircularBuffer> pcb_write_; | 62 scoped_ptr<PartialCircularBuffer> pcb_write_; |
59 scoped_ptr<PartialCircularBuffer> pcb_read_; | 63 scoped_ptr<PartialCircularBuffer> pcb_read_; |
60 scoped_ptr<uint8[]> buffer_; | 64 scoped_ptr<uint8_t[]> buffer_; |
61 uint32 buffer_header_size_; | 65 uint32_t buffer_header_size_; |
62 | 66 |
63 DISALLOW_COPY_AND_ASSIGN(PartialCircularBufferTest); | 67 DISALLOW_COPY_AND_ASSIGN(PartialCircularBufferTest); |
64 }; | 68 }; |
65 | 69 |
66 TEST_F(PartialCircularBufferTest, NoWrapBeginningPartOnly) { | 70 TEST_F(PartialCircularBufferTest, NoWrapBeginningPartOnly) { |
67 InitWriteBuffer(false); | 71 InitWriteBuffer(false); |
68 WriteToBuffer(1); | 72 WriteToBuffer(1); |
69 InitReadBuffer(); | 73 InitReadBuffer(); |
70 | 74 |
71 uint8 output_data[sizeof(kInputData)] = {0}; | 75 uint8_t output_data[sizeof(kInputData)] = {0}; |
72 EXPECT_EQ(sizeof(output_data), | 76 EXPECT_EQ(sizeof(output_data), |
73 pcb_read_->Read(output_data, sizeof(output_data))); | 77 pcb_read_->Read(output_data, sizeof(output_data))); |
74 | 78 |
75 EXPECT_EQ(0, memcmp(kInputData, output_data, sizeof(kInputData))); | 79 EXPECT_EQ(0, memcmp(kInputData, output_data, sizeof(kInputData))); |
76 | 80 |
77 EXPECT_EQ(0u, pcb_read_->Read(output_data, sizeof(output_data))); | 81 EXPECT_EQ(0u, pcb_read_->Read(output_data, sizeof(output_data))); |
78 } | 82 } |
79 | 83 |
80 TEST_F(PartialCircularBufferTest, NoWrapBeginningAndEndParts) { | 84 TEST_F(PartialCircularBufferTest, NoWrapBeginningAndEndParts) { |
81 InitWriteBuffer(false); | 85 InitWriteBuffer(false); |
82 WriteToBuffer(2); | 86 WriteToBuffer(2); |
83 InitReadBuffer(); | 87 InitReadBuffer(); |
84 | 88 |
85 uint8 output_data[2 * sizeof(kInputData)] = {0}; | 89 uint8_t output_data[2 * sizeof(kInputData)] = {0}; |
86 EXPECT_EQ(sizeof(output_data), | 90 EXPECT_EQ(sizeof(output_data), |
87 pcb_read_->Read(output_data, sizeof(output_data))); | 91 pcb_read_->Read(output_data, sizeof(output_data))); |
88 | 92 |
89 const uint8 output_ref_data[2 * sizeof(kInputData)] = | 93 const uint8_t output_ref_data[2 * sizeof(kInputData)] = { |
90 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, | 94 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, |
91 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; | 95 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; |
92 EXPECT_EQ(0, memcmp(output_ref_data, output_data, sizeof(output_data))); | 96 EXPECT_EQ(0, memcmp(output_ref_data, output_data, sizeof(output_data))); |
93 | 97 |
94 EXPECT_EQ(0u, pcb_read_->Read(output_data, sizeof(output_data))); | 98 EXPECT_EQ(0u, pcb_read_->Read(output_data, sizeof(output_data))); |
95 } | 99 } |
96 | 100 |
97 TEST_F(PartialCircularBufferTest, WrapOnce) { | 101 TEST_F(PartialCircularBufferTest, WrapOnce) { |
98 InitWriteBuffer(false); | 102 InitWriteBuffer(false); |
99 WriteToBuffer(4); | 103 WriteToBuffer(4); |
100 InitReadBuffer(); | 104 InitReadBuffer(); |
101 | 105 |
102 uint8 output_data[sizeof(kOutputRefDataWrap)] = {0}; | 106 uint8_t output_data[sizeof(kOutputRefDataWrap)] = {0}; |
103 EXPECT_EQ(sizeof(output_data), | 107 EXPECT_EQ(sizeof(output_data), |
104 pcb_read_->Read(output_data, sizeof(output_data))); | 108 pcb_read_->Read(output_data, sizeof(output_data))); |
105 | 109 |
106 EXPECT_EQ(0, memcmp(kOutputRefDataWrap, output_data, sizeof(output_data))); | 110 EXPECT_EQ(0, memcmp(kOutputRefDataWrap, output_data, sizeof(output_data))); |
107 | 111 |
108 EXPECT_EQ(0u, pcb_read_->Read(output_data, sizeof(output_data))); | 112 EXPECT_EQ(0u, pcb_read_->Read(output_data, sizeof(output_data))); |
109 } | 113 } |
110 | 114 |
111 TEST_F(PartialCircularBufferTest, WrapTwice) { | 115 TEST_F(PartialCircularBufferTest, WrapTwice) { |
112 InitWriteBuffer(false); | 116 InitWriteBuffer(false); |
113 WriteToBuffer(7); | 117 WriteToBuffer(7); |
114 InitReadBuffer(); | 118 InitReadBuffer(); |
115 | 119 |
116 uint8 output_data[sizeof(kOutputRefDataWrap)] = {0}; | 120 uint8_t output_data[sizeof(kOutputRefDataWrap)] = {0}; |
117 EXPECT_EQ(sizeof(output_data), | 121 EXPECT_EQ(sizeof(output_data), |
118 pcb_read_->Read(output_data, sizeof(output_data))); | 122 pcb_read_->Read(output_data, sizeof(output_data))); |
119 | 123 |
120 EXPECT_EQ(0, memcmp(kOutputRefDataWrap, output_data, sizeof(output_data))); | 124 EXPECT_EQ(0, memcmp(kOutputRefDataWrap, output_data, sizeof(output_data))); |
121 | 125 |
122 EXPECT_EQ(0u, pcb_read_->Read(output_data, sizeof(output_data))); | 126 EXPECT_EQ(0u, pcb_read_->Read(output_data, sizeof(output_data))); |
123 } | 127 } |
124 | 128 |
125 TEST_F(PartialCircularBufferTest, WrapOnceSmallerOutputBuffer) { | 129 TEST_F(PartialCircularBufferTest, WrapOnceSmallerOutputBuffer) { |
126 InitWriteBuffer(false); | 130 InitWriteBuffer(false); |
127 WriteToBuffer(4); | 131 WriteToBuffer(4); |
128 InitReadBuffer(); | 132 InitReadBuffer(); |
129 | 133 |
130 uint8 output_data[sizeof(kOutputRefDataWrap)] = {0}; | 134 uint8_t output_data[sizeof(kOutputRefDataWrap)] = {0}; |
131 const uint32 size_per_read = 16; | 135 const uint32_t size_per_read = 16; |
132 uint32 read = 0; | 136 uint32_t read = 0; |
133 for (; read + size_per_read <= sizeof(output_data); read += size_per_read) { | 137 for (; read + size_per_read <= sizeof(output_data); read += size_per_read) { |
134 EXPECT_EQ(size_per_read, | 138 EXPECT_EQ(size_per_read, |
135 pcb_read_->Read(output_data + read, size_per_read)); | 139 pcb_read_->Read(output_data + read, size_per_read)); |
136 } | 140 } |
137 EXPECT_EQ(sizeof(output_data) - read, | 141 EXPECT_EQ(sizeof(output_data) - read, |
138 pcb_read_->Read(output_data + read, size_per_read)); | 142 pcb_read_->Read(output_data + read, size_per_read)); |
139 | 143 |
140 EXPECT_EQ(0, memcmp(kOutputRefDataWrap, output_data, sizeof(output_data))); | 144 EXPECT_EQ(0, memcmp(kOutputRefDataWrap, output_data, sizeof(output_data))); |
141 | 145 |
142 EXPECT_EQ(0u, pcb_read_->Read(output_data, sizeof(output_data))); | 146 EXPECT_EQ(0u, pcb_read_->Read(output_data, sizeof(output_data))); |
143 } | 147 } |
144 | 148 |
145 TEST_F(PartialCircularBufferTest, WrapOnceWithAppend) { | 149 TEST_F(PartialCircularBufferTest, WrapOnceWithAppend) { |
146 InitWriteBuffer(false); | 150 InitWriteBuffer(false); |
147 WriteToBuffer(2); | 151 WriteToBuffer(2); |
148 InitWriteBuffer(true); | 152 InitWriteBuffer(true); |
149 WriteToBuffer(2); | 153 WriteToBuffer(2); |
150 InitReadBuffer(); | 154 InitReadBuffer(); |
151 | 155 |
152 uint8 output_data[sizeof(kOutputRefDataWrap)] = {0}; | 156 uint8_t output_data[sizeof(kOutputRefDataWrap)] = {0}; |
153 EXPECT_EQ(sizeof(output_data), | 157 EXPECT_EQ(sizeof(output_data), |
154 pcb_read_->Read(output_data, sizeof(output_data))); | 158 pcb_read_->Read(output_data, sizeof(output_data))); |
155 | 159 |
156 EXPECT_EQ(0, memcmp(kOutputRefDataWrap, output_data, sizeof(output_data))); | 160 EXPECT_EQ(0, memcmp(kOutputRefDataWrap, output_data, sizeof(output_data))); |
157 | 161 |
158 EXPECT_EQ(0u, pcb_read_->Read(output_data, sizeof(output_data))); | 162 EXPECT_EQ(0u, pcb_read_->Read(output_data, sizeof(output_data))); |
159 } | 163 } |
160 | 164 |
161 TEST_F(PartialCircularBufferTest, WrapTwiceWithAppend) { | 165 TEST_F(PartialCircularBufferTest, WrapTwiceWithAppend) { |
162 InitWriteBuffer(false); | 166 InitWriteBuffer(false); |
163 WriteToBuffer(4); | 167 WriteToBuffer(4); |
164 InitWriteBuffer(true); | 168 InitWriteBuffer(true); |
165 WriteToBuffer(3); | 169 WriteToBuffer(3); |
166 InitReadBuffer(); | 170 InitReadBuffer(); |
167 | 171 |
168 uint8 output_data[sizeof(kOutputRefDataWrap)] = {0}; | 172 uint8_t output_data[sizeof(kOutputRefDataWrap)] = {0}; |
169 EXPECT_EQ(sizeof(output_data), | 173 EXPECT_EQ(sizeof(output_data), |
170 pcb_read_->Read(output_data, sizeof(output_data))); | 174 pcb_read_->Read(output_data, sizeof(output_data))); |
171 | 175 |
172 EXPECT_EQ(0, memcmp(kOutputRefDataWrap, output_data, sizeof(output_data))); | 176 EXPECT_EQ(0, memcmp(kOutputRefDataWrap, output_data, sizeof(output_data))); |
173 | 177 |
174 EXPECT_EQ(0u, pcb_read_->Read(output_data, sizeof(output_data))); | 178 EXPECT_EQ(0u, pcb_read_->Read(output_data, sizeof(output_data))); |
175 } | 179 } |
176 | 180 |
177 TEST_F(PartialCircularBufferTest, WrapOnceThenOverwriteWithNoWrap) { | 181 TEST_F(PartialCircularBufferTest, WrapOnceThenOverwriteWithNoWrap) { |
178 InitWriteBuffer(false); | 182 InitWriteBuffer(false); |
179 WriteToBuffer(4); | 183 WriteToBuffer(4); |
180 InitWriteBuffer(false); | 184 InitWriteBuffer(false); |
181 WriteToBuffer(1); | 185 WriteToBuffer(1); |
182 InitReadBuffer(); | 186 InitReadBuffer(); |
183 | 187 |
184 uint8 output_data[sizeof(kInputData)] = {0}; | 188 uint8_t output_data[sizeof(kInputData)] = {0}; |
185 EXPECT_EQ(sizeof(output_data), | 189 EXPECT_EQ(sizeof(output_data), |
186 pcb_read_->Read(output_data, sizeof(output_data))); | 190 pcb_read_->Read(output_data, sizeof(output_data))); |
187 | 191 |
188 EXPECT_EQ(0, memcmp(kInputData, output_data, sizeof(kInputData))); | 192 EXPECT_EQ(0, memcmp(kInputData, output_data, sizeof(kInputData))); |
189 | 193 |
190 EXPECT_EQ(0u, pcb_read_->Read(output_data, sizeof(output_data))); | 194 EXPECT_EQ(0u, pcb_read_->Read(output_data, sizeof(output_data))); |
191 } | 195 } |
192 | 196 |
193 TEST_F(PartialCircularBufferTest, WrapTwiceWithSingleWrite) { | 197 TEST_F(PartialCircularBufferTest, WrapTwiceWithSingleWrite) { |
194 const size_t kInputSize = sizeof(kInputData); | 198 const size_t kInputSize = sizeof(kInputData); |
195 const size_t kLargeSize = kInputSize * 7; | 199 const size_t kLargeSize = kInputSize * 7; |
196 uint8 large_input[kLargeSize] = {0}; | 200 uint8_t large_input[kLargeSize] = {0}; |
197 for (size_t offset = 0; offset < kLargeSize; offset += kInputSize) | 201 for (size_t offset = 0; offset < kLargeSize; offset += kInputSize) |
198 memcpy(large_input + offset, kInputData, kInputSize); | 202 memcpy(large_input + offset, kInputData, kInputSize); |
199 | 203 |
200 InitWriteBuffer(false); | 204 InitWriteBuffer(false); |
201 pcb_write_->Write(large_input, kLargeSize); | 205 pcb_write_->Write(large_input, kLargeSize); |
202 InitReadBuffer(); | 206 InitReadBuffer(); |
203 | 207 |
204 uint8 output_data[sizeof(kOutputRefDataWrap)] = {0}; | 208 uint8_t output_data[sizeof(kOutputRefDataWrap)] = {0}; |
205 EXPECT_EQ(sizeof(output_data), | 209 EXPECT_EQ(sizeof(output_data), |
206 pcb_read_->Read(output_data, sizeof(output_data))); | 210 pcb_read_->Read(output_data, sizeof(output_data))); |
207 | 211 |
208 EXPECT_EQ(0, memcmp(kOutputRefDataWrap, output_data, sizeof(output_data))); | 212 EXPECT_EQ(0, memcmp(kOutputRefDataWrap, output_data, sizeof(output_data))); |
209 | 213 |
210 EXPECT_EQ(0u, pcb_read_->Read(output_data, sizeof(output_data))); | 214 EXPECT_EQ(0u, pcb_read_->Read(output_data, sizeof(output_data))); |
211 } | 215 } |
212 | 216 |
OLD | NEW |