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

Side by Side Diff: content/browser/download/byte_stream_unittest.cc

Issue 10244001: Creation of ByteStream class. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Cleaned up header comments. Created 8 years, 8 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
OLDNEW
(Empty)
1 // Copyright (c) 2012 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/bind.h"
6 #include "base/callback.h"
7 #include "base/location.h"
8 #include "base/memory/ref_counted.h"
9 #include "base/task_runner.h"
10 #include "content/browser/download/byte_stream.h"
willchan no longer on Chromium 2012/04/27 21:22:29 goes first, see google c++ style guide's include o
11 #include "net/base/io_buffer.h"
12 #include "testing/gmock/include/gmock/gmock.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 using ::testing::_;
16 using ::testing::Return;
17 using ::testing::SaveArg;
18 using ::testing::StrictMock;
19
20 namespace tracked_objects {
21 class Location;
22 }
23
24 namespace {
25
26 class MockTaskRunner : public base::TaskRunner {
27 public:
28 MockTaskRunner();
29
30 // TaskRunner functions.
31 MOCK_METHOD3(PostDelayedTask, bool(const tracked_objects::Location&,
32 const base::Closure&, int64));
33 MOCK_METHOD3(PostDelayedTask, bool(const tracked_objects::Location&,
34 const base::Closure&, base::TimeDelta));
35 MOCK_CONST_METHOD0(RunsTasksOnCurrentThread, bool());
36
37 protected:
38 ~MockTaskRunner();
39 };
40
41 MockTaskRunner::MockTaskRunner() { }
42
43 MockTaskRunner::~MockTaskRunner() { }
44
45 int null_callback_call_count = 0;
46
47 void NullCallback(int arg) {
48 null_callback_call_count++;
49 }
50
51 } // namespace
52
53 class ByteStreamTest : public testing::Test {
54 public:
55 // Create a new IO buffer of the given |buffer_size|, with contents
56 // dependent on the |seed_key|. The |seed_key| is also used for comparing
57 // pointers between NewIOBuffer and ValidateIOBuffer; do not re-use any
58 // |seed_key| value within a single test.
59 scoped_refptr<net::IOBuffer> NewIOBuffer(size_t buffer_size, int seed_key) {
60 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(buffer_size));
61 char *bufferp = buffer->data();
62 for (size_t i = 0; i < buffer_size; i++)
63 bufferp[i] = (i + seed_key) % (1 << sizeof(char));
64 DCHECK(pointer_map_.find(seed_key) == pointer_map_.end());
65 DCHECK(length_map_.find(seed_key) == length_map_.end());
66 pointer_map_[seed_key] = bufferp;
67 length_map_[seed_key] = buffer_size;
68 return buffer;
69 }
70
71 // Create an IOBuffer of the appropriate size and add it to the
72 // ByteStream, returning the result of the ByteStream::AddData.
73 // Separate function to avoid duplication of buffer_size in test
74 // calls.
75 bool AddData(scoped_refptr<content::ByteStream> byte_stream,
76 int seed_key, size_t buffer_size) {
77 return byte_stream->AddData(NewIOBuffer(buffer_size, seed_key),
78 buffer_size);
79 }
80
81 // Validate that we have the IOBuffer we expect. This IOBuffer must
82 // have been created through NewIOBuffer with the given |buffer_size|
83 // and |seed_key|.
84 bool ValidateIOBuffer(scoped_refptr<net::IOBuffer> buffer, int seed_key,
85 size_t buffer_size) {
86 char *bufferp = buffer->data();
87 EXPECT_TRUE(pointer_map_.find(seed_key) != pointer_map_.end());
88 if (pointer_map_.find(seed_key) == pointer_map_.end())
89 return false;
90 EXPECT_EQ(bufferp, pointer_map_[seed_key]);
91 EXPECT_TRUE(length_map_.find(seed_key) != length_map_.end());
92 if (length_map_.find(seed_key) == length_map_.end())
93 return false;
94 EXPECT_EQ(buffer_size, length_map_[seed_key]);
95 for (size_t i = 0; i < buffer_size; i++) {
96 EXPECT_EQ(static_cast<int>((i + seed_key) % (1 << sizeof(char))),
97 bufferp[i]);
98 if (static_cast<int>((i + seed_key) % (1 << sizeof(char))) != bufferp[i])
99 return false;
100 }
101 return true;
102 }
103
104 private:
105 std::map<int, char*> pointer_map_;
106 std::map<int, size_t> length_map_;
107 };
108
109 // Confirm that filling and emptying the pipe works properly, and that
110 // we get full triggers when we expect.
111 TEST_F(ByteStreamTest, PushBack) {
112 scoped_refptr<content::ByteStream> byte_stream(new content::ByteStream());
113 byte_stream->SetBufferSize(3 * 1024);
114
115 // Push a series of IO buffers on; test pushback happening and
116 // that it's advisory.
117 EXPECT_TRUE(AddData(byte_stream, 0, 1024));
118 EXPECT_FALSE(byte_stream->IsFull());
119 EXPECT_TRUE(AddData(byte_stream, 1, 1024));
120 EXPECT_FALSE(byte_stream->IsFull());
121 EXPECT_TRUE(AddData(byte_stream, 2, 1024));
122 EXPECT_FALSE(byte_stream->IsFull());
123 EXPECT_FALSE(AddData(byte_stream, 3, 1));
124 EXPECT_TRUE(byte_stream->IsFull());
125 EXPECT_FALSE(AddData(byte_stream, 4, 1024));
126 EXPECT_TRUE(byte_stream->IsFull());
127 EXPECT_EQ(0u, byte_stream->bytes_read());
128 EXPECT_EQ(0u, byte_stream->buffers_read());
129
130 // Pull the IO buffers out; do we get the same buffers and do they
131 // have the same contents?
132 scoped_refptr<net::IOBuffer> output_io_buffer;
133 size_t output_length;
134 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
135 byte_stream->GetData(&output_io_buffer, &output_length));
136 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 0, output_length));
137 EXPECT_EQ(1024u, byte_stream->bytes_read());
138 EXPECT_EQ(1u, byte_stream->buffers_read());
139
140 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
141 byte_stream->GetData(&output_io_buffer, &output_length));
142 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 1, output_length));
143 EXPECT_EQ(2048u, byte_stream->bytes_read());
144 EXPECT_EQ(2u, byte_stream->buffers_read());
145
146 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
147 byte_stream->GetData(&output_io_buffer, &output_length));
148 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 2, output_length));
149 EXPECT_EQ(3072u, byte_stream->bytes_read());
150 EXPECT_EQ(3u, byte_stream->buffers_read());
151
152 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
153 byte_stream->GetData(&output_io_buffer, &output_length));
154 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 3, output_length));
155 EXPECT_EQ(3073u, byte_stream->bytes_read());
156 EXPECT_EQ(4u, byte_stream->buffers_read());
157
158 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
159 byte_stream->GetData(&output_io_buffer, &output_length));
160 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 4, output_length));
161 EXPECT_EQ(4097u, byte_stream->bytes_read());
162 EXPECT_EQ(5u, byte_stream->buffers_read());
163
164 EXPECT_EQ(content::ByteStream::STREAM_EMPTY,
165 byte_stream->GetData(&output_io_buffer, &output_length));
166 }
167
168 // Confirm that a SourceComplete() notification transmits in-order
169 // with data on the pipe.
170 TEST_F(ByteStreamTest, CompleteTransmits) {
171 scoped_refptr<content::ByteStream> byte_stream;
172
173 scoped_refptr<net::IOBuffer> output_io_buffer;
174 size_t output_length;
175
176 // Empty stream, non-error case.
177 byte_stream = new content::ByteStream();
178 EXPECT_EQ(content::ByteStream::STREAM_EMPTY,
179 byte_stream->GetData(&output_io_buffer, &output_length));
180 byte_stream->SourceComplete(content::DOWNLOAD_INTERRUPT_REASON_NONE);
181 ASSERT_EQ(content::ByteStream::STREAM_COMPLETE,
182 byte_stream->GetData(&output_io_buffer, &output_length));
183 EXPECT_EQ(content::DOWNLOAD_INTERRUPT_REASON_NONE,
184 byte_stream->GetSourceResult());
185
186 // Non-empty stream, non-error case.
187 byte_stream = new content::ByteStream();
188 EXPECT_EQ(content::ByteStream::STREAM_EMPTY,
189 byte_stream->GetData(&output_io_buffer, &output_length));
190 EXPECT_TRUE(AddData(byte_stream, 0, 1024));
191 byte_stream->SourceComplete(content::DOWNLOAD_INTERRUPT_REASON_NONE);
192 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
193 byte_stream->GetData(&output_io_buffer, &output_length));
194 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 0, output_length));
195 ASSERT_EQ(content::ByteStream::STREAM_COMPLETE,
196 byte_stream->GetData(&output_io_buffer, &output_length));
197 EXPECT_EQ(content::DOWNLOAD_INTERRUPT_REASON_NONE,
198 byte_stream->GetSourceResult());
199
200 // Empty stream, non-error case.
201 byte_stream = new content::ByteStream();
202 EXPECT_EQ(content::ByteStream::STREAM_EMPTY,
203 byte_stream->GetData(&output_io_buffer, &output_length));
204 byte_stream->SourceComplete(
205 content::DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED);
206 ASSERT_EQ(content::ByteStream::STREAM_COMPLETE,
207 byte_stream->GetData(&output_io_buffer, &output_length));
208 EXPECT_EQ(content::DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED,
209 byte_stream->GetSourceResult());
210
211 // Non-empty stream, non-error case.
212 byte_stream = new content::ByteStream();
213 EXPECT_EQ(content::ByteStream::STREAM_EMPTY,
214 byte_stream->GetData(&output_io_buffer, &output_length));
215 EXPECT_TRUE(AddData(byte_stream, 1, 1024));
216 byte_stream->SourceComplete(
217 content::DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED);
218 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
219 byte_stream->GetData(&output_io_buffer, &output_length));
220 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 1, output_length));
221 ASSERT_EQ(content::ByteStream::STREAM_COMPLETE,
222 byte_stream->GetData(&output_io_buffer, &output_length));
223 EXPECT_EQ(content::DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED,
224 byte_stream->GetSourceResult());
225 }
226
227 // Confirm that callbacks on the sink side are triggered when they should be.
228 TEST_F(ByteStreamTest, SinkCallback) {
229 scoped_refptr<MockTaskRunner> task_runner(new StrictMock<MockTaskRunner>());
230 int null_callback_call_count_start = 0;
231
232 scoped_refptr<content::ByteStream> byte_stream(new content::ByteStream());
233 byte_stream->SetBufferSize(10000);
234
235 scoped_refptr<net::IOBuffer> output_io_buffer;
236 size_t output_length;
237 base::Closure intermediate_callback;
238
239 // Callback to be called on any data.
240 byte_stream->RegisterSinkCallback(task_runner,
241 base::Bind(NullCallback, 0),
242 0);
243 null_callback_call_count_start = null_callback_call_count;
244 EXPECT_CALL(*task_runner.get(), PostDelayedTask(_, _, 0))
245 .WillOnce(DoAll(SaveArg<1>(&intermediate_callback),
246 Return(true)));
247 EXPECT_EQ(0u, byte_stream->num_sink_callbacks());
248 EXPECT_TRUE(AddData(byte_stream, 0, 1024));
249 EXPECT_EQ(1u, byte_stream->num_sink_callbacks());
250 ::testing::Mock::VerifyAndClearExpectations(task_runner.get());
251 EXPECT_EQ(null_callback_call_count_start, null_callback_call_count);
252 intermediate_callback.Run();
253 EXPECT_EQ(null_callback_call_count_start+1, null_callback_call_count);
254 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
255 byte_stream->GetData(&output_io_buffer, &output_length));
256 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 0, output_length));
257 EXPECT_EQ(content::ByteStream::STREAM_EMPTY,
258 byte_stream->GetData(&output_io_buffer, &output_length));
259
260 // Callback to be called on 33% full.
261 byte_stream->RegisterSinkCallback(task_runner,
262 base::Bind(NullCallback, 0),
263 33);
264 null_callback_call_count_start = null_callback_call_count;
265 EXPECT_TRUE(AddData(byte_stream, 1, 3300));
266 EXPECT_CALL(*task_runner.get(), PostDelayedTask(_, _, 0))
267 .WillOnce(DoAll(SaveArg<1>(&intermediate_callback),
268 Return(true)));
269 EXPECT_EQ(1u, byte_stream->num_sink_callbacks());
270 EXPECT_TRUE(AddData(byte_stream, 2, 1));
271 EXPECT_EQ(2u, byte_stream->num_sink_callbacks());
272 ::testing::Mock::VerifyAndClearExpectations(task_runner.get());
273 EXPECT_EQ(null_callback_call_count_start, null_callback_call_count);
274 intermediate_callback.Run();
275 EXPECT_EQ(null_callback_call_count_start+1, null_callback_call_count);
276 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
277 byte_stream->GetData(&output_io_buffer, &output_length));
278 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 1, output_length));
279 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
280 byte_stream->GetData(&output_io_buffer, &output_length));
281 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 2, output_length));
282 EXPECT_EQ(content::ByteStream::STREAM_EMPTY,
283 byte_stream->GetData(&output_io_buffer, &output_length));
284
285 // Callback to be called on 100% full.
286 byte_stream->RegisterSinkCallback(task_runner,
287 base::Bind(NullCallback, 0),
288 100);
289 null_callback_call_count_start = null_callback_call_count;
290 EXPECT_TRUE(AddData(byte_stream, 3, 3300));
291 EXPECT_TRUE(AddData(byte_stream, 4, 3300));
292 EXPECT_TRUE(AddData(byte_stream, 5, 3400));
293 EXPECT_CALL(*task_runner.get(), PostDelayedTask(_, _, 0))
294 .WillOnce(DoAll(SaveArg<1>(&intermediate_callback),
295 Return(true)));
296 EXPECT_EQ(2u, byte_stream->num_sink_callbacks());
297 EXPECT_FALSE(AddData(byte_stream, 6, 1));
298 EXPECT_EQ(3u, byte_stream->num_sink_callbacks());
299 ::testing::Mock::VerifyAndClearExpectations(task_runner.get());
300 EXPECT_EQ(null_callback_call_count_start, null_callback_call_count);
301 intermediate_callback.Run();
302 EXPECT_EQ(null_callback_call_count_start+1, null_callback_call_count);
303 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
304 byte_stream->GetData(&output_io_buffer, &output_length));
305 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 3, output_length));
306 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
307 byte_stream->GetData(&output_io_buffer, &output_length));
308 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 4, output_length));
309 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
310 byte_stream->GetData(&output_io_buffer, &output_length));
311 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 5, output_length));
312 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
313 byte_stream->GetData(&output_io_buffer, &output_length));
314 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 6, output_length));
315 EXPECT_EQ(content::ByteStream::STREAM_EMPTY,
316 byte_stream->GetData(&output_io_buffer, &output_length));
317 EXPECT_EQ(3u, byte_stream->num_sink_callbacks());
318 }
319
320 // Confirm that callbacks on the source side are triggered when they should
321 // be.
322 TEST_F(ByteStreamTest, SourceCallback) {
323 scoped_refptr<MockTaskRunner> task_runner(new StrictMock<MockTaskRunner>());
324 int null_callback_call_count_start = 0;
325
326 scoped_refptr<content::ByteStream> byte_stream(new content::ByteStream());
327 byte_stream->SetBufferSize(10000);
328
329 scoped_refptr<net::IOBuffer> output_io_buffer;
330 size_t output_length;
331 base::Closure intermediate_callback;
332
333 // Confirm callback called when any space available.
334 EXPECT_TRUE(AddData(byte_stream, 0, 1));
335 EXPECT_FALSE(AddData(byte_stream, 1, 10000));
336 byte_stream->RegisterSourceCallback(task_runner,
337 base::Bind(NullCallback, 0),
338 0);
339 null_callback_call_count_start = null_callback_call_count;
340 EXPECT_CALL(*task_runner.get(), PostDelayedTask(_, _, 0))
341 .WillOnce(DoAll(SaveArg<1>(&intermediate_callback),
342 Return(true)));
343 EXPECT_EQ(0u, byte_stream->num_source_callbacks());
344 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
345 byte_stream->GetData(&output_io_buffer, &output_length));
346 EXPECT_EQ(1u, byte_stream->num_source_callbacks());
347 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 0, output_length));
348 ::testing::Mock::VerifyAndClearExpectations(task_runner.get());
349 intermediate_callback.Run();
350 EXPECT_EQ(null_callback_call_count_start+1, null_callback_call_count);
351 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
352 byte_stream->GetData(&output_io_buffer, &output_length));
353 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 1, output_length));
354 EXPECT_EQ(content::ByteStream::STREAM_EMPTY,
355 byte_stream->GetData(&output_io_buffer, &output_length));
356
357 // Confirm callback called when 33% space available.
358 EXPECT_TRUE(AddData(byte_stream, 2, 3300));
359 EXPECT_TRUE(AddData(byte_stream, 3, 1));
360 EXPECT_FALSE(AddData(byte_stream, 4, 6700));
361 byte_stream->RegisterSourceCallback(task_runner,
362 base::Bind(NullCallback, 0),
363 33);
364 null_callback_call_count_start = null_callback_call_count;
365 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
366 byte_stream->GetData(&output_io_buffer, &output_length));
367 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 2, output_length));
368 EXPECT_CALL(*task_runner.get(), PostDelayedTask(_, _, 0))
369 .WillOnce(DoAll(SaveArg<1>(&intermediate_callback),
370 Return(true)));
371 EXPECT_EQ(1u, byte_stream->num_source_callbacks());
372 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
373 byte_stream->GetData(&output_io_buffer, &output_length));
374 EXPECT_EQ(2u, byte_stream->num_source_callbacks());
375 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 3, output_length));
376 ::testing::Mock::VerifyAndClearExpectations(task_runner.get());
377 intermediate_callback.Run();
378 EXPECT_EQ(null_callback_call_count_start+1, null_callback_call_count);
379 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
380 byte_stream->GetData(&output_io_buffer, &output_length));
381 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 4, output_length));
382 EXPECT_EQ(content::ByteStream::STREAM_EMPTY,
383 byte_stream->GetData(&output_io_buffer, &output_length));
384
385 // Confirm callback called only when 100% space available.
386 EXPECT_TRUE(AddData(byte_stream, 5, 3300));
387 EXPECT_TRUE(AddData(byte_stream, 6, 6700));
388 EXPECT_FALSE(AddData(byte_stream, 7, 1));
389 byte_stream->RegisterSourceCallback(task_runner,
390 base::Bind(NullCallback, 0),
391 100);
392 null_callback_call_count_start = null_callback_call_count;
393 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
394 byte_stream->GetData(&output_io_buffer, &output_length));
395 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 5, output_length));
396 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
397 byte_stream->GetData(&output_io_buffer, &output_length));
398 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 6, output_length));
399 EXPECT_CALL(*task_runner.get(), PostDelayedTask(_, _, 0))
400 .WillOnce(DoAll(SaveArg<1>(&intermediate_callback),
401 Return(true)));
402 EXPECT_EQ(2u, byte_stream->num_source_callbacks());
403 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
404 byte_stream->GetData(&output_io_buffer, &output_length));
405 EXPECT_EQ(3u, byte_stream->num_source_callbacks());
406 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 7, output_length));
407 ::testing::Mock::VerifyAndClearExpectations(task_runner.get());
408 intermediate_callback.Run();
409 EXPECT_EQ(null_callback_call_count_start+1, null_callback_call_count);
410 EXPECT_EQ(content::ByteStream::STREAM_EMPTY,
411 byte_stream->GetData(&output_io_buffer, &output_length));
412 EXPECT_EQ(3u, byte_stream->num_source_callbacks());
413 }
414
415 // Confirm that changing a sink callback on the same "thread" as the original
416 // callback was targeted to results in the callback being dropped on the
417 // floor.
418 TEST_F(ByteStreamTest, SinkInterrupt) {
419 scoped_refptr<MockTaskRunner> task_runner(new StrictMock<MockTaskRunner>());
420 int null_callback_call_count_start = 0;
421
422 scoped_refptr<content::ByteStream> byte_stream(new content::ByteStream());
423 byte_stream->SetBufferSize(10000);
424
425 base::Closure intermediate_callback;
426
427 // Callback to be called on any data.
428 byte_stream->RegisterSinkCallback(task_runner,
429 base::Bind(NullCallback, 0),
430 0);
431 null_callback_call_count_start = null_callback_call_count;
432 EXPECT_CALL(*task_runner.get(), PostDelayedTask(_, _, 0))
433 .WillOnce(DoAll(SaveArg<1>(&intermediate_callback),
434 Return(true)));
435 EXPECT_TRUE(AddData(byte_stream, 0, 1024));
436 ::testing::Mock::VerifyAndClearExpectations(task_runner.get());
437 EXPECT_EQ(null_callback_call_count_start, null_callback_call_count);
438 byte_stream->RegisterSinkCallback(scoped_refptr<base::TaskRunner>(),
439 base::Closure(), 0);
440 intermediate_callback.Run();
441 EXPECT_EQ(null_callback_call_count_start, null_callback_call_count);
442 }
443
444 // Confirm that changing a source callback on the same "thread" as the original
445 // callback was targeted to results in the callback being dropped on the
446 // floor.
447 TEST_F(ByteStreamTest, SourceInterrupt) {
448 scoped_refptr<MockTaskRunner> task_runner(new StrictMock<MockTaskRunner>());
449 int null_callback_call_count_start = 0;
450
451 scoped_refptr<content::ByteStream> byte_stream(new content::ByteStream());
452 byte_stream->SetBufferSize(10000);
453
454 base::Closure intermediate_callback;
455 scoped_refptr<net::IOBuffer> output_io_buffer;
456 size_t output_length;
457
458 EXPECT_TRUE(AddData(byte_stream, 0, 1));
459 EXPECT_FALSE(AddData(byte_stream, 1, 10000));
460 byte_stream->RegisterSourceCallback(task_runner,
461 base::Bind(NullCallback, 0),
462 0);
463 null_callback_call_count_start = null_callback_call_count;
464 EXPECT_CALL(*task_runner.get(), PostDelayedTask(_, _, 0))
465 .WillOnce(DoAll(SaveArg<1>(&intermediate_callback),
466 Return(true)));
467 EXPECT_EQ(content::ByteStream::STREAM_HAS_DATA,
468 byte_stream->GetData(&output_io_buffer, &output_length));
469 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, 0, output_length));
470 ::testing::Mock::VerifyAndClearExpectations(task_runner.get());
471 byte_stream->RegisterSourceCallback(scoped_refptr<base::TaskRunner>(),
472 base::Closure(), 0);
473 intermediate_callback.Run();
474 EXPECT_EQ(null_callback_call_count_start, null_callback_call_count);
475 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698