| 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 "base/file_util.h" | 5 #include "base/file_util.h" |
| 6 #include "base/json/json_file_value_serializer.h" | 6 #include "base/json/json_file_value_serializer.h" |
| 7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
| 8 #include "base/path_service.h" | 8 #include "base/path_service.h" |
| 9 #include "chrome/browser/chromeos/cros/cros_library.h" | 9 #include "chrome/browser/chromeos/cros/cros_library.h" |
| 10 #include "chrome/browser/chromeos/gdata/drive_webapps_registry.h" | 10 #include "chrome/browser/chromeos/gdata/drive_webapps_registry.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 // Cache resource that is pinned, to test a pinned file is in persistent dir | 51 // Cache resource that is pinned, to test a pinned file is in persistent dir |
| 52 // with a symlink in pinned dir referencing it. | 52 // with a symlink in pinned dir referencing it. |
| 53 { "directory_entry_atom.json", "pinned:existing", "md5_pinned_existing", | 53 { "directory_entry_atom.json", "pinned:existing", "md5_pinned_existing", |
| 54 GDataCache::CACHE_STATE_PRESENT | | 54 GDataCache::CACHE_STATE_PRESENT | |
| 55 GDataCache::CACHE_STATE_PINNED, | 55 GDataCache::CACHE_STATE_PINNED, |
| 56 "md5_pinned_existing", GDataCache::CACHE_TYPE_PERSISTENT }, | 56 "md5_pinned_existing", GDataCache::CACHE_TYPE_PERSISTENT }, |
| 57 // Cache resource with a non-existent source file that is pinned, to test that | 57 // Cache resource with a non-existent source file that is pinned, to test that |
| 58 // a pinned file can reference a non-existent file. | 58 // a pinned file can reference a non-existent file. |
| 59 { "", "pinned:non-existent", "md5_pinned_non_existent", | 59 { "", "pinned:non-existent", "md5_pinned_non_existent", |
| 60 GDataCache::CACHE_STATE_PINNED, | 60 GDataCache::CACHE_STATE_PINNED, |
| 61 "md5_pinned_non_existent", GDataCache::CACHE_TYPE_PINNED }, | 61 "md5_pinned_non_existent", GDataCache::CACHE_TYPE_TMP }, |
| 62 // Cache resource that is dirty, to test a dirty file is in persistent dir | 62 // Cache resource that is dirty, to test a dirty file is in persistent dir |
| 63 // with a symlink in outgoing dir referencing it. | 63 // with a symlink in outgoing dir referencing it. |
| 64 { "account_metadata.json", "dirty:existing", "md5_dirty_existing", | 64 { "account_metadata.json", "dirty:existing", "md5_dirty_existing", |
| 65 GDataCache::CACHE_STATE_PRESENT | | 65 GDataCache::CACHE_STATE_PRESENT | |
| 66 GDataCache::CACHE_STATE_DIRTY, | 66 GDataCache::CACHE_STATE_DIRTY, |
| 67 "local", GDataCache::CACHE_TYPE_PERSISTENT }, | 67 "local", GDataCache::CACHE_TYPE_PERSISTENT }, |
| 68 // Cache resource that is pinned and dirty, to test a dirty pinned file is in | 68 // Cache resource that is pinned and dirty, to test a dirty pinned file is in |
| 69 // persistent dir with symlink in pinned and outgoing dirs referencing it. | 69 // persistent dir with symlink in pinned and outgoing dirs referencing it. |
| 70 { "basic_feed.json", "dirty_and_pinned:existing", | 70 { "basic_feed.json", "dirty_and_pinned:existing", |
| 71 "md5_dirty_and_pinned_existing", | 71 "md5_dirty_and_pinned_existing", |
| (...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 424 // - no "<resource_id>" symlink exists in pinned and outgoing dirs. | 424 // - no "<resource_id>" symlink exists in pinned and outgoing dirs. |
| 425 std::vector<PathToVerify> paths_to_verify; | 425 std::vector<PathToVerify> paths_to_verify; |
| 426 paths_to_verify.push_back( // Index 0: CACHE_TYPE_TMP. | 426 paths_to_verify.push_back( // Index 0: CACHE_TYPE_TMP. |
| 427 PathToVerify(cache_->GetCacheFilePath(resource_id, "*", | 427 PathToVerify(cache_->GetCacheFilePath(resource_id, "*", |
| 428 GDataCache::CACHE_TYPE_TMP, | 428 GDataCache::CACHE_TYPE_TMP, |
| 429 GDataCache::CACHED_FILE_FROM_SERVER), FilePath())); | 429 GDataCache::CACHED_FILE_FROM_SERVER), FilePath())); |
| 430 paths_to_verify.push_back( // Index 1: CACHE_TYPE_PERSISTENT. | 430 paths_to_verify.push_back( // Index 1: CACHE_TYPE_PERSISTENT. |
| 431 PathToVerify(cache_->GetCacheFilePath(resource_id, "*", | 431 PathToVerify(cache_->GetCacheFilePath(resource_id, "*", |
| 432 GDataCache::CACHE_TYPE_PERSISTENT, | 432 GDataCache::CACHE_TYPE_PERSISTENT, |
| 433 GDataCache::CACHED_FILE_FROM_SERVER), FilePath())); | 433 GDataCache::CACHED_FILE_FROM_SERVER), FilePath())); |
| 434 paths_to_verify.push_back( // Index 2: CACHE_TYPE_PINNED. | 434 paths_to_verify.push_back( // Index 2: CACHE_TYPE_TMP, but STATE_PINNED. |
| 435 PathToVerify(cache_->GetCacheFilePath(resource_id, "", | 435 PathToVerify(cache_->GetCacheFilePath(resource_id, "", |
| 436 GDataCache::CACHE_TYPE_PINNED, | 436 GDataCache::CACHE_TYPE_PINNED, |
| 437 GDataCache::CACHED_FILE_FROM_SERVER), FilePath())); | 437 GDataCache::CACHED_FILE_FROM_SERVER), FilePath())); |
| 438 paths_to_verify.push_back( // Index 3: CACHE_TYPE_OUTGOING. | 438 paths_to_verify.push_back( // Index 3: CACHE_TYPE_OUTGOING. |
| 439 PathToVerify(cache_->GetCacheFilePath(resource_id, "", | 439 PathToVerify(cache_->GetCacheFilePath(resource_id, "", |
| 440 GDataCache::CACHE_TYPE_OUTGOING, | 440 GDataCache::CACHE_TYPE_OUTGOING, |
| 441 GDataCache::CACHED_FILE_FROM_SERVER), FilePath())); | 441 GDataCache::CACHED_FILE_FROM_SERVER), FilePath())); |
| 442 if (!cache_entry.get()) { | 442 if (!cache_entry.get()) { |
| 443 for (size_t i = 0; i < paths_to_verify.size(); ++i) { | 443 for (size_t i = 0; i < paths_to_verify.size(); ++i) { |
| 444 file_util::FileEnumerator enumerator( | 444 file_util::FileEnumerator enumerator( |
| (...skipping 19 matching lines...) Expand all Loading... |
| 464 GDataCache::CACHED_FILE_LOCALLY_MODIFIED); | 464 GDataCache::CACHED_FILE_LOCALLY_MODIFIED); |
| 465 | 465 |
| 466 // Change expected_existing_path of CACHE_TYPE_OUTGOING (index 3). | 466 // Change expected_existing_path of CACHE_TYPE_OUTGOING (index 3). |
| 467 paths_to_verify[3].expected_existing_path = | 467 paths_to_verify[3].expected_existing_path = |
| 468 GetCacheFilePath(resource_id, | 468 GetCacheFilePath(resource_id, |
| 469 std::string(), | 469 std::string(), |
| 470 GDataCache::CACHE_TYPE_OUTGOING, | 470 GDataCache::CACHE_TYPE_OUTGOING, |
| 471 GDataCache::CACHED_FILE_FROM_SERVER); | 471 GDataCache::CACHED_FILE_FROM_SERVER); |
| 472 | 472 |
| 473 if (cache_entry->IsPinned()) { | 473 if (cache_entry->IsPinned()) { |
| 474 // Change expected_existing_path of CACHE_TYPE_PINNED (index 2). | 474 // Change expected_existing_path of CACHE_TYPE_TMP but STATE_PINNED |
| 475 // (index 2). |
| 475 paths_to_verify[2].expected_existing_path = | 476 paths_to_verify[2].expected_existing_path = |
| 476 GetCacheFilePath(resource_id, | 477 GetCacheFilePath(resource_id, |
| 477 std::string(), | 478 std::string(), |
| 478 GDataCache::CACHE_TYPE_PINNED, | 479 GDataCache::CACHE_TYPE_PINNED, |
| 479 GDataCache::CACHED_FILE_FROM_SERVER); | 480 GDataCache::CACHED_FILE_FROM_SERVER); |
| 480 } | 481 } |
| 481 | 482 |
| 482 for (size_t i = 0; i < paths_to_verify.size(); ++i) { | 483 for (size_t i = 0; i < paths_to_verify.size(); ++i) { |
| 483 const struct PathToVerify& verify = paths_to_verify[i]; | 484 const struct PathToVerify& verify = paths_to_verify[i]; |
| 484 file_util::FileEnumerator enumerator( | 485 file_util::FileEnumerator enumerator( |
| (...skipping 612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1097 EXPECT_EQ(1, num_callback_invocations_); | 1098 EXPECT_EQ(1, num_callback_invocations_); |
| 1098 | 1099 |
| 1099 // Pin a non-existent file in cache. | 1100 // Pin a non-existent file in cache. |
| 1100 resource_id = "document:1a2b"; | 1101 resource_id = "document:1a2b"; |
| 1101 EXPECT_CALL(*mock_sync_client_, OnCachePinned(resource_id, md5)).Times(1); | 1102 EXPECT_CALL(*mock_sync_client_, OnCachePinned(resource_id, md5)).Times(1); |
| 1102 EXPECT_CALL(*mock_sync_client_, OnCacheUnpinned(resource_id, md5)).Times(1); | 1103 EXPECT_CALL(*mock_sync_client_, OnCacheUnpinned(resource_id, md5)).Times(1); |
| 1103 | 1104 |
| 1104 num_callback_invocations_ = 0; | 1105 num_callback_invocations_ = 0; |
| 1105 TestPin(resource_id, md5, base::PLATFORM_FILE_OK, | 1106 TestPin(resource_id, md5, base::PLATFORM_FILE_OK, |
| 1106 GDataCache::CACHE_STATE_PINNED, | 1107 GDataCache::CACHE_STATE_PINNED, |
| 1107 GDataCache::CACHE_TYPE_PINNED); | 1108 GDataCache::CACHE_TYPE_TMP); |
| 1108 EXPECT_EQ(1, num_callback_invocations_); | 1109 EXPECT_EQ(1, num_callback_invocations_); |
| 1109 | 1110 |
| 1110 // Unpin the previously pinned non-existent file in cache. | 1111 // Unpin the previously pinned non-existent file in cache. |
| 1111 num_callback_invocations_ = 0; | 1112 num_callback_invocations_ = 0; |
| 1112 TestUnpin(resource_id, md5, base::PLATFORM_FILE_OK, | 1113 TestUnpin(resource_id, md5, base::PLATFORM_FILE_OK, |
| 1113 GDataCache::CACHE_STATE_NONE, | 1114 GDataCache::CACHE_STATE_NONE, |
| 1114 GDataCache::CACHE_TYPE_PINNED); | 1115 GDataCache::CACHE_TYPE_TMP); |
| 1115 EXPECT_EQ(1, num_callback_invocations_); | 1116 EXPECT_EQ(1, num_callback_invocations_); |
| 1116 | 1117 |
| 1117 // Unpin a file that doesn't exist in cache and is not pinned, i.e. cache | 1118 // Unpin a file that doesn't exist in cache and is not pinned, i.e. cache |
| 1118 // has zero knowledge of the file. | 1119 // has zero knowledge of the file. |
| 1119 resource_id = "not-in-cache:1a2b"; | 1120 resource_id = "not-in-cache:1a2b"; |
| 1120 // Because unpinning will fail, OnCacheUnpinned() won't be run. | 1121 // Because unpinning will fail, OnCacheUnpinned() won't be run. |
| 1121 EXPECT_CALL(*mock_sync_client_, OnCacheUnpinned(resource_id, md5)).Times(0); | 1122 EXPECT_CALL(*mock_sync_client_, OnCacheUnpinned(resource_id, md5)).Times(0); |
| 1122 | 1123 |
| 1123 num_callback_invocations_ = 0; | 1124 num_callback_invocations_ = 0; |
| 1124 TestUnpin(resource_id, md5, base::PLATFORM_FILE_ERROR_NOT_FOUND, | 1125 TestUnpin(resource_id, md5, base::PLATFORM_FILE_ERROR_NOT_FOUND, |
| 1125 GDataCache::CACHE_STATE_NONE, | 1126 GDataCache::CACHE_STATE_NONE, |
| 1126 GDataCache::CACHE_TYPE_PINNED /* non-applicable */); | 1127 GDataCache::CACHE_TYPE_TMP /* non-applicable */); |
| 1127 EXPECT_EQ(1, num_callback_invocations_); | 1128 EXPECT_EQ(1, num_callback_invocations_); |
| 1128 } | 1129 } |
| 1129 | 1130 |
| 1130 TEST_F(GDataCacheTest, StoreToCachePinned) { | 1131 TEST_F(GDataCacheTest, StoreToCachePinned) { |
| 1131 std::string resource_id("pdf:1a2b"); | 1132 std::string resource_id("pdf:1a2b"); |
| 1132 std::string md5("abcdef0123456789"); | 1133 std::string md5("abcdef0123456789"); |
| 1133 EXPECT_CALL(*mock_sync_client_, OnCachePinned(resource_id, md5)).Times(1); | 1134 EXPECT_CALL(*mock_sync_client_, OnCachePinned(resource_id, md5)).Times(1); |
| 1134 | 1135 |
| 1135 // Pin a non-existent file. | 1136 // Pin a non-existent file. |
| 1136 TestPin(resource_id, md5, base::PLATFORM_FILE_OK, | 1137 TestPin(resource_id, md5, base::PLATFORM_FILE_OK, |
| 1137 GDataCache::CACHE_STATE_PINNED, | 1138 GDataCache::CACHE_STATE_PINNED, |
| 1138 GDataCache::CACHE_TYPE_PINNED); | 1139 GDataCache::CACHE_TYPE_TMP); |
| 1139 | 1140 |
| 1140 // Store an existing file to a previously pinned file. | 1141 // Store an existing file to a previously pinned file. |
| 1141 num_callback_invocations_ = 0; | 1142 num_callback_invocations_ = 0; |
| 1142 TestStoreToCache(resource_id, md5, GetTestFilePath("root_feed.json"), | 1143 TestStoreToCache(resource_id, md5, GetTestFilePath("root_feed.json"), |
| 1143 base::PLATFORM_FILE_OK, | 1144 base::PLATFORM_FILE_OK, |
| 1144 GDataCache::CACHE_STATE_PRESENT | | 1145 GDataCache::CACHE_STATE_PRESENT | |
| 1145 GDataCache::CACHE_STATE_PINNED, | 1146 GDataCache::CACHE_STATE_PINNED, |
| 1146 GDataCache::CACHE_TYPE_PERSISTENT); | 1147 GDataCache::CACHE_TYPE_PERSISTENT); |
| 1147 EXPECT_EQ(1, num_callback_invocations_); | 1148 EXPECT_EQ(1, num_callback_invocations_); |
| 1148 | 1149 |
| 1149 // Store a non-existent file to a previously pinned and stored file. | 1150 // Store a non-existent file to a previously pinned and stored file. |
| 1150 num_callback_invocations_ = 0; | 1151 num_callback_invocations_ = 0; |
| 1151 TestStoreToCache(resource_id, md5, FilePath("./non_existent.json"), | 1152 TestStoreToCache(resource_id, md5, FilePath("./non_existent.json"), |
| 1152 base::PLATFORM_FILE_ERROR_NOT_FOUND, | 1153 base::PLATFORM_FILE_ERROR_NOT_FOUND, |
| 1153 GDataCache::CACHE_STATE_PRESENT | | 1154 GDataCache::CACHE_STATE_PRESENT | |
| 1154 GDataCache::CACHE_STATE_PINNED, | 1155 GDataCache::CACHE_STATE_PINNED, |
| 1155 GDataCache::CACHE_TYPE_PERSISTENT); | 1156 GDataCache::CACHE_TYPE_PERSISTENT); |
| 1156 EXPECT_EQ(1, num_callback_invocations_); | 1157 EXPECT_EQ(1, num_callback_invocations_); |
| 1157 } | 1158 } |
| 1158 | 1159 |
| 1159 TEST_F(GDataCacheTest, GetFromCachePinned) { | 1160 TEST_F(GDataCacheTest, GetFromCachePinned) { |
| 1160 std::string resource_id("pdf:1a2b"); | 1161 std::string resource_id("pdf:1a2b"); |
| 1161 std::string md5("abcdef0123456789"); | 1162 std::string md5("abcdef0123456789"); |
| 1162 EXPECT_CALL(*mock_sync_client_, OnCachePinned(resource_id, md5)).Times(1); | 1163 EXPECT_CALL(*mock_sync_client_, OnCachePinned(resource_id, md5)).Times(1); |
| 1163 | 1164 |
| 1164 // Pin a non-existent file. | 1165 // Pin a non-existent file. |
| 1165 TestPin(resource_id, md5, base::PLATFORM_FILE_OK, | 1166 TestPin(resource_id, md5, base::PLATFORM_FILE_OK, |
| 1166 GDataCache::CACHE_STATE_PINNED, | 1167 GDataCache::CACHE_STATE_PINNED, |
| 1167 GDataCache::CACHE_TYPE_PINNED); | 1168 GDataCache::CACHE_TYPE_TMP); |
| 1168 | 1169 |
| 1169 // Get the non-existent pinned file from cache. | 1170 // Get the non-existent pinned file from cache. |
| 1170 num_callback_invocations_ = 0; | 1171 num_callback_invocations_ = 0; |
| 1171 TestGetFileFromCacheByResourceIdAndMd5( | 1172 TestGetFileFromCacheByResourceIdAndMd5( |
| 1172 resource_id, md5, base::PLATFORM_FILE_ERROR_NOT_FOUND, md5); | 1173 resource_id, md5, base::PLATFORM_FILE_ERROR_NOT_FOUND, md5); |
| 1173 EXPECT_EQ(1, num_callback_invocations_); | 1174 EXPECT_EQ(1, num_callback_invocations_); |
| 1174 | 1175 |
| 1175 // Store an existing file to the previously pinned non-existent file. | 1176 // Store an existing file to the previously pinned non-existent file. |
| 1176 TestStoreToCache(resource_id, md5, GetTestFilePath("root_feed.json"), | 1177 TestStoreToCache(resource_id, md5, GetTestFilePath("root_feed.json"), |
| 1177 base::PLATFORM_FILE_OK, | 1178 base::PLATFORM_FILE_OK, |
| (...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1602 EXPECT_EQ(1, num_callback_invocations_); | 1603 EXPECT_EQ(1, num_callback_invocations_); |
| 1603 EXPECT_TRUE(CacheEntryExists(resource_id, md5)); | 1604 EXPECT_TRUE(CacheEntryExists(resource_id, md5)); |
| 1604 | 1605 |
| 1605 // Try to remove the file. | 1606 // Try to remove the file. |
| 1606 num_callback_invocations_ = 0; | 1607 num_callback_invocations_ = 0; |
| 1607 TestRemoveFromCache(resource_id, base::PLATFORM_FILE_OK); | 1608 TestRemoveFromCache(resource_id, base::PLATFORM_FILE_OK); |
| 1608 EXPECT_EQ(1, num_callback_invocations_); | 1609 EXPECT_EQ(1, num_callback_invocations_); |
| 1609 } | 1610 } |
| 1610 | 1611 |
| 1611 } // namespace gdata | 1612 } // namespace gdata |
| OLD | NEW |