OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/chromeos/drive/sync/entry_update_performer.h" | 5 #include "chrome/browser/chromeos/drive/sync/entry_update_performer.h" |
6 | 6 |
7 #include "base/callback_helpers.h" | 7 #include "base/callback_helpers.h" |
8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
9 #include "base/md5.h" | 9 #include "base/md5.h" |
10 #include "base/task_runner_util.h" | 10 #include "base/task_runner_util.h" |
11 #include "chrome/browser/chromeos/drive/file_cache.h" | 11 #include "chrome/browser/chromeos/drive/file_cache.h" |
12 #include "chrome/browser/chromeos/drive/file_system/download_operation.h" | 12 #include "chrome/browser/chromeos/drive/file_system/download_operation.h" |
13 #include "chrome/browser/chromeos/drive/file_system/operation_test_base.h" | 13 #include "chrome/browser/chromeos/drive/file_system/operation_test_base.h" |
14 #include "chrome/browser/chromeos/drive/job_scheduler.h" | 14 #include "chrome/browser/chromeos/drive/job_scheduler.h" |
15 #include "chrome/browser/chromeos/drive/resource_metadata.h" | 15 #include "chrome/browser/chromeos/drive/resource_metadata.h" |
16 #include "chrome/browser/drive/drive_api_util.h" | 16 #include "chrome/browser/drive/drive_api_util.h" |
17 #include "chrome/browser/drive/fake_drive_service.h" | 17 #include "chrome/browser/drive/fake_drive_service.h" |
| 18 #include "content/public/test/test_utils.h" |
18 #include "google_apis/drive/drive_api_parser.h" | 19 #include "google_apis/drive/drive_api_parser.h" |
19 #include "google_apis/drive/test_util.h" | 20 #include "google_apis/drive/test_util.h" |
20 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
21 | 22 |
22 namespace drive { | 23 namespace drive { |
23 namespace internal { | 24 namespace internal { |
24 | 25 |
25 class EntryUpdatePerformerTest : public file_system::OperationTestBase { | 26 class EntryUpdatePerformerTest : public file_system::OperationTestBase { |
26 protected: | 27 protected: |
27 virtual void SetUp() OVERRIDE { | 28 virtual void SetUp() OVERRIDE { |
(...skipping 17 matching lines...) Expand all Loading... |
45 // Store the file to cache. | 46 // Store the file to cache. |
46 FileError error = FILE_ERROR_FAILED; | 47 FileError error = FILE_ERROR_FAILED; |
47 base::PostTaskAndReplyWithResult( | 48 base::PostTaskAndReplyWithResult( |
48 blocking_task_runner(), | 49 blocking_task_runner(), |
49 FROM_HERE, | 50 FROM_HERE, |
50 base::Bind(&FileCache::Store, | 51 base::Bind(&FileCache::Store, |
51 base::Unretained(cache()), | 52 base::Unretained(cache()), |
52 local_id, std::string(), path, | 53 local_id, std::string(), path, |
53 FileCache::FILE_OPERATION_COPY), | 54 FileCache::FILE_OPERATION_COPY), |
54 google_apis::test_util::CreateCopyResultCallback(&error)); | 55 google_apis::test_util::CreateCopyResultCallback(&error)); |
55 test_util::RunBlockingPoolTask(); | 56 content::RunAllBlockingPoolTasksUntilIdle(); |
56 return error; | 57 return error; |
57 } | 58 } |
58 | 59 |
59 scoped_ptr<EntryUpdatePerformer> performer_; | 60 scoped_ptr<EntryUpdatePerformer> performer_; |
60 }; | 61 }; |
61 | 62 |
62 TEST_F(EntryUpdatePerformerTest, UpdateEntry) { | 63 TEST_F(EntryUpdatePerformerTest, UpdateEntry) { |
63 base::FilePath src_path( | 64 base::FilePath src_path( |
64 FILE_PATH_LITERAL("drive/root/Directory 1/SubDirectory File 1.txt")); | 65 FILE_PATH_LITERAL("drive/root/Directory 1/SubDirectory File 1.txt")); |
65 base::FilePath dest_path( | 66 base::FilePath dest_path( |
(...skipping 18 matching lines...) Expand all Loading... |
84 src_entry.set_metadata_edit_state(ResourceEntry::DIRTY); | 85 src_entry.set_metadata_edit_state(ResourceEntry::DIRTY); |
85 | 86 |
86 FileError error = FILE_ERROR_FAILED; | 87 FileError error = FILE_ERROR_FAILED; |
87 base::PostTaskAndReplyWithResult( | 88 base::PostTaskAndReplyWithResult( |
88 blocking_task_runner(), | 89 blocking_task_runner(), |
89 FROM_HERE, | 90 FROM_HERE, |
90 base::Bind(&ResourceMetadata::RefreshEntry, | 91 base::Bind(&ResourceMetadata::RefreshEntry, |
91 base::Unretained(metadata()), | 92 base::Unretained(metadata()), |
92 src_entry), | 93 src_entry), |
93 google_apis::test_util::CreateCopyResultCallback(&error)); | 94 google_apis::test_util::CreateCopyResultCallback(&error)); |
94 test_util::RunBlockingPoolTask(); | 95 content::RunAllBlockingPoolTasksUntilIdle(); |
95 EXPECT_EQ(FILE_ERROR_OK, error); | 96 EXPECT_EQ(FILE_ERROR_OK, error); |
96 | 97 |
97 // Perform server side update. | 98 // Perform server side update. |
98 error = FILE_ERROR_FAILED; | 99 error = FILE_ERROR_FAILED; |
99 performer_->UpdateEntry( | 100 performer_->UpdateEntry( |
100 src_entry.local_id(), | 101 src_entry.local_id(), |
101 ClientContext(USER_INITIATED), | 102 ClientContext(USER_INITIATED), |
102 google_apis::test_util::CreateCopyResultCallback(&error)); | 103 google_apis::test_util::CreateCopyResultCallback(&error)); |
103 test_util::RunBlockingPoolTask(); | 104 content::RunAllBlockingPoolTasksUntilIdle(); |
104 EXPECT_EQ(FILE_ERROR_OK, error); | 105 EXPECT_EQ(FILE_ERROR_OK, error); |
105 | 106 |
106 // Verify the file is updated on the server. | 107 // Verify the file is updated on the server. |
107 google_apis::GDataErrorCode gdata_error = google_apis::GDATA_OTHER_ERROR; | 108 google_apis::GDataErrorCode gdata_error = google_apis::GDATA_OTHER_ERROR; |
108 scoped_ptr<google_apis::FileResource> gdata_entry; | 109 scoped_ptr<google_apis::FileResource> gdata_entry; |
109 fake_service()->GetFileResource( | 110 fake_service()->GetFileResource( |
110 src_entry.resource_id(), | 111 src_entry.resource_id(), |
111 google_apis::test_util::CreateCopyResultCallback(&gdata_error, | 112 google_apis::test_util::CreateCopyResultCallback(&gdata_error, |
112 &gdata_entry)); | 113 &gdata_entry)); |
113 test_util::RunBlockingPoolTask(); | 114 content::RunAllBlockingPoolTasksUntilIdle(); |
114 EXPECT_EQ(google_apis::HTTP_SUCCESS, gdata_error); | 115 EXPECT_EQ(google_apis::HTTP_SUCCESS, gdata_error); |
115 ASSERT_TRUE(gdata_entry); | 116 ASSERT_TRUE(gdata_entry); |
116 | 117 |
117 EXPECT_EQ(src_entry.title(), gdata_entry->title()); | 118 EXPECT_EQ(src_entry.title(), gdata_entry->title()); |
118 EXPECT_EQ(new_last_modified, gdata_entry->modified_date()); | 119 EXPECT_EQ(new_last_modified, gdata_entry->modified_date()); |
119 EXPECT_EQ(new_last_accessed, gdata_entry->last_viewed_by_me_date()); | 120 EXPECT_EQ(new_last_accessed, gdata_entry->last_viewed_by_me_date()); |
120 | 121 |
121 ASSERT_FALSE(gdata_entry->parents().empty()); | 122 ASSERT_FALSE(gdata_entry->parents().empty()); |
122 EXPECT_EQ(dest_entry.resource_id(), gdata_entry->parents()[0].file_id()); | 123 EXPECT_EQ(dest_entry.resource_id(), gdata_entry->parents()[0].file_id()); |
123 } | 124 } |
(...skipping 10 matching lines...) Expand all Loading... |
134 FileError error = FILE_ERROR_FAILED; | 135 FileError error = FILE_ERROR_FAILED; |
135 base::FilePath cache_file_path; | 136 base::FilePath cache_file_path; |
136 scoped_ptr<ResourceEntry> src_entry; | 137 scoped_ptr<ResourceEntry> src_entry; |
137 download_operation.EnsureFileDownloadedByPath( | 138 download_operation.EnsureFileDownloadedByPath( |
138 src_path, | 139 src_path, |
139 ClientContext(USER_INITIATED), | 140 ClientContext(USER_INITIATED), |
140 GetFileContentInitializedCallback(), | 141 GetFileContentInitializedCallback(), |
141 google_apis::GetContentCallback(), | 142 google_apis::GetContentCallback(), |
142 google_apis::test_util::CreateCopyResultCallback( | 143 google_apis::test_util::CreateCopyResultCallback( |
143 &error, &cache_file_path, &src_entry)); | 144 &error, &cache_file_path, &src_entry)); |
144 test_util::RunBlockingPoolTask(); | 145 content::RunAllBlockingPoolTasksUntilIdle(); |
145 EXPECT_EQ(FILE_ERROR_OK, error); | 146 EXPECT_EQ(FILE_ERROR_OK, error); |
146 ASSERT_TRUE(src_entry); | 147 ASSERT_TRUE(src_entry); |
147 | 148 |
148 // Update the entry locally. | 149 // Update the entry locally. |
149 src_entry->set_title("Updated" + src_entry->title()); | 150 src_entry->set_title("Updated" + src_entry->title()); |
150 src_entry->set_metadata_edit_state(ResourceEntry::DIRTY); | 151 src_entry->set_metadata_edit_state(ResourceEntry::DIRTY); |
151 | 152 |
152 error = FILE_ERROR_FAILED; | 153 error = FILE_ERROR_FAILED; |
153 base::PostTaskAndReplyWithResult( | 154 base::PostTaskAndReplyWithResult( |
154 blocking_task_runner(), | 155 blocking_task_runner(), |
155 FROM_HERE, | 156 FROM_HERE, |
156 base::Bind(&ResourceMetadata::RefreshEntry, | 157 base::Bind(&ResourceMetadata::RefreshEntry, |
157 base::Unretained(metadata()), | 158 base::Unretained(metadata()), |
158 *src_entry), | 159 *src_entry), |
159 google_apis::test_util::CreateCopyResultCallback(&error)); | 160 google_apis::test_util::CreateCopyResultCallback(&error)); |
160 test_util::RunBlockingPoolTask(); | 161 content::RunAllBlockingPoolTasksUntilIdle(); |
161 EXPECT_EQ(FILE_ERROR_OK, error); | 162 EXPECT_EQ(FILE_ERROR_OK, error); |
162 | 163 |
163 // Perform server side update. This shouldn't fail. (crbug.com/358590) | 164 // Perform server side update. This shouldn't fail. (crbug.com/358590) |
164 error = FILE_ERROR_FAILED; | 165 error = FILE_ERROR_FAILED; |
165 performer_->UpdateEntry( | 166 performer_->UpdateEntry( |
166 src_entry->local_id(), | 167 src_entry->local_id(), |
167 ClientContext(USER_INITIATED), | 168 ClientContext(USER_INITIATED), |
168 google_apis::test_util::CreateCopyResultCallback(&error)); | 169 google_apis::test_util::CreateCopyResultCallback(&error)); |
169 test_util::RunBlockingPoolTask(); | 170 content::RunAllBlockingPoolTasksUntilIdle(); |
170 EXPECT_EQ(FILE_ERROR_OK, error); | 171 EXPECT_EQ(FILE_ERROR_OK, error); |
171 | 172 |
172 // Verify the file is updated on the server. | 173 // Verify the file is updated on the server. |
173 google_apis::GDataErrorCode gdata_error = google_apis::GDATA_OTHER_ERROR; | 174 google_apis::GDataErrorCode gdata_error = google_apis::GDATA_OTHER_ERROR; |
174 scoped_ptr<google_apis::FileResource> gdata_entry; | 175 scoped_ptr<google_apis::FileResource> gdata_entry; |
175 fake_service()->GetFileResource( | 176 fake_service()->GetFileResource( |
176 src_entry->resource_id(), | 177 src_entry->resource_id(), |
177 google_apis::test_util::CreateCopyResultCallback(&gdata_error, | 178 google_apis::test_util::CreateCopyResultCallback(&gdata_error, |
178 &gdata_entry)); | 179 &gdata_entry)); |
179 test_util::RunBlockingPoolTask(); | 180 content::RunAllBlockingPoolTasksUntilIdle(); |
180 EXPECT_EQ(google_apis::HTTP_SUCCESS, gdata_error); | 181 EXPECT_EQ(google_apis::HTTP_SUCCESS, gdata_error); |
181 ASSERT_TRUE(gdata_entry); | 182 ASSERT_TRUE(gdata_entry); |
182 EXPECT_EQ(src_entry->title(), gdata_entry->title()); | 183 EXPECT_EQ(src_entry->title(), gdata_entry->title()); |
183 } | 184 } |
184 | 185 |
185 TEST_F(EntryUpdatePerformerTest, UpdateEntry_NotFound) { | 186 TEST_F(EntryUpdatePerformerTest, UpdateEntry_NotFound) { |
186 const std::string id = "this ID should result in NOT_FOUND"; | 187 const std::string id = "this ID should result in NOT_FOUND"; |
187 FileError error = FILE_ERROR_FAILED; | 188 FileError error = FILE_ERROR_FAILED; |
188 performer_->UpdateEntry( | 189 performer_->UpdateEntry( |
189 id, ClientContext(USER_INITIATED), | 190 id, ClientContext(USER_INITIATED), |
190 google_apis::test_util::CreateCopyResultCallback(&error)); | 191 google_apis::test_util::CreateCopyResultCallback(&error)); |
191 test_util::RunBlockingPoolTask(); | 192 content::RunAllBlockingPoolTasksUntilIdle(); |
192 EXPECT_EQ(FILE_ERROR_NOT_FOUND, error); | 193 EXPECT_EQ(FILE_ERROR_NOT_FOUND, error); |
193 } | 194 } |
194 | 195 |
195 TEST_F(EntryUpdatePerformerTest, UpdateEntry_ContentUpdate) { | 196 TEST_F(EntryUpdatePerformerTest, UpdateEntry_ContentUpdate) { |
196 const base::FilePath kFilePath(FILE_PATH_LITERAL("drive/root/File 1.txt")); | 197 const base::FilePath kFilePath(FILE_PATH_LITERAL("drive/root/File 1.txt")); |
197 const std::string kResourceId("file:2_file_resource_id"); | 198 const std::string kResourceId("file:2_file_resource_id"); |
198 | 199 |
199 const std::string local_id = GetLocalId(kFilePath); | 200 const std::string local_id = GetLocalId(kFilePath); |
200 EXPECT_FALSE(local_id.empty()); | 201 EXPECT_FALSE(local_id.empty()); |
201 | 202 |
202 const std::string kTestFileContent = "I'm being uploaded! Yay!"; | 203 const std::string kTestFileContent = "I'm being uploaded! Yay!"; |
203 EXPECT_EQ(FILE_ERROR_OK, StoreAndMarkDirty(local_id, kTestFileContent)); | 204 EXPECT_EQ(FILE_ERROR_OK, StoreAndMarkDirty(local_id, kTestFileContent)); |
204 | 205 |
205 int64 original_changestamp = | 206 int64 original_changestamp = |
206 fake_service()->about_resource().largest_change_id(); | 207 fake_service()->about_resource().largest_change_id(); |
207 | 208 |
208 // The callback will be called upon completion of UpdateEntry(). | 209 // The callback will be called upon completion of UpdateEntry(). |
209 FileError error = FILE_ERROR_FAILED; | 210 FileError error = FILE_ERROR_FAILED; |
210 performer_->UpdateEntry( | 211 performer_->UpdateEntry( |
211 local_id, | 212 local_id, |
212 ClientContext(USER_INITIATED), | 213 ClientContext(USER_INITIATED), |
213 google_apis::test_util::CreateCopyResultCallback(&error)); | 214 google_apis::test_util::CreateCopyResultCallback(&error)); |
214 test_util::RunBlockingPoolTask(); | 215 content::RunAllBlockingPoolTasksUntilIdle(); |
215 EXPECT_EQ(FILE_ERROR_OK, error); | 216 EXPECT_EQ(FILE_ERROR_OK, error); |
216 | 217 |
217 // Check that the server has received an update. | 218 // Check that the server has received an update. |
218 EXPECT_LT(original_changestamp, | 219 EXPECT_LT(original_changestamp, |
219 fake_service()->about_resource().largest_change_id()); | 220 fake_service()->about_resource().largest_change_id()); |
220 | 221 |
221 // Check that the file size is updated to that of the updated content. | 222 // Check that the file size is updated to that of the updated content. |
222 google_apis::GDataErrorCode gdata_error = google_apis::GDATA_OTHER_ERROR; | 223 google_apis::GDataErrorCode gdata_error = google_apis::GDATA_OTHER_ERROR; |
223 scoped_ptr<google_apis::FileResource> server_entry; | 224 scoped_ptr<google_apis::FileResource> server_entry; |
224 fake_service()->GetFileResource( | 225 fake_service()->GetFileResource( |
225 kResourceId, | 226 kResourceId, |
226 google_apis::test_util::CreateCopyResultCallback(&gdata_error, | 227 google_apis::test_util::CreateCopyResultCallback(&gdata_error, |
227 &server_entry)); | 228 &server_entry)); |
228 test_util::RunBlockingPoolTask(); | 229 content::RunAllBlockingPoolTasksUntilIdle(); |
229 EXPECT_EQ(google_apis::HTTP_SUCCESS, gdata_error); | 230 EXPECT_EQ(google_apis::HTTP_SUCCESS, gdata_error); |
230 EXPECT_EQ(static_cast<int64>(kTestFileContent.size()), | 231 EXPECT_EQ(static_cast<int64>(kTestFileContent.size()), |
231 server_entry->file_size()); | 232 server_entry->file_size()); |
232 | 233 |
233 // Make sure that the cache is no longer dirty. | 234 // Make sure that the cache is no longer dirty. |
234 ResourceEntry entry; | 235 ResourceEntry entry; |
235 EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); | 236 EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); |
236 EXPECT_FALSE(entry.file_specific_info().cache_state().is_dirty()); | 237 EXPECT_FALSE(entry.file_specific_info().cache_state().is_dirty()); |
237 } | 238 } |
238 | 239 |
239 TEST_F(EntryUpdatePerformerTest, UpdateEntry_ContentUpdateMd5Check) { | 240 TEST_F(EntryUpdatePerformerTest, UpdateEntry_ContentUpdateMd5Check) { |
240 const base::FilePath kFilePath(FILE_PATH_LITERAL("drive/root/File 1.txt")); | 241 const base::FilePath kFilePath(FILE_PATH_LITERAL("drive/root/File 1.txt")); |
241 const std::string kResourceId("file:2_file_resource_id"); | 242 const std::string kResourceId("file:2_file_resource_id"); |
242 | 243 |
243 const std::string local_id = GetLocalId(kFilePath); | 244 const std::string local_id = GetLocalId(kFilePath); |
244 EXPECT_FALSE(local_id.empty()); | 245 EXPECT_FALSE(local_id.empty()); |
245 | 246 |
246 const std::string kTestFileContent = "I'm being uploaded! Yay!"; | 247 const std::string kTestFileContent = "I'm being uploaded! Yay!"; |
247 EXPECT_EQ(FILE_ERROR_OK, StoreAndMarkDirty(local_id, kTestFileContent)); | 248 EXPECT_EQ(FILE_ERROR_OK, StoreAndMarkDirty(local_id, kTestFileContent)); |
248 | 249 |
249 int64 original_changestamp = | 250 int64 original_changestamp = |
250 fake_service()->about_resource().largest_change_id(); | 251 fake_service()->about_resource().largest_change_id(); |
251 | 252 |
252 // The callback will be called upon completion of UpdateEntry(). | 253 // The callback will be called upon completion of UpdateEntry(). |
253 FileError error = FILE_ERROR_FAILED; | 254 FileError error = FILE_ERROR_FAILED; |
254 performer_->UpdateEntry( | 255 performer_->UpdateEntry( |
255 local_id, | 256 local_id, |
256 ClientContext(USER_INITIATED), | 257 ClientContext(USER_INITIATED), |
257 google_apis::test_util::CreateCopyResultCallback(&error)); | 258 google_apis::test_util::CreateCopyResultCallback(&error)); |
258 test_util::RunBlockingPoolTask(); | 259 content::RunAllBlockingPoolTasksUntilIdle(); |
259 EXPECT_EQ(FILE_ERROR_OK, error); | 260 EXPECT_EQ(FILE_ERROR_OK, error); |
260 | 261 |
261 // Check that the server has received an update. | 262 // Check that the server has received an update. |
262 EXPECT_LT(original_changestamp, | 263 EXPECT_LT(original_changestamp, |
263 fake_service()->about_resource().largest_change_id()); | 264 fake_service()->about_resource().largest_change_id()); |
264 | 265 |
265 // Check that the file size is updated to that of the updated content. | 266 // Check that the file size is updated to that of the updated content. |
266 google_apis::GDataErrorCode gdata_error = google_apis::GDATA_OTHER_ERROR; | 267 google_apis::GDataErrorCode gdata_error = google_apis::GDATA_OTHER_ERROR; |
267 scoped_ptr<google_apis::FileResource> server_entry; | 268 scoped_ptr<google_apis::FileResource> server_entry; |
268 fake_service()->GetFileResource( | 269 fake_service()->GetFileResource( |
269 kResourceId, | 270 kResourceId, |
270 google_apis::test_util::CreateCopyResultCallback(&gdata_error, | 271 google_apis::test_util::CreateCopyResultCallback(&gdata_error, |
271 &server_entry)); | 272 &server_entry)); |
272 test_util::RunBlockingPoolTask(); | 273 content::RunAllBlockingPoolTasksUntilIdle(); |
273 EXPECT_EQ(google_apis::HTTP_SUCCESS, gdata_error); | 274 EXPECT_EQ(google_apis::HTTP_SUCCESS, gdata_error); |
274 EXPECT_EQ(static_cast<int64>(kTestFileContent.size()), | 275 EXPECT_EQ(static_cast<int64>(kTestFileContent.size()), |
275 server_entry->file_size()); | 276 server_entry->file_size()); |
276 | 277 |
277 // Make sure that the cache is no longer dirty. | 278 // Make sure that the cache is no longer dirty. |
278 ResourceEntry entry; | 279 ResourceEntry entry; |
279 EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); | 280 EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); |
280 EXPECT_FALSE(entry.file_specific_info().cache_state().is_dirty()); | 281 EXPECT_FALSE(entry.file_specific_info().cache_state().is_dirty()); |
281 | 282 |
282 // Again mark the cache file dirty. | 283 // Again mark the cache file dirty. |
283 scoped_ptr<base::ScopedClosureRunner> file_closer; | 284 scoped_ptr<base::ScopedClosureRunner> file_closer; |
284 error = FILE_ERROR_FAILED; | 285 error = FILE_ERROR_FAILED; |
285 base::PostTaskAndReplyWithResult( | 286 base::PostTaskAndReplyWithResult( |
286 blocking_task_runner(), | 287 blocking_task_runner(), |
287 FROM_HERE, | 288 FROM_HERE, |
288 base::Bind(&FileCache::OpenForWrite, | 289 base::Bind(&FileCache::OpenForWrite, |
289 base::Unretained(cache()), | 290 base::Unretained(cache()), |
290 local_id, | 291 local_id, |
291 &file_closer), | 292 &file_closer), |
292 google_apis::test_util::CreateCopyResultCallback(&error)); | 293 google_apis::test_util::CreateCopyResultCallback(&error)); |
293 test_util::RunBlockingPoolTask(); | 294 content::RunAllBlockingPoolTasksUntilIdle(); |
294 EXPECT_EQ(FILE_ERROR_OK, error); | 295 EXPECT_EQ(FILE_ERROR_OK, error); |
295 file_closer.reset(); | 296 file_closer.reset(); |
296 | 297 |
297 // And call UpdateEntry again. | 298 // And call UpdateEntry again. |
298 // In this case, although the file is marked as dirty, but the content | 299 // In this case, although the file is marked as dirty, but the content |
299 // hasn't been changed. Thus, the actual uploading should be skipped. | 300 // hasn't been changed. Thus, the actual uploading should be skipped. |
300 original_changestamp = fake_service()->about_resource().largest_change_id(); | 301 original_changestamp = fake_service()->about_resource().largest_change_id(); |
301 error = FILE_ERROR_FAILED; | 302 error = FILE_ERROR_FAILED; |
302 performer_->UpdateEntry( | 303 performer_->UpdateEntry( |
303 local_id, | 304 local_id, |
304 ClientContext(USER_INITIATED), | 305 ClientContext(USER_INITIATED), |
305 google_apis::test_util::CreateCopyResultCallback(&error)); | 306 google_apis::test_util::CreateCopyResultCallback(&error)); |
306 test_util::RunBlockingPoolTask(); | 307 content::RunAllBlockingPoolTasksUntilIdle(); |
307 EXPECT_EQ(FILE_ERROR_OK, error); | 308 EXPECT_EQ(FILE_ERROR_OK, error); |
308 | 309 |
309 EXPECT_EQ(original_changestamp, | 310 EXPECT_EQ(original_changestamp, |
310 fake_service()->about_resource().largest_change_id()); | 311 fake_service()->about_resource().largest_change_id()); |
311 | 312 |
312 // Make sure that the cache is no longer dirty. | 313 // Make sure that the cache is no longer dirty. |
313 EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); | 314 EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); |
314 EXPECT_FALSE(entry.file_specific_info().cache_state().is_dirty()); | 315 EXPECT_FALSE(entry.file_specific_info().cache_state().is_dirty()); |
315 } | 316 } |
316 | 317 |
(...skipping 11 matching lines...) Expand all Loading... |
328 scoped_ptr<base::ScopedClosureRunner> file_closer; | 329 scoped_ptr<base::ScopedClosureRunner> file_closer; |
329 FileError error = FILE_ERROR_FAILED; | 330 FileError error = FILE_ERROR_FAILED; |
330 base::PostTaskAndReplyWithResult( | 331 base::PostTaskAndReplyWithResult( |
331 blocking_task_runner(), | 332 blocking_task_runner(), |
332 FROM_HERE, | 333 FROM_HERE, |
333 base::Bind(&FileCache::OpenForWrite, | 334 base::Bind(&FileCache::OpenForWrite, |
334 base::Unretained(cache()), | 335 base::Unretained(cache()), |
335 local_id, | 336 local_id, |
336 &file_closer), | 337 &file_closer), |
337 google_apis::test_util::CreateCopyResultCallback(&error)); | 338 google_apis::test_util::CreateCopyResultCallback(&error)); |
338 test_util::RunBlockingPoolTask(); | 339 content::RunAllBlockingPoolTasksUntilIdle(); |
339 EXPECT_EQ(FILE_ERROR_OK, error); | 340 EXPECT_EQ(FILE_ERROR_OK, error); |
340 | 341 |
341 // Update. This should not clear the dirty bit. | 342 // Update. This should not clear the dirty bit. |
342 error = FILE_ERROR_FAILED; | 343 error = FILE_ERROR_FAILED; |
343 performer_->UpdateEntry( | 344 performer_->UpdateEntry( |
344 local_id, | 345 local_id, |
345 ClientContext(USER_INITIATED), | 346 ClientContext(USER_INITIATED), |
346 google_apis::test_util::CreateCopyResultCallback(&error)); | 347 google_apis::test_util::CreateCopyResultCallback(&error)); |
347 test_util::RunBlockingPoolTask(); | 348 content::RunAllBlockingPoolTasksUntilIdle(); |
348 EXPECT_EQ(FILE_ERROR_OK, error); | 349 EXPECT_EQ(FILE_ERROR_OK, error); |
349 | 350 |
350 // Make sure that the cache is still dirty. | 351 // Make sure that the cache is still dirty. |
351 ResourceEntry entry; | 352 ResourceEntry entry; |
352 EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); | 353 EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); |
353 EXPECT_TRUE(entry.file_specific_info().cache_state().is_dirty()); | 354 EXPECT_TRUE(entry.file_specific_info().cache_state().is_dirty()); |
354 | 355 |
355 // Close the file. | 356 // Close the file. |
356 file_closer.reset(); | 357 file_closer.reset(); |
357 | 358 |
358 // Update. This should clear the dirty bit. | 359 // Update. This should clear the dirty bit. |
359 error = FILE_ERROR_FAILED; | 360 error = FILE_ERROR_FAILED; |
360 performer_->UpdateEntry( | 361 performer_->UpdateEntry( |
361 local_id, | 362 local_id, |
362 ClientContext(USER_INITIATED), | 363 ClientContext(USER_INITIATED), |
363 google_apis::test_util::CreateCopyResultCallback(&error)); | 364 google_apis::test_util::CreateCopyResultCallback(&error)); |
364 test_util::RunBlockingPoolTask(); | 365 content::RunAllBlockingPoolTasksUntilIdle(); |
365 EXPECT_EQ(FILE_ERROR_OK, error); | 366 EXPECT_EQ(FILE_ERROR_OK, error); |
366 | 367 |
367 // Make sure that the cache is no longer dirty. | 368 // Make sure that the cache is no longer dirty. |
368 EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); | 369 EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); |
369 EXPECT_FALSE(entry.file_specific_info().cache_state().is_dirty()); | 370 EXPECT_FALSE(entry.file_specific_info().cache_state().is_dirty()); |
370 } | 371 } |
371 | 372 |
372 TEST_F(EntryUpdatePerformerTest, UpdateEntry_UploadNewFile) { | 373 TEST_F(EntryUpdatePerformerTest, UpdateEntry_UploadNewFile) { |
373 // Create a new file locally. | 374 // Create a new file locally. |
374 const base::FilePath kFilePath(FILE_PATH_LITERAL("drive/root/New File.txt")); | 375 const base::FilePath kFilePath(FILE_PATH_LITERAL("drive/root/New File.txt")); |
(...skipping 10 matching lines...) Expand all Loading... |
385 FileError error = FILE_ERROR_FAILED; | 386 FileError error = FILE_ERROR_FAILED; |
386 std::string local_id; | 387 std::string local_id; |
387 base::PostTaskAndReplyWithResult( | 388 base::PostTaskAndReplyWithResult( |
388 blocking_task_runner(), | 389 blocking_task_runner(), |
389 FROM_HERE, | 390 FROM_HERE, |
390 base::Bind(&internal::ResourceMetadata::AddEntry, | 391 base::Bind(&internal::ResourceMetadata::AddEntry, |
391 base::Unretained(metadata()), | 392 base::Unretained(metadata()), |
392 entry, | 393 entry, |
393 &local_id), | 394 &local_id), |
394 google_apis::test_util::CreateCopyResultCallback(&error)); | 395 google_apis::test_util::CreateCopyResultCallback(&error)); |
395 test_util::RunBlockingPoolTask(); | 396 content::RunAllBlockingPoolTasksUntilIdle(); |
396 EXPECT_EQ(FILE_ERROR_OK, error); | 397 EXPECT_EQ(FILE_ERROR_OK, error); |
397 | 398 |
398 // Update. This should result in creating a new file on the server. | 399 // Update. This should result in creating a new file on the server. |
399 error = FILE_ERROR_FAILED; | 400 error = FILE_ERROR_FAILED; |
400 performer_->UpdateEntry( | 401 performer_->UpdateEntry( |
401 local_id, | 402 local_id, |
402 ClientContext(USER_INITIATED), | 403 ClientContext(USER_INITIATED), |
403 google_apis::test_util::CreateCopyResultCallback(&error)); | 404 google_apis::test_util::CreateCopyResultCallback(&error)); |
404 test_util::RunBlockingPoolTask(); | 405 content::RunAllBlockingPoolTasksUntilIdle(); |
405 EXPECT_EQ(FILE_ERROR_OK, error); | 406 EXPECT_EQ(FILE_ERROR_OK, error); |
406 | 407 |
407 // The entry got a resource ID. | 408 // The entry got a resource ID. |
408 EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); | 409 EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); |
409 EXPECT_FALSE(entry.resource_id().empty()); | 410 EXPECT_FALSE(entry.resource_id().empty()); |
410 EXPECT_EQ(ResourceEntry::CLEAN, entry.metadata_edit_state()); | 411 EXPECT_EQ(ResourceEntry::CLEAN, entry.metadata_edit_state()); |
411 | 412 |
412 // Make sure that the cache is no longer dirty. | 413 // Make sure that the cache is no longer dirty. |
413 EXPECT_FALSE(entry.file_specific_info().cache_state().is_dirty()); | 414 EXPECT_FALSE(entry.file_specific_info().cache_state().is_dirty()); |
414 | 415 |
415 // Make sure that we really created a file. | 416 // Make sure that we really created a file. |
416 google_apis::GDataErrorCode status = google_apis::GDATA_OTHER_ERROR; | 417 google_apis::GDataErrorCode status = google_apis::GDATA_OTHER_ERROR; |
417 scoped_ptr<google_apis::FileResource> server_entry; | 418 scoped_ptr<google_apis::FileResource> server_entry; |
418 fake_service()->GetFileResource( | 419 fake_service()->GetFileResource( |
419 entry.resource_id(), | 420 entry.resource_id(), |
420 google_apis::test_util::CreateCopyResultCallback(&status, &server_entry)); | 421 google_apis::test_util::CreateCopyResultCallback(&status, &server_entry)); |
421 test_util::RunBlockingPoolTask(); | 422 content::RunAllBlockingPoolTasksUntilIdle(); |
422 EXPECT_EQ(google_apis::HTTP_SUCCESS, status); | 423 EXPECT_EQ(google_apis::HTTP_SUCCESS, status); |
423 ASSERT_TRUE(server_entry); | 424 ASSERT_TRUE(server_entry); |
424 EXPECT_FALSE(server_entry->IsDirectory()); | 425 EXPECT_FALSE(server_entry->IsDirectory()); |
425 } | 426 } |
426 | 427 |
427 TEST_F(EntryUpdatePerformerTest, UpdateEntry_NewFileOpendForWrite) { | 428 TEST_F(EntryUpdatePerformerTest, UpdateEntry_NewFileOpendForWrite) { |
428 // Create a new file locally. | 429 // Create a new file locally. |
429 const base::FilePath kFilePath(FILE_PATH_LITERAL("drive/root/New File.txt")); | 430 const base::FilePath kFilePath(FILE_PATH_LITERAL("drive/root/New File.txt")); |
430 | 431 |
431 ResourceEntry parent; | 432 ResourceEntry parent; |
432 EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath.DirName(), &parent)); | 433 EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath.DirName(), &parent)); |
433 | 434 |
434 ResourceEntry entry; | 435 ResourceEntry entry; |
435 entry.set_parent_local_id(parent.local_id()); | 436 entry.set_parent_local_id(parent.local_id()); |
436 entry.set_title(kFilePath.BaseName().AsUTF8Unsafe()); | 437 entry.set_title(kFilePath.BaseName().AsUTF8Unsafe()); |
437 entry.mutable_file_specific_info()->set_content_mime_type("text/plain"); | 438 entry.mutable_file_specific_info()->set_content_mime_type("text/plain"); |
438 entry.set_metadata_edit_state(ResourceEntry::DIRTY); | 439 entry.set_metadata_edit_state(ResourceEntry::DIRTY); |
439 | 440 |
440 FileError error = FILE_ERROR_FAILED; | 441 FileError error = FILE_ERROR_FAILED; |
441 std::string local_id; | 442 std::string local_id; |
442 base::PostTaskAndReplyWithResult( | 443 base::PostTaskAndReplyWithResult( |
443 blocking_task_runner(), | 444 blocking_task_runner(), |
444 FROM_HERE, | 445 FROM_HERE, |
445 base::Bind(&internal::ResourceMetadata::AddEntry, | 446 base::Bind(&internal::ResourceMetadata::AddEntry, |
446 base::Unretained(metadata()), | 447 base::Unretained(metadata()), |
447 entry, | 448 entry, |
448 &local_id), | 449 &local_id), |
449 google_apis::test_util::CreateCopyResultCallback(&error)); | 450 google_apis::test_util::CreateCopyResultCallback(&error)); |
450 test_util::RunBlockingPoolTask(); | 451 content::RunAllBlockingPoolTasksUntilIdle(); |
451 EXPECT_EQ(FILE_ERROR_OK, error); | 452 EXPECT_EQ(FILE_ERROR_OK, error); |
452 | 453 |
453 const std::string kTestFileContent = "This is a new file."; | 454 const std::string kTestFileContent = "This is a new file."; |
454 EXPECT_EQ(FILE_ERROR_OK, StoreAndMarkDirty(local_id, kTestFileContent)); | 455 EXPECT_EQ(FILE_ERROR_OK, StoreAndMarkDirty(local_id, kTestFileContent)); |
455 | 456 |
456 // Emulate a situation where someone is writing to the file. | 457 // Emulate a situation where someone is writing to the file. |
457 scoped_ptr<base::ScopedClosureRunner> file_closer; | 458 scoped_ptr<base::ScopedClosureRunner> file_closer; |
458 error = FILE_ERROR_FAILED; | 459 error = FILE_ERROR_FAILED; |
459 base::PostTaskAndReplyWithResult( | 460 base::PostTaskAndReplyWithResult( |
460 blocking_task_runner(), | 461 blocking_task_runner(), |
461 FROM_HERE, | 462 FROM_HERE, |
462 base::Bind(&FileCache::OpenForWrite, | 463 base::Bind(&FileCache::OpenForWrite, |
463 base::Unretained(cache()), | 464 base::Unretained(cache()), |
464 local_id, | 465 local_id, |
465 &file_closer), | 466 &file_closer), |
466 google_apis::test_util::CreateCopyResultCallback(&error)); | 467 google_apis::test_util::CreateCopyResultCallback(&error)); |
467 test_util::RunBlockingPoolTask(); | 468 content::RunAllBlockingPoolTasksUntilIdle(); |
468 EXPECT_EQ(FILE_ERROR_OK, error); | 469 EXPECT_EQ(FILE_ERROR_OK, error); |
469 | 470 |
470 // Update, but no update is performed because the file is opened. | 471 // Update, but no update is performed because the file is opened. |
471 error = FILE_ERROR_FAILED; | 472 error = FILE_ERROR_FAILED; |
472 performer_->UpdateEntry( | 473 performer_->UpdateEntry( |
473 local_id, | 474 local_id, |
474 ClientContext(USER_INITIATED), | 475 ClientContext(USER_INITIATED), |
475 google_apis::test_util::CreateCopyResultCallback(&error)); | 476 google_apis::test_util::CreateCopyResultCallback(&error)); |
476 test_util::RunBlockingPoolTask(); | 477 content::RunAllBlockingPoolTasksUntilIdle(); |
477 EXPECT_EQ(FILE_ERROR_OK, error); | 478 EXPECT_EQ(FILE_ERROR_OK, error); |
478 | 479 |
479 // The entry hasn't got a resource ID yet. | 480 // The entry hasn't got a resource ID yet. |
480 EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); | 481 EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); |
481 EXPECT_TRUE(entry.resource_id().empty()); | 482 EXPECT_TRUE(entry.resource_id().empty()); |
482 | 483 |
483 // Close the file. | 484 // Close the file. |
484 file_closer.reset(); | 485 file_closer.reset(); |
485 | 486 |
486 // Update. This should result in creating a new file on the server. | 487 // Update. This should result in creating a new file on the server. |
487 error = FILE_ERROR_FAILED; | 488 error = FILE_ERROR_FAILED; |
488 performer_->UpdateEntry( | 489 performer_->UpdateEntry( |
489 local_id, | 490 local_id, |
490 ClientContext(USER_INITIATED), | 491 ClientContext(USER_INITIATED), |
491 google_apis::test_util::CreateCopyResultCallback(&error)); | 492 google_apis::test_util::CreateCopyResultCallback(&error)); |
492 test_util::RunBlockingPoolTask(); | 493 content::RunAllBlockingPoolTasksUntilIdle(); |
493 EXPECT_EQ(FILE_ERROR_OK, error); | 494 EXPECT_EQ(FILE_ERROR_OK, error); |
494 | 495 |
495 // The entry got a resource ID. | 496 // The entry got a resource ID. |
496 EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); | 497 EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); |
497 EXPECT_FALSE(entry.resource_id().empty()); | 498 EXPECT_FALSE(entry.resource_id().empty()); |
498 EXPECT_EQ(ResourceEntry::CLEAN, entry.metadata_edit_state()); | 499 EXPECT_EQ(ResourceEntry::CLEAN, entry.metadata_edit_state()); |
499 } | 500 } |
500 | 501 |
501 TEST_F(EntryUpdatePerformerTest, UpdateEntry_CreateDirectory) { | 502 TEST_F(EntryUpdatePerformerTest, UpdateEntry_CreateDirectory) { |
502 // Create a new directory locally. | 503 // Create a new directory locally. |
(...skipping 11 matching lines...) Expand all Loading... |
514 FileError error = FILE_ERROR_FAILED; | 515 FileError error = FILE_ERROR_FAILED; |
515 std::string local_id; | 516 std::string local_id; |
516 base::PostTaskAndReplyWithResult( | 517 base::PostTaskAndReplyWithResult( |
517 blocking_task_runner(), | 518 blocking_task_runner(), |
518 FROM_HERE, | 519 FROM_HERE, |
519 base::Bind(&internal::ResourceMetadata::AddEntry, | 520 base::Bind(&internal::ResourceMetadata::AddEntry, |
520 base::Unretained(metadata()), | 521 base::Unretained(metadata()), |
521 entry, | 522 entry, |
522 &local_id), | 523 &local_id), |
523 google_apis::test_util::CreateCopyResultCallback(&error)); | 524 google_apis::test_util::CreateCopyResultCallback(&error)); |
524 test_util::RunBlockingPoolTask(); | 525 content::RunAllBlockingPoolTasksUntilIdle(); |
525 EXPECT_EQ(FILE_ERROR_OK, error); | 526 EXPECT_EQ(FILE_ERROR_OK, error); |
526 | 527 |
527 // Update. This should result in creating a new directory on the server. | 528 // Update. This should result in creating a new directory on the server. |
528 error = FILE_ERROR_FAILED; | 529 error = FILE_ERROR_FAILED; |
529 performer_->UpdateEntry( | 530 performer_->UpdateEntry( |
530 local_id, | 531 local_id, |
531 ClientContext(USER_INITIATED), | 532 ClientContext(USER_INITIATED), |
532 google_apis::test_util::CreateCopyResultCallback(&error)); | 533 google_apis::test_util::CreateCopyResultCallback(&error)); |
533 test_util::RunBlockingPoolTask(); | 534 content::RunAllBlockingPoolTasksUntilIdle(); |
534 EXPECT_EQ(FILE_ERROR_OK, error); | 535 EXPECT_EQ(FILE_ERROR_OK, error); |
535 | 536 |
536 // The entry got a resource ID. | 537 // The entry got a resource ID. |
537 EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kPath, &entry)); | 538 EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kPath, &entry)); |
538 EXPECT_FALSE(entry.resource_id().empty()); | 539 EXPECT_FALSE(entry.resource_id().empty()); |
539 EXPECT_EQ(ResourceEntry::CLEAN, entry.metadata_edit_state()); | 540 EXPECT_EQ(ResourceEntry::CLEAN, entry.metadata_edit_state()); |
540 | 541 |
541 // Make sure that we really created a directory. | 542 // Make sure that we really created a directory. |
542 google_apis::GDataErrorCode status = google_apis::GDATA_OTHER_ERROR; | 543 google_apis::GDataErrorCode status = google_apis::GDATA_OTHER_ERROR; |
543 scoped_ptr<google_apis::FileResource> server_entry; | 544 scoped_ptr<google_apis::FileResource> server_entry; |
544 fake_service()->GetFileResource( | 545 fake_service()->GetFileResource( |
545 entry.resource_id(), | 546 entry.resource_id(), |
546 google_apis::test_util::CreateCopyResultCallback(&status, &server_entry)); | 547 google_apis::test_util::CreateCopyResultCallback(&status, &server_entry)); |
547 test_util::RunBlockingPoolTask(); | 548 content::RunAllBlockingPoolTasksUntilIdle(); |
548 EXPECT_EQ(google_apis::HTTP_SUCCESS, status); | 549 EXPECT_EQ(google_apis::HTTP_SUCCESS, status); |
549 ASSERT_TRUE(server_entry); | 550 ASSERT_TRUE(server_entry); |
550 EXPECT_TRUE(server_entry->IsDirectory()); | 551 EXPECT_TRUE(server_entry->IsDirectory()); |
551 } | 552 } |
552 | 553 |
553 } // namespace internal | 554 } // namespace internal |
554 } // namespace drive | 555 } // namespace drive |
OLD | NEW |