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 "chrome/browser/drive/drive_uploader.h" | 5 #include "chrome/browser/drive/drive_uploader.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 int64 received_bytes() const { return received_bytes_; } | 68 int64 received_bytes() const { return received_bytes_; } |
69 void set_received_bytes(int64 received_bytes) { | 69 void set_received_bytes(int64 received_bytes) { |
70 received_bytes_ = received_bytes; | 70 received_bytes_ = received_bytes; |
71 } | 71 } |
72 | 72 |
73 int64 resume_upload_call_count() const { return resume_upload_call_count_; } | 73 int64 resume_upload_call_count() const { return resume_upload_call_count_; } |
74 | 74 |
75 private: | 75 private: |
76 // DriveServiceInterface overrides. | 76 // DriveServiceInterface overrides. |
77 // Handles a request for obtaining an upload location URL. | 77 // Handles a request for obtaining an upload location URL. |
78 virtual CancelCallback InitiateUploadNewFile( | 78 CancelCallback InitiateUploadNewFile( |
79 const std::string& content_type, | 79 const std::string& content_type, |
80 int64 content_length, | 80 int64 content_length, |
81 const std::string& parent_resource_id, | 81 const std::string& parent_resource_id, |
82 const std::string& title, | 82 const std::string& title, |
83 const InitiateUploadNewFileOptions& options, | 83 const InitiateUploadNewFileOptions& options, |
84 const InitiateUploadCallback& callback) override { | 84 const InitiateUploadCallback& callback) override { |
85 EXPECT_EQ(kTestDocumentTitle, title); | 85 EXPECT_EQ(kTestDocumentTitle, title); |
86 EXPECT_EQ(kTestMimeType, content_type); | 86 EXPECT_EQ(kTestMimeType, content_type); |
87 EXPECT_EQ(expected_content_length_, content_length); | 87 EXPECT_EQ(expected_content_length_, content_length); |
88 EXPECT_EQ(kTestInitiateUploadParentResourceId, parent_resource_id); | 88 EXPECT_EQ(kTestInitiateUploadParentResourceId, parent_resource_id); |
89 | 89 |
90 // Calls back the upload URL for subsequent ResumeUpload requests. | 90 // Calls back the upload URL for subsequent ResumeUpload requests. |
91 // InitiateUpload is an asynchronous function, so don't callback directly. | 91 // InitiateUpload is an asynchronous function, so don't callback directly. |
92 base::MessageLoop::current()->PostTask(FROM_HERE, | 92 base::MessageLoop::current()->PostTask(FROM_HERE, |
93 base::Bind(callback, HTTP_SUCCESS, GURL(kTestUploadNewFileURL))); | 93 base::Bind(callback, HTTP_SUCCESS, GURL(kTestUploadNewFileURL))); |
94 return CancelCallback(); | 94 return CancelCallback(); |
95 } | 95 } |
96 | 96 |
97 virtual CancelCallback InitiateUploadExistingFile( | 97 CancelCallback InitiateUploadExistingFile( |
98 const std::string& content_type, | 98 const std::string& content_type, |
99 int64 content_length, | 99 int64 content_length, |
100 const std::string& resource_id, | 100 const std::string& resource_id, |
101 const InitiateUploadExistingFileOptions& options, | 101 const InitiateUploadExistingFileOptions& options, |
102 const InitiateUploadCallback& callback) override { | 102 const InitiateUploadCallback& callback) override { |
103 EXPECT_EQ(kTestMimeType, content_type); | 103 EXPECT_EQ(kTestMimeType, content_type); |
104 EXPECT_EQ(expected_content_length_, content_length); | 104 EXPECT_EQ(expected_content_length_, content_length); |
105 EXPECT_EQ(kTestInitiateUploadResourceId, resource_id); | 105 EXPECT_EQ(kTestInitiateUploadResourceId, resource_id); |
106 | 106 |
107 if (!options.etag.empty() && options.etag != kTestETag) { | 107 if (!options.etag.empty() && options.etag != kTestETag) { |
108 base::MessageLoop::current()->PostTask(FROM_HERE, | 108 base::MessageLoop::current()->PostTask(FROM_HERE, |
109 base::Bind(callback, HTTP_PRECONDITION, GURL())); | 109 base::Bind(callback, HTTP_PRECONDITION, GURL())); |
110 return CancelCallback(); | 110 return CancelCallback(); |
111 } | 111 } |
112 | 112 |
113 // Calls back the upload URL for subsequent ResumeUpload requests. | 113 // Calls back the upload URL for subsequent ResumeUpload requests. |
114 // InitiateUpload is an asynchronous function, so don't callback directly. | 114 // InitiateUpload is an asynchronous function, so don't callback directly. |
115 base::MessageLoop::current()->PostTask(FROM_HERE, | 115 base::MessageLoop::current()->PostTask(FROM_HERE, |
116 base::Bind(callback, HTTP_SUCCESS, GURL(kTestUploadExistingFileURL))); | 116 base::Bind(callback, HTTP_SUCCESS, GURL(kTestUploadExistingFileURL))); |
117 return CancelCallback(); | 117 return CancelCallback(); |
118 } | 118 } |
119 | 119 |
120 // Handles a request for uploading a chunk of bytes. | 120 // Handles a request for uploading a chunk of bytes. |
121 virtual CancelCallback ResumeUpload( | 121 CancelCallback ResumeUpload( |
122 const GURL& upload_location, | 122 const GURL& upload_location, |
123 int64 start_position, | 123 int64 start_position, |
124 int64 end_position, | 124 int64 end_position, |
125 int64 content_length, | 125 int64 content_length, |
126 const std::string& content_type, | 126 const std::string& content_type, |
127 const base::FilePath& local_file_path, | 127 const base::FilePath& local_file_path, |
128 const UploadRangeCallback& callback, | 128 const UploadRangeCallback& callback, |
129 const ProgressCallback& progress_callback) override { | 129 const ProgressCallback& progress_callback) override { |
130 // The upload range should start from the current first unreceived byte. | 130 // The upload range should start from the current first unreceived byte. |
131 EXPECT_EQ(received_bytes_, start_position); | 131 EXPECT_EQ(received_bytes_, start_position); |
(...skipping 23 matching lines...) Expand all Loading... |
155 int64 chunk_size = end_position - start_position; | 155 int64 chunk_size = end_position - start_position; |
156 base::MessageLoop::current()->PostTask(FROM_HERE, | 156 base::MessageLoop::current()->PostTask(FROM_HERE, |
157 base::Bind(progress_callback, chunk_size, chunk_size)); | 157 base::Bind(progress_callback, chunk_size, chunk_size)); |
158 } | 158 } |
159 | 159 |
160 SendUploadRangeResponse(upload_location, callback); | 160 SendUploadRangeResponse(upload_location, callback); |
161 return CancelCallback(); | 161 return CancelCallback(); |
162 } | 162 } |
163 | 163 |
164 // Handles a request to fetch the current upload status. | 164 // Handles a request to fetch the current upload status. |
165 virtual CancelCallback GetUploadStatus( | 165 CancelCallback GetUploadStatus(const GURL& upload_location, |
166 const GURL& upload_location, | 166 int64 content_length, |
167 int64 content_length, | 167 const UploadRangeCallback& callback) override { |
168 const UploadRangeCallback& callback) override { | |
169 EXPECT_EQ(expected_content_length_, content_length); | 168 EXPECT_EQ(expected_content_length_, content_length); |
170 // The upload URL returned by InitiateUpload() must be used. | 169 // The upload URL returned by InitiateUpload() must be used. |
171 EXPECT_TRUE(GURL(kTestUploadNewFileURL) == upload_location || | 170 EXPECT_TRUE(GURL(kTestUploadNewFileURL) == upload_location || |
172 GURL(kTestUploadExistingFileURL) == upload_location); | 171 GURL(kTestUploadExistingFileURL) == upload_location); |
173 | 172 |
174 SendUploadRangeResponse(upload_location, callback); | 173 SendUploadRangeResponse(upload_location, callback); |
175 return CancelCallback(); | 174 return CancelCallback(); |
176 } | 175 } |
177 | 176 |
178 // Runs |callback| with the current upload status. | 177 // Runs |callback| with the current upload status. |
(...skipping 21 matching lines...) Expand all Loading... |
200 | 199 |
201 const base::FilePath expected_upload_file_; | 200 const base::FilePath expected_upload_file_; |
202 const int64 expected_content_length_; | 201 const int64 expected_content_length_; |
203 int64 received_bytes_; | 202 int64 received_bytes_; |
204 int64 resume_upload_call_count_; | 203 int64 resume_upload_call_count_; |
205 }; | 204 }; |
206 | 205 |
207 // Mock DriveService that returns a failure at InitiateUpload(). | 206 // Mock DriveService that returns a failure at InitiateUpload(). |
208 class MockDriveServiceNoConnectionAtInitiate : public DummyDriveService { | 207 class MockDriveServiceNoConnectionAtInitiate : public DummyDriveService { |
209 // Returns error. | 208 // Returns error. |
210 virtual CancelCallback InitiateUploadNewFile( | 209 CancelCallback InitiateUploadNewFile( |
211 const std::string& content_type, | 210 const std::string& content_type, |
212 int64 content_length, | 211 int64 content_length, |
213 const std::string& parent_resource_id, | 212 const std::string& parent_resource_id, |
214 const std::string& title, | 213 const std::string& title, |
215 const InitiateUploadNewFileOptions& options, | 214 const InitiateUploadNewFileOptions& options, |
216 const InitiateUploadCallback& callback) override { | 215 const InitiateUploadCallback& callback) override { |
217 base::MessageLoop::current()->PostTask(FROM_HERE, | 216 base::MessageLoop::current()->PostTask(FROM_HERE, |
218 base::Bind(callback, GDATA_NO_CONNECTION, GURL())); | 217 base::Bind(callback, GDATA_NO_CONNECTION, GURL())); |
219 return CancelCallback(); | 218 return CancelCallback(); |
220 } | 219 } |
221 | 220 |
222 virtual CancelCallback InitiateUploadExistingFile( | 221 CancelCallback InitiateUploadExistingFile( |
223 const std::string& content_type, | 222 const std::string& content_type, |
224 int64 content_length, | 223 int64 content_length, |
225 const std::string& resource_id, | 224 const std::string& resource_id, |
226 const InitiateUploadExistingFileOptions& options, | 225 const InitiateUploadExistingFileOptions& options, |
227 const InitiateUploadCallback& callback) override { | 226 const InitiateUploadCallback& callback) override { |
228 base::MessageLoop::current()->PostTask(FROM_HERE, | 227 base::MessageLoop::current()->PostTask(FROM_HERE, |
229 base::Bind(callback, GDATA_NO_CONNECTION, GURL())); | 228 base::Bind(callback, GDATA_NO_CONNECTION, GURL())); |
230 return CancelCallback(); | 229 return CancelCallback(); |
231 } | 230 } |
232 | 231 |
233 // Should not be used. | 232 // Should not be used. |
234 virtual CancelCallback ResumeUpload( | 233 CancelCallback ResumeUpload( |
235 const GURL& upload_url, | 234 const GURL& upload_url, |
236 int64 start_position, | 235 int64 start_position, |
237 int64 end_position, | 236 int64 end_position, |
238 int64 content_length, | 237 int64 content_length, |
239 const std::string& content_type, | 238 const std::string& content_type, |
240 const base::FilePath& local_file_path, | 239 const base::FilePath& local_file_path, |
241 const UploadRangeCallback& callback, | 240 const UploadRangeCallback& callback, |
242 const ProgressCallback& progress_callback) override { | 241 const ProgressCallback& progress_callback) override { |
243 NOTREACHED(); | 242 NOTREACHED(); |
244 return CancelCallback(); | 243 return CancelCallback(); |
245 } | 244 } |
246 }; | 245 }; |
247 | 246 |
248 // Mock DriveService that returns a failure at ResumeUpload(). | 247 // Mock DriveService that returns a failure at ResumeUpload(). |
249 class MockDriveServiceNoConnectionAtResume : public DummyDriveService { | 248 class MockDriveServiceNoConnectionAtResume : public DummyDriveService { |
250 // Succeeds and returns an upload location URL. | 249 // Succeeds and returns an upload location URL. |
251 virtual CancelCallback InitiateUploadNewFile( | 250 CancelCallback InitiateUploadNewFile( |
252 const std::string& content_type, | 251 const std::string& content_type, |
253 int64 content_length, | 252 int64 content_length, |
254 const std::string& parent_resource_id, | 253 const std::string& parent_resource_id, |
255 const std::string& title, | 254 const std::string& title, |
256 const InitiateUploadNewFileOptions& options, | 255 const InitiateUploadNewFileOptions& options, |
257 const InitiateUploadCallback& callback) override { | 256 const InitiateUploadCallback& callback) override { |
258 base::MessageLoop::current()->PostTask(FROM_HERE, | 257 base::MessageLoop::current()->PostTask(FROM_HERE, |
259 base::Bind(callback, HTTP_SUCCESS, GURL(kTestUploadNewFileURL))); | 258 base::Bind(callback, HTTP_SUCCESS, GURL(kTestUploadNewFileURL))); |
260 return CancelCallback(); | 259 return CancelCallback(); |
261 } | 260 } |
262 | 261 |
263 virtual CancelCallback InitiateUploadExistingFile( | 262 CancelCallback InitiateUploadExistingFile( |
264 const std::string& content_type, | 263 const std::string& content_type, |
265 int64 content_length, | 264 int64 content_length, |
266 const std::string& resource_id, | 265 const std::string& resource_id, |
267 const InitiateUploadExistingFileOptions& options, | 266 const InitiateUploadExistingFileOptions& options, |
268 const InitiateUploadCallback& callback) override { | 267 const InitiateUploadCallback& callback) override { |
269 base::MessageLoop::current()->PostTask(FROM_HERE, | 268 base::MessageLoop::current()->PostTask(FROM_HERE, |
270 base::Bind(callback, HTTP_SUCCESS, GURL(kTestUploadExistingFileURL))); | 269 base::Bind(callback, HTTP_SUCCESS, GURL(kTestUploadExistingFileURL))); |
271 return CancelCallback(); | 270 return CancelCallback(); |
272 } | 271 } |
273 | 272 |
274 // Returns error. | 273 // Returns error. |
275 virtual CancelCallback ResumeUpload( | 274 CancelCallback ResumeUpload( |
276 const GURL& upload_url, | 275 const GURL& upload_url, |
277 int64 start_position, | 276 int64 start_position, |
278 int64 end_position, | 277 int64 end_position, |
279 int64 content_length, | 278 int64 content_length, |
280 const std::string& content_type, | 279 const std::string& content_type, |
281 const base::FilePath& local_file_path, | 280 const base::FilePath& local_file_path, |
282 const UploadRangeCallback& callback, | 281 const UploadRangeCallback& callback, |
283 const ProgressCallback& progress_callback) override { | 282 const ProgressCallback& progress_callback) override { |
284 base::MessageLoop::current()->PostTask(FROM_HERE, | 283 base::MessageLoop::current()->PostTask(FROM_HERE, |
285 base::Bind(callback, | 284 base::Bind(callback, |
286 UploadRangeResponse(GDATA_NO_CONNECTION, -1, -1), | 285 UploadRangeResponse(GDATA_NO_CONNECTION, -1, -1), |
287 base::Passed(scoped_ptr<FileResource>()))); | 286 base::Passed(scoped_ptr<FileResource>()))); |
288 return CancelCallback(); | 287 return CancelCallback(); |
289 } | 288 } |
290 }; | 289 }; |
291 | 290 |
292 // Mock DriveService that returns a failure at GetUploadStatus(). | 291 // Mock DriveService that returns a failure at GetUploadStatus(). |
293 class MockDriveServiceNoConnectionAtGetUploadStatus : public DummyDriveService { | 292 class MockDriveServiceNoConnectionAtGetUploadStatus : public DummyDriveService { |
294 // Returns error. | 293 // Returns error. |
295 virtual CancelCallback GetUploadStatus( | 294 CancelCallback GetUploadStatus(const GURL& upload_url, |
296 const GURL& upload_url, | 295 int64 content_length, |
297 int64 content_length, | 296 const UploadRangeCallback& callback) override { |
298 const UploadRangeCallback& callback) override { | |
299 base::MessageLoop::current()->PostTask(FROM_HERE, | 297 base::MessageLoop::current()->PostTask(FROM_HERE, |
300 base::Bind(callback, | 298 base::Bind(callback, |
301 UploadRangeResponse(GDATA_NO_CONNECTION, -1, -1), | 299 UploadRangeResponse(GDATA_NO_CONNECTION, -1, -1), |
302 base::Passed(scoped_ptr<FileResource>()))); | 300 base::Passed(scoped_ptr<FileResource>()))); |
303 return CancelCallback(); | 301 return CancelCallback(); |
304 } | 302 } |
305 }; | 303 }; |
306 | 304 |
307 class DriveUploaderTest : public testing::Test { | 305 class DriveUploaderTest : public testing::Test { |
308 public: | 306 public: |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
579 EXPECT_EQ(HTTP_SUCCESS, error); | 577 EXPECT_EQ(HTTP_SUCCESS, error); |
580 EXPECT_TRUE(upload_location.is_empty()); | 578 EXPECT_TRUE(upload_location.is_empty()); |
581 ASSERT_TRUE(entry); | 579 ASSERT_TRUE(entry); |
582 EXPECT_EQ(kTestDummyMd5, entry->md5_checksum()); | 580 EXPECT_EQ(kTestDummyMd5, entry->md5_checksum()); |
583 ASSERT_EQ(1U, upload_progress_values.size()); | 581 ASSERT_EQ(1U, upload_progress_values.size()); |
584 EXPECT_EQ(test_util::ProgressInfo(1024 * 1024, 1024 * 1024), | 582 EXPECT_EQ(test_util::ProgressInfo(1024 * 1024, 1024 * 1024), |
585 upload_progress_values[0]); | 583 upload_progress_values[0]); |
586 } | 584 } |
587 | 585 |
588 } // namespace drive | 586 } // namespace drive |
OLD | NEW |