Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(479)

Side by Side Diff: media/base/seekable_buffer_unittest.cc

Issue 114042: Cleanup media::SeekableBuffer and unit tests... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/base/seekable_buffer.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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 #include "base/logging.h" 5 #include "base/logging.h"
6 #include "base/scoped_ptr.h" 6 #include "base/scoped_ptr.h"
7 #include "base/time.h" 7 #include "base/time.h"
8 #include "media/base/seekable_buffer.h" 8 #include "media/base/seekable_buffer.h"
9 #include "testing/gtest/include/gtest/gtest.h" 9 #include "testing/gtest/include/gtest/gtest.h"
10 10
11 namespace { 11 namespace {
12 12
13 class SeekableBufferTest : public testing::Test { 13 class SeekableBufferTest : public testing::Test {
14 public:
15 SeekableBufferTest() : buffer_(kBufferSize, kBufferSize) {
16 }
17
14 protected: 18 protected:
19 static const size_t kDataSize = 409600;
20 static const size_t kBufferSize = 4096;
21 static const size_t kWriteSize = 512;
22
15 virtual void SetUp() { 23 virtual void SetUp() {
16 // Setup seed. 24 // Setup seed.
17 size_t seed = static_cast<int32>(base::Time::Now().ToInternalValue()); 25 size_t seed = static_cast<int32>(base::Time::Now().ToInternalValue());
18 srand(seed); 26 srand(seed);
19 LOG(INFO) << "Random seed: " << seed; 27 LOG(INFO) << "Random seed: " << seed;
20 28
21 // Creates a test data. 29 // Creates a test data.
22 data_.reset(new uint8[kDataSize]);
23 for (size_t i = 0; i < kDataSize; i++) 30 for (size_t i = 0; i < kDataSize; i++)
24 data_.get()[i] = static_cast<char>(rand()); 31 data_[i] = static_cast<char>(rand());
25
26 // Creates a temp buffer.
27 write_buffer_.reset(new uint8[kDataSize]);
28
29 // Setup |buffer_|.
30 buffer_.reset(new media::SeekableBuffer(kBufferSize, kBufferSize));
31 } 32 }
32 33
33 size_t GetRandomInt(size_t maximum) { 34 size_t GetRandomInt(size_t maximum) {
34 return rand() % maximum + 1; 35 return rand() % maximum + 1;
35 } 36 }
36 37
37 static const size_t kDataSize = 409600; 38 media::SeekableBuffer buffer_;
38 static const size_t kBufferSize = 4096; 39 uint8 data_[kDataSize];
39 scoped_ptr<media::SeekableBuffer> buffer_; 40 uint8 write_buffer_[kDataSize];
40 scoped_array<uint8> data_;
41 scoped_array<uint8> write_buffer_;
42 }; 41 };
43 42
44 TEST_F(SeekableBufferTest, RandomReadWrite) { 43 TEST_F(SeekableBufferTest, RandomReadWrite) {
45 size_t write_position = 0; 44 size_t write_position = 0;
46 size_t read_position = 0; 45 size_t read_position = 0;
47 while (read_position < kDataSize) { 46 while (read_position < kDataSize) {
48 // Write a random amount of data. 47 // Write a random amount of data.
49 size_t write_size = GetRandomInt(kBufferSize); 48 size_t write_size = GetRandomInt(kBufferSize);
50 write_size = std::min(write_size, kDataSize - write_position); 49 write_size = std::min(write_size, kDataSize - write_position);
51 bool should_append = 50 bool should_append = buffer_.Append(write_size, data_ + write_position);
52 buffer_->Append(write_size, data_.get() + write_position);
53 write_position += write_size; 51 write_position += write_size;
54 EXPECT_GE(write_position, read_position); 52 EXPECT_GE(write_position, read_position);
55 EXPECT_EQ(write_position - read_position, buffer_->forward_bytes()); 53 EXPECT_EQ(write_position - read_position, buffer_.forward_bytes());
56 EXPECT_EQ(should_append, buffer_->forward_bytes() < kBufferSize) 54 EXPECT_EQ(should_append, buffer_.forward_bytes() < kBufferSize)
57 << "Incorrect buffer full reported"; 55 << "Incorrect buffer full reported";
58 56
59 // Read a random amount of data. 57 // Read a random amount of data.
60 size_t read_size = GetRandomInt(kBufferSize); 58 size_t read_size = GetRandomInt(kBufferSize);
61 size_t bytes_read = buffer_->Read(read_size, write_buffer_.get()); 59 size_t bytes_read = buffer_.Read(read_size, write_buffer_);
62 EXPECT_GE(read_size, bytes_read); 60 EXPECT_GE(read_size, bytes_read);
63 EXPECT_EQ(0, memcmp(write_buffer_.get(), 61 EXPECT_EQ(0, memcmp(write_buffer_, data_ + read_position, bytes_read));
64 data_.get() + read_position,
65 bytes_read));
66 read_position += bytes_read; 62 read_position += bytes_read;
67 EXPECT_GE(write_position, read_position); 63 EXPECT_GE(write_position, read_position);
68 EXPECT_EQ(write_position - read_position, buffer_->forward_bytes()); 64 EXPECT_EQ(write_position - read_position, buffer_.forward_bytes());
69 } 65 }
70 } 66 }
71 67
72 TEST_F(SeekableBufferTest, ReadWriteSeek) { 68 TEST_F(SeekableBufferTest, ReadWriteSeek) {
73 const size_t kWriteSize = 512;
74 const size_t kReadSize = kWriteSize / 4; 69 const size_t kReadSize = kWriteSize / 4;
75 70
76 size_t write_position = 0;
77 size_t read_position = 0;
78 size_t forward_bytes = 0;
79 for (int i = 0; i < 10; ++i) { 71 for (int i = 0; i < 10; ++i) {
80 // Write until buffer is full. 72 // Write until buffer is full.
81 for (int j = kBufferSize / kWriteSize; j > 0; --j) { 73 for (size_t j = 0; j < kBufferSize; j += kWriteSize) {
82 bool should_append = 74 bool should_append = buffer_.Append(kWriteSize, data_ + j);
83 buffer_->Append(kWriteSize, data_.get() + write_position); 75 EXPECT_EQ(j < kBufferSize - kWriteSize, should_append)
84 EXPECT_EQ(j > 1, should_append) << "Incorrect buffer full reported"; 76 << "Incorrect buffer full reported";
85 write_position += kWriteSize; 77 EXPECT_EQ(j + kWriteSize, buffer_.forward_bytes());
86 forward_bytes += kWriteSize;
87 EXPECT_EQ(forward_bytes, buffer_->forward_bytes());
88 } 78 }
89 79
90 // Simulate a read and seek pattern. Each loop reads 4 times, each time 80 // Simulate a read and seek pattern. Each loop reads 4 times, each time
91 // reading a quarter of |kWriteSize|. 81 // reading a quarter of |kWriteSize|.
92 for (size_t j = 0; j < kBufferSize / kWriteSize; ++j) { 82 size_t read_position = 0;
83 size_t forward_bytes = kBufferSize;
84 for (size_t j = 0; j < kBufferSize; j += kWriteSize) {
93 // Read. 85 // Read.
94 EXPECT_EQ(kReadSize, buffer_->Read(kReadSize, write_buffer_.get())); 86 EXPECT_EQ(kReadSize, buffer_.Read(kReadSize, write_buffer_));
95 forward_bytes -= kReadSize; 87 forward_bytes -= kReadSize;
96 EXPECT_EQ(forward_bytes, buffer_->forward_bytes()); 88 EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
97 EXPECT_EQ(0, memcmp(write_buffer_.get(), 89 EXPECT_EQ(0, memcmp(write_buffer_, data_ + read_position, kReadSize));
98 data_.get() + read_position,
99 kReadSize));
100 read_position += kReadSize; 90 read_position += kReadSize;
101 91
102 // Seek forward. 92 // Seek forward.
103 EXPECT_TRUE(buffer_->Seek(2 * kReadSize)); 93 EXPECT_TRUE(buffer_.Seek(2 * kReadSize));
104 forward_bytes -= 2 * kReadSize; 94 forward_bytes -= 2 * kReadSize;
105 read_position += 2 * kReadSize; 95 read_position += 2 * kReadSize;
106 EXPECT_EQ(forward_bytes, buffer_->forward_bytes()); 96 EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
107 97
108 // Read. 98 // Read.
109 EXPECT_EQ(kReadSize, buffer_->Read(kReadSize, write_buffer_.get())); 99 EXPECT_EQ(kReadSize, buffer_.Read(kReadSize, write_buffer_));
110 forward_bytes -= kReadSize; 100 forward_bytes -= kReadSize;
111 EXPECT_EQ(forward_bytes, buffer_->forward_bytes()); 101 EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
112 EXPECT_EQ(0, memcmp(write_buffer_.get(), 102 EXPECT_EQ(0, memcmp(write_buffer_, data_ + read_position, kReadSize));
113 data_.get() + read_position,
114 kReadSize));
115 read_position += kReadSize; 103 read_position += kReadSize;
116 104
117 // Seek backward. 105 // Seek backward.
118 EXPECT_TRUE(buffer_->Seek(-3 * static_cast<int32>(kReadSize))); 106 EXPECT_TRUE(buffer_.Seek(-3 * static_cast<int32>(kReadSize)));
119 forward_bytes += 3 * kReadSize; 107 forward_bytes += 3 * kReadSize;
120 read_position -= 3 * kReadSize; 108 read_position -= 3 * kReadSize;
121 EXPECT_EQ(forward_bytes, buffer_->forward_bytes()); 109 EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
122 110
123 // Read. 111 // Read.
124 EXPECT_EQ(kReadSize, buffer_->Read(kReadSize, write_buffer_.get())); 112 EXPECT_EQ(kReadSize, buffer_.Read(kReadSize, write_buffer_));
125 forward_bytes -= kReadSize; 113 forward_bytes -= kReadSize;
126 EXPECT_EQ(forward_bytes, buffer_->forward_bytes()); 114 EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
127 EXPECT_EQ(0, memcmp(write_buffer_.get(), 115 EXPECT_EQ(0, memcmp(write_buffer_, data_ + read_position, kReadSize));
128 data_.get() + read_position,
129 kReadSize));
130 read_position += kReadSize; 116 read_position += kReadSize;
131 117
132 // Read. 118 // Read.
133 EXPECT_EQ(kReadSize, buffer_->Read(kReadSize, write_buffer_.get())); 119 EXPECT_EQ(kReadSize, buffer_.Read(kReadSize, write_buffer_));
134 forward_bytes -= kReadSize; 120 forward_bytes -= kReadSize;
135 EXPECT_EQ(forward_bytes, buffer_->forward_bytes()); 121 EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
136 EXPECT_EQ(0, memcmp(write_buffer_.get(), 122 EXPECT_EQ(0, memcmp(write_buffer_, data_ + read_position, kReadSize));
137 data_.get() + read_position,
138 kReadSize));
139 read_position += kReadSize; 123 read_position += kReadSize;
140 124
141 // Seek forward. 125 // Seek forward.
142 EXPECT_TRUE(buffer_->Seek(kReadSize)); 126 EXPECT_TRUE(buffer_.Seek(kReadSize));
143 forward_bytes -= kReadSize; 127 forward_bytes -= kReadSize;
144 read_position += kReadSize; 128 read_position += kReadSize;
145 EXPECT_EQ(forward_bytes, buffer_->forward_bytes()); 129 EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
146 } 130 }
147 } 131 }
148 } 132 }
149 133
150 TEST_F(SeekableBufferTest, BufferFull) { 134 TEST_F(SeekableBufferTest, BufferFull) {
151 const size_t kWriteSize = 512; 135 const size_t kMaxWriteSize = 2 * kBufferSize;
152 136
153 // Write and expect the buffer to be not full. 137 // Write and expect the buffer to be not full.
154 size_t write_position = 0; 138 for (size_t i = 0; i < kBufferSize - kWriteSize; i += kWriteSize) {
155 for (size_t i = 0; i < kBufferSize / kWriteSize - 1; ++i) { 139 EXPECT_TRUE(buffer_.Append(kWriteSize, data_ + i));
156 EXPECT_TRUE(buffer_->Append(kWriteSize, data_.get() + write_position)); 140 EXPECT_EQ(i + kWriteSize, buffer_.forward_bytes());
157 write_position += kWriteSize;
158 EXPECT_EQ(write_position, buffer_->forward_bytes());
159 } 141 }
160 142
161 // Write 10 more times, the buffer is full. 143 // Write until we have kMaxWriteSize bytes in the buffer. Buffer is full in
162 for (int i = 0; i < 10; ++i) { 144 // these writes.
163 EXPECT_FALSE(buffer_->Append(kWriteSize, data_.get() + write_position)); 145 for (size_t i = buffer_.forward_bytes(); i < kMaxWriteSize; i += kWriteSize) {
164 write_position += kWriteSize; 146 EXPECT_FALSE(buffer_.Append(kWriteSize, data_ + i));
165 EXPECT_EQ(write_position, buffer_->forward_bytes()); 147 EXPECT_EQ(i + kWriteSize, buffer_.forward_bytes());
166 } 148 }
167 149
168 // Read until the buffer is empty. 150 // Read until the buffer is empty.
169 size_t read_position = 0; 151 size_t read_position = 0;
170 while (buffer_->forward_bytes()) { 152 while (buffer_.forward_bytes()) {
171 // Read a random amount of data. 153 // Read a random amount of data.
172 size_t read_size = GetRandomInt(kBufferSize); 154 size_t read_size = GetRandomInt(kBufferSize);
173 size_t forward_bytes = buffer_->forward_bytes(); 155 size_t forward_bytes = buffer_.forward_bytes();
174 size_t bytes_read = buffer_->Read(read_size, write_buffer_.get()); 156 size_t bytes_read = buffer_.Read(read_size, write_buffer_);
175 EXPECT_EQ(0, memcmp(write_buffer_.get(), 157 EXPECT_EQ(0, memcmp(write_buffer_, data_ + read_position, bytes_read));
176 data_.get() + read_position,
177 bytes_read));
178 if (read_size > forward_bytes) 158 if (read_size > forward_bytes)
179 EXPECT_EQ(forward_bytes, bytes_read); 159 EXPECT_EQ(forward_bytes, bytes_read);
180 else 160 else
181 EXPECT_EQ(read_size, bytes_read); 161 EXPECT_EQ(read_size, bytes_read);
182 read_position += bytes_read; 162 read_position += bytes_read;
183 EXPECT_GE(write_position, read_position); 163 EXPECT_GE(kMaxWriteSize, read_position);
184 EXPECT_EQ(write_position - read_position, buffer_->forward_bytes()); 164 EXPECT_EQ(kMaxWriteSize - read_position, buffer_.forward_bytes());
185 } 165 }
186 166
187 // Expect we have no bytes left. 167 // Expects we have no bytes left.
188 EXPECT_EQ(0u, buffer_->forward_bytes()); 168 EXPECT_EQ(0u, buffer_.forward_bytes());
189 EXPECT_EQ(0u, buffer_->Read(1, write_buffer_.get())); 169 EXPECT_EQ(0u, buffer_.Read(1, write_buffer_));
190 } 170 }
191 171
192 TEST_F(SeekableBufferTest, SeekBackward) { 172 TEST_F(SeekableBufferTest, SeekBackward) {
193 EXPECT_EQ(0u, buffer_->forward_bytes()); 173 EXPECT_EQ(0u, buffer_.forward_bytes());
194 EXPECT_EQ(0u, buffer_->backward_bytes()); 174 EXPECT_EQ(0u, buffer_.backward_bytes());
195 EXPECT_FALSE(buffer_->Seek(1)); 175 EXPECT_FALSE(buffer_.Seek(1));
196 EXPECT_FALSE(buffer_->Seek(-1)); 176 EXPECT_FALSE(buffer_.Seek(-1));
197 177
198 const size_t kWriteSize = 512;
199 const size_t kReadSize = 256; 178 const size_t kReadSize = 256;
200 179
201 // Write into buffer until it's full. 180 // Write into buffer until it's full.
202 size_t write_position = 0; 181 for (size_t i = 0; i < kBufferSize; i += kWriteSize) {
203 for (size_t i = 0; i < kBufferSize / kWriteSize; ++i) {
204 // Write a random amount of data. 182 // Write a random amount of data.
205 buffer_->Append(kWriteSize, data_.get() + write_position); 183 buffer_.Append(kWriteSize, data_ + i);
206 write_position += kWriteSize;
207 } 184 }
208 185
209 // Read until buffer is empty. 186 // Read until buffer is empty.
210 size_t read_position = 0; 187 for (size_t i = 0; i < kBufferSize; i += kReadSize) {
211 for (size_t i = 0; i < kBufferSize / kReadSize; ++i) { 188 EXPECT_EQ(kReadSize, buffer_.Read(kReadSize, write_buffer_));
212 EXPECT_EQ(kReadSize, buffer_->Read(kReadSize, write_buffer_.get())); 189 EXPECT_EQ(0, memcmp(write_buffer_, data_ + i, kReadSize));
213 EXPECT_EQ(0, memcmp(write_buffer_.get(),
214 data_.get() + read_position,
215 kReadSize));
216 read_position += kReadSize;
217 } 190 }
218 191
219 // Seek backward. 192 // Seek backward.
220 EXPECT_TRUE(buffer_->Seek(-static_cast<int32>(kBufferSize))); 193 EXPECT_TRUE(buffer_.Seek(-static_cast<int32>(kBufferSize)));
221 EXPECT_FALSE(buffer_->Seek(-1)); 194 EXPECT_FALSE(buffer_.Seek(-1));
222 195
223 // Read again. 196 // Read again.
224 read_position = 0; 197 for (size_t i = 0; i < kBufferSize; i += kReadSize) {
225 for (size_t i = 0; i < kBufferSize / kReadSize; ++i) { 198 EXPECT_EQ(kReadSize, buffer_.Read(kReadSize, write_buffer_));
226 EXPECT_EQ(kReadSize, buffer_->Read(kReadSize, write_buffer_.get())); 199 EXPECT_EQ(0, memcmp(write_buffer_, data_ + i, kReadSize));
227 EXPECT_EQ(0, memcmp(write_buffer_.get(),
228 data_.get() + read_position,
229 kReadSize));
230 read_position += kReadSize;
231 } 200 }
232 } 201 }
233 202
234 TEST_F(SeekableBufferTest, SeekForward) { 203 TEST_F(SeekableBufferTest, SeekForward) {
235 size_t write_position = 0; 204 size_t write_position = 0;
236 size_t read_position = 0; 205 size_t read_position = 0;
237 while (read_position < kDataSize) { 206 while (read_position < kDataSize) {
238 for (int i = 0; i < 10; ++i) { 207 for (int i = 0; i < 10 && write_position < kDataSize; ++i) {
239 // Write a random amount of data. 208 // Write a random amount of data.
240 size_t write_size = GetRandomInt(kBufferSize); 209 size_t write_size = GetRandomInt(kBufferSize);
241 write_size = std::min(write_size, kDataSize - write_position); 210 write_size = std::min(write_size, kDataSize - write_position);
242 if (!write_size) 211
243 break; 212 bool should_append = buffer_.Append(write_size, data_ + write_position);
244 bool should_append =
245 buffer_->Append(write_size, data_.get() + write_position);
246 write_position += write_size; 213 write_position += write_size;
247 EXPECT_GE(write_position, read_position); 214 EXPECT_GE(write_position, read_position);
248 EXPECT_EQ(write_position - read_position, buffer_->forward_bytes()); 215 EXPECT_EQ(write_position - read_position, buffer_.forward_bytes());
249 EXPECT_EQ(should_append, buffer_->forward_bytes() < kBufferSize) 216 EXPECT_EQ(should_append, buffer_.forward_bytes() < kBufferSize)
250 << "Incorrect buffer full status reported"; 217 << "Incorrect buffer full status reported";
251 } 218 }
252 219
253 // Read a random amount of data. 220 // Read a random amount of data.
254 size_t seek_size = GetRandomInt(kBufferSize); 221 size_t seek_size = GetRandomInt(kBufferSize);
255 if (buffer_->Seek(seek_size)) 222 if (buffer_.Seek(seek_size))
256 read_position += seek_size; 223 read_position += seek_size;
257 EXPECT_GE(write_position, read_position); 224 EXPECT_GE(write_position, read_position);
258 EXPECT_EQ(write_position - read_position, buffer_->forward_bytes()); 225 EXPECT_EQ(write_position - read_position, buffer_.forward_bytes());
259 226
260 // Read a random amount of data. 227 // Read a random amount of data.
261 size_t read_size = GetRandomInt(kBufferSize); 228 size_t read_size = GetRandomInt(kBufferSize);
262 size_t bytes_read = buffer_->Read(read_size, write_buffer_.get()); 229 size_t bytes_read = buffer_.Read(read_size, write_buffer_);
263 EXPECT_GE(read_size, bytes_read); 230 EXPECT_GE(read_size, bytes_read);
264 EXPECT_EQ(0, memcmp(write_buffer_.get(), 231 EXPECT_EQ(0, memcmp(write_buffer_, data_ + read_position, bytes_read));
265 data_.get() + read_position,
266 bytes_read));
267 read_position += bytes_read; 232 read_position += bytes_read;
268 EXPECT_GE(write_position, read_position); 233 EXPECT_GE(write_position, read_position);
269 EXPECT_EQ(write_position - read_position, buffer_->forward_bytes()); 234 EXPECT_EQ(write_position - read_position, buffer_.forward_bytes());
270 } 235 }
271 } 236 }
272 237
273 TEST_F(SeekableBufferTest, AllMethods) { 238 TEST_F(SeekableBufferTest, AllMethods) {
274 EXPECT_EQ(0u, buffer_->Read(0, write_buffer_.get())); 239 EXPECT_EQ(0u, buffer_.Read(0, write_buffer_));
275 EXPECT_EQ(0u, buffer_->Read(1, write_buffer_.get())); 240 EXPECT_EQ(0u, buffer_.Read(1, write_buffer_));
276 EXPECT_TRUE(buffer_->Seek(0)); 241 EXPECT_TRUE(buffer_.Seek(0));
277 EXPECT_FALSE(buffer_->Seek(-1)); 242 EXPECT_FALSE(buffer_.Seek(-1));
278 EXPECT_FALSE(buffer_->Seek(1)); 243 EXPECT_FALSE(buffer_.Seek(1));
279 EXPECT_EQ(0u, buffer_->forward_bytes()); 244 EXPECT_EQ(0u, buffer_.forward_bytes());
280 EXPECT_EQ(0u, buffer_->backward_bytes()); 245 EXPECT_EQ(0u, buffer_.backward_bytes());
281 } 246 }
282 247
283 } 248 } // namespace
OLDNEW
« no previous file with comments | « media/base/seekable_buffer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698