OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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_path.h" | 5 #include "base/file_path.h" |
6 #include "base/file_util.h" | 6 #include "base/file_util.h" |
7 #include "base/scoped_ptr.h" | 7 #include "base/scoped_ptr.h" |
8 #include "base/scoped_temp_dir.h" | 8 #include "base/scoped_temp_dir.h" |
9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 } // namespace | 63 } // namespace |
64 | 64 |
65 namespace webkit_database { | 65 namespace webkit_database { |
66 | 66 |
67 TEST(DatabaseTrackerTest, TestIt) { | 67 TEST(DatabaseTrackerTest, TestIt) { |
68 // Initialize the tracker database. | 68 // Initialize the tracker database. |
69 ScopedTempDir temp_dir; | 69 ScopedTempDir temp_dir; |
70 EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); | 70 EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); |
71 scoped_refptr<DatabaseTracker> tracker(new DatabaseTracker(temp_dir.path())); | 71 scoped_refptr<DatabaseTracker> tracker(new DatabaseTracker(temp_dir.path())); |
72 | 72 |
73 // Get the default quota for all origins. | |
74 const int64 kDefaultQuota = tracker->GetOriginQuota(EmptyString16()); | |
75 | |
76 // Add two observers. | 73 // Add two observers. |
77 TestObserver observer1; | 74 TestObserver observer1; |
78 TestObserver observer2; | 75 TestObserver observer2; |
79 tracker->AddObserver(&observer1); | 76 tracker->AddObserver(&observer1); |
80 tracker->AddObserver(&observer2); | 77 tracker->AddObserver(&observer2); |
81 | 78 |
82 // Open three new databases. | 79 // Open three new databases. |
83 int64 database_size = 0; | 80 int64 database_size = 0; |
84 int64 space_available = 0; | 81 int64 space_available = 0; |
85 const string16 kOrigin1 = ASCIIToUTF16("origin1"); | 82 const string16 kOrigin1 = ASCIIToUTF16("origin1"); |
86 const string16 kOrigin2 = ASCIIToUTF16("origin2"); | 83 const string16 kOrigin2 = ASCIIToUTF16("origin2"); |
87 const string16 kDB1 = ASCIIToUTF16("db1"); | 84 const string16 kDB1 = ASCIIToUTF16("db1"); |
88 const string16 kDB2 = ASCIIToUTF16("db2"); | 85 const string16 kDB2 = ASCIIToUTF16("db2"); |
89 const string16 kDB3 = ASCIIToUTF16("db3"); | 86 const string16 kDB3 = ASCIIToUTF16("db3"); |
90 const string16 kDescription = ASCIIToUTF16("database_description"); | 87 const string16 kDescription = ASCIIToUTF16("database_description"); |
91 | 88 |
| 89 // Get the quota for kOrigin1 and kOrigin2 |
| 90 DatabaseTracker::CachedOriginInfo* origin1_info = |
| 91 tracker->GetCachedOriginInfo(kOrigin1); |
| 92 DatabaseTracker::CachedOriginInfo* origin2_info = |
| 93 tracker->GetCachedOriginInfo(kOrigin1); |
| 94 EXPECT_TRUE(origin1_info); |
| 95 EXPECT_TRUE(origin2_info); |
| 96 int64 origin1_quota = origin1_info->Quota(); |
| 97 int64 origin2_quota = origin2_info->Quota(); |
| 98 EXPECT_EQ(origin1_quota, tracker->GetOriginSpaceAvailable(kOrigin1)); |
| 99 EXPECT_EQ(origin2_quota, tracker->GetOriginSpaceAvailable(kOrigin2)); |
| 100 |
| 101 // Set a new quota for kOrigin1 |
| 102 origin1_quota *= 2; |
| 103 tracker->SetOriginQuota(kOrigin1, origin1_quota); |
| 104 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); |
| 105 EXPECT_TRUE(origin1_info); |
| 106 EXPECT_EQ(origin1_quota, origin1_info->Quota()); |
| 107 |
92 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, | 108 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, |
93 &database_size, &space_available); | 109 &database_size, &space_available); |
94 EXPECT_EQ(0, database_size); | 110 EXPECT_EQ(0, database_size); |
95 EXPECT_EQ(kDefaultQuota, space_available); | 111 EXPECT_EQ(origin1_quota, space_available); |
96 tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0, | 112 tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0, |
97 &database_size, &space_available); | 113 &database_size, &space_available); |
98 EXPECT_EQ(0, database_size); | 114 EXPECT_EQ(0, database_size); |
99 EXPECT_EQ(kDefaultQuota, space_available); | 115 EXPECT_EQ(origin2_quota, space_available); |
100 tracker->DatabaseOpened(kOrigin1, kDB3, kDescription, 0, | 116 tracker->DatabaseOpened(kOrigin1, kDB3, kDescription, 0, |
101 &database_size, &space_available); | 117 &database_size, &space_available); |
102 EXPECT_EQ(0, database_size); | 118 EXPECT_EQ(0, database_size); |
103 EXPECT_EQ(kDefaultQuota, space_available); | 119 EXPECT_EQ(origin1_quota, space_available); |
104 | 120 |
105 // Tell the tracker that a database has changed. | 121 // Tell the tracker that a database has changed. |
106 // Even though nothing has changed, the observers should be notified. | 122 // Even though nothing has changed, the observers should be notified. |
107 tracker->DatabaseModified(kOrigin1, kDB1); | 123 tracker->DatabaseModified(kOrigin1, kDB1); |
108 CheckNotificationReceived(&observer1, kOrigin1, kDB1, 0, kDefaultQuota); | 124 CheckNotificationReceived(&observer1, kOrigin1, kDB1, 0, origin1_quota); |
109 CheckNotificationReceived(&observer2, kOrigin1, kDB1, 0, kDefaultQuota); | 125 CheckNotificationReceived(&observer2, kOrigin1, kDB1, 0, origin1_quota); |
110 | 126 |
111 // Write some data to each file and check that the listeners are | 127 // Write some data to each file and check that the listeners are |
112 // called with the appropriate values. | 128 // called with the appropriate values. |
113 EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append( | 129 EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append( |
114 FilePath::FromWStringHack(UTF16ToWide(kOrigin1))))); | 130 FilePath::FromWStringHack(UTF16ToWide(kOrigin1))))); |
115 EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append( | 131 EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append( |
116 FilePath::FromWStringHack(UTF16ToWide(kOrigin2))))); | 132 FilePath::FromWStringHack(UTF16ToWide(kOrigin2))))); |
117 EXPECT_EQ(1, file_util::WriteFile( | 133 EXPECT_EQ(1, file_util::WriteFile( |
118 tracker->GetFullDBFilePath(kOrigin1, kDB1), "a", 1)); | 134 tracker->GetFullDBFilePath(kOrigin1, kDB1), "a", 1)); |
119 EXPECT_EQ(2, file_util::WriteFile( | 135 EXPECT_EQ(2, file_util::WriteFile( |
120 tracker->GetFullDBFilePath(kOrigin2, kDB2), "aa", 2)); | 136 tracker->GetFullDBFilePath(kOrigin2, kDB2), "aa", 2)); |
121 EXPECT_EQ(4, file_util::WriteFile( | 137 EXPECT_EQ(4, file_util::WriteFile( |
122 tracker->GetFullDBFilePath(kOrigin1, kDB3), "aaaa", 4)); | 138 tracker->GetFullDBFilePath(kOrigin1, kDB3), "aaaa", 4)); |
123 tracker->DatabaseModified(kOrigin1, kDB1); | 139 tracker->DatabaseModified(kOrigin1, kDB1); |
124 CheckNotificationReceived(&observer1, kOrigin1, kDB1, 1, kDefaultQuota - 1); | 140 CheckNotificationReceived(&observer1, kOrigin1, kDB1, 1, origin1_quota - 1); |
125 CheckNotificationReceived(&observer2, kOrigin1, kDB1, 1, kDefaultQuota - 1); | 141 CheckNotificationReceived(&observer2, kOrigin1, kDB1, 1, origin1_quota - 1); |
126 tracker->DatabaseModified(kOrigin2, kDB2); | 142 tracker->DatabaseModified(kOrigin2, kDB2); |
127 CheckNotificationReceived(&observer1, kOrigin2, kDB2, 2, kDefaultQuota - 2); | 143 CheckNotificationReceived(&observer1, kOrigin2, kDB2, 2, origin2_quota - 2); |
128 CheckNotificationReceived(&observer2, kOrigin2, kDB2, 2, kDefaultQuota - 2); | 144 CheckNotificationReceived(&observer2, kOrigin2, kDB2, 2, origin2_quota - 2); |
129 tracker->DatabaseModified(kOrigin1, kDB3); | 145 tracker->DatabaseModified(kOrigin1, kDB3); |
130 CheckNotificationReceived(&observer1, kOrigin1, kDB3, 4, kDefaultQuota - 5); | 146 CheckNotificationReceived(&observer1, kOrigin1, kDB3, 4, origin1_quota - 5); |
131 CheckNotificationReceived(&observer2, kOrigin1, kDB3, 4, kDefaultQuota - 5); | 147 CheckNotificationReceived(&observer2, kOrigin1, kDB3, 4, origin1_quota - 5); |
| 148 |
| 149 // Make sure the available space for kOrigin1 and kOrigin2 changed accordingly |
| 150 EXPECT_EQ(origin1_quota - 5, tracker->GetOriginSpaceAvailable(kOrigin1)); |
| 151 EXPECT_EQ(origin2_quota - 2, tracker->GetOriginSpaceAvailable(kOrigin2)); |
| 152 |
| 153 // Close all databases |
| 154 tracker->DatabaseClosed(kOrigin1, kDB1); |
| 155 tracker->DatabaseClosed(kOrigin2, kDB2); |
| 156 tracker->DatabaseClosed(kOrigin1, kDB3); |
132 | 157 |
133 // Open an existing database and check the reported size | 158 // Open an existing database and check the reported size |
134 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, | 159 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, |
135 &database_size, &space_available); | 160 &database_size, &space_available); |
136 EXPECT_EQ(1, database_size); | 161 EXPECT_EQ(1, database_size); |
137 EXPECT_EQ(kDefaultQuota - 5, space_available); | 162 EXPECT_EQ(origin1_quota - 5, space_available); |
138 | 163 |
139 // Make sure that the observers are notified even if | 164 // Make sure that the observers are notified even if |
140 // the size of the database hasn't changed. | 165 // the size of the database hasn't changed. |
141 EXPECT_EQ(1, file_util::WriteFile( | 166 EXPECT_EQ(1, file_util::WriteFile( |
142 tracker->GetFullDBFilePath(kOrigin1, kDB1), "b", 1)); | 167 tracker->GetFullDBFilePath(kOrigin1, kDB1), "b", 1)); |
143 tracker->DatabaseModified(kOrigin1, kDB1); | 168 tracker->DatabaseModified(kOrigin1, kDB1); |
144 CheckNotificationReceived(&observer1, kOrigin1, kDB1, 1, kDefaultQuota - 5); | 169 CheckNotificationReceived(&observer1, kOrigin1, kDB1, 1, origin1_quota - 5); |
145 CheckNotificationReceived(&observer2, kOrigin1, kDB1, 1, kDefaultQuota - 5); | 170 CheckNotificationReceived(&observer2, kOrigin1, kDB1, 1, origin1_quota - 5); |
| 171 tracker->DatabaseClosed(kOrigin1, kDB1); |
146 | 172 |
147 // Remove an observer; this should clear all caches. | 173 // Remove an observer; this should clear all caches. |
148 tracker->RemoveObserver(&observer2); | 174 tracker->RemoveObserver(&observer2); |
149 | 175 |
150 // Change kDB1's and kDB3's size and call tracker->DatabaseModified() | 176 // Change kDB1's and kDB3's size and call tracker->DatabaseModified() |
151 // for kDB1 only. If the caches were indeed cleared, then calling | 177 // for kDB1 only. If the caches were indeed cleared, then calling |
152 // tracker->DatabaseModified() should re-populate the cache for | 178 // tracker->DatabaseModified() should re-populate the cache for |
153 // kOrigin1 == kOrigin1, and thus, should pick up kDB3's size change too. | 179 // kOrigin1 == kOrigin1, and thus, should pick up kDB3's size change too. |
154 EXPECT_EQ(5, file_util::WriteFile( | 180 EXPECT_EQ(5, file_util::WriteFile( |
155 tracker->GetFullDBFilePath(kOrigin1, kDB1), "ccccc", 5)); | 181 tracker->GetFullDBFilePath(kOrigin1, kDB1), "ccccc", 5)); |
156 EXPECT_EQ(6, file_util::WriteFile( | 182 EXPECT_EQ(6, file_util::WriteFile( |
157 tracker->GetFullDBFilePath(kOrigin1, kDB3), "dddddd", 6)); | 183 tracker->GetFullDBFilePath(kOrigin1, kDB3), "dddddd", 6)); |
158 tracker->DatabaseModified(kOrigin1, kDB1); | 184 tracker->DatabaseModified(kOrigin1, kDB1); |
159 CheckNotificationReceived(&observer1, kOrigin1, kDB1, 5, kDefaultQuota - 11); | 185 CheckNotificationReceived(&observer1, kOrigin1, kDB1, 5, origin1_quota - 11); |
160 EXPECT_FALSE(observer2.DidReceiveNewNotification()); | 186 EXPECT_FALSE(observer2.DidReceiveNewNotification()); |
| 187 EXPECT_EQ(origin1_quota - 11, tracker->GetOriginSpaceAvailable(kOrigin1)); |
161 | 188 |
162 // Close the tracker database and clear all caches. | 189 // Close the tracker database and clear all caches. |
163 // Then make sure that DatabaseOpened() still returns the correct result. | 190 // Then make sure that DatabaseOpened() still returns the correct result. |
164 tracker->CloseTrackerDatabaseAndClearCaches(); | 191 tracker->CloseTrackerDatabaseAndClearCaches(); |
165 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, | 192 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, |
166 &database_size, &space_available); | 193 &database_size, &space_available); |
167 EXPECT_EQ(5, database_size); | 194 EXPECT_EQ(5, database_size); |
168 EXPECT_EQ(kDefaultQuota - 11, space_available); | 195 EXPECT_EQ(origin1_quota - 11, space_available); |
169 | 196 |
170 // Close the tracker database and clear all caches. Then make sure that | 197 // Close the tracker database and clear all caches. Then make sure that |
171 // DatabaseModified() still calls the observers with correct values. | 198 // DatabaseModified() still calls the observers with correct values. |
172 tracker->CloseTrackerDatabaseAndClearCaches(); | 199 tracker->CloseTrackerDatabaseAndClearCaches(); |
173 tracker->DatabaseModified(kOrigin1, kDB3); | 200 tracker->DatabaseModified(kOrigin1, kDB3); |
174 CheckNotificationReceived(&observer1, kOrigin1, kDB3, 6, kDefaultQuota - 11); | 201 CheckNotificationReceived(&observer1, kOrigin1, kDB3, 6, origin1_quota - 11); |
| 202 tracker->DatabaseClosed(kOrigin1, kDB1); |
175 | 203 |
176 // Clean up. | 204 // Remove all observers. |
177 tracker->RemoveObserver(&observer1); | 205 tracker->RemoveObserver(&observer1); |
| 206 |
| 207 // Trying to delete a database in use should fail |
| 208 tracker->DatabaseOpened(kOrigin1, kDB3, kDescription, 0, |
| 209 &database_size, &space_available); |
| 210 EXPECT_FALSE(tracker->DeleteDatabase(kOrigin1, kDB3)); |
| 211 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); |
| 212 EXPECT_TRUE(origin1_info); |
| 213 EXPECT_EQ(6, origin1_info->GetDatabaseSize(kDB3)); |
| 214 tracker->DatabaseClosed(kOrigin1, kDB3); |
| 215 |
| 216 // Delete a database and make sure the space used by that origin is updated |
| 217 EXPECT_TRUE(tracker->DeleteDatabase(kOrigin1, kDB3)); |
| 218 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); |
| 219 EXPECT_TRUE(origin1_info); |
| 220 EXPECT_EQ(origin1_quota - 5, tracker->GetOriginSpaceAvailable(kOrigin1)); |
| 221 EXPECT_EQ(5, origin1_info->GetDatabaseSize(kDB1)); |
| 222 EXPECT_EQ(0, origin1_info->GetDatabaseSize(kDB3)); |
| 223 |
| 224 // Get all data for all origins |
| 225 std::vector<OriginInfo> origins_info; |
| 226 EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info)); |
| 227 EXPECT_EQ(size_t(2), origins_info.size()); |
| 228 EXPECT_EQ(kOrigin1, origins_info[0].GetOrigin()); |
| 229 EXPECT_EQ(5, origins_info[0].TotalSize()); |
| 230 EXPECT_EQ(origin1_quota, origins_info[0].Quota()); |
| 231 EXPECT_EQ(5, origins_info[0].GetDatabaseSize(kDB1)); |
| 232 EXPECT_EQ(0, origins_info[0].GetDatabaseSize(kDB3)); |
| 233 |
| 234 EXPECT_EQ(kOrigin2, origins_info[1].GetOrigin()); |
| 235 EXPECT_EQ(2, origins_info[1].TotalSize()); |
| 236 EXPECT_EQ(origin2_quota, origins_info[1].Quota()); |
| 237 |
| 238 // Trying to delete an origin with databases in use should fail |
| 239 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, |
| 240 &database_size, &space_available); |
| 241 EXPECT_FALSE(tracker->DeleteOrigin(kOrigin1)); |
| 242 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); |
| 243 EXPECT_TRUE(origin1_info); |
| 244 EXPECT_EQ(5, origin1_info->GetDatabaseSize(kDB1)); |
| 245 tracker->DatabaseClosed(kOrigin1, kDB1); |
| 246 |
| 247 // Delete an origin that doesn't have any database in use |
| 248 EXPECT_TRUE(tracker->DeleteOrigin(kOrigin1)); |
| 249 origins_info.clear(); |
| 250 EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info)); |
| 251 EXPECT_EQ(size_t(1), origins_info.size()); |
| 252 EXPECT_EQ(kOrigin2, origins_info[0].GetOrigin()); |
| 253 |
| 254 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); |
| 255 EXPECT_TRUE(origin1_info); |
| 256 EXPECT_EQ(origin1_quota, origin1_info->Quota()); |
| 257 EXPECT_EQ(0, origin1_info->TotalSize()); |
| 258 EXPECT_EQ(origin1_quota, tracker->GetOriginSpaceAvailable(kOrigin1)); |
178 } | 259 } |
179 | 260 |
180 } // namespace webkit_database | 261 } // namespace webkit_database |
OLD | NEW |