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

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: Address comments 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
« no previous file with comments | « net/base/upload_data_stream.cc ('k') | net/base/upload_element_reader.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
61 // UploadElementReader overrides.
54 MOCK_METHOD1(Init, int(const CompletionCallback& callback)); 62 MOCK_METHOD1(Init, int(const CompletionCallback& callback));
55 MOCK_CONST_METHOD0(GetContentLength, uint64()); 63 virtual uint64 GetContentLength() const OVERRIDE { return content_length_; }
56 MOCK_CONST_METHOD0(BytesRemaining, uint64()); 64 virtual uint64 BytesRemaining() const OVERRIDE { return bytes_remaining_; }
57 MOCK_CONST_METHOD0(IsInMemory, bool()); 65 virtual bool IsInMemory() const OVERRIDE { return is_in_memory_; }
58 MOCK_METHOD2(ReadSync, int(char* buf, int buf_length)); 66 MOCK_METHOD3(Read, int(IOBuffer* buf,
67 int buf_length,
68 const CompletionCallback& callback));
59 69
60 // Sets expectation to return the specified result from Init() asynchronously. 70 // Sets expectation to return the specified result from Init() asynchronously.
61 void SetAsyncInitExpectation(int result) { 71 void SetAsyncInitExpectation(int result) {
62 init_result_ = result; 72 init_result_ = result;
63 EXPECT_CALL(*this, Init(_)) 73 EXPECT_CALL(*this, Init(_))
64 .WillOnce(DoAll(Invoke(this, &MockUploadElementReader::OnInit), 74 .WillOnce(DoAll(Invoke(this, &MockUploadElementReader::OnInit),
65 Return(ERR_IO_PENDING))); 75 Return(ERR_IO_PENDING)));
66 } 76 }
67 77
78 // Sets expectation to return the specified result from Read().
79 void SetReadExpectation(int result) {
80 read_result_ = result;
81 EXPECT_CALL(*this, Read(_, _, _))
82 .WillOnce(Invoke(this, &MockUploadElementReader::OnRead));
83 }
84
68 private: 85 private:
69 void OnInit(const CompletionCallback& callback) { 86 void OnInit(const CompletionCallback& callback) {
70 MessageLoop::current()->PostTask(FROM_HERE, 87 MessageLoop::current()->PostTask(FROM_HERE,
71 base::Bind(callback, init_result_)); 88 base::Bind(callback, init_result_));
72 } 89 }
73 90
91 int OnRead(IOBuffer* buf,
92 int buf_length,
93 const CompletionCallback& callback) {
94 bytes_remaining_ = std::max(0, bytes_remaining_ - read_result_);
95 if (IsInMemory()) {
96 return read_result_;
97 } else {
98 MessageLoop::current()->PostTask(FROM_HERE,
99 base::Bind(callback, read_result_));
100 return ERR_IO_PENDING;
101 }
102 }
103
104 int content_length_;
105 int bytes_remaining_;
106 bool is_in_memory_;
107
74 // Result value returned from Init(). 108 // Result value returned from Init().
75 int init_result_; 109 int init_result_;
110
111 // Result value returned from Read().
112 int read_result_;
76 }; 113 };
77 114
78 // A mock CompletionCallback. 115 // A mock CompletionCallback.
79 class MockCompletionCallback { 116 class MockCompletionCallback {
80 public: 117 public:
81 MOCK_METHOD1(Run, void(int result)); 118 MOCK_METHOD1(Run, void(int result));
82 119
83 CompletionCallback CreateCallback() { 120 CompletionCallback CreateCallback() {
84 return base::Bind(&MockCompletionCallback::Run, base::Unretained(this)); 121 return base::Bind(&MockCompletionCallback::Run, base::Unretained(this));
85 } 122 }
86 }; 123 };
87 124
88 } // namespace 125 } // namespace
89 126
90 class UploadDataStreamTest : public PlatformTest { 127 class UploadDataStreamTest : public PlatformTest {
91 public: 128 public:
92 UploadDataStreamTest() : upload_data_(new UploadData) { } 129 UploadDataStreamTest() : upload_data_(new UploadData) { }
93 130
94 void FileChangedHelper(const FilePath& file_path, 131 void FileChangedHelper(const FilePath& file_path,
95 const base::Time& time, 132 const base::Time& time,
96 bool error_expected); 133 bool error_expected);
97 134
98 scoped_refptr<UploadData> upload_data_; 135 scoped_refptr<UploadData> upload_data_;
99 }; 136 };
100 137
101 TEST_F(UploadDataStreamTest, EmptyUploadData) { 138 TEST_F(UploadDataStreamTest, EmptyUploadData) {
102 upload_data_->AppendBytes("", 0); 139 upload_data_->AppendBytes("", 0);
103 scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_)); 140 UploadDataStream stream(upload_data_);
104 ASSERT_EQ(OK, stream->InitSync()); 141 ASSERT_EQ(OK, stream.InitSync());
105 EXPECT_TRUE(stream->IsInMemory()); 142 EXPECT_TRUE(stream.IsInMemory());
106 ASSERT_TRUE(stream.get()); 143 EXPECT_EQ(0U, stream.size());
107 EXPECT_EQ(0U, stream->size()); 144 EXPECT_EQ(0U, stream.position());
108 EXPECT_EQ(0U, stream->position()); 145 EXPECT_TRUE(stream.IsEOF());
109 EXPECT_TRUE(stream->IsEOF());
110 } 146 }
111 147
112 TEST_F(UploadDataStreamTest, ConsumeAllBytes) { 148 TEST_F(UploadDataStreamTest, ConsumeAllBytes) {
113 upload_data_->AppendBytes(kTestData, kTestDataSize); 149 upload_data_->AppendBytes(kTestData, kTestDataSize);
114 scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_)); 150 UploadDataStream stream(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 EXPECT_EQ(kTestDataSize, stream.size());
118 EXPECT_EQ(kTestDataSize, stream->size()); 154 EXPECT_EQ(0U, stream.position());
119 EXPECT_EQ(0U, stream->position()); 155 EXPECT_FALSE(stream.IsEOF());
120 EXPECT_FALSE(stream->IsEOF());
121 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); 156 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize);
122 while (!stream->IsEOF()) { 157 while (!stream.IsEOF()) {
123 int bytes_read = stream->Read(buf, kTestBufferSize); 158 int bytes_read = stream.ReadSync(buf, kTestBufferSize);
124 ASSERT_LE(0, bytes_read); // Not an error. 159 ASSERT_LE(0, bytes_read); // Not an error.
125 } 160 }
126 EXPECT_EQ(kTestDataSize, stream->position()); 161 EXPECT_EQ(kTestDataSize, stream.position());
127 ASSERT_TRUE(stream->IsEOF()); 162 ASSERT_TRUE(stream.IsEOF());
128 } 163 }
129 164
130 TEST_F(UploadDataStreamTest, File) { 165 TEST_F(UploadDataStreamTest, File) {
131 FilePath temp_file_path; 166 FilePath temp_file_path;
132 ASSERT_TRUE(file_util::CreateTemporaryFile(&temp_file_path)); 167 ASSERT_TRUE(file_util::CreateTemporaryFile(&temp_file_path));
133 ASSERT_EQ(static_cast<int>(kTestDataSize), 168 ASSERT_EQ(static_cast<int>(kTestDataSize),
134 file_util::WriteFile(temp_file_path, kTestData, kTestDataSize)); 169 file_util::WriteFile(temp_file_path, kTestData, kTestDataSize));
135 170
136 std::vector<UploadElement> elements; 171 std::vector<UploadElement> elements;
137 UploadElement element; 172 UploadElement element;
138 element.SetToFilePath(temp_file_path); 173 element.SetToFilePath(temp_file_path);
139 elements.push_back(element); 174 elements.push_back(element);
140 upload_data_->SetElements(elements); 175 upload_data_->SetElements(elements);
141 176
142 scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_)); 177 UploadDataStream stream(upload_data_);
143 ASSERT_EQ(OK, stream->InitSync()); 178 ASSERT_EQ(OK, stream.InitSync());
144 EXPECT_FALSE(stream->IsInMemory()); 179 EXPECT_FALSE(stream.IsInMemory());
145 ASSERT_TRUE(stream.get()); 180 EXPECT_EQ(kTestDataSize, stream.size());
146 EXPECT_EQ(kTestDataSize, stream->size()); 181 EXPECT_EQ(0U, stream.position());
147 EXPECT_EQ(0U, stream->position()); 182 EXPECT_FALSE(stream.IsEOF());
148 EXPECT_FALSE(stream->IsEOF());
149 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); 183 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize);
150 while (!stream->IsEOF()) { 184 while (!stream.IsEOF()) {
151 int bytes_read = stream->Read(buf, kTestBufferSize); 185 int bytes_read = stream.ReadSync(buf, kTestBufferSize);
152 ASSERT_LE(0, bytes_read); // Not an error. 186 ASSERT_LE(0, bytes_read); // Not an error.
153 } 187 }
154 EXPECT_EQ(kTestDataSize, stream->position()); 188 EXPECT_EQ(kTestDataSize, stream.position());
155 ASSERT_TRUE(stream->IsEOF()); 189 ASSERT_TRUE(stream.IsEOF());
156 file_util::Delete(temp_file_path, false); 190 file_util::Delete(temp_file_path, false);
157 } 191 }
158 192
159 TEST_F(UploadDataStreamTest, FileSmallerThanLength) { 193 TEST_F(UploadDataStreamTest, FileSmallerThanLength) {
160 FilePath temp_file_path; 194 FilePath temp_file_path;
161 ASSERT_TRUE(file_util::CreateTemporaryFile(&temp_file_path)); 195 ASSERT_TRUE(file_util::CreateTemporaryFile(&temp_file_path));
162 ASSERT_EQ(static_cast<int>(kTestDataSize), 196 ASSERT_EQ(static_cast<int>(kTestDataSize),
163 file_util::WriteFile(temp_file_path, kTestData, kTestDataSize)); 197 file_util::WriteFile(temp_file_path, kTestData, kTestDataSize));
164 const uint64 kFakeSize = kTestDataSize*2; 198 const uint64 kFakeSize = kTestDataSize*2;
165 199
166 UploadFileElementReader::ScopedOverridingContentLengthForTests 200 UploadFileElementReader::ScopedOverridingContentLengthForTests
167 overriding_content_length(kFakeSize); 201 overriding_content_length(kFakeSize);
168 202
169 std::vector<UploadElement> elements; 203 std::vector<UploadElement> elements;
170 UploadElement element; 204 UploadElement element;
171 element.SetToFilePath(temp_file_path); 205 element.SetToFilePath(temp_file_path);
172 elements.push_back(element); 206 elements.push_back(element);
173 upload_data_->SetElements(elements); 207 upload_data_->SetElements(elements);
174 208
175 scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_)); 209 UploadDataStream stream(upload_data_);
176 ASSERT_EQ(OK, stream->InitSync()); 210 ASSERT_EQ(OK, stream.InitSync());
177 EXPECT_FALSE(stream->IsInMemory()); 211 EXPECT_FALSE(stream.IsInMemory());
178 ASSERT_TRUE(stream.get()); 212 EXPECT_EQ(kFakeSize, stream.size());
179 EXPECT_EQ(kFakeSize, stream->size()); 213 EXPECT_EQ(0U, stream.position());
180 EXPECT_EQ(0U, stream->position()); 214 EXPECT_FALSE(stream.IsEOF());
181 EXPECT_FALSE(stream->IsEOF());
182 uint64 read_counter = 0; 215 uint64 read_counter = 0;
183 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); 216 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize);
184 while (!stream->IsEOF()) { 217 while (!stream.IsEOF()) {
185 int bytes_read = stream->Read(buf, kTestBufferSize); 218 int bytes_read = stream.ReadSync(buf, kTestBufferSize);
186 ASSERT_LE(0, bytes_read); // Not an error. 219 ASSERT_LE(0, bytes_read); // Not an error.
187 read_counter += bytes_read; 220 read_counter += bytes_read;
188 EXPECT_EQ(read_counter, stream->position()); 221 EXPECT_EQ(read_counter, stream.position());
189 } 222 }
190 // UpdateDataStream will pad out the file with 0 bytes so that the HTTP 223 // UpdateDataStream will pad out the file with 0 bytes so that the HTTP
191 // transaction doesn't hang. Therefore we expected the full size. 224 // transaction doesn't hang. Therefore we expected the full size.
192 EXPECT_EQ(kFakeSize, read_counter); 225 EXPECT_EQ(kFakeSize, read_counter);
193 EXPECT_EQ(read_counter, stream->position()); 226 EXPECT_EQ(read_counter, stream.position());
194 227
195 file_util::Delete(temp_file_path, false); 228 file_util::Delete(temp_file_path, false);
196 } 229 }
197 230
198 TEST_F(UploadDataStreamTest, FileAndBytes) { 231 TEST_F(UploadDataStreamTest, FileAndBytes) {
199 FilePath temp_file_path; 232 FilePath temp_file_path;
200 ASSERT_TRUE(file_util::CreateTemporaryFile(&temp_file_path)); 233 ASSERT_TRUE(file_util::CreateTemporaryFile(&temp_file_path));
201 ASSERT_EQ(static_cast<int>(kTestDataSize), 234 ASSERT_EQ(static_cast<int>(kTestDataSize),
202 file_util::WriteFile(temp_file_path, kTestData, kTestDataSize)); 235 file_util::WriteFile(temp_file_path, kTestData, kTestDataSize));
203 236
204 const uint64 kFileRangeOffset = 1; 237 const uint64 kFileRangeOffset = 1;
205 const uint64 kFileRangeLength = 4; 238 const uint64 kFileRangeLength = 4;
206 upload_data_->AppendFileRange( 239 upload_data_->AppendFileRange(
207 temp_file_path, kFileRangeOffset, kFileRangeLength, base::Time()); 240 temp_file_path, kFileRangeOffset, kFileRangeLength, base::Time());
208 241
209 upload_data_->AppendBytes(kTestData, kTestDataSize); 242 upload_data_->AppendBytes(kTestData, kTestDataSize);
210 243
211 const uint64 kStreamSize = kTestDataSize + kFileRangeLength; 244 const uint64 kStreamSize = kTestDataSize + kFileRangeLength;
212 scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_)); 245 UploadDataStream stream(upload_data_);
213 ASSERT_EQ(OK, stream->InitSync()); 246 ASSERT_EQ(OK, stream.InitSync());
214 EXPECT_FALSE(stream->IsInMemory()); 247 EXPECT_FALSE(stream.IsInMemory());
215 ASSERT_TRUE(stream.get()); 248 EXPECT_EQ(kStreamSize, stream.size());
216 EXPECT_EQ(kStreamSize, stream->size()); 249 EXPECT_EQ(0U, stream.position());
217 EXPECT_EQ(0U, stream->position()); 250 EXPECT_FALSE(stream.IsEOF());
218 EXPECT_FALSE(stream->IsEOF());
219 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); 251 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize);
220 while (!stream->IsEOF()) { 252 while (!stream.IsEOF()) {
221 int bytes_read = stream->Read(buf, kTestBufferSize); 253 int bytes_read = stream.ReadSync(buf, kTestBufferSize);
222 ASSERT_LE(0, bytes_read); // Not an error. 254 ASSERT_LE(0, bytes_read); // Not an error.
223 } 255 }
224 EXPECT_EQ(kStreamSize, stream->position()); 256 EXPECT_EQ(kStreamSize, stream.position());
225 ASSERT_TRUE(stream->IsEOF()); 257 ASSERT_TRUE(stream.IsEOF());
226 258
227 file_util::Delete(temp_file_path, false); 259 file_util::Delete(temp_file_path, false);
228 } 260 }
229 261
230 TEST_F(UploadDataStreamTest, Chunk) { 262 TEST_F(UploadDataStreamTest, Chunk) {
231 upload_data_->set_is_chunked(true); 263 upload_data_->set_is_chunked(true);
232 upload_data_->AppendChunk(kTestData, kTestDataSize, false); 264 upload_data_->AppendChunk(kTestData, kTestDataSize, false);
233 upload_data_->AppendChunk(kTestData, kTestDataSize, true); 265 upload_data_->AppendChunk(kTestData, kTestDataSize, true);
234 266
235 const uint64 kStreamSize = kTestDataSize*2; 267 const uint64 kStreamSize = kTestDataSize*2;
236 scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_)); 268 UploadDataStream stream(upload_data_);
237 ASSERT_EQ(OK, stream->InitSync()); 269 ASSERT_EQ(OK, stream.InitSync());
238 EXPECT_FALSE(stream->IsInMemory()); 270 EXPECT_FALSE(stream.IsInMemory());
239 ASSERT_TRUE(stream.get()); 271 EXPECT_EQ(0U, stream.size()); // Content-Length is 0 for chunked data.
240 EXPECT_EQ(0U, stream->size()); // Content-Length is 0 for chunked data. 272 EXPECT_EQ(0U, stream.position());
241 EXPECT_EQ(0U, stream->position()); 273 EXPECT_FALSE(stream.IsEOF());
242 EXPECT_FALSE(stream->IsEOF());
243 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); 274 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize);
244 while (!stream->IsEOF()) { 275 while (!stream.IsEOF()) {
245 int bytes_read = stream->Read(buf, kTestBufferSize); 276 int bytes_read = stream.ReadSync(buf, kTestBufferSize);
246 ASSERT_LE(0, bytes_read); // Not an error. 277 ASSERT_LE(0, bytes_read); // Not an error.
247 } 278 }
248 EXPECT_EQ(kStreamSize, stream->position()); 279 EXPECT_EQ(kStreamSize, stream.position());
249 ASSERT_TRUE(stream->IsEOF()); 280 ASSERT_TRUE(stream.IsEOF());
250 } 281 }
251 282
252 // Init() with on-memory and not-on-memory readers. 283 // Init() with on-memory and not-on-memory readers.
253 TEST_F(UploadDataStreamTest, InitAsync) { 284 TEST_F(UploadDataStreamTest, InitAsync) {
254 // Create stream without element readers. 285 // Create stream without element readers.
255 UploadDataStream stream(upload_data_); 286 UploadDataStream stream(upload_data_);
256 287
257 // Set mock readers to the stream. 288 // Set mock readers to the stream.
258 MockUploadElementReader* reader = NULL; 289 MockUploadElementReader* reader = NULL;
259 290
260 reader = new MockUploadElementReader; 291 reader = new MockUploadElementReader(kTestDataSize, true);
261 EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK)); 292 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); 293 stream.element_readers_.push_back(reader);
265 294
266 reader = new MockUploadElementReader; 295 reader = new MockUploadElementReader(kTestDataSize, true);
267 EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK)); 296 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); 297 stream.element_readers_.push_back(reader);
271 298
272 reader = new MockUploadElementReader; 299 reader = new MockUploadElementReader(kTestDataSize, false);
273 reader->SetAsyncInitExpectation(OK); 300 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); 301 stream.element_readers_.push_back(reader);
277 302
278 reader = new MockUploadElementReader; 303 reader = new MockUploadElementReader(kTestDataSize, false);
279 reader->SetAsyncInitExpectation(OK); 304 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); 305 stream.element_readers_.push_back(reader);
283 306
284 reader = new MockUploadElementReader; 307 reader = new MockUploadElementReader(kTestDataSize, true);
285 EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK)); 308 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); 309 stream.element_readers_.push_back(reader);
289 310
290 // Run Init(). 311 // Run Init().
291 MockCompletionCallback mock_callback; 312 MockCompletionCallback mock_callback;
292 EXPECT_CALL(mock_callback, Run(OK)).Times(1); 313 EXPECT_CALL(mock_callback, Run(OK)).Times(1);
293 EXPECT_EQ(stream.Init(mock_callback.CreateCallback()), ERR_IO_PENDING); 314 EXPECT_EQ(stream.Init(mock_callback.CreateCallback()), ERR_IO_PENDING);
294 MessageLoop::current()->RunAllPending(); 315 MessageLoop::current()->RunAllPending();
295 } 316 }
296 317
297 // Init() of a reader fails asynchronously. 318 // Init() of a reader fails asynchronously.
298 TEST_F(UploadDataStreamTest, InitAsyncFailureAsync) { 319 TEST_F(UploadDataStreamTest, InitAsyncFailureAsync) {
299 // Create stream without element readers. 320 // Create stream without element readers.
300 UploadDataStream stream(upload_data_); 321 UploadDataStream stream(upload_data_);
301 322
302 // Set a mock reader to the stream. 323 // Set a mock reader to the stream.
303 MockUploadElementReader* reader = NULL; 324 MockUploadElementReader* reader = NULL;
304 325
305 reader = new MockUploadElementReader; 326 reader = new MockUploadElementReader(kTestDataSize, false);
306 reader->SetAsyncInitExpectation(ERR_FAILED); 327 reader->SetAsyncInitExpectation(ERR_FAILED);
307 EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(false));
308 stream.element_readers_.push_back(reader); 328 stream.element_readers_.push_back(reader);
309 329
310 // Run Init(). 330 // Run Init().
311 MockCompletionCallback mock_callback; 331 MockCompletionCallback mock_callback;
312 EXPECT_CALL(mock_callback, Run(ERR_FAILED)).Times(1); 332 EXPECT_CALL(mock_callback, Run(ERR_FAILED)).Times(1);
313 EXPECT_EQ(stream.Init(mock_callback.CreateCallback()), ERR_IO_PENDING); 333 EXPECT_EQ(stream.Init(mock_callback.CreateCallback()), ERR_IO_PENDING);
314 MessageLoop::current()->RunAllPending(); 334 MessageLoop::current()->RunAllPending();
315 } 335 }
316 336
317 // Init() of a reader fails synchronously. 337 // Init() of a reader fails synchronously.
318 TEST_F(UploadDataStreamTest, InitAsyncFailureSync) { 338 TEST_F(UploadDataStreamTest, InitAsyncFailureSync) {
319 // Create stream without element readers. 339 // Create stream without element readers.
320 UploadDataStream stream(upload_data_); 340 UploadDataStream stream(upload_data_);
321 341
322 // Set mock readers to the stream. 342 // Set mock readers to the stream.
323 MockUploadElementReader* reader = NULL; 343 MockUploadElementReader* reader = NULL;
324 344
325 reader = new MockUploadElementReader; 345 reader = new MockUploadElementReader(kTestDataSize, false);
326 reader->SetAsyncInitExpectation(OK); 346 reader->SetAsyncInitExpectation(OK);
327 EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(false));
328 stream.element_readers_.push_back(reader); 347 stream.element_readers_.push_back(reader);
329 348
330 reader = new MockUploadElementReader; 349 reader = new MockUploadElementReader(kTestDataSize, true);
331 EXPECT_CALL(*reader, Init(_)).WillOnce(Return(ERR_FAILED)); 350 EXPECT_CALL(*reader, Init(_)).WillOnce(Return(ERR_FAILED));
332 EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(true));
333 stream.element_readers_.push_back(reader); 351 stream.element_readers_.push_back(reader);
334 352
335 // Run Init(). 353 // Run Init().
336 MockCompletionCallback mock_callback; 354 MockCompletionCallback mock_callback;
337 EXPECT_CALL(mock_callback, Run(ERR_FAILED)).Times(1); 355 EXPECT_CALL(mock_callback, Run(ERR_FAILED)).Times(1);
338 EXPECT_EQ(stream.Init(mock_callback.CreateCallback()), ERR_IO_PENDING); 356 EXPECT_EQ(stream.Init(mock_callback.CreateCallback()), ERR_IO_PENDING);
339 MessageLoop::current()->RunAllPending(); 357 MessageLoop::current()->RunAllPending();
340 } 358 }
341 359
360 // Read with a buffer whose size is same as the data.
361 TEST_F(UploadDataStreamTest, ReadAsyncWithExactSizeBuffer) {
362 upload_data_->AppendBytes(kTestData, kTestDataSize);
363 UploadDataStream stream(upload_data_);
364
365 MockCompletionCallback mock_callback;
366 EXPECT_CALL(mock_callback, Run(_)).Times(0);
367
368 ASSERT_EQ(OK, stream.Init(mock_callback.CreateCallback()));
369 EXPECT_TRUE(stream.IsInMemory());
370 EXPECT_EQ(kTestDataSize, stream.size());
371 EXPECT_EQ(0U, stream.position());
372 EXPECT_FALSE(stream.IsEOF());
373 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestDataSize);
374 int bytes_read = stream.Read(buf, kTestDataSize,
375 mock_callback.CreateCallback());
376 ASSERT_EQ(static_cast<int>(kTestDataSize), bytes_read); // Not an error.
377 EXPECT_EQ(kTestDataSize, stream.position());
378 ASSERT_TRUE(stream.IsEOF());
379 }
380
381 // Async Read() with on-memory and not-on-memory readers.
382 TEST_F(UploadDataStreamTest, ReadAsync) {
383 // Create stream without element readers.
384 UploadDataStream stream(upload_data_);
385
386 // Set mock readers to the stream.
387 MockUploadElementReader* reader = NULL;
388
389 reader = new MockUploadElementReader(kTestDataSize, true);
390 EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK));
391 reader->SetReadExpectation(kTestDataSize);
392 stream.element_readers_.push_back(reader);
393
394 reader = new MockUploadElementReader(kTestDataSize, false);
395 reader->SetAsyncInitExpectation(OK);
396 reader->SetReadExpectation(kTestDataSize);
397 stream.element_readers_.push_back(reader);
398
399 reader = new MockUploadElementReader(kTestDataSize, true);
400 EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK));
401 reader->SetReadExpectation(kTestDataSize);
402 stream.element_readers_.push_back(reader);
403
404 reader = new MockUploadElementReader(kTestDataSize, false);
405 reader->SetAsyncInitExpectation(OK);
406 reader->SetReadExpectation(kTestDataSize);
407 stream.element_readers_.push_back(reader);
408
409 // Run Init().
410 MockCompletionCallback mock_callback;
411 EXPECT_CALL(mock_callback, Run(OK)).Times(1);
412 EXPECT_EQ(ERR_IO_PENDING, stream.Init(mock_callback.CreateCallback()));
413 MessageLoop::current()->RunAllPending();
414
415 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize);
416
417 // Consume the first element.
418 EXPECT_CALL(mock_callback, Run(kTestDataSize)).Times(0);
419 EXPECT_EQ(static_cast<int>(kTestDataSize),
420 stream.Read(buf, kTestDataSize, mock_callback.CreateCallback()));
421 MessageLoop::current()->RunAllPending();
422
423 // Consume the second element.
424 EXPECT_CALL(mock_callback, Run(kTestDataSize)).Times(1);
425 EXPECT_EQ(ERR_IO_PENDING,
426 stream.Read(buf, kTestDataSize, mock_callback.CreateCallback()));
427 MessageLoop::current()->RunAllPending();
428
429 // Consume the third and the fourth elements.
430 EXPECT_CALL(mock_callback, Run(kTestDataSize*2)).Times(1);
431 EXPECT_EQ(ERR_IO_PENDING,
432 stream.Read(buf, kTestDataSize*2, mock_callback.CreateCallback()));
433 MessageLoop::current()->RunAllPending();
434 }
435
342 void UploadDataStreamTest::FileChangedHelper(const FilePath& file_path, 436 void UploadDataStreamTest::FileChangedHelper(const FilePath& file_path,
343 const base::Time& time, 437 const base::Time& time,
344 bool error_expected) { 438 bool error_expected) {
345 std::vector<UploadElement> elements; 439 std::vector<UploadElement> elements;
346 UploadElement element; 440 UploadElement element;
347 element.SetToFilePathRange(file_path, 1, 2, time); 441 element.SetToFilePathRange(file_path, 1, 2, time);
348 elements.push_back(element); 442 elements.push_back(element);
349 // Don't use upload_data_ here, as this function is called twice, and 443 // Don't use upload_data_ here, as this function is called twice, and
350 // reusing upload_data_ is wrong. 444 // reusing upload_data_ is wrong.
351 scoped_refptr<UploadData> upload_data(new UploadData); 445 scoped_refptr<UploadData> upload_data(new UploadData);
352 upload_data->SetElements(elements); 446 upload_data->SetElements(elements);
353 447
354 scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data)); 448 UploadDataStream stream(upload_data);
355 int error_code = stream->InitSync(); 449 int error_code = stream.InitSync();
356 if (error_expected) 450 if (error_expected)
357 ASSERT_EQ(ERR_UPLOAD_FILE_CHANGED, error_code); 451 ASSERT_EQ(ERR_UPLOAD_FILE_CHANGED, error_code);
358 else 452 else
359 ASSERT_EQ(OK, error_code); 453 ASSERT_EQ(OK, error_code);
360 } 454 }
361 455
362 TEST_F(UploadDataStreamTest, FileChanged) { 456 TEST_F(UploadDataStreamTest, FileChanged) {
363 FilePath temp_file_path; 457 FilePath temp_file_path;
364 ASSERT_TRUE(file_util::CreateTemporaryFile(&temp_file_path)); 458 ASSERT_TRUE(file_util::CreateTemporaryFile(&temp_file_path));
365 ASSERT_EQ(static_cast<int>(kTestDataSize), 459 ASSERT_EQ(static_cast<int>(kTestDataSize),
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 UploadDataStream stream(upload_data_); 500 UploadDataStream stream(upload_data_);
407 ASSERT_EQ(OK, stream.InitSync()); 501 ASSERT_EQ(OK, stream.InitSync());
408 EXPECT_EQ(kTestDataSize, stream.size()); 502 EXPECT_EQ(kTestDataSize, stream.size());
409 EXPECT_EQ(kTestData, ReadFromUploadDataStream(&stream)); 503 EXPECT_EQ(kTestData, ReadFromUploadDataStream(&stream));
410 } 504 }
411 505
412 file_util::Delete(temp_file_path, false); 506 file_util::Delete(temp_file_path, false);
413 } 507 }
414 508
415 } // namespace net 509 } // namespace net
OLDNEW
« no previous file with comments | « net/base/upload_data_stream.cc ('k') | net/base/upload_element_reader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698