| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "base/basictypes.h" | |
| 6 #include "base/file_util.h" | |
| 7 #include "base/files/scoped_temp_dir.h" | |
| 8 #include "base/platform_file.h" | |
| 9 #include "testing/gtest/include/gtest/gtest.h" | |
| 10 #include "webkit/browser/fileapi/sandbox_origin_database.h" | |
| 11 #include "webkit/browser/fileapi/sandbox_prioritized_origin_database.h" | |
| 12 | |
| 13 namespace fileapi { | |
| 14 | |
| 15 TEST(SandboxPrioritizedOriginDatabaseTest, BasicTest) { | |
| 16 base::ScopedTempDir dir; | |
| 17 base::FilePath path; | |
| 18 ASSERT_TRUE(dir.CreateUniqueTempDir()); | |
| 19 | |
| 20 const std::string kOrigin1("origin1"); | |
| 21 const std::string kOrigin2("origin2"); | |
| 22 | |
| 23 SandboxPrioritizedOriginDatabase database(dir.path(), NULL); | |
| 24 | |
| 25 // Set the kOrigin1 as a parimary origin. | |
| 26 EXPECT_TRUE(database.InitializePrimaryOrigin(kOrigin1)); | |
| 27 | |
| 28 // Add two origins. | |
| 29 EXPECT_TRUE(database.GetPathForOrigin(kOrigin1, &path)); | |
| 30 EXPECT_TRUE(database.GetPathForOrigin(kOrigin2, &path)); | |
| 31 | |
| 32 // Verify them. | |
| 33 EXPECT_TRUE(database.HasOriginPath(kOrigin1)); | |
| 34 EXPECT_TRUE(database.GetPathForOrigin(kOrigin1, &path)); | |
| 35 EXPECT_FALSE(path.empty()); | |
| 36 EXPECT_TRUE(database.HasOriginPath(kOrigin2)); | |
| 37 EXPECT_TRUE(database.GetPathForOrigin(kOrigin2, &path)); | |
| 38 EXPECT_FALSE(path.empty()); | |
| 39 | |
| 40 std::vector<SandboxOriginDatabaseInterface::OriginRecord> origins; | |
| 41 database.ListAllOrigins(&origins); | |
| 42 ASSERT_EQ(2U, origins.size()); | |
| 43 EXPECT_TRUE(origins[0].origin == kOrigin1 || | |
| 44 origins[1].origin == kOrigin1); | |
| 45 EXPECT_TRUE(origins[0].origin == kOrigin2 || | |
| 46 origins[1].origin == kOrigin2); | |
| 47 EXPECT_NE(origins[0].path, origins[1].path); | |
| 48 | |
| 49 // Try remove path for kOrigin1. | |
| 50 database.RemovePathForOrigin(kOrigin1); | |
| 51 | |
| 52 // Verify the removal. | |
| 53 EXPECT_FALSE(database.HasOriginPath(kOrigin1)); | |
| 54 EXPECT_TRUE(database.HasOriginPath(kOrigin2)); | |
| 55 database.ListAllOrigins(&origins); | |
| 56 ASSERT_EQ(1U, origins.size()); | |
| 57 EXPECT_EQ(kOrigin2, origins[0].origin); | |
| 58 | |
| 59 // Try remove path for kOrigin2. | |
| 60 database.RemovePathForOrigin(kOrigin2); | |
| 61 | |
| 62 // Verify the removal. | |
| 63 EXPECT_FALSE(database.HasOriginPath(kOrigin1)); | |
| 64 EXPECT_FALSE(database.HasOriginPath(kOrigin2)); | |
| 65 database.ListAllOrigins(&origins); | |
| 66 EXPECT_TRUE(origins.empty()); | |
| 67 } | |
| 68 | |
| 69 TEST(SandboxPrioritizedOriginDatabaseTest, SetPrimaryLaterTest) { | |
| 70 base::ScopedTempDir dir; | |
| 71 base::FilePath path; | |
| 72 ASSERT_TRUE(dir.CreateUniqueTempDir()); | |
| 73 | |
| 74 const std::string kOrigin1("origin1"); | |
| 75 const std::string kOrigin2("origin2"); | |
| 76 | |
| 77 SandboxPrioritizedOriginDatabase database(dir.path(), NULL); | |
| 78 | |
| 79 EXPECT_TRUE(database.GetPrimaryOrigin().empty()); | |
| 80 | |
| 81 EXPECT_TRUE(database.GetPathForOrigin(kOrigin1, &path)); | |
| 82 EXPECT_TRUE(database.GetPathForOrigin(kOrigin2, &path)); | |
| 83 | |
| 84 // Set the kOrigin1 as a parimary origin. | |
| 85 EXPECT_TRUE(database.InitializePrimaryOrigin(kOrigin1)); | |
| 86 EXPECT_EQ(kOrigin1, database.GetPrimaryOrigin()); | |
| 87 | |
| 88 // Regardless of whether it is initialized as primary or not | |
| 89 // they should just work. | |
| 90 EXPECT_TRUE(database.HasOriginPath(kOrigin1)); | |
| 91 EXPECT_TRUE(database.GetPathForOrigin(kOrigin1, &path)); | |
| 92 EXPECT_FALSE(path.empty()); | |
| 93 EXPECT_TRUE(database.HasOriginPath(kOrigin2)); | |
| 94 EXPECT_TRUE(database.GetPathForOrigin(kOrigin2, &path)); | |
| 95 EXPECT_FALSE(path.empty()); | |
| 96 } | |
| 97 | |
| 98 TEST(SandboxPrioritizedOriginDatabaseTest, LostPrimaryOriginFileTest) { | |
| 99 base::ScopedTempDir dir; | |
| 100 base::FilePath path; | |
| 101 ASSERT_TRUE(dir.CreateUniqueTempDir()); | |
| 102 | |
| 103 const std::string kOrigin1("origin1"); | |
| 104 const std::string kData("foo"); | |
| 105 | |
| 106 SandboxPrioritizedOriginDatabase database(dir.path(), NULL); | |
| 107 | |
| 108 EXPECT_TRUE(database.GetPrimaryOrigin().empty()); | |
| 109 | |
| 110 // Set the kOrigin1 as a parimary origin. | |
| 111 EXPECT_TRUE(database.InitializePrimaryOrigin(kOrigin1)); | |
| 112 EXPECT_EQ(kOrigin1, database.GetPrimaryOrigin()); | |
| 113 | |
| 114 // Make sure it works. | |
| 115 EXPECT_TRUE(database.HasOriginPath(kOrigin1)); | |
| 116 EXPECT_TRUE(database.GetPathForOrigin(kOrigin1, &path)); | |
| 117 | |
| 118 // Reset the database. | |
| 119 database.DropDatabase(); | |
| 120 | |
| 121 // kOrigin1 should still be marked as primary. | |
| 122 EXPECT_TRUE(database.HasOriginPath(kOrigin1)); | |
| 123 EXPECT_TRUE(database.GetPathForOrigin(kOrigin1, &path)); | |
| 124 | |
| 125 // Corrupt the primary origin file. | |
| 126 base::WriteFile(database.primary_origin_file(), kData.data(), kData.size()); | |
| 127 | |
| 128 // Reset the database. | |
| 129 database.DropDatabase(); | |
| 130 | |
| 131 // kOrigin1 is no longer marked as primary, and unfortunately we fail | |
| 132 // to find the data for the origin. | |
| 133 EXPECT_FALSE(database.HasOriginPath(kOrigin1)); | |
| 134 } | |
| 135 | |
| 136 TEST(SandboxPrioritizedOriginDatabaseTest, MigrationTest) { | |
| 137 base::ScopedTempDir dir; | |
| 138 ASSERT_TRUE(dir.CreateUniqueTempDir()); | |
| 139 | |
| 140 const std::string kOrigin1("origin1"); | |
| 141 const std::string kOrigin2("origin2"); | |
| 142 const std::string kFakeDirectoryData1("0123456789"); | |
| 143 const std::string kFakeDirectoryData2("abcde"); | |
| 144 base::FilePath old_dir_db_path1, old_dir_db_path2; | |
| 145 base::FilePath path1, path2; | |
| 146 | |
| 147 // Initialize the directory with two origins using the regular | |
| 148 // SandboxOriginDatabase. | |
| 149 { | |
| 150 SandboxOriginDatabase database_old(dir.path(), NULL); | |
| 151 base::FilePath old_db_path = database_old.GetDatabasePath(); | |
| 152 EXPECT_FALSE(base::PathExists(old_db_path)); | |
| 153 | |
| 154 // Initialize paths for kOrigin1 and kOrigin2. | |
| 155 EXPECT_TRUE(database_old.GetPathForOrigin(kOrigin1, &path1)); | |
| 156 EXPECT_FALSE(path1.empty()); | |
| 157 EXPECT_TRUE(database_old.GetPathForOrigin(kOrigin2, &path2)); | |
| 158 EXPECT_FALSE(path2.empty()); | |
| 159 | |
| 160 EXPECT_TRUE(base::DirectoryExists(old_db_path)); | |
| 161 | |
| 162 // Populate the origin directory with some fake data. | |
| 163 old_dir_db_path1 = dir.path().Append(path1); | |
| 164 ASSERT_TRUE(base::CreateDirectory(old_dir_db_path1)); | |
| 165 EXPECT_EQ(static_cast<int>(kFakeDirectoryData1.size()), | |
| 166 base::WriteFile(old_dir_db_path1.AppendASCII("dummy"), | |
| 167 kFakeDirectoryData1.data(), | |
| 168 kFakeDirectoryData1.size())); | |
| 169 old_dir_db_path2 = dir.path().Append(path2); | |
| 170 ASSERT_TRUE(base::CreateDirectory(old_dir_db_path2)); | |
| 171 EXPECT_EQ(static_cast<int>(kFakeDirectoryData2.size()), | |
| 172 base::WriteFile(old_dir_db_path2.AppendASCII("dummy"), | |
| 173 kFakeDirectoryData2.data(), | |
| 174 kFakeDirectoryData2.size())); | |
| 175 } | |
| 176 | |
| 177 // Re-open the directory using sandboxPrioritizedOriginDatabase. | |
| 178 SandboxPrioritizedOriginDatabase database(dir.path(), NULL); | |
| 179 | |
| 180 // Set the kOrigin1 as a parimary origin. | |
| 181 // (Trying to initialize another origin should fail). | |
| 182 EXPECT_TRUE(database.InitializePrimaryOrigin(kOrigin1)); | |
| 183 EXPECT_FALSE(database.InitializePrimaryOrigin(kOrigin2)); | |
| 184 | |
| 185 EXPECT_EQ(kOrigin1, database.GetPrimaryOrigin()); | |
| 186 | |
| 187 // Regardless of whether the origin is registered as primary or not | |
| 188 // it should just work. | |
| 189 EXPECT_TRUE(database.HasOriginPath(kOrigin1)); | |
| 190 EXPECT_TRUE(database.GetPathForOrigin(kOrigin1, &path1)); | |
| 191 EXPECT_TRUE(database.HasOriginPath(kOrigin2)); | |
| 192 EXPECT_TRUE(database.GetPathForOrigin(kOrigin2, &path2)); | |
| 193 | |
| 194 // The directory content must be kept (or migrated if necessary) as well. | |
| 195 std::string origin_db_data; | |
| 196 base::FilePath dir_db_path = dir.path().Append(path1); | |
| 197 EXPECT_TRUE(base::PathExists(dir_db_path.AppendASCII("dummy"))); | |
| 198 EXPECT_TRUE(base::ReadFileToString( | |
| 199 dir_db_path.AppendASCII("dummy"), &origin_db_data)); | |
| 200 EXPECT_EQ(kFakeDirectoryData1, origin_db_data); | |
| 201 | |
| 202 origin_db_data.clear(); | |
| 203 dir_db_path = dir.path().Append(path2); | |
| 204 EXPECT_TRUE(base::PathExists(dir_db_path.AppendASCII("dummy"))); | |
| 205 EXPECT_TRUE(base::ReadFileToString( | |
| 206 dir_db_path.AppendASCII("dummy"), &origin_db_data)); | |
| 207 EXPECT_EQ(kFakeDirectoryData2, origin_db_data); | |
| 208 | |
| 209 // After the migration the kOrigin1 directory database path must be gone. | |
| 210 EXPECT_FALSE(base::PathExists(old_dir_db_path1)); | |
| 211 EXPECT_TRUE(base::PathExists(old_dir_db_path2)); | |
| 212 } | |
| 213 | |
| 214 } // namespace fileapi | |
| OLD | NEW |