| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 "content/browser/byte_stream.h" | 5 #include "content/browser/byte_stream.h" |
| 6 | 6 |
| 7 #include <deque> | 7 #include <deque> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 pointer_queue_.push_back(bufferp); | 38 pointer_queue_.push_back(bufferp); |
| 39 length_queue_.push_back(buffer_size); | 39 length_queue_.push_back(buffer_size); |
| 40 ++producing_seed_key_; | 40 ++producing_seed_key_; |
| 41 return buffer; | 41 return buffer; |
| 42 } | 42 } |
| 43 | 43 |
| 44 // Create an IOBuffer of the appropriate size and add it to the | 44 // Create an IOBuffer of the appropriate size and add it to the |
| 45 // ByteStream, returning the result of the ByteStream::Write. | 45 // ByteStream, returning the result of the ByteStream::Write. |
| 46 // Separate function to avoid duplication of buffer_size in test | 46 // Separate function to avoid duplication of buffer_size in test |
| 47 // calls. | 47 // calls. |
| 48 bool Write(ByteStreamWriter* byte_stream_input, size_t buffer_size) { | 48 bool Write(ByteStreamWriter<int>* byte_stream_input, size_t buffer_size) { |
| 49 return byte_stream_input->Write(NewIOBuffer(buffer_size), buffer_size); | 49 return byte_stream_input->Write(NewIOBuffer(buffer_size), buffer_size); |
| 50 } | 50 } |
| 51 | 51 |
| 52 // Validate that we have the IOBuffer we expect. This routine must be | 52 // Validate that we have the IOBuffer we expect. This routine must be |
| 53 // called on buffers that were allocated from NewIOBuffer, and in the | 53 // called on buffers that were allocated from NewIOBuffer, and in the |
| 54 // order that they were allocated. Calls to NewIOBuffer && | 54 // order that they were allocated. Calls to NewIOBuffer && |
| 55 // ValidateIOBuffer may be interleaved. | 55 // ValidateIOBuffer may be interleaved. |
| 56 bool ValidateIOBuffer( | 56 bool ValidateIOBuffer( |
| 57 scoped_refptr<net::IOBuffer> buffer, size_t buffer_size) { | 57 scoped_refptr<net::IOBuffer> buffer, size_t buffer_size) { |
| 58 char *bufferp = buffer->data(); | 58 char *bufferp = buffer->data(); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 std::deque<size_t> length_queue_; | 94 std::deque<size_t> length_queue_; |
| 95 }; | 95 }; |
| 96 | 96 |
| 97 ByteStreamTest::ByteStreamTest() | 97 ByteStreamTest::ByteStreamTest() |
| 98 : producing_seed_key_(0), | 98 : producing_seed_key_(0), |
| 99 consuming_seed_key_(0) { } | 99 consuming_seed_key_(0) { } |
| 100 | 100 |
| 101 // Confirm that filling and emptying the stream works properly, and that | 101 // Confirm that filling and emptying the stream works properly, and that |
| 102 // we get full triggers when we expect. | 102 // we get full triggers when we expect. |
| 103 TEST_F(ByteStreamTest, ByteStream_PushBack) { | 103 TEST_F(ByteStreamTest, ByteStream_PushBack) { |
| 104 scoped_ptr<ByteStreamWriter> byte_stream_input; | 104 scoped_ptr<ByteStreamWriter<int> > byte_stream_input; |
| 105 scoped_ptr<ByteStreamReader> byte_stream_output; | 105 scoped_ptr<ByteStreamReader<int> > byte_stream_output; |
| 106 CreateByteStream( | 106 CreateByteStream<int>( |
| 107 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), | 107 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), |
| 108 3 * 1024, &byte_stream_input, &byte_stream_output); | 108 3 * 1024, &byte_stream_input, &byte_stream_output); |
| 109 | 109 |
| 110 // Push a series of IO buffers on; test pushback happening and | 110 // Push a series of IO buffers on; test pushback happening and |
| 111 // that it's advisory. | 111 // that it's advisory. |
| 112 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); | 112 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); |
| 113 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); | 113 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); |
| 114 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); | 114 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); |
| 115 EXPECT_FALSE(Write(byte_stream_input.get(), 1)); | 115 EXPECT_FALSE(Write(byte_stream_input.get(), 1)); |
| 116 EXPECT_FALSE(Write(byte_stream_input.get(), 1024)); | 116 EXPECT_FALSE(Write(byte_stream_input.get(), 1024)); |
| 117 // Flush | 117 // Flush |
| 118 byte_stream_input->Close(DOWNLOAD_INTERRUPT_REASON_NONE); | 118 byte_stream_input->Close(0); |
| 119 message_loop_.RunUntilIdle(); | 119 message_loop_.RunUntilIdle(); |
| 120 | 120 |
| 121 // Pull the IO buffers out; do we get the same buffers and do they | 121 // Pull the IO buffers out; do we get the same buffers and do they |
| 122 // have the same contents? | 122 // have the same contents? |
| 123 scoped_refptr<net::IOBuffer> output_io_buffer; | 123 scoped_refptr<net::IOBuffer> output_io_buffer; |
| 124 size_t output_length; | 124 size_t output_length; |
| 125 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, | 125 EXPECT_EQ(ByteStreamReader<int>::STREAM_HAS_DATA, |
| 126 byte_stream_output->Read(&output_io_buffer, &output_length)); | 126 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 127 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); | 127 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); |
| 128 | 128 |
| 129 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, | 129 EXPECT_EQ(ByteStreamReader<int>::STREAM_HAS_DATA, |
| 130 byte_stream_output->Read(&output_io_buffer, &output_length)); | 130 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 131 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); | 131 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); |
| 132 | 132 |
| 133 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, | 133 EXPECT_EQ(ByteStreamReader<int>::STREAM_HAS_DATA, |
| 134 byte_stream_output->Read(&output_io_buffer, &output_length)); | 134 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 135 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); | 135 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); |
| 136 | 136 |
| 137 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, | 137 EXPECT_EQ(ByteStreamReader<int>::STREAM_HAS_DATA, |
| 138 byte_stream_output->Read(&output_io_buffer, &output_length)); | 138 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 139 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); | 139 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); |
| 140 | 140 |
| 141 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, | 141 EXPECT_EQ(ByteStreamReader<int>::STREAM_HAS_DATA, |
| 142 byte_stream_output->Read(&output_io_buffer, &output_length)); | 142 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 143 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); | 143 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); |
| 144 | 144 |
| 145 EXPECT_EQ(ByteStreamReader::STREAM_COMPLETE, | 145 EXPECT_EQ(ByteStreamReader<int>::STREAM_COMPLETE, |
| 146 byte_stream_output->Read(&output_io_buffer, &output_length)); | 146 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 147 } | 147 } |
| 148 | 148 |
| 149 // Same as above, only use knowledge of the internals to confirm | 149 // Same as above, only use knowledge of the internals to confirm |
| 150 // that we're getting pushback even when data's split across the two | 150 // that we're getting pushback even when data's split across the two |
| 151 // objects | 151 // objects |
| 152 TEST_F(ByteStreamTest, ByteStream_PushBackSplit) { | 152 TEST_F(ByteStreamTest, ByteStream_PushBackSplit) { |
| 153 scoped_ptr<ByteStreamWriter> byte_stream_input; | 153 scoped_ptr<ByteStreamWriter<int> > byte_stream_input; |
| 154 scoped_ptr<ByteStreamReader> byte_stream_output; | 154 scoped_ptr<ByteStreamReader<int> > byte_stream_output; |
| 155 CreateByteStream( | 155 CreateByteStream<int>( |
| 156 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), | 156 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), |
| 157 9 * 1024, &byte_stream_input, &byte_stream_output); | 157 9 * 1024, &byte_stream_input, &byte_stream_output); |
| 158 | 158 |
| 159 // Push a series of IO buffers on; test pushback happening and | 159 // Push a series of IO buffers on; test pushback happening and |
| 160 // that it's advisory. | 160 // that it's advisory. |
| 161 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); | 161 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); |
| 162 message_loop_.RunUntilIdle(); | 162 message_loop_.RunUntilIdle(); |
| 163 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); | 163 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); |
| 164 message_loop_.RunUntilIdle(); | 164 message_loop_.RunUntilIdle(); |
| 165 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); | 165 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); |
| 166 message_loop_.RunUntilIdle(); | 166 message_loop_.RunUntilIdle(); |
| 167 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); | 167 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); |
| 168 message_loop_.RunUntilIdle(); | 168 message_loop_.RunUntilIdle(); |
| 169 EXPECT_FALSE(Write(byte_stream_input.get(), 6 * 1024)); | 169 EXPECT_FALSE(Write(byte_stream_input.get(), 6 * 1024)); |
| 170 message_loop_.RunUntilIdle(); | 170 message_loop_.RunUntilIdle(); |
| 171 | 171 |
| 172 // Pull the IO buffers out; do we get the same buffers and do they | 172 // Pull the IO buffers out; do we get the same buffers and do they |
| 173 // have the same contents? | 173 // have the same contents? |
| 174 scoped_refptr<net::IOBuffer> output_io_buffer; | 174 scoped_refptr<net::IOBuffer> output_io_buffer; |
| 175 size_t output_length; | 175 size_t output_length; |
| 176 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, | 176 EXPECT_EQ(ByteStreamReader<int>::STREAM_HAS_DATA, |
| 177 byte_stream_output->Read(&output_io_buffer, &output_length)); | 177 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 178 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); | 178 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); |
| 179 | 179 |
| 180 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, | 180 EXPECT_EQ(ByteStreamReader<int>::STREAM_HAS_DATA, |
| 181 byte_stream_output->Read(&output_io_buffer, &output_length)); | 181 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 182 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); | 182 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); |
| 183 | 183 |
| 184 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, | 184 EXPECT_EQ(ByteStreamReader<int>::STREAM_HAS_DATA, |
| 185 byte_stream_output->Read(&output_io_buffer, &output_length)); | 185 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 186 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); | 186 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); |
| 187 | 187 |
| 188 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, | 188 EXPECT_EQ(ByteStreamReader<int>::STREAM_HAS_DATA, |
| 189 byte_stream_output->Read(&output_io_buffer, &output_length)); | 189 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 190 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); | 190 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); |
| 191 | 191 |
| 192 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, | 192 EXPECT_EQ(ByteStreamReader<int>::STREAM_HAS_DATA, |
| 193 byte_stream_output->Read(&output_io_buffer, &output_length)); | 193 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 194 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); | 194 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); |
| 195 | 195 |
| 196 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, | 196 EXPECT_EQ(ByteStreamReader<int>::STREAM_EMPTY, |
| 197 byte_stream_output->Read(&output_io_buffer, &output_length)); | 197 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 198 } | 198 } |
| 199 | 199 |
| 200 // Confirm that a Close() notification transmits in-order | 200 // Confirm that a Close() notification transmits in-order |
| 201 // with data on the stream. | 201 // with data on the stream. |
| 202 TEST_F(ByteStreamTest, ByteStream_CompleteTransmits) { | 202 TEST_F(ByteStreamTest, ByteStream_CompleteTransmits) { |
| 203 scoped_ptr<ByteStreamWriter> byte_stream_input; | 203 scoped_ptr<ByteStreamWriter<int> > byte_stream_input; |
| 204 scoped_ptr<ByteStreamReader> byte_stream_output; | 204 scoped_ptr<ByteStreamReader<int> > byte_stream_output; |
| 205 | 205 |
| 206 scoped_refptr<net::IOBuffer> output_io_buffer; | 206 scoped_refptr<net::IOBuffer> output_io_buffer; |
| 207 size_t output_length; | 207 size_t output_length; |
| 208 | 208 |
| 209 // Empty stream, non-error case. | 209 // Empty stream, non-error case. |
| 210 CreateByteStream( | 210 CreateByteStream<int>( |
| 211 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), | 211 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), |
| 212 3 * 1024, &byte_stream_input, &byte_stream_output); | 212 3 * 1024, &byte_stream_input, &byte_stream_output); |
| 213 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, | 213 EXPECT_EQ(ByteStreamReader<int>::STREAM_EMPTY, |
| 214 byte_stream_output->Read(&output_io_buffer, &output_length)); | 214 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 215 byte_stream_input->Close(DOWNLOAD_INTERRUPT_REASON_NONE); | 215 byte_stream_input->Close(0); |
| 216 message_loop_.RunUntilIdle(); | 216 message_loop_.RunUntilIdle(); |
| 217 ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE, | 217 ASSERT_EQ(ByteStreamReader<int>::STREAM_COMPLETE, |
| 218 byte_stream_output->Read(&output_io_buffer, &output_length)); | 218 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 219 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, | 219 EXPECT_EQ(0, byte_stream_output->GetStatus()); |
| 220 byte_stream_output->GetStatus()); | |
| 221 | 220 |
| 222 // Non-empty stream, non-error case. | 221 // Non-empty stream, non-error case. |
| 223 CreateByteStream( | 222 CreateByteStream<int>( |
| 224 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), | 223 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), |
| 225 3 * 1024, &byte_stream_input, &byte_stream_output); | 224 3 * 1024, &byte_stream_input, &byte_stream_output); |
| 226 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, | 225 EXPECT_EQ(ByteStreamReader<int>::STREAM_EMPTY, |
| 227 byte_stream_output->Read(&output_io_buffer, &output_length)); | 226 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 228 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); | 227 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); |
| 229 byte_stream_input->Close(DOWNLOAD_INTERRUPT_REASON_NONE); | 228 byte_stream_input->Close(0); |
| 230 message_loop_.RunUntilIdle(); | 229 message_loop_.RunUntilIdle(); |
| 231 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, | 230 EXPECT_EQ(ByteStreamReader<int>::STREAM_HAS_DATA, |
| 232 byte_stream_output->Read(&output_io_buffer, &output_length)); | 231 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 233 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); | 232 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); |
| 234 ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE, | 233 ASSERT_EQ(ByteStreamReader<int>::STREAM_COMPLETE, |
| 235 byte_stream_output->Read(&output_io_buffer, &output_length)); | 234 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 236 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, | 235 EXPECT_EQ(0, byte_stream_output->GetStatus()); |
| 237 byte_stream_output->GetStatus()); | |
| 238 | 236 |
| 239 // Empty stream, non-error case. | 237 const int kFakeErrorCode = 22; |
| 240 CreateByteStream( | 238 |
| 239 // Empty stream, error case. |
| 240 CreateByteStream<int>( |
| 241 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), | 241 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), |
| 242 3 * 1024, &byte_stream_input, &byte_stream_output); | 242 3 * 1024, &byte_stream_input, &byte_stream_output); |
| 243 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, | 243 EXPECT_EQ(ByteStreamReader<int>::STREAM_EMPTY, |
| 244 byte_stream_output->Read(&output_io_buffer, &output_length)); | 244 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 245 byte_stream_input->Close(DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED); | 245 byte_stream_input->Close(kFakeErrorCode); |
| 246 message_loop_.RunUntilIdle(); | 246 message_loop_.RunUntilIdle(); |
| 247 ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE, | 247 ASSERT_EQ(ByteStreamReader<int>::STREAM_COMPLETE, |
| 248 byte_stream_output->Read(&output_io_buffer, &output_length)); | 248 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 249 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED, | 249 EXPECT_EQ(kFakeErrorCode, byte_stream_output->GetStatus()); |
| 250 byte_stream_output->GetStatus()); | |
| 251 | 250 |
| 252 // Non-empty stream, non-error case. | 251 // Non-empty stream, error case. |
| 253 CreateByteStream( | 252 CreateByteStream<int>( |
| 254 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), | 253 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), |
| 255 3 * 1024, &byte_stream_input, &byte_stream_output); | 254 3 * 1024, &byte_stream_input, &byte_stream_output); |
| 256 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, | 255 EXPECT_EQ(ByteStreamReader<int>::STREAM_EMPTY, |
| 257 byte_stream_output->Read(&output_io_buffer, &output_length)); | 256 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 258 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); | 257 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); |
| 259 byte_stream_input->Close(DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED); | 258 byte_stream_input->Close(kFakeErrorCode); |
| 260 message_loop_.RunUntilIdle(); | 259 message_loop_.RunUntilIdle(); |
| 261 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, | 260 EXPECT_EQ(ByteStreamReader<int>::STREAM_HAS_DATA, |
| 262 byte_stream_output->Read(&output_io_buffer, &output_length)); | 261 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 263 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); | 262 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); |
| 264 ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE, | 263 ASSERT_EQ(ByteStreamReader<int>::STREAM_COMPLETE, |
| 265 byte_stream_output->Read(&output_io_buffer, &output_length)); | 264 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 266 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED, | 265 EXPECT_EQ(kFakeErrorCode, byte_stream_output->GetStatus()); |
| 267 byte_stream_output->GetStatus()); | |
| 268 } | 266 } |
| 269 | 267 |
| 270 // Confirm that callbacks on the sink side are triggered when they should be. | 268 // Confirm that callbacks on the sink side are triggered when they should be. |
| 271 TEST_F(ByteStreamTest, ByteStream_SinkCallback) { | 269 TEST_F(ByteStreamTest, ByteStream_SinkCallback) { |
| 272 scoped_refptr<base::TestSimpleTaskRunner> task_runner( | 270 scoped_refptr<base::TestSimpleTaskRunner> task_runner( |
| 273 new base::TestSimpleTaskRunner()); | 271 new base::TestSimpleTaskRunner()); |
| 274 | 272 |
| 275 scoped_ptr<ByteStreamWriter> byte_stream_input; | 273 scoped_ptr<ByteStreamWriter<int> > byte_stream_input; |
| 276 scoped_ptr<ByteStreamReader> byte_stream_output; | 274 scoped_ptr<ByteStreamReader<int> > byte_stream_output; |
| 277 CreateByteStream( | 275 CreateByteStream<int>( |
| 278 message_loop_.message_loop_proxy(), task_runner, | 276 message_loop_.message_loop_proxy(), task_runner, |
| 279 10000, &byte_stream_input, &byte_stream_output); | 277 10000, &byte_stream_input, &byte_stream_output); |
| 280 | 278 |
| 281 scoped_refptr<net::IOBuffer> output_io_buffer; | 279 scoped_refptr<net::IOBuffer> output_io_buffer; |
| 282 size_t output_length; | 280 size_t output_length; |
| 283 | 281 |
| 284 // Note that the specifics of when the callbacks are called with regard | 282 // Note that the specifics of when the callbacks are called with regard |
| 285 // to how much data is pushed onto the stream is not (currently) part | 283 // to how much data is pushed onto the stream is not (currently) part |
| 286 // of the interface contract. If it becomes part of the contract, the | 284 // of the interface contract. If it becomes part of the contract, the |
| 287 // tests below should get much more precise. | 285 // tests below should get much more precise. |
| 288 | 286 |
| 289 // Confirm callback called when you add more than 33% of the buffer. | 287 // Confirm callback called when you add more than 33% of the buffer. |
| 290 | 288 |
| 291 // Setup callback | 289 // Setup callback |
| 292 int num_callbacks = 0; | 290 int num_callbacks = 0; |
| 293 byte_stream_output->RegisterCallback( | 291 byte_stream_output->RegisterCallback( |
| 294 base::Bind(CountCallbacks, &num_callbacks)); | 292 base::Bind(CountCallbacks, &num_callbacks)); |
| 295 | 293 |
| 296 EXPECT_TRUE(Write(byte_stream_input.get(), 4000)); | 294 EXPECT_TRUE(Write(byte_stream_input.get(), 4000)); |
| 297 message_loop_.RunUntilIdle(); | 295 message_loop_.RunUntilIdle(); |
| 298 | 296 |
| 299 EXPECT_EQ(0, num_callbacks); | 297 EXPECT_EQ(0, num_callbacks); |
| 300 task_runner->RunUntilIdle(); | 298 task_runner->RunUntilIdle(); |
| 301 EXPECT_EQ(1, num_callbacks); | 299 EXPECT_EQ(1, num_callbacks); |
| 302 | 300 |
| 303 // Check data and stream state. | 301 // Check data and stream state. |
| 304 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, | 302 EXPECT_EQ(ByteStreamReader<int>::STREAM_HAS_DATA, |
| 305 byte_stream_output->Read(&output_io_buffer, &output_length)); | 303 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 306 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); | 304 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); |
| 307 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, | 305 EXPECT_EQ(ByteStreamReader<int>::STREAM_EMPTY, |
| 308 byte_stream_output->Read(&output_io_buffer, &output_length)); | 306 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 309 | 307 |
| 310 // Confirm callback *isn't* called at less than 33% (by lack of | 308 // Confirm callback *isn't* called at less than 33% (by lack of |
| 311 // unexpected call on task runner). | 309 // unexpected call on task runner). |
| 312 EXPECT_TRUE(Write(byte_stream_input.get(), 3000)); | 310 EXPECT_TRUE(Write(byte_stream_input.get(), 3000)); |
| 313 message_loop_.RunUntilIdle(); | 311 message_loop_.RunUntilIdle(); |
| 314 | 312 |
| 315 // This reflects an implementation artifact that data goes with callbacks, | 313 // This reflects an implementation artifact that data goes with callbacks, |
| 316 // which should not be considered part of the interface guarantee. | 314 // which should not be considered part of the interface guarantee. |
| 317 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, | 315 EXPECT_EQ(ByteStreamReader<int>::STREAM_EMPTY, |
| 318 byte_stream_output->Read(&output_io_buffer, &output_length)); | 316 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 319 } | 317 } |
| 320 | 318 |
| 321 // Confirm that callbacks on the source side are triggered when they should | 319 // Confirm that callbacks on the source side are triggered when they should |
| 322 // be. | 320 // be. |
| 323 TEST_F(ByteStreamTest, ByteStream_SourceCallback) { | 321 TEST_F(ByteStreamTest, ByteStream_SourceCallback) { |
| 324 scoped_refptr<base::TestSimpleTaskRunner> task_runner( | 322 scoped_refptr<base::TestSimpleTaskRunner> task_runner( |
| 325 new base::TestSimpleTaskRunner()); | 323 new base::TestSimpleTaskRunner()); |
| 326 | 324 |
| 327 scoped_ptr<ByteStreamWriter> byte_stream_input; | 325 scoped_ptr<ByteStreamWriter<int> > byte_stream_input; |
| 328 scoped_ptr<ByteStreamReader> byte_stream_output; | 326 scoped_ptr<ByteStreamReader<int> > byte_stream_output; |
| 329 CreateByteStream( | 327 CreateByteStream<int>( |
| 330 task_runner, message_loop_.message_loop_proxy(), | 328 task_runner, message_loop_.message_loop_proxy(), |
| 331 10000, &byte_stream_input, &byte_stream_output); | 329 10000, &byte_stream_input, &byte_stream_output); |
| 332 | 330 |
| 333 scoped_refptr<net::IOBuffer> output_io_buffer; | 331 scoped_refptr<net::IOBuffer> output_io_buffer; |
| 334 size_t output_length; | 332 size_t output_length; |
| 335 | 333 |
| 336 // Note that the specifics of when the callbacks are called with regard | 334 // Note that the specifics of when the callbacks are called with regard |
| 337 // to how much data is pulled from the stream is not (currently) part | 335 // to how much data is pulled from the stream is not (currently) part |
| 338 // of the interface contract. If it becomes part of the contract, the | 336 // of the interface contract. If it becomes part of the contract, the |
| 339 // tests below should get much more precise. | 337 // tests below should get much more precise. |
| 340 | 338 |
| 341 // Confirm callback called when about 33% space available, and not | 339 // Confirm callback called when about 33% space available, and not |
| 342 // at other transitions. | 340 // at other transitions. |
| 343 | 341 |
| 344 // Add data. | 342 // Add data. |
| 345 int num_callbacks = 0; | 343 int num_callbacks = 0; |
| 346 byte_stream_input->RegisterCallback( | 344 byte_stream_input->RegisterCallback( |
| 347 base::Bind(CountCallbacks, &num_callbacks)); | 345 base::Bind(CountCallbacks, &num_callbacks)); |
| 348 EXPECT_TRUE(Write(byte_stream_input.get(), 2000)); | 346 EXPECT_TRUE(Write(byte_stream_input.get(), 2000)); |
| 349 EXPECT_TRUE(Write(byte_stream_input.get(), 2001)); | 347 EXPECT_TRUE(Write(byte_stream_input.get(), 2001)); |
| 350 EXPECT_FALSE(Write(byte_stream_input.get(), 6000)); | 348 EXPECT_FALSE(Write(byte_stream_input.get(), 6000)); |
| 351 | 349 |
| 352 // Allow bytes to transition (needed for message passing implementation), | 350 // Allow bytes to transition (needed for message passing implementation), |
| 353 // and get and validate the data. | 351 // and get and validate the data. |
| 354 message_loop_.RunUntilIdle(); | 352 message_loop_.RunUntilIdle(); |
| 355 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, | 353 EXPECT_EQ(ByteStreamReader<int>::STREAM_HAS_DATA, |
| 356 byte_stream_output->Read(&output_io_buffer, &output_length)); | 354 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 357 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); | 355 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); |
| 358 | 356 |
| 359 // Grab data, triggering callback. Recorded on dispatch, but doesn't | 357 // Grab data, triggering callback. Recorded on dispatch, but doesn't |
| 360 // happen because it's caught by the mock. | 358 // happen because it's caught by the mock. |
| 361 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, | 359 EXPECT_EQ(ByteStreamReader<int>::STREAM_HAS_DATA, |
| 362 byte_stream_output->Read(&output_io_buffer, &output_length)); | 360 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 363 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); | 361 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); |
| 364 | 362 |
| 365 // Confirm that the callback passed to the mock does what we expect. | 363 // Confirm that the callback passed to the mock does what we expect. |
| 366 EXPECT_EQ(0, num_callbacks); | 364 EXPECT_EQ(0, num_callbacks); |
| 367 task_runner->RunUntilIdle(); | 365 task_runner->RunUntilIdle(); |
| 368 EXPECT_EQ(1, num_callbacks); | 366 EXPECT_EQ(1, num_callbacks); |
| 369 | 367 |
| 370 // Same drill with final buffer. | 368 // Same drill with final buffer. |
| 371 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, | 369 EXPECT_EQ(ByteStreamReader<int>::STREAM_HAS_DATA, |
| 372 byte_stream_output->Read(&output_io_buffer, &output_length)); | 370 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 373 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); | 371 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); |
| 374 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, | 372 EXPECT_EQ(ByteStreamReader<int>::STREAM_EMPTY, |
| 375 byte_stream_output->Read(&output_io_buffer, &output_length)); | 373 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 376 EXPECT_EQ(1, num_callbacks); | 374 EXPECT_EQ(1, num_callbacks); |
| 377 task_runner->RunUntilIdle(); | 375 task_runner->RunUntilIdle(); |
| 378 // Should have updated the internal structures but not called the | 376 // Should have updated the internal structures but not called the |
| 379 // callback. | 377 // callback. |
| 380 EXPECT_EQ(1, num_callbacks); | 378 EXPECT_EQ(1, num_callbacks); |
| 381 } | 379 } |
| 382 | 380 |
| 383 // Confirm that racing a change to a sink callback with a post results | 381 // Confirm that racing a change to a sink callback with a post results |
| 384 // in the new callback being called. | 382 // in the new callback being called. |
| 385 TEST_F(ByteStreamTest, ByteStream_SinkInterrupt) { | 383 TEST_F(ByteStreamTest, ByteStream_SinkInterrupt) { |
| 386 scoped_refptr<base::TestSimpleTaskRunner> task_runner( | 384 scoped_refptr<base::TestSimpleTaskRunner> task_runner( |
| 387 new base::TestSimpleTaskRunner()); | 385 new base::TestSimpleTaskRunner()); |
| 388 | 386 |
| 389 scoped_ptr<ByteStreamWriter> byte_stream_input; | 387 scoped_ptr<ByteStreamWriter<int> > byte_stream_input; |
| 390 scoped_ptr<ByteStreamReader> byte_stream_output; | 388 scoped_ptr<ByteStreamReader<int> > byte_stream_output; |
| 391 CreateByteStream( | 389 CreateByteStream<int>( |
| 392 message_loop_.message_loop_proxy(), task_runner, | 390 message_loop_.message_loop_proxy(), task_runner, |
| 393 10000, &byte_stream_input, &byte_stream_output); | 391 10000, &byte_stream_input, &byte_stream_output); |
| 394 | 392 |
| 395 scoped_refptr<net::IOBuffer> output_io_buffer; | 393 scoped_refptr<net::IOBuffer> output_io_buffer; |
| 396 size_t output_length; | 394 size_t output_length; |
| 397 base::Closure intermediate_callback; | 395 base::Closure intermediate_callback; |
| 398 | 396 |
| 399 // Record initial state. | 397 // Record initial state. |
| 400 int num_callbacks = 0; | 398 int num_callbacks = 0; |
| 401 byte_stream_output->RegisterCallback( | 399 byte_stream_output->RegisterCallback( |
| (...skipping 10 matching lines...) Expand all Loading... |
| 412 // If we change the callback now, the new one should be run | 410 // If we change the callback now, the new one should be run |
| 413 // (simulates race with post task). | 411 // (simulates race with post task). |
| 414 int num_alt_callbacks = 0; | 412 int num_alt_callbacks = 0; |
| 415 byte_stream_output->RegisterCallback( | 413 byte_stream_output->RegisterCallback( |
| 416 base::Bind(CountCallbacks, &num_alt_callbacks)); | 414 base::Bind(CountCallbacks, &num_alt_callbacks)); |
| 417 task_runner->RunUntilIdle(); | 415 task_runner->RunUntilIdle(); |
| 418 EXPECT_EQ(0, num_callbacks); | 416 EXPECT_EQ(0, num_callbacks); |
| 419 EXPECT_EQ(1, num_alt_callbacks); | 417 EXPECT_EQ(1, num_alt_callbacks); |
| 420 | 418 |
| 421 // Final cleanup. | 419 // Final cleanup. |
| 422 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, | 420 EXPECT_EQ(ByteStreamReader<int>::STREAM_HAS_DATA, |
| 423 byte_stream_output->Read(&output_io_buffer, &output_length)); | 421 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 424 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); | 422 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); |
| 425 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, | 423 EXPECT_EQ(ByteStreamReader<int>::STREAM_EMPTY, |
| 426 byte_stream_output->Read(&output_io_buffer, &output_length)); | 424 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 427 | 425 |
| 428 } | 426 } |
| 429 | 427 |
| 430 // Confirm that racing a change to a source callback with a post results | 428 // Confirm that racing a change to a source callback with a post results |
| 431 // in the new callback being called. | 429 // in the new callback being called. |
| 432 TEST_F(ByteStreamTest, ByteStream_SourceInterrupt) { | 430 TEST_F(ByteStreamTest, ByteStream_SourceInterrupt) { |
| 433 scoped_refptr<base::TestSimpleTaskRunner> task_runner( | 431 scoped_refptr<base::TestSimpleTaskRunner> task_runner( |
| 434 new base::TestSimpleTaskRunner()); | 432 new base::TestSimpleTaskRunner()); |
| 435 | 433 |
| 436 scoped_ptr<ByteStreamWriter> byte_stream_input; | 434 scoped_ptr<ByteStreamWriter<int> > byte_stream_input; |
| 437 scoped_ptr<ByteStreamReader> byte_stream_output; | 435 scoped_ptr<ByteStreamReader<int> > byte_stream_output; |
| 438 CreateByteStream( | 436 CreateByteStream<int>( |
| 439 task_runner, message_loop_.message_loop_proxy(), | 437 task_runner, message_loop_.message_loop_proxy(), |
| 440 10000, &byte_stream_input, &byte_stream_output); | 438 10000, &byte_stream_input, &byte_stream_output); |
| 441 | 439 |
| 442 scoped_refptr<net::IOBuffer> output_io_buffer; | 440 scoped_refptr<net::IOBuffer> output_io_buffer; |
| 443 size_t output_length; | 441 size_t output_length; |
| 444 base::Closure intermediate_callback; | 442 base::Closure intermediate_callback; |
| 445 | 443 |
| 446 // Setup state for test. | 444 // Setup state for test. |
| 447 int num_callbacks = 0; | 445 int num_callbacks = 0; |
| 448 byte_stream_input->RegisterCallback( | 446 byte_stream_input->RegisterCallback( |
| 449 base::Bind(CountCallbacks, &num_callbacks)); | 447 base::Bind(CountCallbacks, &num_callbacks)); |
| 450 EXPECT_TRUE(Write(byte_stream_input.get(), 2000)); | 448 EXPECT_TRUE(Write(byte_stream_input.get(), 2000)); |
| 451 EXPECT_TRUE(Write(byte_stream_input.get(), 2001)); | 449 EXPECT_TRUE(Write(byte_stream_input.get(), 2001)); |
| 452 EXPECT_FALSE(Write(byte_stream_input.get(), 6000)); | 450 EXPECT_FALSE(Write(byte_stream_input.get(), 6000)); |
| 453 message_loop_.RunUntilIdle(); | 451 message_loop_.RunUntilIdle(); |
| 454 | 452 |
| 455 // Initial get should not trigger callback. | 453 // Initial get should not trigger callback. |
| 456 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, | 454 EXPECT_EQ(ByteStreamReader<int>::STREAM_HAS_DATA, |
| 457 byte_stream_output->Read(&output_io_buffer, &output_length)); | 455 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 458 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); | 456 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); |
| 459 message_loop_.RunUntilIdle(); | 457 message_loop_.RunUntilIdle(); |
| 460 | 458 |
| 461 // Second get *should* trigger callback. | 459 // Second get *should* trigger callback. |
| 462 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, | 460 EXPECT_EQ(ByteStreamReader<int>::STREAM_HAS_DATA, |
| 463 byte_stream_output->Read(&output_io_buffer, &output_length)); | 461 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 464 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); | 462 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); |
| 465 | 463 |
| 466 // Which should do the right thing when it's run. | 464 // Which should do the right thing when it's run. |
| 467 int num_alt_callbacks = 0; | 465 int num_alt_callbacks = 0; |
| 468 byte_stream_input->RegisterCallback( | 466 byte_stream_input->RegisterCallback( |
| 469 base::Bind(CountCallbacks, &num_alt_callbacks)); | 467 base::Bind(CountCallbacks, &num_alt_callbacks)); |
| 470 task_runner->RunUntilIdle(); | 468 task_runner->RunUntilIdle(); |
| 471 EXPECT_EQ(0, num_callbacks); | 469 EXPECT_EQ(0, num_callbacks); |
| 472 EXPECT_EQ(1, num_alt_callbacks); | 470 EXPECT_EQ(1, num_alt_callbacks); |
| 473 | 471 |
| 474 // Third get should also trigger callback. | 472 // Third get should also trigger callback. |
| 475 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, | 473 EXPECT_EQ(ByteStreamReader<int>::STREAM_HAS_DATA, |
| 476 byte_stream_output->Read(&output_io_buffer, &output_length)); | 474 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 477 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); | 475 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); |
| 478 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, | 476 EXPECT_EQ(ByteStreamReader<int>::STREAM_EMPTY, |
| 479 byte_stream_output->Read(&output_io_buffer, &output_length)); | 477 byte_stream_output->Read(&output_io_buffer, &output_length)); |
| 480 } | 478 } |
| 481 | 479 |
| 482 // Confirm that callback is called on zero data transfer but source | 480 // Confirm that callback is called on zero data transfer but source |
| 483 // complete. | 481 // complete. |
| 484 TEST_F(ByteStreamTest, ByteStream_ZeroCallback) { | 482 TEST_F(ByteStreamTest, ByteStream_ZeroCallback) { |
| 485 scoped_refptr<base::TestSimpleTaskRunner> task_runner( | 483 scoped_refptr<base::TestSimpleTaskRunner> task_runner( |
| 486 new base::TestSimpleTaskRunner()); | 484 new base::TestSimpleTaskRunner()); |
| 487 | 485 |
| 488 scoped_ptr<ByteStreamWriter> byte_stream_input; | 486 scoped_ptr<ByteStreamWriter<int> > byte_stream_input; |
| 489 scoped_ptr<ByteStreamReader> byte_stream_output; | 487 scoped_ptr<ByteStreamReader<int> > byte_stream_output; |
| 490 CreateByteStream( | 488 CreateByteStream<int>( |
| 491 message_loop_.message_loop_proxy(), task_runner, | 489 message_loop_.message_loop_proxy(), task_runner, |
| 492 10000, &byte_stream_input, &byte_stream_output); | 490 10000, &byte_stream_input, &byte_stream_output); |
| 493 | 491 |
| 494 base::Closure intermediate_callback; | 492 base::Closure intermediate_callback; |
| 495 | 493 |
| 496 // Record initial state. | 494 // Record initial state. |
| 497 int num_callbacks = 0; | 495 int num_callbacks = 0; |
| 498 byte_stream_output->RegisterCallback( | 496 byte_stream_output->RegisterCallback( |
| 499 base::Bind(CountCallbacks, &num_callbacks)); | 497 base::Bind(CountCallbacks, &num_callbacks)); |
| 500 | 498 |
| 501 // Immediately close the stream. | 499 // Immediately close the stream. |
| 502 byte_stream_input->Close(DOWNLOAD_INTERRUPT_REASON_NONE); | 500 byte_stream_input->Close(0); |
| 503 task_runner->RunUntilIdle(); | 501 task_runner->RunUntilIdle(); |
| 504 EXPECT_EQ(1, num_callbacks); | 502 EXPECT_EQ(1, num_callbacks); |
| 505 } | 503 } |
| 506 | 504 |
| 507 } // namespace content | 505 } // namespace content |
| OLD | NEW |