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

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

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

Powered by Google App Engine
This is Rietveld 408576698