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.
5 #include "content/browser/byte_stream.h"
10 #include "base/bind.h"
11 #include "base/callback.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/message_loop/message_loop.h"
14 #include "base/test/test_simple_task_runner.h"
15 #include "net/base/io_buffer.h"
16 #include "testing/gtest/include/gtest/gtest.h"
21 void CountCallbacks(int* counter
) {
27 class ByteStreamTest
: public testing::Test
{
31 // Create a new IO buffer of the given |buffer_size|. Details of the
32 // contents of the created buffer will be kept, and can be validated
33 // by ValidateIOBuffer.
34 scoped_refptr
<net::IOBuffer
> NewIOBuffer(size_t buffer_size
) {
35 scoped_refptr
<net::IOBuffer
> buffer(new net::IOBuffer(buffer_size
));
36 char *bufferp
= buffer
->data();
37 for (size_t i
= 0; i
< buffer_size
; i
++)
38 bufferp
[i
] = (i
+ producing_seed_key_
) % (1 << sizeof(char));
39 pointer_queue_
.push_back(bufferp
);
40 length_queue_
.push_back(buffer_size
);
41 ++producing_seed_key_
;
45 // Create an IOBuffer of the appropriate size and add it to the
46 // ByteStream, returning the result of the ByteStream::Write.
47 // Separate function to avoid duplication of buffer_size in test
49 bool Write(ByteStreamWriter
* byte_stream_input
, size_t buffer_size
) {
50 return byte_stream_input
->Write(NewIOBuffer(buffer_size
), buffer_size
);
53 // Validate that we have the IOBuffer we expect. This routine must be
54 // called on buffers that were allocated from NewIOBuffer, and in the
55 // order that they were allocated. Calls to NewIOBuffer &&
56 // ValidateIOBuffer may be interleaved.
57 bool ValidateIOBuffer(
58 scoped_refptr
<net::IOBuffer
> buffer
, size_t buffer_size
) {
59 char *bufferp
= buffer
->data();
61 char *expected_ptr
= pointer_queue_
.front();
62 size_t expected_length
= length_queue_
.front();
63 pointer_queue_
.pop_front();
64 length_queue_
.pop_front();
65 ++consuming_seed_key_
;
67 EXPECT_EQ(expected_ptr
, bufferp
);
68 if (expected_ptr
!= bufferp
)
71 EXPECT_EQ(expected_length
, buffer_size
);
72 if (expected_length
!= buffer_size
)
75 for (size_t i
= 0; i
< buffer_size
; i
++) {
76 // Already incremented, so subtract one from the key.
77 EXPECT_EQ(static_cast<int>((i
+ consuming_seed_key_
- 1)
78 % (1 << sizeof(char))),
80 if (static_cast<int>((i
+ consuming_seed_key_
- 1) %
81 (1 << sizeof(char))) != bufferp
[i
]) {
89 base::MessageLoop message_loop_
;
92 int producing_seed_key_
;
93 int consuming_seed_key_
;
94 std::deque
<char*> pointer_queue_
;
95 std::deque
<size_t> length_queue_
;
98 ByteStreamTest::ByteStreamTest()
99 : producing_seed_key_(0),
100 consuming_seed_key_(0) { }
102 // Confirm that filling and emptying the stream works properly, and that
103 // we get full triggers when we expect.
104 TEST_F(ByteStreamTest
, ByteStream_PushBack
) {
105 scoped_ptr
<ByteStreamWriter
> byte_stream_input
;
106 scoped_ptr
<ByteStreamReader
> byte_stream_output
;
108 message_loop_
.message_loop_proxy(), message_loop_
.message_loop_proxy(),
109 3 * 1024, &byte_stream_input
, &byte_stream_output
);
111 // Push a series of IO buffers on; test pushback happening and
112 // that it's advisory.
113 EXPECT_TRUE(Write(byte_stream_input
.get(), 1024));
114 EXPECT_TRUE(Write(byte_stream_input
.get(), 1024));
115 EXPECT_TRUE(Write(byte_stream_input
.get(), 1024));
116 EXPECT_FALSE(Write(byte_stream_input
.get(), 1));
117 EXPECT_FALSE(Write(byte_stream_input
.get(), 1024));
119 byte_stream_input
->Close(0);
120 EXPECT_EQ(4 * 1024U + 1U, byte_stream_input
->GetTotalBufferedBytes());
121 message_loop_
.RunUntilIdle();
122 // Data already sent to reader is also counted in.
123 EXPECT_EQ(4 * 1024U + 1U, byte_stream_input
->GetTotalBufferedBytes());
125 // Pull the IO buffers out; do we get the same buffers and do they
126 // have the same contents?
127 scoped_refptr
<net::IOBuffer
> output_io_buffer
;
128 size_t output_length
;
129 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA
,
130 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
131 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer
, output_length
));
133 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA
,
134 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
135 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer
, output_length
));
137 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA
,
138 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
139 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer
, output_length
));
141 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA
,
142 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
143 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer
, output_length
));
145 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA
,
146 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
147 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer
, output_length
));
149 EXPECT_EQ(ByteStreamReader::STREAM_COMPLETE
,
150 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
152 message_loop_
.RunUntilIdle();
153 // Reader now knows that all data is read out.
154 EXPECT_EQ(1024U, byte_stream_input
->GetTotalBufferedBytes());
157 // Confirm that Flush() method makes the writer to send written contents to
159 TEST_F(ByteStreamTest
, ByteStream_Flush
) {
160 scoped_ptr
<ByteStreamWriter
> byte_stream_input
;
161 scoped_ptr
<ByteStreamReader
> byte_stream_output
;
163 message_loop_
.message_loop_proxy(), message_loop_
.message_loop_proxy(),
164 1024, &byte_stream_input
, &byte_stream_output
);
166 EXPECT_TRUE(Write(byte_stream_input
.get(), 1));
167 message_loop_
.RunUntilIdle();
169 scoped_refptr
<net::IOBuffer
> output_io_buffer
;
170 size_t output_length
= 0;
171 // Check that data is not sent to the reader yet.
172 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY
,
173 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
175 byte_stream_input
->Flush();
176 message_loop_
.RunUntilIdle();
178 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA
,
179 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
180 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer
, output_length
));
182 // Check that it's ok to Flush() an empty writer.
183 byte_stream_input
->Flush();
184 message_loop_
.RunUntilIdle();
186 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY
,
187 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
189 byte_stream_input
->Close(0);
190 message_loop_
.RunUntilIdle();
192 EXPECT_EQ(ByteStreamReader::STREAM_COMPLETE
,
193 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
196 // Same as above, only use knowledge of the internals to confirm
197 // that we're getting pushback even when data's split across the two
199 TEST_F(ByteStreamTest
, ByteStream_PushBackSplit
) {
200 scoped_ptr
<ByteStreamWriter
> byte_stream_input
;
201 scoped_ptr
<ByteStreamReader
> byte_stream_output
;
203 message_loop_
.message_loop_proxy(), message_loop_
.message_loop_proxy(),
204 9 * 1024, &byte_stream_input
, &byte_stream_output
);
206 // Push a series of IO buffers on; test pushback happening and
207 // that it's advisory.
208 EXPECT_TRUE(Write(byte_stream_input
.get(), 1024));
209 message_loop_
.RunUntilIdle();
210 EXPECT_TRUE(Write(byte_stream_input
.get(), 1024));
211 message_loop_
.RunUntilIdle();
212 EXPECT_TRUE(Write(byte_stream_input
.get(), 1024));
213 message_loop_
.RunUntilIdle();
214 EXPECT_TRUE(Write(byte_stream_input
.get(), 1024));
215 message_loop_
.RunUntilIdle();
216 EXPECT_FALSE(Write(byte_stream_input
.get(), 6 * 1024));
217 message_loop_
.RunUntilIdle();
219 // Pull the IO buffers out; do we get the same buffers and do they
220 // have the same contents?
221 scoped_refptr
<net::IOBuffer
> output_io_buffer
;
222 size_t output_length
;
223 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA
,
224 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
225 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer
, output_length
));
227 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA
,
228 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
229 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer
, output_length
));
231 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA
,
232 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
233 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer
, output_length
));
235 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA
,
236 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
237 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer
, output_length
));
239 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA
,
240 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
241 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer
, output_length
));
243 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY
,
244 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
247 // Confirm that a Close() notification transmits in-order
248 // with data on the stream.
249 TEST_F(ByteStreamTest
, ByteStream_CompleteTransmits
) {
250 scoped_ptr
<ByteStreamWriter
> byte_stream_input
;
251 scoped_ptr
<ByteStreamReader
> byte_stream_output
;
253 scoped_refptr
<net::IOBuffer
> output_io_buffer
;
254 size_t output_length
;
256 // Empty stream, non-error case.
258 message_loop_
.message_loop_proxy(), message_loop_
.message_loop_proxy(),
259 3 * 1024, &byte_stream_input
, &byte_stream_output
);
260 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY
,
261 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
262 byte_stream_input
->Close(0);
263 message_loop_
.RunUntilIdle();
264 ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE
,
265 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
266 EXPECT_EQ(0, byte_stream_output
->GetStatus());
268 // Non-empty stream, non-error case.
270 message_loop_
.message_loop_proxy(), message_loop_
.message_loop_proxy(),
271 3 * 1024, &byte_stream_input
, &byte_stream_output
);
272 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY
,
273 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
274 EXPECT_TRUE(Write(byte_stream_input
.get(), 1024));
275 byte_stream_input
->Close(0);
276 message_loop_
.RunUntilIdle();
277 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA
,
278 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
279 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer
, output_length
));
280 ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE
,
281 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
282 EXPECT_EQ(0, byte_stream_output
->GetStatus());
284 const int kFakeErrorCode
= 22;
286 // Empty stream, error case.
288 message_loop_
.message_loop_proxy(), message_loop_
.message_loop_proxy(),
289 3 * 1024, &byte_stream_input
, &byte_stream_output
);
290 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY
,
291 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
292 byte_stream_input
->Close(kFakeErrorCode
);
293 message_loop_
.RunUntilIdle();
294 ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE
,
295 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
296 EXPECT_EQ(kFakeErrorCode
, byte_stream_output
->GetStatus());
298 // Non-empty stream, error case.
300 message_loop_
.message_loop_proxy(), message_loop_
.message_loop_proxy(),
301 3 * 1024, &byte_stream_input
, &byte_stream_output
);
302 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY
,
303 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
304 EXPECT_TRUE(Write(byte_stream_input
.get(), 1024));
305 byte_stream_input
->Close(kFakeErrorCode
);
306 message_loop_
.RunUntilIdle();
307 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA
,
308 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
309 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer
, output_length
));
310 ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE
,
311 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
312 EXPECT_EQ(kFakeErrorCode
, byte_stream_output
->GetStatus());
315 // Confirm that callbacks on the sink side are triggered when they should be.
316 TEST_F(ByteStreamTest
, ByteStream_SinkCallback
) {
317 scoped_refptr
<base::TestSimpleTaskRunner
> task_runner(
318 new base::TestSimpleTaskRunner());
320 scoped_ptr
<ByteStreamWriter
> byte_stream_input
;
321 scoped_ptr
<ByteStreamReader
> byte_stream_output
;
323 message_loop_
.message_loop_proxy(), task_runner
,
324 10000, &byte_stream_input
, &byte_stream_output
);
326 scoped_refptr
<net::IOBuffer
> output_io_buffer
;
327 size_t output_length
;
329 // Note that the specifics of when the callbacks are called with regard
330 // to how much data is pushed onto the stream is not (currently) part
331 // of the interface contract. If it becomes part of the contract, the
332 // tests below should get much more precise.
334 // Confirm callback called when you add more than 33% of the buffer.
337 int num_callbacks
= 0;
338 byte_stream_output
->RegisterCallback(
339 base::Bind(CountCallbacks
, &num_callbacks
));
341 EXPECT_TRUE(Write(byte_stream_input
.get(), 4000));
342 message_loop_
.RunUntilIdle();
344 EXPECT_EQ(0, num_callbacks
);
345 task_runner
->RunUntilIdle();
346 EXPECT_EQ(1, num_callbacks
);
348 // Check data and stream state.
349 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA
,
350 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
351 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer
, output_length
));
352 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY
,
353 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
355 // Confirm callback *isn't* called at less than 33% (by lack of
356 // unexpected call on task runner).
357 EXPECT_TRUE(Write(byte_stream_input
.get(), 3000));
358 message_loop_
.RunUntilIdle();
360 // This reflects an implementation artifact that data goes with callbacks,
361 // which should not be considered part of the interface guarantee.
362 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY
,
363 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
366 // Confirm that callbacks on the source side are triggered when they should
368 TEST_F(ByteStreamTest
, ByteStream_SourceCallback
) {
369 scoped_refptr
<base::TestSimpleTaskRunner
> task_runner(
370 new base::TestSimpleTaskRunner());
372 scoped_ptr
<ByteStreamWriter
> byte_stream_input
;
373 scoped_ptr
<ByteStreamReader
> byte_stream_output
;
375 task_runner
, message_loop_
.message_loop_proxy(),
376 10000, &byte_stream_input
, &byte_stream_output
);
378 scoped_refptr
<net::IOBuffer
> output_io_buffer
;
379 size_t output_length
;
381 // Note that the specifics of when the callbacks are called with regard
382 // to how much data is pulled from the stream is not (currently) part
383 // of the interface contract. If it becomes part of the contract, the
384 // tests below should get much more precise.
386 // Confirm callback called when about 33% space available, and not
387 // at other transitions.
390 int num_callbacks
= 0;
391 byte_stream_input
->RegisterCallback(
392 base::Bind(CountCallbacks
, &num_callbacks
));
393 EXPECT_TRUE(Write(byte_stream_input
.get(), 2000));
394 EXPECT_TRUE(Write(byte_stream_input
.get(), 2001));
395 EXPECT_FALSE(Write(byte_stream_input
.get(), 6000));
397 // Allow bytes to transition (needed for message passing implementation),
398 // and get and validate the data.
399 message_loop_
.RunUntilIdle();
400 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA
,
401 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
402 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer
, output_length
));
404 // Grab data, triggering callback. Recorded on dispatch, but doesn't
405 // happen because it's caught by the mock.
406 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA
,
407 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
408 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer
, output_length
));
410 // Confirm that the callback passed to the mock does what we expect.
411 EXPECT_EQ(0, num_callbacks
);
412 task_runner
->RunUntilIdle();
413 EXPECT_EQ(1, num_callbacks
);
415 // Same drill with final buffer.
416 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA
,
417 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
418 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer
, output_length
));
419 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY
,
420 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
421 EXPECT_EQ(1, num_callbacks
);
422 task_runner
->RunUntilIdle();
423 // Should have updated the internal structures but not called the
425 EXPECT_EQ(1, num_callbacks
);
428 // Confirm that racing a change to a sink callback with a post results
429 // in the new callback being called.
430 TEST_F(ByteStreamTest
, ByteStream_SinkInterrupt
) {
431 scoped_refptr
<base::TestSimpleTaskRunner
> task_runner(
432 new base::TestSimpleTaskRunner());
434 scoped_ptr
<ByteStreamWriter
> byte_stream_input
;
435 scoped_ptr
<ByteStreamReader
> byte_stream_output
;
437 message_loop_
.message_loop_proxy(), task_runner
,
438 10000, &byte_stream_input
, &byte_stream_output
);
440 scoped_refptr
<net::IOBuffer
> output_io_buffer
;
441 size_t output_length
;
442 base::Closure intermediate_callback
;
444 // Record initial state.
445 int num_callbacks
= 0;
446 byte_stream_output
->RegisterCallback(
447 base::Bind(CountCallbacks
, &num_callbacks
));
449 // Add data, and pass it across.
450 EXPECT_TRUE(Write(byte_stream_input
.get(), 4000));
451 message_loop_
.RunUntilIdle();
453 // The task runner should have been hit, but the callback count
454 // isn't changed until we actually run the callback.
455 EXPECT_EQ(0, num_callbacks
);
457 // If we change the callback now, the new one should be run
458 // (simulates race with post task).
459 int num_alt_callbacks
= 0;
460 byte_stream_output
->RegisterCallback(
461 base::Bind(CountCallbacks
, &num_alt_callbacks
));
462 task_runner
->RunUntilIdle();
463 EXPECT_EQ(0, num_callbacks
);
464 EXPECT_EQ(1, num_alt_callbacks
);
467 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA
,
468 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
469 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer
, output_length
));
470 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY
,
471 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
475 // Confirm that racing a change to a source callback with a post results
476 // in the new callback being called.
477 TEST_F(ByteStreamTest
, ByteStream_SourceInterrupt
) {
478 scoped_refptr
<base::TestSimpleTaskRunner
> task_runner(
479 new base::TestSimpleTaskRunner());
481 scoped_ptr
<ByteStreamWriter
> byte_stream_input
;
482 scoped_ptr
<ByteStreamReader
> byte_stream_output
;
484 task_runner
, message_loop_
.message_loop_proxy(),
485 10000, &byte_stream_input
, &byte_stream_output
);
487 scoped_refptr
<net::IOBuffer
> output_io_buffer
;
488 size_t output_length
;
489 base::Closure intermediate_callback
;
491 // Setup state for test.
492 int num_callbacks
= 0;
493 byte_stream_input
->RegisterCallback(
494 base::Bind(CountCallbacks
, &num_callbacks
));
495 EXPECT_TRUE(Write(byte_stream_input
.get(), 2000));
496 EXPECT_TRUE(Write(byte_stream_input
.get(), 2001));
497 EXPECT_FALSE(Write(byte_stream_input
.get(), 6000));
498 message_loop_
.RunUntilIdle();
500 // Initial get should not trigger callback.
501 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA
,
502 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
503 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer
, output_length
));
504 message_loop_
.RunUntilIdle();
506 // Second get *should* trigger callback.
507 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA
,
508 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
509 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer
, output_length
));
511 // Which should do the right thing when it's run.
512 int num_alt_callbacks
= 0;
513 byte_stream_input
->RegisterCallback(
514 base::Bind(CountCallbacks
, &num_alt_callbacks
));
515 task_runner
->RunUntilIdle();
516 EXPECT_EQ(0, num_callbacks
);
517 EXPECT_EQ(1, num_alt_callbacks
);
519 // Third get should also trigger callback.
520 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA
,
521 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
522 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer
, output_length
));
523 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY
,
524 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
527 // Confirm that callback is called on zero data transfer but source
529 TEST_F(ByteStreamTest
, ByteStream_ZeroCallback
) {
530 scoped_refptr
<base::TestSimpleTaskRunner
> task_runner(
531 new base::TestSimpleTaskRunner());
533 scoped_ptr
<ByteStreamWriter
> byte_stream_input
;
534 scoped_ptr
<ByteStreamReader
> byte_stream_output
;
536 message_loop_
.message_loop_proxy(), task_runner
,
537 10000, &byte_stream_input
, &byte_stream_output
);
539 base::Closure intermediate_callback
;
541 // Record initial state.
542 int num_callbacks
= 0;
543 byte_stream_output
->RegisterCallback(
544 base::Bind(CountCallbacks
, &num_callbacks
));
546 // Immediately close the stream.
547 byte_stream_input
->Close(0);
548 task_runner
->RunUntilIdle();
549 EXPECT_EQ(1, num_callbacks
);
552 TEST_F(ByteStreamTest
, ByteStream_CloseWithoutAnyWrite
) {
553 scoped_ptr
<ByteStreamWriter
> byte_stream_input
;
554 scoped_ptr
<ByteStreamReader
> byte_stream_output
;
556 message_loop_
.message_loop_proxy(), message_loop_
.message_loop_proxy(),
557 3 * 1024, &byte_stream_input
, &byte_stream_output
);
559 byte_stream_input
->Close(0);
560 message_loop_
.RunUntilIdle();
562 scoped_refptr
<net::IOBuffer
> output_io_buffer
;
563 size_t output_length
;
564 EXPECT_EQ(ByteStreamReader::STREAM_COMPLETE
,
565 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
568 TEST_F(ByteStreamTest
, ByteStream_FlushWithoutAnyWrite
) {
569 scoped_ptr
<ByteStreamWriter
> byte_stream_input
;
570 scoped_ptr
<ByteStreamReader
> byte_stream_output
;
572 message_loop_
.message_loop_proxy(), message_loop_
.message_loop_proxy(),
573 3 * 1024, &byte_stream_input
, &byte_stream_output
);
575 byte_stream_input
->Flush();
576 message_loop_
.RunUntilIdle();
578 scoped_refptr
<net::IOBuffer
> output_io_buffer
;
579 size_t output_length
;
580 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY
,
581 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
583 byte_stream_input
->Close(0);
584 message_loop_
.RunUntilIdle();
586 EXPECT_EQ(ByteStreamReader::STREAM_COMPLETE
,
587 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
590 TEST_F(ByteStreamTest
, ByteStream_WriteOverflow
) {
591 scoped_ptr
<ByteStreamWriter
> byte_stream_input
;
592 scoped_ptr
<ByteStreamReader
> byte_stream_output
;
594 message_loop_
.message_loop_proxy(), message_loop_
.message_loop_proxy(),
595 std::numeric_limits
<size_t>::max(),
596 &byte_stream_input
, &byte_stream_output
);
598 EXPECT_TRUE(Write(byte_stream_input
.get(), 1));
599 // 1 + size_t max -> Overflow.
600 scoped_refptr
<net::IOBuffer
> empty_io_buffer
;
601 EXPECT_FALSE(byte_stream_input
->Write(empty_io_buffer
,
602 std::numeric_limits
<size_t>::max()));
603 message_loop_
.RunUntilIdle();
605 // The first write is below PostToPeer threshold. We shouldn't get anything
607 scoped_refptr
<net::IOBuffer
> output_io_buffer
;
608 size_t output_length
;
609 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY
,
610 byte_stream_output
->Read(&output_io_buffer
, &output_length
));
613 } // namespace content