Chromium Code Reviews
|
| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2011 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 <map> | |
| 6 | |
| 7 #include "base/memory/scoped_callback_factory.h" | |
| 8 #include "base/message_loop.h" | |
| 9 #include "base/message_loop_proxy.h" | |
| 10 #include "net/base/net_errors.h" | |
| 11 #include "testing/gtest/include/gtest/gtest.h" | |
| 12 #include "webkit/appcache/appcache_quota_client.h" | |
| 13 #include "webkit/appcache/mock_appcache_service.h" | |
| 14 | |
| 15 namespace appcache { | |
| 16 | |
| 17 // Declared to shorten the line lengths. | |
| 18 static const quota::StorageType kTemp = quota::kStorageTypeTemporary; | |
| 19 static const quota::StorageType kPerm = quota::kStorageTypePersistent; | |
| 20 | |
| 21 | |
| 22 // Base class for our test fixtures. | |
| 23 class AppCacheQuotaClientTest : public testing::Test { | |
| 24 public: | |
| 25 const GURL kOriginA; | |
| 26 const GURL kOriginB; | |
| 27 const GURL kOriginOther; | |
| 28 | |
| 29 | |
| 30 AppCacheQuotaClientTest() | |
| 31 : kOriginA("http://host"), | |
| 32 kOriginB("http://host:8000"), | |
| 33 kOriginOther("http://other"), | |
| 34 usage_(0), | |
| 35 delete_status_(quota::kQuotaStatusUnknown), | |
| 36 num_get_origin_usage_completions_(0), | |
| 37 num_get_origins_completions_(0), | |
| 38 num_delete_origins_completions_(0), | |
| 39 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { | |
| 40 } | |
| 41 | |
| 42 int64 GetOriginUsage( | |
| 43 quota::QuotaClient* client, | |
| 44 const GURL& origin, | |
| 45 quota::StorageType type) { | |
| 46 usage_ = -1; | |
| 47 AsyncGetOriginUsage(client, origin, type); | |
| 48 MessageLoop::current()->RunAllPending(); | |
| 49 return usage_; | |
| 50 } | |
| 51 | |
| 52 const std::set<GURL>& GetOriginsForType( | |
| 53 quota::QuotaClient* client, | |
| 54 quota::StorageType type) { | |
| 55 origins_.clear(); | |
| 56 AsyncGetOriginsForType(client, type); | |
| 57 MessageLoop::current()->RunAllPending(); | |
| 58 return origins_; | |
| 59 } | |
| 60 | |
| 61 const std::set<GURL>& GetOriginsForHost( | |
| 62 quota::QuotaClient* client, | |
| 63 quota::StorageType type, | |
| 64 const std::string& host) { | |
| 65 origins_.clear(); | |
| 66 AsyncGetOriginsForHost(client, type, host); | |
| 67 MessageLoop::current()->RunAllPending(); | |
| 68 return origins_; | |
| 69 } | |
| 70 | |
| 71 quota::QuotaStatusCode DeleteOriginData( | |
| 72 quota::QuotaClient* client, | |
| 73 quota::StorageType type, | |
| 74 const GURL& origin) { | |
| 75 delete_status_ = quota::kQuotaStatusUnknown; | |
| 76 AsyncDeleteOriginData(client, type, origin); | |
| 77 MessageLoop::current()->RunAllPending(); | |
| 78 return delete_status_; | |
| 79 } | |
| 80 | |
| 81 void AsyncGetOriginUsage( | |
| 82 quota::QuotaClient* client, | |
| 83 const GURL& origin, | |
| 84 quota::StorageType type) { | |
| 85 client->GetOriginUsage(origin, type, | |
| 86 callback_factory_.NewCallback( | |
| 87 &AppCacheQuotaClientTest::OnGetOriginUsageComplete)); | |
| 88 } | |
| 89 | |
| 90 void AsyncGetOriginsForType( | |
| 91 quota::QuotaClient* client, | |
| 92 quota::StorageType type) { | |
| 93 client->GetOriginsForType(type, | |
| 94 callback_factory_.NewCallback( | |
| 95 &AppCacheQuotaClientTest::OnGetOriginsComplete)); | |
| 96 } | |
| 97 | |
| 98 void AsyncGetOriginsForHost( | |
| 99 quota::QuotaClient* client, | |
| 100 quota::StorageType type, | |
| 101 const std::string& host) { | |
| 102 client->GetOriginsForHost(type, host, | |
| 103 callback_factory_.NewCallback( | |
| 104 &AppCacheQuotaClientTest::OnGetOriginsComplete)); | |
| 105 } | |
| 106 | |
| 107 void AsyncDeleteOriginData( | |
| 108 quota::QuotaClient* client, | |
| 109 quota::StorageType type, | |
| 110 const GURL& origin) { | |
| 111 client->DeleteOriginData(origin, type, | |
| 112 callback_factory_.NewCallback( | |
| 113 &AppCacheQuotaClientTest::OnDeleteOriginDataComplete)); | |
| 114 } | |
| 115 | |
| 116 void SetUsageMapEntry(const GURL& origin, int64 usage) { | |
| 117 mock_service_.storage()->usage_map_[origin] = usage; | |
| 118 } | |
| 119 | |
| 120 AppCacheQuotaClient* CreateClient() { | |
| 121 return new AppCacheQuotaClient(&mock_service_); | |
| 122 } | |
| 123 | |
| 124 void Call_NotifyAppCacheReady(AppCacheQuotaClient* client) { | |
| 125 client->NotifyAppCacheReady(); | |
| 126 } | |
| 127 | |
| 128 void Call_NotifyAppCacheDestroyed(AppCacheQuotaClient* client) { | |
| 129 client->NotifyAppCacheDestroyed(); | |
| 130 } | |
| 131 | |
| 132 void Call_OnQuotaManagerDestroyed(AppCacheQuotaClient* client) { | |
| 133 client->OnQuotaManagerDestroyed(); | |
| 134 } | |
| 135 | |
| 136 void OnGetOriginUsageComplete(int64 usage) { | |
| 137 ++num_get_origin_usage_completions_; | |
| 138 usage_ = usage; | |
| 139 } | |
| 140 | |
| 141 void OnGetOriginsComplete(const std::set<GURL>& origins) { | |
| 142 ++num_get_origins_completions_; | |
| 143 origins_ = origins; | |
| 144 } | |
| 145 | |
| 146 void OnDeleteOriginDataComplete(quota::QuotaStatusCode status) { | |
| 147 ++num_delete_origins_completions_; | |
| 148 delete_status_ = status; | |
| 149 } | |
| 150 | |
| 151 int64 usage_; | |
| 152 std::set<GURL> origins_; | |
| 153 quota::QuotaStatusCode delete_status_; | |
| 154 int num_get_origin_usage_completions_; | |
| 155 int num_get_origins_completions_; | |
| 156 int num_delete_origins_completions_; | |
| 157 MockAppCacheService mock_service_; | |
| 158 base::ScopedCallbackFactory<AppCacheQuotaClientTest> callback_factory_; | |
| 159 }; | |
| 160 | |
| 161 | |
| 162 TEST_F(AppCacheQuotaClientTest, BasicCreateDestroy) { | |
| 163 AppCacheQuotaClient* client = CreateClient(); | |
| 164 Call_NotifyAppCacheReady(client); | |
| 165 Call_OnQuotaManagerDestroyed(client); | |
| 166 Call_NotifyAppCacheDestroyed(client); | |
| 167 } | |
| 168 | |
| 169 TEST_F(AppCacheQuotaClientTest, EmptyService) { | |
| 170 AppCacheQuotaClient* client = CreateClient(); | |
| 171 Call_NotifyAppCacheReady(client); | |
| 172 | |
| 173 EXPECT_EQ(0, GetOriginUsage(client, kOriginA, kTemp)); | |
| 174 EXPECT_EQ(0, GetOriginUsage(client, kOriginA, kPerm)); | |
| 175 EXPECT_TRUE(GetOriginsForType(client, kTemp).empty()); | |
| 176 EXPECT_TRUE(GetOriginsForType(client, kPerm).empty()); | |
| 177 EXPECT_TRUE(GetOriginsForHost(client, kTemp, kOriginA.host()).empty()); | |
| 178 EXPECT_TRUE(GetOriginsForHost(client, kPerm, kOriginA.host()).empty()); | |
| 179 EXPECT_EQ(quota::kQuotaStatusOk, DeleteOriginData(client, kTemp, kOriginA)); | |
| 180 EXPECT_EQ(quota::kQuotaStatusOk, DeleteOriginData(client, kPerm, kOriginA)); | |
| 181 | |
| 182 Call_NotifyAppCacheDestroyed(client); | |
| 183 Call_OnQuotaManagerDestroyed(client); | |
| 184 } | |
| 185 | |
| 186 TEST_F(AppCacheQuotaClientTest, NoService) { | |
| 187 AppCacheQuotaClient* client = CreateClient(); | |
| 188 Call_NotifyAppCacheReady(client); | |
| 189 Call_NotifyAppCacheDestroyed(client); | |
| 190 | |
| 191 EXPECT_EQ(0, GetOriginUsage(client, kOriginA, kTemp)); | |
| 192 EXPECT_EQ(0, GetOriginUsage(client, kOriginA, kPerm)); | |
| 193 EXPECT_TRUE(GetOriginsForType(client, kTemp).empty()); | |
| 194 EXPECT_TRUE(GetOriginsForType(client, kPerm).empty()); | |
| 195 EXPECT_TRUE(GetOriginsForHost(client, kTemp, kOriginA.host()).empty()); | |
| 196 EXPECT_TRUE(GetOriginsForHost(client, kPerm, kOriginA.host()).empty()); | |
| 197 EXPECT_EQ(quota::kQuotaErrorAbort, | |
| 198 DeleteOriginData(client, kTemp, kOriginA)); | |
| 199 EXPECT_EQ(quota::kQuotaErrorAbort, | |
| 200 DeleteOriginData(client, kPerm, kOriginA)); | |
| 201 | |
| 202 Call_OnQuotaManagerDestroyed(client); | |
| 203 } | |
| 204 | |
| 205 | |
|
kinuko
2011/06/08 13:49:25
nit: extra empty line
michaeln
2011/06/08 18:09:54
Done.
| |
| 206 TEST_F(AppCacheQuotaClientTest, GetOriginUsage) { | |
| 207 AppCacheQuotaClient* client = CreateClient(); | |
| 208 Call_NotifyAppCacheReady(client); | |
| 209 | |
| 210 SetUsageMapEntry(kOriginA, 1000); | |
| 211 EXPECT_EQ(1000, GetOriginUsage(client, kOriginA, kTemp)); | |
| 212 EXPECT_EQ(0, GetOriginUsage(client, kOriginA, kPerm)); | |
| 213 | |
| 214 Call_NotifyAppCacheDestroyed(client); | |
| 215 Call_OnQuotaManagerDestroyed(client); | |
| 216 } | |
| 217 | |
| 218 TEST_F(AppCacheQuotaClientTest, GetOriginsForHost) { | |
| 219 AppCacheQuotaClient* client = CreateClient(); | |
| 220 Call_NotifyAppCacheReady(client); | |
| 221 | |
| 222 EXPECT_EQ(kOriginA.host(), kOriginB.host()); | |
| 223 EXPECT_NE(kOriginA.host(), kOriginOther.host()); | |
| 224 | |
| 225 std::set<GURL> origins = GetOriginsForHost(client, kTemp, kOriginA.host()); | |
| 226 EXPECT_TRUE(origins.empty()); | |
| 227 | |
| 228 SetUsageMapEntry(kOriginA, 1000); | |
| 229 SetUsageMapEntry(kOriginB, 10); | |
| 230 SetUsageMapEntry(kOriginOther, 500); | |
| 231 | |
| 232 origins = GetOriginsForHost(client, kTemp, kOriginA.host()); | |
| 233 EXPECT_EQ(2ul, origins.size()); | |
| 234 EXPECT_TRUE(origins.find(kOriginA) != origins.end()); | |
| 235 EXPECT_TRUE(origins.find(kOriginB) != origins.end()); | |
| 236 | |
| 237 origins = GetOriginsForHost(client, kTemp, kOriginOther.host()); | |
| 238 EXPECT_EQ(1ul, origins.size()); | |
| 239 EXPECT_TRUE(origins.find(kOriginOther) != origins.end()); | |
| 240 | |
| 241 origins = GetOriginsForHost(client, kPerm, kOriginA.host()); | |
| 242 EXPECT_TRUE(origins.empty()); | |
| 243 | |
| 244 Call_NotifyAppCacheDestroyed(client); | |
| 245 Call_OnQuotaManagerDestroyed(client); | |
| 246 } | |
| 247 | |
| 248 TEST_F(AppCacheQuotaClientTest, GetOriginsForType) { | |
| 249 AppCacheQuotaClient* client = CreateClient(); | |
| 250 Call_NotifyAppCacheReady(client); | |
| 251 | |
| 252 EXPECT_TRUE(GetOriginsForType(client, kTemp).empty()); | |
| 253 EXPECT_TRUE(GetOriginsForType(client, kPerm).empty()); | |
| 254 | |
| 255 SetUsageMapEntry(kOriginA, 1000); | |
| 256 SetUsageMapEntry(kOriginB, 10); | |
| 257 | |
| 258 std::set<GURL> origins = GetOriginsForType(client, kTemp); | |
| 259 EXPECT_EQ(2ul, origins.size()); | |
| 260 EXPECT_TRUE(origins.find(kOriginA) != origins.end()); | |
| 261 EXPECT_TRUE(origins.find(kOriginB) != origins.end()); | |
| 262 | |
| 263 EXPECT_TRUE(GetOriginsForType(client, kPerm).empty()); | |
| 264 | |
| 265 Call_NotifyAppCacheDestroyed(client); | |
| 266 Call_OnQuotaManagerDestroyed(client); | |
| 267 } | |
| 268 | |
| 269 TEST_F(AppCacheQuotaClientTest, DeleteOriginData) { | |
| 270 AppCacheQuotaClient* client = CreateClient(); | |
| 271 Call_NotifyAppCacheReady(client); | |
| 272 | |
| 273 // Perm deletions are short circuited in the Client and | |
| 274 // should not reach the AppCacheService. | |
| 275 EXPECT_EQ(quota::kQuotaStatusOk, | |
| 276 DeleteOriginData(client, kPerm, kOriginA)); | |
| 277 EXPECT_EQ(0, mock_service_.delete_called_count()); | |
| 278 | |
| 279 EXPECT_EQ(quota::kQuotaStatusOk, | |
| 280 DeleteOriginData(client, kTemp, kOriginA)); | |
| 281 EXPECT_EQ(1, mock_service_.delete_called_count()); | |
| 282 | |
| 283 mock_service_.set_mock_delete_appcaches_for_origin_result( | |
| 284 net::ERR_ABORTED); | |
| 285 EXPECT_EQ(quota::kQuotaErrorAbort, | |
| 286 DeleteOriginData(client, kTemp, kOriginA)); | |
| 287 EXPECT_EQ(2, mock_service_.delete_called_count()); | |
|
kinuko
2011/06/08 13:49:25
don't we need to call Call_NotifyAppCacheDestroyed
michaeln
2011/06/08 18:09:54
Yes... done... thnx
| |
| 288 } | |
| 289 | |
| 290 TEST_F(AppCacheQuotaClientTest, PendingRequests) { | |
| 291 AppCacheQuotaClient* client = CreateClient(); | |
| 292 | |
| 293 SetUsageMapEntry(kOriginA, 1000); | |
| 294 SetUsageMapEntry(kOriginB, 10); | |
| 295 SetUsageMapEntry(kOriginOther, 500); | |
| 296 | |
| 297 // Queue up some reqeusts. | |
| 298 AsyncGetOriginUsage(client, kOriginA, kPerm); | |
| 299 AsyncGetOriginUsage(client, kOriginB, kTemp); | |
| 300 AsyncGetOriginsForType(client, kPerm); | |
| 301 AsyncGetOriginsForType(client, kTemp); | |
| 302 AsyncGetOriginsForHost(client, kTemp, kOriginA.host()); | |
| 303 AsyncGetOriginsForHost(client, kTemp, kOriginOther.host()); | |
| 304 AsyncDeleteOriginData(client, kTemp, kOriginA); | |
| 305 AsyncDeleteOriginData(client, kPerm, kOriginA); | |
| 306 AsyncDeleteOriginData(client, kTemp, kOriginB); | |
| 307 | |
| 308 EXPECT_EQ(0, num_get_origin_usage_completions_); | |
| 309 EXPECT_EQ(0, num_get_origins_completions_); | |
| 310 EXPECT_EQ(0, num_delete_origins_completions_); | |
| 311 MessageLoop::current()->RunAllPending(); | |
| 312 EXPECT_EQ(0, num_get_origin_usage_completions_); | |
| 313 EXPECT_EQ(0, num_get_origins_completions_); | |
| 314 EXPECT_EQ(0, num_delete_origins_completions_); | |
| 315 | |
| 316 // Pending requests should get serviced when the appcache is ready. | |
| 317 Call_NotifyAppCacheReady(client); | |
| 318 EXPECT_EQ(2, num_get_origin_usage_completions_); | |
| 319 EXPECT_EQ(4, num_get_origins_completions_); | |
| 320 EXPECT_EQ(0, num_delete_origins_completions_); | |
| 321 MessageLoop::current()->RunAllPending(); | |
| 322 EXPECT_EQ(3, num_delete_origins_completions_); // deletes are really async | |
| 323 | |
| 324 // They should be serviced in order requested. | |
| 325 EXPECT_EQ(10, usage_); | |
| 326 EXPECT_EQ(1ul, origins_.size()); | |
| 327 EXPECT_TRUE(origins_.find(kOriginOther) != origins_.end()); | |
| 328 | |
| 329 Call_NotifyAppCacheDestroyed(client); | |
| 330 Call_OnQuotaManagerDestroyed(client); | |
| 331 } | |
| 332 | |
| 333 TEST_F(AppCacheQuotaClientTest, DestroyServiceWithPending) { | |
| 334 } | |
| 335 | |
| 336 TEST_F(AppCacheQuotaClientTest, DestroyQuotaManagerWithPending) { | |
| 337 } | |
| 338 | |
| 339 | |
| 340 } // namespace appcache | |
| OLD | NEW |