- add sources.
[platform/framework/web/crosswalk.git] / src / content / browser / byte_stream_unittest.cc
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 "content/browser/byte_stream.h"
6
7 #include <deque>
8 #include <limits>
9
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"
17
18 namespace content {
19 namespace {
20
21 void CountCallbacks(int* counter) {
22   ++*counter;
23 }
24
25 }  // namespace
26
27 class ByteStreamTest : public testing::Test {
28  public:
29   ByteStreamTest();
30
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_;
42     return buffer;
43   }
44
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
48   // calls.
49   bool Write(ByteStreamWriter* byte_stream_input, size_t buffer_size) {
50     return byte_stream_input->Write(NewIOBuffer(buffer_size), buffer_size);
51   }
52
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();
60
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_;
66
67     EXPECT_EQ(expected_ptr, bufferp);
68     if (expected_ptr != bufferp)
69       return false;
70
71     EXPECT_EQ(expected_length, buffer_size);
72     if (expected_length != buffer_size)
73       return false;
74
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))),
79                 bufferp[i]);
80       if (static_cast<int>((i + consuming_seed_key_ - 1) %
81                            (1 << sizeof(char))) != bufferp[i]) {
82         return false;
83       }
84     }
85     return true;
86   }
87
88  protected:
89   base::MessageLoop message_loop_;
90
91  private:
92   int producing_seed_key_;
93   int consuming_seed_key_;
94   std::deque<char*> pointer_queue_;
95   std::deque<size_t> length_queue_;
96 };
97
98 ByteStreamTest::ByteStreamTest()
99     : producing_seed_key_(0),
100       consuming_seed_key_(0) { }
101
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;
107   CreateByteStream(
108       message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(),
109       3 * 1024, &byte_stream_input, &byte_stream_output);
110
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));
118   // Flush
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());
124
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));
132
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));
136
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));
140
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));
144
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));
148
149   EXPECT_EQ(ByteStreamReader::STREAM_COMPLETE,
150             byte_stream_output->Read(&output_io_buffer, &output_length));
151
152   message_loop_.RunUntilIdle();
153   // Reader now knows that all data is read out.
154   EXPECT_EQ(1024U, byte_stream_input->GetTotalBufferedBytes());
155 }
156
157 // Confirm that Flush() method makes the writer to send written contents to
158 // the reader.
159 TEST_F(ByteStreamTest, ByteStream_Flush) {
160   scoped_ptr<ByteStreamWriter> byte_stream_input;
161   scoped_ptr<ByteStreamReader> byte_stream_output;
162   CreateByteStream(
163       message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(),
164       1024, &byte_stream_input, &byte_stream_output);
165
166   EXPECT_TRUE(Write(byte_stream_input.get(), 1));
167   message_loop_.RunUntilIdle();
168
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));
174
175   byte_stream_input->Flush();
176   message_loop_.RunUntilIdle();
177
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));
181
182   // Check that it's ok to Flush() an empty writer.
183   byte_stream_input->Flush();
184   message_loop_.RunUntilIdle();
185
186   EXPECT_EQ(ByteStreamReader::STREAM_EMPTY,
187             byte_stream_output->Read(&output_io_buffer, &output_length));
188
189   byte_stream_input->Close(0);
190   message_loop_.RunUntilIdle();
191
192   EXPECT_EQ(ByteStreamReader::STREAM_COMPLETE,
193             byte_stream_output->Read(&output_io_buffer, &output_length));
194 }
195
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
198 // objects
199 TEST_F(ByteStreamTest, ByteStream_PushBackSplit) {
200   scoped_ptr<ByteStreamWriter> byte_stream_input;
201   scoped_ptr<ByteStreamReader> byte_stream_output;
202   CreateByteStream(
203       message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(),
204       9 * 1024, &byte_stream_input, &byte_stream_output);
205
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();
218
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));
226
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));
230
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));
234
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));
238
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));
242
243   EXPECT_EQ(ByteStreamReader::STREAM_EMPTY,
244             byte_stream_output->Read(&output_io_buffer, &output_length));
245 }
246
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;
252
253   scoped_refptr<net::IOBuffer> output_io_buffer;
254   size_t output_length;
255
256   // Empty stream, non-error case.
257   CreateByteStream(
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());
267
268   // Non-empty stream, non-error case.
269   CreateByteStream(
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());
283
284   const int kFakeErrorCode = 22;
285
286   // Empty stream, error case.
287   CreateByteStream(
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());
297
298   // Non-empty stream, error case.
299   CreateByteStream(
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());
313 }
314
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());
319
320   scoped_ptr<ByteStreamWriter> byte_stream_input;
321   scoped_ptr<ByteStreamReader> byte_stream_output;
322   CreateByteStream(
323       message_loop_.message_loop_proxy(), task_runner,
324       10000, &byte_stream_input, &byte_stream_output);
325
326   scoped_refptr<net::IOBuffer> output_io_buffer;
327   size_t output_length;
328
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.
333
334   // Confirm callback called when you add more than 33% of the buffer.
335
336   // Setup callback
337   int num_callbacks = 0;
338   byte_stream_output->RegisterCallback(
339       base::Bind(CountCallbacks, &num_callbacks));
340
341   EXPECT_TRUE(Write(byte_stream_input.get(), 4000));
342   message_loop_.RunUntilIdle();
343
344   EXPECT_EQ(0, num_callbacks);
345   task_runner->RunUntilIdle();
346   EXPECT_EQ(1, num_callbacks);
347
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));
354
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();
359
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));
364 }
365
366 // Confirm that callbacks on the source side are triggered when they should
367 // be.
368 TEST_F(ByteStreamTest, ByteStream_SourceCallback) {
369   scoped_refptr<base::TestSimpleTaskRunner> task_runner(
370       new base::TestSimpleTaskRunner());
371
372   scoped_ptr<ByteStreamWriter> byte_stream_input;
373   scoped_ptr<ByteStreamReader> byte_stream_output;
374   CreateByteStream(
375       task_runner, message_loop_.message_loop_proxy(),
376       10000, &byte_stream_input, &byte_stream_output);
377
378   scoped_refptr<net::IOBuffer> output_io_buffer;
379   size_t output_length;
380
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.
385
386   // Confirm callback called when about 33% space available, and not
387   // at other transitions.
388
389   // Add data.
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));
396
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));
403
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));
409
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);
414
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
424   // callback.
425   EXPECT_EQ(1, num_callbacks);
426 }
427
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());
433
434   scoped_ptr<ByteStreamWriter> byte_stream_input;
435   scoped_ptr<ByteStreamReader> byte_stream_output;
436   CreateByteStream(
437       message_loop_.message_loop_proxy(), task_runner,
438       10000, &byte_stream_input, &byte_stream_output);
439
440   scoped_refptr<net::IOBuffer> output_io_buffer;
441   size_t output_length;
442   base::Closure intermediate_callback;
443
444   // Record initial state.
445   int num_callbacks = 0;
446   byte_stream_output->RegisterCallback(
447       base::Bind(CountCallbacks, &num_callbacks));
448
449   // Add data, and pass it across.
450   EXPECT_TRUE(Write(byte_stream_input.get(), 4000));
451   message_loop_.RunUntilIdle();
452
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);
456
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);
465
466   // Final cleanup.
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));
472
473 }
474
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());
480
481   scoped_ptr<ByteStreamWriter> byte_stream_input;
482   scoped_ptr<ByteStreamReader> byte_stream_output;
483   CreateByteStream(
484       task_runner, message_loop_.message_loop_proxy(),
485       10000, &byte_stream_input, &byte_stream_output);
486
487   scoped_refptr<net::IOBuffer> output_io_buffer;
488   size_t output_length;
489   base::Closure intermediate_callback;
490
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();
499
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();
505
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));
510
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);
518
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));
525 }
526
527 // Confirm that callback is called on zero data transfer but source
528 // complete.
529 TEST_F(ByteStreamTest, ByteStream_ZeroCallback) {
530   scoped_refptr<base::TestSimpleTaskRunner> task_runner(
531       new base::TestSimpleTaskRunner());
532
533   scoped_ptr<ByteStreamWriter> byte_stream_input;
534   scoped_ptr<ByteStreamReader> byte_stream_output;
535   CreateByteStream(
536       message_loop_.message_loop_proxy(), task_runner,
537       10000, &byte_stream_input, &byte_stream_output);
538
539   base::Closure intermediate_callback;
540
541   // Record initial state.
542   int num_callbacks = 0;
543   byte_stream_output->RegisterCallback(
544       base::Bind(CountCallbacks, &num_callbacks));
545
546   // Immediately close the stream.
547   byte_stream_input->Close(0);
548   task_runner->RunUntilIdle();
549   EXPECT_EQ(1, num_callbacks);
550 }
551
552 TEST_F(ByteStreamTest, ByteStream_CloseWithoutAnyWrite) {
553   scoped_ptr<ByteStreamWriter> byte_stream_input;
554   scoped_ptr<ByteStreamReader> byte_stream_output;
555   CreateByteStream(
556       message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(),
557       3 * 1024, &byte_stream_input, &byte_stream_output);
558
559   byte_stream_input->Close(0);
560   message_loop_.RunUntilIdle();
561
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));
566 }
567
568 TEST_F(ByteStreamTest, ByteStream_FlushWithoutAnyWrite) {
569   scoped_ptr<ByteStreamWriter> byte_stream_input;
570   scoped_ptr<ByteStreamReader> byte_stream_output;
571   CreateByteStream(
572       message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(),
573       3 * 1024, &byte_stream_input, &byte_stream_output);
574
575   byte_stream_input->Flush();
576   message_loop_.RunUntilIdle();
577
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));
582
583   byte_stream_input->Close(0);
584   message_loop_.RunUntilIdle();
585
586   EXPECT_EQ(ByteStreamReader::STREAM_COMPLETE,
587             byte_stream_output->Read(&output_io_buffer, &output_length));
588 }
589
590 TEST_F(ByteStreamTest, ByteStream_WriteOverflow) {
591   scoped_ptr<ByteStreamWriter> byte_stream_input;
592   scoped_ptr<ByteStreamReader> byte_stream_output;
593   CreateByteStream(
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);
597
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();
604
605   // The first write is below PostToPeer threshold. We shouldn't get anything
606   // from the output.
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));
611 }
612
613 }  // namespace content