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

Side by Side Diff: net/base/upload_data_stream_unittest.cc

Issue 10910268: net: Make UploadDataStream::Read() asynchronous (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 8 years, 2 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
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 "net/base/upload_data_stream.h" 5 #include "net/base/upload_data_stream.h"
6 6
7 #include <algorithm>
7 #include <vector> 8 #include <vector>
8 9
9 #include "base/basictypes.h" 10 #include "base/basictypes.h"
10 #include "base/bind.h" 11 #include "base/bind.h"
11 #include "base/file_path.h" 12 #include "base/file_path.h"
12 #include "base/file_util.h" 13 #include "base/file_util.h"
13 #include "base/memory/scoped_ptr.h" 14 #include "base/memory/scoped_ptr.h"
14 #include "base/message_loop.h" 15 #include "base/message_loop.h"
15 #include "base/time.h" 16 #include "base/time.h"
16 #include "net/base/io_buffer.h" 17 #include "net/base/io_buffer.h"
(...skipping 15 matching lines...) Expand all
32 33
33 const char kTestData[] = "0123456789"; 34 const char kTestData[] = "0123456789";
34 const size_t kTestDataSize = arraysize(kTestData) - 1; 35 const size_t kTestDataSize = arraysize(kTestData) - 1;
35 const size_t kTestBufferSize = 1 << 14; // 16KB. 36 const size_t kTestBufferSize = 1 << 14; // 16KB.
36 37
37 // Reads data from the upload data stream, and returns the data as string. 38 // Reads data from the upload data stream, and returns the data as string.
38 std::string ReadFromUploadDataStream(UploadDataStream* stream) { 39 std::string ReadFromUploadDataStream(UploadDataStream* stream) {
39 std::string data_read; 40 std::string data_read;
40 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); 41 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize);
41 while (!stream->IsEOF()) { 42 while (!stream->IsEOF()) {
42 const int bytes_read = stream->Read(buf, kTestBufferSize); 43 const int bytes_read = stream->ReadSync(buf, kTestBufferSize);
43 data_read.append(buf->data(), bytes_read); 44 data_read.append(buf->data(), bytes_read);
44 } 45 }
45 return data_read; 46 return data_read;
46 } 47 }
47 48
48 // A mock class of UploadElementReader. 49 // A mock class of UploadElementReader.
49 class MockUploadElementReader : public UploadElementReader { 50 class MockUploadElementReader : public UploadElementReader {
50 public: 51 public:
51 MockUploadElementReader() : init_result_(OK) {} 52 MockUploadElementReader(int content_length, bool is_in_memory)
53 : content_length_(content_length),
54 bytes_remaining_(content_length),
55 is_in_memory_(is_in_memory),
56 init_result_(OK),
57 read_result_(OK) {}
58
52 virtual ~MockUploadElementReader() {} 59 virtual ~MockUploadElementReader() {}
53 60
54 MOCK_METHOD1(Init, int(const CompletionCallback& callback)); 61 MOCK_METHOD1(Init, int(const CompletionCallback& callback));
55 MOCK_CONST_METHOD0(GetContentLength, uint64()); 62 uint64 GetContentLength() const OVERRIDE { return content_length_; }
56 MOCK_CONST_METHOD0(BytesRemaining, uint64()); 63 uint64 BytesRemaining() const OVERRIDE { return bytes_remaining_; }
57 MOCK_CONST_METHOD0(IsInMemory, bool()); 64 bool IsInMemory() const OVERRIDE { return is_in_memory_; }
58 MOCK_METHOD2(ReadSync, int(char* buf, int buf_length)); 65 MOCK_METHOD3(Read, int(IOBuffer* buf,
66 int buf_length,
67 const CompletionCallback& callback));
59 68
60 // Sets expectation to return the specified result from Init() asynchronously. 69 // Sets expectation to return the specified result from Init() asynchronously.
61 void SetAsyncInitExpectation(int result) { 70 void SetAsyncInitExpectation(int result) {
62 init_result_ = result; 71 init_result_ = result;
63 EXPECT_CALL(*this, Init(_)) 72 EXPECT_CALL(*this, Init(_))
64 .WillOnce(DoAll(Invoke(this, &MockUploadElementReader::OnInit), 73 .WillOnce(DoAll(Invoke(this, &MockUploadElementReader::OnInit),
65 Return(ERR_IO_PENDING))); 74 Return(ERR_IO_PENDING)));
66 } 75 }
67 76
77 // Sets expectation to return the specified result from Read().
78 void SetReadExpectation(int result) {
79 read_result_ = result;
80 EXPECT_CALL(*this, Read(_, _, _))
81 .WillOnce(Invoke(this, &MockUploadElementReader::OnRead));
82 }
83
68 private: 84 private:
69 void OnInit(const CompletionCallback& callback) { 85 void OnInit(const CompletionCallback& callback) {
70 MessageLoop::current()->PostTask(FROM_HERE, 86 MessageLoop::current()->PostTask(FROM_HERE,
71 base::Bind(callback, init_result_)); 87 base::Bind(callback, init_result_));
72 } 88 }
73 89
90 int OnRead(IOBuffer* buf,
91 int buf_length,
92 const CompletionCallback& callback) {
93 bytes_remaining_ = std::max(0, bytes_remaining_ - read_result_);
94 if (IsInMemory()) {
95 return read_result_;
96 } else {
97 MessageLoop::current()->PostTask(FROM_HERE,
98 base::Bind(callback, read_result_));
99 return ERR_IO_PENDING;
100 }
101 }
102
103 int content_length_;
104 int bytes_remaining_;
105 bool is_in_memory_;
106
74 // Result value returned from Init(). 107 // Result value returned from Init().
75 int init_result_; 108 int init_result_;
109
110 // Result value returned from Read().
111 int read_result_;
76 }; 112 };
77 113
78 // A mock CompletionCallback. 114 // A mock CompletionCallback.
79 class MockCompletionCallback { 115 class MockCompletionCallback {
80 public: 116 public:
81 MOCK_METHOD1(Run, void(int result)); 117 MOCK_METHOD1(Run, void(int result));
82 118
83 CompletionCallback CreateCallback() { 119 CompletionCallback CreateCallback() {
84 return base::Bind(&MockCompletionCallback::Run, base::Unretained(this)); 120 return base::Bind(&MockCompletionCallback::Run, base::Unretained(this));
85 } 121 }
(...skipping 27 matching lines...) Expand all
113 upload_data_->AppendBytes(kTestData, kTestDataSize); 149 upload_data_->AppendBytes(kTestData, kTestDataSize);
114 scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_)); 150 scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_));
115 ASSERT_EQ(OK, stream->InitSync()); 151 ASSERT_EQ(OK, stream->InitSync());
116 EXPECT_TRUE(stream->IsInMemory()); 152 EXPECT_TRUE(stream->IsInMemory());
117 ASSERT_TRUE(stream.get()); 153 ASSERT_TRUE(stream.get());
118 EXPECT_EQ(kTestDataSize, stream->size()); 154 EXPECT_EQ(kTestDataSize, stream->size());
119 EXPECT_EQ(0U, stream->position()); 155 EXPECT_EQ(0U, stream->position());
120 EXPECT_FALSE(stream->IsEOF()); 156 EXPECT_FALSE(stream->IsEOF());
121 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); 157 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize);
122 while (!stream->IsEOF()) { 158 while (!stream->IsEOF()) {
123 int bytes_read = stream->Read(buf, kTestBufferSize); 159 int bytes_read = stream->ReadSync(buf, kTestBufferSize);
124 ASSERT_LE(0, bytes_read); // Not an error. 160 ASSERT_LE(0, bytes_read); // Not an error.
125 } 161 }
126 EXPECT_EQ(kTestDataSize, stream->position()); 162 EXPECT_EQ(kTestDataSize, stream->position());
127 ASSERT_TRUE(stream->IsEOF()); 163 ASSERT_TRUE(stream->IsEOF());
128 } 164 }
129 165
130 TEST_F(UploadDataStreamTest, File) { 166 TEST_F(UploadDataStreamTest, File) {
131 FilePath temp_file_path; 167 FilePath temp_file_path;
132 ASSERT_TRUE(file_util::CreateTemporaryFile(&temp_file_path)); 168 ASSERT_TRUE(file_util::CreateTemporaryFile(&temp_file_path));
133 ASSERT_EQ(static_cast<int>(kTestDataSize), 169 ASSERT_EQ(static_cast<int>(kTestDataSize),
134 file_util::WriteFile(temp_file_path, kTestData, kTestDataSize)); 170 file_util::WriteFile(temp_file_path, kTestData, kTestDataSize));
135 171
136 std::vector<UploadElement> elements; 172 std::vector<UploadElement> elements;
137 UploadElement element; 173 UploadElement element;
138 element.SetToFilePath(temp_file_path); 174 element.SetToFilePath(temp_file_path);
139 elements.push_back(element); 175 elements.push_back(element);
140 upload_data_->SetElements(elements); 176 upload_data_->SetElements(elements);
141 177
142 scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_)); 178 scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_));
143 ASSERT_EQ(OK, stream->InitSync()); 179 ASSERT_EQ(OK, stream->InitSync());
144 EXPECT_FALSE(stream->IsInMemory()); 180 EXPECT_FALSE(stream->IsInMemory());
145 ASSERT_TRUE(stream.get()); 181 ASSERT_TRUE(stream.get());
146 EXPECT_EQ(kTestDataSize, stream->size()); 182 EXPECT_EQ(kTestDataSize, stream->size());
147 EXPECT_EQ(0U, stream->position()); 183 EXPECT_EQ(0U, stream->position());
148 EXPECT_FALSE(stream->IsEOF()); 184 EXPECT_FALSE(stream->IsEOF());
149 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); 185 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize);
150 while (!stream->IsEOF()) { 186 while (!stream->IsEOF()) {
151 int bytes_read = stream->Read(buf, kTestBufferSize); 187 int bytes_read = stream->ReadSync(buf, kTestBufferSize);
152 ASSERT_LE(0, bytes_read); // Not an error. 188 ASSERT_LE(0, bytes_read); // Not an error.
153 } 189 }
154 EXPECT_EQ(kTestDataSize, stream->position()); 190 EXPECT_EQ(kTestDataSize, stream->position());
155 ASSERT_TRUE(stream->IsEOF()); 191 ASSERT_TRUE(stream->IsEOF());
156 file_util::Delete(temp_file_path, false); 192 file_util::Delete(temp_file_path, false);
157 } 193 }
158 194
159 TEST_F(UploadDataStreamTest, FileSmallerThanLength) { 195 TEST_F(UploadDataStreamTest, FileSmallerThanLength) {
160 FilePath temp_file_path; 196 FilePath temp_file_path;
161 ASSERT_TRUE(file_util::CreateTemporaryFile(&temp_file_path)); 197 ASSERT_TRUE(file_util::CreateTemporaryFile(&temp_file_path));
(...skipping 13 matching lines...) Expand all
175 scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_)); 211 scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_));
176 ASSERT_EQ(OK, stream->InitSync()); 212 ASSERT_EQ(OK, stream->InitSync());
177 EXPECT_FALSE(stream->IsInMemory()); 213 EXPECT_FALSE(stream->IsInMemory());
178 ASSERT_TRUE(stream.get()); 214 ASSERT_TRUE(stream.get());
179 EXPECT_EQ(kFakeSize, stream->size()); 215 EXPECT_EQ(kFakeSize, stream->size());
180 EXPECT_EQ(0U, stream->position()); 216 EXPECT_EQ(0U, stream->position());
181 EXPECT_FALSE(stream->IsEOF()); 217 EXPECT_FALSE(stream->IsEOF());
182 uint64 read_counter = 0; 218 uint64 read_counter = 0;
183 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); 219 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize);
184 while (!stream->IsEOF()) { 220 while (!stream->IsEOF()) {
185 int bytes_read = stream->Read(buf, kTestBufferSize); 221 int bytes_read = stream->ReadSync(buf, kTestBufferSize);
186 ASSERT_LE(0, bytes_read); // Not an error. 222 ASSERT_LE(0, bytes_read); // Not an error.
187 read_counter += bytes_read; 223 read_counter += bytes_read;
188 EXPECT_EQ(read_counter, stream->position()); 224 EXPECT_EQ(read_counter, stream->position());
189 } 225 }
190 // UpdateDataStream will pad out the file with 0 bytes so that the HTTP 226 // UpdateDataStream will pad out the file with 0 bytes so that the HTTP
191 // transaction doesn't hang. Therefore we expected the full size. 227 // transaction doesn't hang. Therefore we expected the full size.
192 EXPECT_EQ(kFakeSize, read_counter); 228 EXPECT_EQ(kFakeSize, read_counter);
193 EXPECT_EQ(read_counter, stream->position()); 229 EXPECT_EQ(read_counter, stream->position());
194 230
195 file_util::Delete(temp_file_path, false); 231 file_util::Delete(temp_file_path, false);
(...skipping 15 matching lines...) Expand all
211 const uint64 kStreamSize = kTestDataSize + kFileRangeLength; 247 const uint64 kStreamSize = kTestDataSize + kFileRangeLength;
212 scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_)); 248 scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_));
213 ASSERT_EQ(OK, stream->InitSync()); 249 ASSERT_EQ(OK, stream->InitSync());
214 EXPECT_FALSE(stream->IsInMemory()); 250 EXPECT_FALSE(stream->IsInMemory());
215 ASSERT_TRUE(stream.get()); 251 ASSERT_TRUE(stream.get());
216 EXPECT_EQ(kStreamSize, stream->size()); 252 EXPECT_EQ(kStreamSize, stream->size());
217 EXPECT_EQ(0U, stream->position()); 253 EXPECT_EQ(0U, stream->position());
218 EXPECT_FALSE(stream->IsEOF()); 254 EXPECT_FALSE(stream->IsEOF());
219 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); 255 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize);
220 while (!stream->IsEOF()) { 256 while (!stream->IsEOF()) {
221 int bytes_read = stream->Read(buf, kTestBufferSize); 257 int bytes_read = stream->ReadSync(buf, kTestBufferSize);
222 ASSERT_LE(0, bytes_read); // Not an error. 258 ASSERT_LE(0, bytes_read); // Not an error.
223 } 259 }
224 EXPECT_EQ(kStreamSize, stream->position()); 260 EXPECT_EQ(kStreamSize, stream->position());
225 ASSERT_TRUE(stream->IsEOF()); 261 ASSERT_TRUE(stream->IsEOF());
226 262
227 file_util::Delete(temp_file_path, false); 263 file_util::Delete(temp_file_path, false);
228 } 264 }
229 265
230 TEST_F(UploadDataStreamTest, Chunk) { 266 TEST_F(UploadDataStreamTest, Chunk) {
231 upload_data_->set_is_chunked(true); 267 upload_data_->set_is_chunked(true);
232 upload_data_->AppendChunk(kTestData, kTestDataSize, false); 268 upload_data_->AppendChunk(kTestData, kTestDataSize, false);
233 upload_data_->AppendChunk(kTestData, kTestDataSize, true); 269 upload_data_->AppendChunk(kTestData, kTestDataSize, true);
234 270
235 const uint64 kStreamSize = kTestDataSize*2; 271 const uint64 kStreamSize = kTestDataSize*2;
236 scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_)); 272 scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_));
237 ASSERT_EQ(OK, stream->InitSync()); 273 ASSERT_EQ(OK, stream->InitSync());
238 EXPECT_FALSE(stream->IsInMemory()); 274 EXPECT_FALSE(stream->IsInMemory());
239 ASSERT_TRUE(stream.get()); 275 ASSERT_TRUE(stream.get());
240 EXPECT_EQ(0U, stream->size()); // Content-Length is 0 for chunked data. 276 EXPECT_EQ(0U, stream->size()); // Content-Length is 0 for chunked data.
241 EXPECT_EQ(0U, stream->position()); 277 EXPECT_EQ(0U, stream->position());
242 EXPECT_FALSE(stream->IsEOF()); 278 EXPECT_FALSE(stream->IsEOF());
243 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); 279 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize);
244 while (!stream->IsEOF()) { 280 while (!stream->IsEOF()) {
245 int bytes_read = stream->Read(buf, kTestBufferSize); 281 int bytes_read = stream->ReadSync(buf, kTestBufferSize);
246 ASSERT_LE(0, bytes_read); // Not an error. 282 ASSERT_LE(0, bytes_read); // Not an error.
247 } 283 }
248 EXPECT_EQ(kStreamSize, stream->position()); 284 EXPECT_EQ(kStreamSize, stream->position());
249 ASSERT_TRUE(stream->IsEOF()); 285 ASSERT_TRUE(stream->IsEOF());
250 } 286 }
251 287
252 // Init() with on-memory and not-on-memory readers. 288 // Init() with on-memory and not-on-memory readers.
253 TEST_F(UploadDataStreamTest, InitAsync) { 289 TEST_F(UploadDataStreamTest, InitAsync) {
254 // Create stream without element readers. 290 // Create stream without element readers.
255 UploadDataStream stream(upload_data_); 291 UploadDataStream stream(upload_data_);
256 292
257 // Set mock readers to the stream. 293 // Set mock readers to the stream.
258 MockUploadElementReader* reader = NULL; 294 MockUploadElementReader* reader = NULL;
259 295
260 reader = new MockUploadElementReader; 296 reader = new MockUploadElementReader(kTestDataSize, true);
261 EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK)); 297 EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK));
262 EXPECT_CALL(*reader, GetContentLength()).WillRepeatedly(Return(0));
263 EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(true));
264 stream.element_readers_.push_back(reader); 298 stream.element_readers_.push_back(reader);
265 299
266 reader = new MockUploadElementReader; 300 reader = new MockUploadElementReader(kTestDataSize, true);
267 EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK)); 301 EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK));
268 EXPECT_CALL(*reader, GetContentLength()).WillRepeatedly(Return(0));
269 EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(true));
270 stream.element_readers_.push_back(reader); 302 stream.element_readers_.push_back(reader);
271 303
272 reader = new MockUploadElementReader; 304 reader = new MockUploadElementReader(kTestDataSize, false);
273 reader->SetAsyncInitExpectation(OK); 305 reader->SetAsyncInitExpectation(OK);
274 EXPECT_CALL(*reader, GetContentLength()).WillRepeatedly(Return(0));
275 EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(false));
276 stream.element_readers_.push_back(reader); 306 stream.element_readers_.push_back(reader);
277 307
278 reader = new MockUploadElementReader; 308 reader = new MockUploadElementReader(kTestDataSize, false);
279 reader->SetAsyncInitExpectation(OK); 309 reader->SetAsyncInitExpectation(OK);
280 EXPECT_CALL(*reader, GetContentLength()).WillRepeatedly(Return(0));
281 EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(false));
282 stream.element_readers_.push_back(reader); 310 stream.element_readers_.push_back(reader);
283 311
284 reader = new MockUploadElementReader; 312 reader = new MockUploadElementReader(kTestDataSize, true);
285 EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK)); 313 EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK));
286 EXPECT_CALL(*reader, GetContentLength()).WillRepeatedly(Return(0));
287 EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(true));
288 stream.element_readers_.push_back(reader); 314 stream.element_readers_.push_back(reader);
289 315
290 // Run Init(). 316 // Run Init().
291 MockCompletionCallback mock_callback; 317 MockCompletionCallback mock_callback;
292 EXPECT_CALL(mock_callback, Run(OK)).Times(1); 318 EXPECT_CALL(mock_callback, Run(OK)).Times(1);
293 EXPECT_EQ(stream.Init(mock_callback.CreateCallback()), ERR_IO_PENDING); 319 EXPECT_EQ(stream.Init(mock_callback.CreateCallback()), ERR_IO_PENDING);
294 MessageLoop::current()->RunAllPending(); 320 MessageLoop::current()->RunAllPending();
295 } 321 }
296 322
297 // Init() of a reader fails asynchronously. 323 // Init() of a reader fails asynchronously.
298 TEST_F(UploadDataStreamTest, InitAsyncFailureAsync) { 324 TEST_F(UploadDataStreamTest, InitAsyncFailureAsync) {
299 // Create stream without element readers. 325 // Create stream without element readers.
300 UploadDataStream stream(upload_data_); 326 UploadDataStream stream(upload_data_);
301 327
302 // Set a mock reader to the stream. 328 // Set a mock reader to the stream.
303 MockUploadElementReader* reader = NULL; 329 MockUploadElementReader* reader = NULL;
304 330
305 reader = new MockUploadElementReader; 331 reader = new MockUploadElementReader(kTestDataSize, false);
306 reader->SetAsyncInitExpectation(ERR_FAILED); 332 reader->SetAsyncInitExpectation(ERR_FAILED);
307 EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(false));
308 stream.element_readers_.push_back(reader); 333 stream.element_readers_.push_back(reader);
309 334
310 // Run Init(). 335 // Run Init().
311 MockCompletionCallback mock_callback; 336 MockCompletionCallback mock_callback;
312 EXPECT_CALL(mock_callback, Run(ERR_FAILED)).Times(1); 337 EXPECT_CALL(mock_callback, Run(ERR_FAILED)).Times(1);
313 EXPECT_EQ(stream.Init(mock_callback.CreateCallback()), ERR_IO_PENDING); 338 EXPECT_EQ(stream.Init(mock_callback.CreateCallback()), ERR_IO_PENDING);
314 MessageLoop::current()->RunAllPending(); 339 MessageLoop::current()->RunAllPending();
315 } 340 }
316 341
317 // Init() of a reader fails synchronously. 342 // Init() of a reader fails synchronously.
318 TEST_F(UploadDataStreamTest, InitAsyncFailureSync) { 343 TEST_F(UploadDataStreamTest, InitAsyncFailureSync) {
319 // Create stream without element readers. 344 // Create stream without element readers.
320 UploadDataStream stream(upload_data_); 345 UploadDataStream stream(upload_data_);
321 346
322 // Set mock readers to the stream. 347 // Set mock readers to the stream.
323 MockUploadElementReader* reader = NULL; 348 MockUploadElementReader* reader = NULL;
324 349
325 reader = new MockUploadElementReader; 350 reader = new MockUploadElementReader(kTestDataSize, false);
326 reader->SetAsyncInitExpectation(OK); 351 reader->SetAsyncInitExpectation(OK);
327 EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(false));
328 stream.element_readers_.push_back(reader); 352 stream.element_readers_.push_back(reader);
329 353
330 reader = new MockUploadElementReader; 354 reader = new MockUploadElementReader(kTestDataSize, true);
331 EXPECT_CALL(*reader, Init(_)).WillOnce(Return(ERR_FAILED)); 355 EXPECT_CALL(*reader, Init(_)).WillOnce(Return(ERR_FAILED));
332 EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(true));
333 stream.element_readers_.push_back(reader); 356 stream.element_readers_.push_back(reader);
334 357
335 // Run Init(). 358 // Run Init().
336 MockCompletionCallback mock_callback; 359 MockCompletionCallback mock_callback;
337 EXPECT_CALL(mock_callback, Run(ERR_FAILED)).Times(1); 360 EXPECT_CALL(mock_callback, Run(ERR_FAILED)).Times(1);
338 EXPECT_EQ(stream.Init(mock_callback.CreateCallback()), ERR_IO_PENDING); 361 EXPECT_EQ(stream.Init(mock_callback.CreateCallback()), ERR_IO_PENDING);
339 MessageLoop::current()->RunAllPending(); 362 MessageLoop::current()->RunAllPending();
340 } 363 }
341 364
365 // Read() with on-memory and not-on-memory readers.
366 TEST_F(UploadDataStreamTest, ReadAsync) {
367 // Create stream without element readers.
368 UploadDataStream stream(upload_data_);
369
370 // Set mock readers to the stream.
371 MockUploadElementReader* reader = NULL;
372
373 reader = new MockUploadElementReader(kTestDataSize, true);
374 EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK));
375 reader->SetReadExpectation(kTestDataSize);
376 stream.element_readers_.push_back(reader);
377
378 reader = new MockUploadElementReader(kTestDataSize, false);
379 reader->SetAsyncInitExpectation(OK);
380 reader->SetReadExpectation(kTestDataSize);
381 stream.element_readers_.push_back(reader);
382
383 reader = new MockUploadElementReader(kTestDataSize, true);
384 EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK));
385 reader->SetReadExpectation(kTestDataSize);
386 stream.element_readers_.push_back(reader);
387
388 reader = new MockUploadElementReader(kTestDataSize, false);
389 reader->SetAsyncInitExpectation(OK);
390 reader->SetReadExpectation(kTestDataSize);
391 stream.element_readers_.push_back(reader);
392
393 // Run Init().
394 MockCompletionCallback mock_callback;
395 EXPECT_CALL(mock_callback, Run(OK)).Times(1);
396 EXPECT_EQ(ERR_IO_PENDING, stream.Init(mock_callback.CreateCallback()));
397 MessageLoop::current()->RunAllPending();
398
399 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize);
400
401 // Consume the first element.
402 EXPECT_CALL(mock_callback, Run(kTestDataSize)).Times(0);
403 EXPECT_EQ(static_cast<int>(kTestDataSize),
404 stream.Read(buf, kTestDataSize, mock_callback.CreateCallback()));
405 MessageLoop::current()->RunAllPending();
406
407 // Consume the second element.
408 EXPECT_CALL(mock_callback, Run(kTestDataSize)).Times(1);
409 EXPECT_EQ(ERR_IO_PENDING,
410 stream.Read(buf, kTestDataSize, mock_callback.CreateCallback()));
411 MessageLoop::current()->RunAllPending();
412
413 // Consume the third and the fourth elements.
414 EXPECT_CALL(mock_callback, Run(kTestDataSize*2)).Times(1);
415 EXPECT_EQ(ERR_IO_PENDING,
416 stream.Read(buf, kTestDataSize*2, mock_callback.CreateCallback()));
417 MessageLoop::current()->RunAllPending();
418 }
419
342 void UploadDataStreamTest::FileChangedHelper(const FilePath& file_path, 420 void UploadDataStreamTest::FileChangedHelper(const FilePath& file_path,
343 const base::Time& time, 421 const base::Time& time,
344 bool error_expected) { 422 bool error_expected) {
345 std::vector<UploadElement> elements; 423 std::vector<UploadElement> elements;
346 UploadElement element; 424 UploadElement element;
347 element.SetToFilePathRange(file_path, 1, 2, time); 425 element.SetToFilePathRange(file_path, 1, 2, time);
348 elements.push_back(element); 426 elements.push_back(element);
349 // Don't use upload_data_ here, as this function is called twice, and 427 // Don't use upload_data_ here, as this function is called twice, and
350 // reusing upload_data_ is wrong. 428 // reusing upload_data_ is wrong.
351 scoped_refptr<UploadData> upload_data(new UploadData); 429 scoped_refptr<UploadData> upload_data(new UploadData);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 UploadDataStream stream(upload_data_); 484 UploadDataStream stream(upload_data_);
407 ASSERT_EQ(OK, stream.InitSync()); 485 ASSERT_EQ(OK, stream.InitSync());
408 EXPECT_EQ(kTestDataSize, stream.size()); 486 EXPECT_EQ(kTestDataSize, stream.size());
409 EXPECT_EQ(kTestData, ReadFromUploadDataStream(&stream)); 487 EXPECT_EQ(kTestData, ReadFromUploadDataStream(&stream));
410 } 488 }
411 489
412 file_util::Delete(temp_file_path, false); 490 file_util::Delete(temp_file_path, false);
413 } 491 }
414 492
415 } // namespace net 493 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698