| 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 |