| OLD | NEW |
| (Empty) |
| 1 // Copyright 2007-2009 Google Inc. | |
| 2 // | |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | |
| 4 // you may not use this file except in compliance with the License. | |
| 5 // You may obtain a copy of the License at | |
| 6 // | |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | |
| 8 // | |
| 9 // Unless required by applicable law or agreed to in writing, software | |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | |
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 12 // See the License for the specific language governing permissions and | |
| 13 // limitations under the License. | |
| 14 // ======================================================================== | |
| 15 | |
| 16 #include "omaha/base/app_util.h" | |
| 17 #include "omaha/base/error.h" | |
| 18 #include "omaha/base/file.h" | |
| 19 #include "omaha/base/path.h" | |
| 20 #include "omaha/base/string.h" | |
| 21 #include "omaha/base/utils.h" | |
| 22 #include "omaha/goopdate/package_cache.h" | |
| 23 #include "omaha/testing/unit_test.h" | |
| 24 | |
| 25 namespace omaha { | |
| 26 | |
| 27 class PackageCacheTest : public testing::Test { | |
| 28 protected: | |
| 29 typedef PackageCache::Key Key; | |
| 30 | |
| 31 PackageCacheTest() | |
| 32 : cache_root_(GetUniqueTempDirectoryName()), | |
| 33 size_file1_(0), | |
| 34 size_file2_(0) { | |
| 35 EXPECT_FALSE(cache_root_.IsEmpty()); | |
| 36 | |
| 37 CString executable_path(app_util::GetCurrentModuleDirectory()); | |
| 38 | |
| 39 source_file1_ = ConcatenatePath( | |
| 40 executable_path, | |
| 41 _T("unittest_support\\download_cache_test\\") | |
| 42 _T("{89640431-FE64-4da8-9860-1A1085A60E13}\\gears-win32-opt.msi")); | |
| 43 | |
| 44 hash_file1_ = _T("ImV9skETZqGFMjs32vbZTvzAYJU="); | |
| 45 | |
| 46 size_file1_ = 870400; | |
| 47 | |
| 48 source_file2_ = ConcatenatePath( | |
| 49 executable_path, | |
| 50 _T("unittest_support\\download_cache_test\\") | |
| 51 _T("{7101D597-3481-4971-AD23-455542964072}\\livelysetup.exe")); | |
| 52 | |
| 53 hash_file2_ = _T("Igq6bYaeXFJCjH770knXyJ6V53s="); | |
| 54 | |
| 55 size_file2_ = 479848; | |
| 56 | |
| 57 EXPECT_TRUE(File::Exists(source_file1_)); | |
| 58 EXPECT_TRUE(File::Exists(source_file2_)); | |
| 59 } | |
| 60 | |
| 61 virtual void SetUp() { | |
| 62 EXPECT_FALSE(String_EndsWith(cache_root_, _T("\\"), true)); | |
| 63 EXPECT_HRESULT_SUCCEEDED(package_cache_.Initialize(cache_root_)); | |
| 64 EXPECT_HRESULT_SUCCEEDED(package_cache_.PurgeAll()); | |
| 65 } | |
| 66 | |
| 67 virtual void TearDown() { | |
| 68 EXPECT_HRESULT_SUCCEEDED(DeleteDirectory(cache_root_)); | |
| 69 } | |
| 70 | |
| 71 HRESULT BuildCacheFileNameForKey(const Key& key, CString* filename) const { | |
| 72 return package_cache_.BuildCacheFileNameForKey(key, filename); | |
| 73 } | |
| 74 | |
| 75 HRESULT ExpireCache(const Key& key) { | |
| 76 FILETIME expiration_time = package_cache_.GetCacheExpirationTime(); | |
| 77 | |
| 78 CString cached_file_name; | |
| 79 EXPECT_HRESULT_SUCCEEDED(BuildCacheFileNameForKey(key, &cached_file_name)); | |
| 80 | |
| 81 // Change file time a little big earlier than the expiration time. | |
| 82 ULARGE_INTEGER file_time = {0}; | |
| 83 file_time.LowPart = expiration_time.dwLowDateTime; | |
| 84 file_time.HighPart = expiration_time.dwHighDateTime; | |
| 85 file_time.QuadPart -= 1; | |
| 86 | |
| 87 expiration_time.dwLowDateTime = file_time.LowPart; | |
| 88 expiration_time.dwHighDateTime = file_time.HighPart; | |
| 89 | |
| 90 return File::SetFileTime(cached_file_name, | |
| 91 &expiration_time, | |
| 92 &expiration_time, | |
| 93 &expiration_time); | |
| 94 } | |
| 95 | |
| 96 void SetCacheSizeLimitMB(int limit_mb) { | |
| 97 package_cache_.cache_size_limit_bytes_ = 1024 * 1024 * | |
| 98 static_cast<uint64>(limit_mb); | |
| 99 } | |
| 100 | |
| 101 void SetCacheTimeLimitDays(int limit_days) { | |
| 102 package_cache_.cache_time_limit_days_ = limit_days; | |
| 103 } | |
| 104 | |
| 105 const CString cache_root_; | |
| 106 CString source_file1_; | |
| 107 CString hash_file1_; | |
| 108 uint64 size_file1_; | |
| 109 | |
| 110 CString source_file2_; | |
| 111 CString hash_file2_; | |
| 112 uint64 size_file2_; | |
| 113 | |
| 114 PackageCache package_cache_; | |
| 115 }; | |
| 116 | |
| 117 // Tests the members of key when the constructor arguments are empty strings. | |
| 118 TEST_F(PackageCacheTest, DefaultVersion) { | |
| 119 Key key(_T(""), _T(""), _T("")); | |
| 120 EXPECT_STREQ(_T(""), key.app_id()); | |
| 121 EXPECT_STREQ(_T("0.0.0.0"), key.version()); | |
| 122 EXPECT_STREQ(_T(""), key.package_name()); | |
| 123 } | |
| 124 | |
| 125 TEST_F(PackageCacheTest, Initialize) { | |
| 126 EXPECT_FALSE(package_cache_.cache_root().IsEmpty()); | |
| 127 EXPECT_STREQ(cache_root_, package_cache_.cache_root()); | |
| 128 EXPECT_EQ(0, package_cache_.Size()); | |
| 129 } | |
| 130 | |
| 131 TEST_F(PackageCacheTest, InitializeErrors) { | |
| 132 PackageCache package_cache; | |
| 133 EXPECT_EQ(E_INVALIDARG, package_cache.Initialize(NULL)); | |
| 134 EXPECT_EQ(E_INVALIDARG, package_cache.Initialize(_T(""))); | |
| 135 EXPECT_EQ(E_INVALIDARG, package_cache.Initialize(_T("foo"))); | |
| 136 } | |
| 137 | |
| 138 TEST_F(PackageCacheTest, BuildCacheFileName) { | |
| 139 CString actual; | |
| 140 EXPECT_HRESULT_SUCCEEDED( | |
| 141 BuildCacheFileNameForKey(Key(_T("1"), _T("2"), _T("3")), &actual)); | |
| 142 CString expected = cache_root_ + _T("\\1\\2\\3"); | |
| 143 EXPECT_STREQ(expected, actual); | |
| 144 | |
| 145 EXPECT_HRESULT_SUCCEEDED( | |
| 146 BuildCacheFileNameForKey(Key(_T("1"), _T("2"), _T("3\\4")), &actual)); | |
| 147 expected = cache_root_ + _T("\\1\\2\\3\\4"); | |
| 148 EXPECT_STREQ(expected, actual); | |
| 149 | |
| 150 EXPECT_EQ(E_INVALIDARG, | |
| 151 BuildCacheFileNameForKey(Key(_T("1"), _T("2"), _T("..\\3")), | |
| 152 &actual)); | |
| 153 } | |
| 154 | |
| 155 // Tests Put, Get, IsCached, and Purge calls. | |
| 156 TEST_F(PackageCacheTest, BasicTest) { | |
| 157 EXPECT_HRESULT_SUCCEEDED(package_cache_.PurgeAll()); | |
| 158 | |
| 159 Key key1(_T("app1"), _T("ver1"), _T("package1")); | |
| 160 | |
| 161 // Check the file is not in the cache. | |
| 162 EXPECT_FALSE(package_cache_.IsCached(key1, hash_file1_)); | |
| 163 | |
| 164 // Cache one file. | |
| 165 EXPECT_HRESULT_SUCCEEDED(package_cache_.Put(key1, | |
| 166 source_file1_, | |
| 167 hash_file1_)); | |
| 168 EXPECT_EQ(size_file1_, package_cache_.Size()); | |
| 169 | |
| 170 // Check the file is in the cache. | |
| 171 EXPECT_TRUE(package_cache_.IsCached(key1, hash_file1_)); | |
| 172 | |
| 173 // Check the source file is not deleted after caching it. | |
| 174 EXPECT_TRUE(File::Exists(source_file1_)); | |
| 175 | |
| 176 // Get the package from the cache into a temporary file. | |
| 177 CString destination_file; | |
| 178 EXPECT_TRUE(::GetTempFileName(app_util::GetTempDir(), _T(""), 0, | |
| 179 CStrBuf(destination_file, MAX_PATH))); | |
| 180 | |
| 181 // Get the file two times. | |
| 182 EXPECT_HRESULT_SUCCEEDED(package_cache_.Get(key1, | |
| 183 destination_file, | |
| 184 hash_file1_)); | |
| 185 EXPECT_TRUE(File::Exists(destination_file)); | |
| 186 EXPECT_HRESULT_SUCCEEDED(PackageCache::AuthenticateFile(destination_file, | |
| 187 hash_file1_)); | |
| 188 | |
| 189 EXPECT_HRESULT_SUCCEEDED(package_cache_.Get(key1, | |
| 190 destination_file, | |
| 191 hash_file1_)); | |
| 192 EXPECT_TRUE(File::Exists(destination_file)); | |
| 193 EXPECT_HRESULT_SUCCEEDED(PackageCache::AuthenticateFile(destination_file, | |
| 194 hash_file1_)); | |
| 195 | |
| 196 EXPECT_TRUE(::DeleteFile(destination_file)); | |
| 197 | |
| 198 // Cache another file. | |
| 199 Key key2(_T("app2"), _T("ver2"), _T("package2")); | |
| 200 | |
| 201 EXPECT_HRESULT_SUCCEEDED(package_cache_.Put(key2, | |
| 202 source_file2_, | |
| 203 hash_file2_)); | |
| 204 EXPECT_EQ(size_file1_ + size_file2_, package_cache_.Size()); | |
| 205 EXPECT_TRUE(package_cache_.IsCached(key2, hash_file2_)); | |
| 206 | |
| 207 // Cache the same file again. It should be idempotent. | |
| 208 EXPECT_HRESULT_SUCCEEDED(package_cache_.Put(key2, | |
| 209 source_file2_, | |
| 210 hash_file2_)); | |
| 211 EXPECT_EQ(size_file1_ + size_file2_, package_cache_.Size()); | |
| 212 | |
| 213 EXPECT_TRUE(package_cache_.IsCached(key2, hash_file2_)); | |
| 214 EXPECT_TRUE(File::Exists(source_file2_)); | |
| 215 | |
| 216 EXPECT_HRESULT_SUCCEEDED(package_cache_.Purge(key1)); | |
| 217 EXPECT_FALSE(package_cache_.IsCached(key1, hash_file1_)); | |
| 218 EXPECT_EQ(size_file2_, package_cache_.Size()); | |
| 219 | |
| 220 EXPECT_HRESULT_SUCCEEDED(package_cache_.Purge(key2)); | |
| 221 EXPECT_FALSE(package_cache_.IsCached(key2, hash_file2_)); | |
| 222 EXPECT_EQ(0, package_cache_.Size()); | |
| 223 | |
| 224 // Try getting a purged files. | |
| 225 EXPECT_HRESULT_FAILED(package_cache_.Get(key1, | |
| 226 destination_file, | |
| 227 hash_file1_)); | |
| 228 EXPECT_FALSE(File::Exists(destination_file)); | |
| 229 | |
| 230 EXPECT_HRESULT_FAILED(package_cache_.Get(key2, | |
| 231 destination_file, | |
| 232 hash_file2_)); | |
| 233 EXPECT_FALSE(File::Exists(destination_file)); | |
| 234 } | |
| 235 | |
| 236 TEST_F(PackageCacheTest, PutBadHashTest) { | |
| 237 EXPECT_HRESULT_SUCCEEDED(package_cache_.PurgeAll()); | |
| 238 | |
| 239 Key key1(_T("app1"), _T("ver1"), _T("package1")); | |
| 240 | |
| 241 // Check the file is not in the cache. | |
| 242 EXPECT_FALSE(package_cache_.IsCached(key1, hash_file1_)); | |
| 243 | |
| 244 // Try caching one file when the hash is not correct. | |
| 245 const CString bad_hash = _T("JmV9skETZqGFMjs32vbZTvzAYJU="); | |
| 246 EXPECT_EQ(SIGS_E_INVALID_SIGNATURE, package_cache_.Put(key1, | |
| 247 source_file1_, | |
| 248 bad_hash)); | |
| 249 // Check the file is not the cache. | |
| 250 EXPECT_FALSE(package_cache_.IsCached(key1, hash_file1_)); | |
| 251 } | |
| 252 | |
| 253 // The key must include the app id, version, and package name for Put and Get | |
| 254 // operations. If the version is not provided, "0.0.0.0" is used internally. | |
| 255 TEST_F(PackageCacheTest, BadKeyTest) { | |
| 256 Key key_empty_app(_T(""), _T("b"), _T("c")); | |
| 257 Key key_empty_name(_T("a"), _T("b"), _T("")); | |
| 258 | |
| 259 EXPECT_EQ(E_INVALIDARG, package_cache_.Get(key_empty_app, _T("a"), _T("b"))); | |
| 260 EXPECT_EQ(E_INVALIDARG, package_cache_.Get(key_empty_name, _T("a"), _T("b"))); | |
| 261 | |
| 262 EXPECT_EQ(E_INVALIDARG, package_cache_.Put(key_empty_app, _T("a"), _T("b"))); | |
| 263 EXPECT_EQ(E_INVALIDARG, package_cache_.Put(key_empty_name, _T("a"), _T("b"))); | |
| 264 } | |
| 265 | |
| 266 TEST_F(PackageCacheTest, PurgeVersionTest) { | |
| 267 // Cache two files for two versions of the same app. | |
| 268 Key key11(_T("app1"), _T("ver1"), _T("package1")); | |
| 269 Key key12(_T("app1"), _T("ver1"), _T("package2")); | |
| 270 Key key21(_T("app1"), _T("ver2"), _T("package1")); | |
| 271 Key key22(_T("app1"), _T("ver2"), _T("package2")); | |
| 272 | |
| 273 EXPECT_HRESULT_SUCCEEDED(package_cache_.Put(key11, | |
| 274 source_file1_, | |
| 275 hash_file1_)); | |
| 276 EXPECT_HRESULT_SUCCEEDED(package_cache_.Put(key12, | |
| 277 source_file2_, | |
| 278 hash_file2_)); | |
| 279 EXPECT_HRESULT_SUCCEEDED(package_cache_.Put(key21, | |
| 280 source_file1_, | |
| 281 hash_file1_)); | |
| 282 EXPECT_HRESULT_SUCCEEDED(package_cache_.Put(key22, | |
| 283 source_file2_, | |
| 284 hash_file2_)); | |
| 285 | |
| 286 EXPECT_TRUE(package_cache_.IsCached(key11, hash_file1_)); | |
| 287 EXPECT_TRUE(package_cache_.IsCached(key12, hash_file2_)); | |
| 288 EXPECT_TRUE(package_cache_.IsCached(key21, hash_file1_)); | |
| 289 EXPECT_TRUE(package_cache_.IsCached(key22, hash_file2_)); | |
| 290 | |
| 291 EXPECT_EQ(2 * (size_file1_ + size_file2_), package_cache_.Size()); | |
| 292 | |
| 293 EXPECT_HRESULT_SUCCEEDED(package_cache_.PurgeVersion(_T("app1"), _T("ver1"))); | |
| 294 | |
| 295 EXPECT_FALSE(package_cache_.IsCached(key11, hash_file1_)); | |
| 296 EXPECT_FALSE(package_cache_.IsCached(key12, hash_file2_)); | |
| 297 EXPECT_TRUE(package_cache_.IsCached(key21, hash_file1_)); | |
| 298 EXPECT_TRUE(package_cache_.IsCached(key22, hash_file2_)); | |
| 299 | |
| 300 EXPECT_EQ(size_file1_ + size_file2_, package_cache_.Size()); | |
| 301 | |
| 302 EXPECT_HRESULT_SUCCEEDED(package_cache_.PurgeVersion(_T("app1"), _T("ver2"))); | |
| 303 | |
| 304 EXPECT_FALSE(package_cache_.IsCached(key11, hash_file1_)); | |
| 305 EXPECT_FALSE(package_cache_.IsCached(key12, hash_file2_)); | |
| 306 EXPECT_FALSE(package_cache_.IsCached(key21, hash_file1_)); | |
| 307 EXPECT_FALSE(package_cache_.IsCached(key22, hash_file2_)); | |
| 308 | |
| 309 EXPECT_EQ(0, package_cache_.Size()); | |
| 310 } | |
| 311 | |
| 312 TEST_F(PackageCacheTest, PurgeAppTest) { | |
| 313 // Cache two files for two apps. | |
| 314 Key key11(_T("app1"), _T("ver1"), _T("package1")); | |
| 315 Key key12(_T("app1"), _T("ver1"), _T("package2")); | |
| 316 Key key21(_T("app2"), _T("ver2"), _T("package1")); | |
| 317 Key key22(_T("app2"), _T("ver2"), _T("package2")); | |
| 318 | |
| 319 EXPECT_HRESULT_SUCCEEDED(package_cache_.Put(key11, | |
| 320 source_file1_, | |
| 321 hash_file1_)); | |
| 322 EXPECT_HRESULT_SUCCEEDED(package_cache_.Put(key12, | |
| 323 source_file2_, | |
| 324 hash_file2_)); | |
| 325 EXPECT_HRESULT_SUCCEEDED(package_cache_.Put(key21, | |
| 326 source_file1_, | |
| 327 hash_file1_)); | |
| 328 EXPECT_HRESULT_SUCCEEDED(package_cache_.Put(key22, | |
| 329 source_file2_, | |
| 330 hash_file2_)); | |
| 331 | |
| 332 EXPECT_TRUE(package_cache_.IsCached(key11, hash_file1_)); | |
| 333 EXPECT_TRUE(package_cache_.IsCached(key12, hash_file2_)); | |
| 334 EXPECT_TRUE(package_cache_.IsCached(key21, hash_file1_)); | |
| 335 EXPECT_TRUE(package_cache_.IsCached(key22, hash_file2_)); | |
| 336 | |
| 337 EXPECT_EQ(2 * (size_file1_ + size_file2_), package_cache_.Size()); | |
| 338 | |
| 339 EXPECT_HRESULT_SUCCEEDED(package_cache_.PurgeApp(_T("app1"))); | |
| 340 | |
| 341 EXPECT_FALSE(package_cache_.IsCached(key11, hash_file1_)); | |
| 342 EXPECT_FALSE(package_cache_.IsCached(key12, hash_file2_)); | |
| 343 EXPECT_TRUE(package_cache_.IsCached(key21, hash_file1_)); | |
| 344 EXPECT_TRUE(package_cache_.IsCached(key22, hash_file2_)); | |
| 345 | |
| 346 EXPECT_EQ(size_file1_ + size_file2_, package_cache_.Size()); | |
| 347 | |
| 348 EXPECT_HRESULT_SUCCEEDED(package_cache_.PurgeApp(_T("app2"))); | |
| 349 | |
| 350 EXPECT_FALSE(package_cache_.IsCached(key11, hash_file1_)); | |
| 351 EXPECT_FALSE(package_cache_.IsCached(key12, hash_file2_)); | |
| 352 EXPECT_FALSE(package_cache_.IsCached(key21, hash_file1_)); | |
| 353 EXPECT_FALSE(package_cache_.IsCached(key22, hash_file2_)); | |
| 354 | |
| 355 EXPECT_EQ(0, package_cache_.Size()); | |
| 356 } | |
| 357 | |
| 358 TEST_F(PackageCacheTest, PurgeAppLowerVersionsTest) { | |
| 359 EXPECT_EQ(E_INVALIDARG, package_cache_.PurgeAppLowerVersions(_T("app1"), | |
| 360 _T("1"))); | |
| 361 | |
| 362 Key key_10_1(_T("app1"), _T("1.0.0.0"), _T("package1")); | |
| 363 Key key_10_2(_T("app1"), _T("1.0.0.0"), _T("package2")); | |
| 364 Key key_11_1(_T("app1"), _T("1.1.0.0"), _T("package1")); | |
| 365 Key key_21_2(_T("app1"), _T("2.1.0.0"), _T("package2")); | |
| 366 | |
| 367 EXPECT_HRESULT_SUCCEEDED(package_cache_.Put(key_10_1, | |
| 368 source_file1_, | |
| 369 hash_file1_)); | |
| 370 EXPECT_HRESULT_SUCCEEDED(package_cache_.Put(key_10_2, | |
| 371 source_file2_, | |
| 372 hash_file2_)); | |
| 373 EXPECT_HRESULT_SUCCEEDED(package_cache_.Put(key_11_1, | |
| 374 source_file1_, | |
| 375 hash_file1_)); | |
| 376 EXPECT_HRESULT_SUCCEEDED(package_cache_.Put(key_21_2, | |
| 377 source_file2_, | |
| 378 hash_file2_)); | |
| 379 | |
| 380 EXPECT_HRESULT_SUCCEEDED(package_cache_.PurgeAppLowerVersions(_T("app1"), | |
| 381 _T("1.0.0.0"))); | |
| 382 EXPECT_TRUE(package_cache_.IsCached(key_10_1, hash_file1_)); | |
| 383 EXPECT_TRUE(package_cache_.IsCached(key_10_2, hash_file2_)); | |
| 384 EXPECT_TRUE(package_cache_.IsCached(key_11_1, hash_file1_)); | |
| 385 EXPECT_TRUE(package_cache_.IsCached(key_21_2, hash_file2_)); | |
| 386 | |
| 387 EXPECT_HRESULT_SUCCEEDED(package_cache_.PurgeAppLowerVersions(_T("app1"), | |
| 388 _T("1.1.0.0"))); | |
| 389 EXPECT_FALSE(package_cache_.IsCached(key_10_1, hash_file1_)); | |
| 390 EXPECT_FALSE(package_cache_.IsCached(key_10_2, hash_file2_)); | |
| 391 EXPECT_TRUE(package_cache_.IsCached(key_11_1, hash_file1_)); | |
| 392 EXPECT_TRUE(package_cache_.IsCached(key_21_2, hash_file2_)); | |
| 393 | |
| 394 EXPECT_HRESULT_SUCCEEDED(package_cache_.PurgeAppLowerVersions(_T("app1"), | |
| 395 _T("2.1.0.0"))); | |
| 396 EXPECT_FALSE(package_cache_.IsCached(key_11_1, hash_file1_)); | |
| 397 EXPECT_TRUE(package_cache_.IsCached(key_21_2, hash_file2_)); | |
| 398 | |
| 399 EXPECT_HRESULT_SUCCEEDED(package_cache_.PurgeAppLowerVersions(_T("app1"), | |
| 400 _T("2.2.0.0"))); | |
| 401 EXPECT_FALSE(package_cache_.IsCached(key_21_2, hash_file2_)); | |
| 402 | |
| 403 EXPECT_EQ(0, package_cache_.Size()); | |
| 404 } | |
| 405 | |
| 406 TEST_F(PackageCacheTest, PurgeAll) { | |
| 407 // Cache two files for two apps. | |
| 408 Key key11(_T("app1"), _T("ver1"), _T("package1")); | |
| 409 Key key12(_T("app1"), _T("ver1"), _T("package2")); | |
| 410 Key key21(_T("app2"), _T("ver2"), _T("package1")); | |
| 411 Key key22(_T("app2"), _T("ver2"), _T("package2")); | |
| 412 | |
| 413 EXPECT_HRESULT_SUCCEEDED(package_cache_.Put(key11, | |
| 414 source_file1_, | |
| 415 hash_file1_)); | |
| 416 EXPECT_HRESULT_SUCCEEDED(package_cache_.Put(key12, | |
| 417 source_file2_, | |
| 418 hash_file2_)); | |
| 419 EXPECT_HRESULT_SUCCEEDED(package_cache_.Put(key21, | |
| 420 source_file1_, | |
| 421 hash_file1_)); | |
| 422 EXPECT_HRESULT_SUCCEEDED(package_cache_.Put(key22, | |
| 423 source_file2_, | |
| 424 hash_file2_)); | |
| 425 | |
| 426 EXPECT_TRUE(package_cache_.IsCached(key11, hash_file1_)); | |
| 427 EXPECT_TRUE(package_cache_.IsCached(key12, hash_file2_)); | |
| 428 EXPECT_TRUE(package_cache_.IsCached(key21, hash_file1_)); | |
| 429 EXPECT_TRUE(package_cache_.IsCached(key22, hash_file2_)); | |
| 430 | |
| 431 EXPECT_EQ(2 * (size_file1_ + size_file2_), package_cache_.Size()); | |
| 432 | |
| 433 EXPECT_HRESULT_SUCCEEDED(package_cache_.PurgeAll()); | |
| 434 | |
| 435 EXPECT_FALSE(package_cache_.IsCached(key11, hash_file1_)); | |
| 436 EXPECT_FALSE(package_cache_.IsCached(key12, hash_file2_)); | |
| 437 EXPECT_FALSE(package_cache_.IsCached(key21, hash_file1_)); | |
| 438 EXPECT_FALSE(package_cache_.IsCached(key22, hash_file2_)); | |
| 439 | |
| 440 EXPECT_EQ(0, package_cache_.Size()); | |
| 441 } | |
| 442 | |
| 443 TEST_F(PackageCacheTest, PurgeOldPackagesIfOverSizeLimit) { | |
| 444 EXPECT_HRESULT_SUCCEEDED(package_cache_.PurgeAll()); | |
| 445 | |
| 446 const int kCacheSizeLimitMB = 2; | |
| 447 SetCacheSizeLimitMB(kCacheSizeLimitMB); | |
| 448 | |
| 449 const uint64 kSizeLimitBytes = 1024LL * 1024 * kCacheSizeLimitMB; | |
| 450 | |
| 451 Key key0(_T("app0"), _T("version0"), _T("package0")); | |
| 452 | |
| 453 // Keep adding packages until we exceed cache limit. | |
| 454 uint64 current_size = 0; | |
| 455 int i = 0; | |
| 456 while (current_size <= kSizeLimitBytes) { | |
| 457 CString app; | |
| 458 CString version; | |
| 459 CString package; | |
| 460 app.Format(_T("app%d"), i); | |
| 461 version.Format(_T("version%d"), i); | |
| 462 package.Format(_T("package%d"), i); | |
| 463 EXPECT_HRESULT_SUCCEEDED(package_cache_.Put(Key(app, version, package), | |
| 464 source_file1_, | |
| 465 hash_file1_)); | |
| 466 current_size += size_file1_; | |
| 467 EXPECT_EQ(current_size, package_cache_.Size()); | |
| 468 ++i; | |
| 469 } | |
| 470 | |
| 471 // Verify that cache size limit is exceeded. | |
| 472 EXPECT_GT(package_cache_.Size(), kSizeLimitBytes); | |
| 473 EXPECT_TRUE(package_cache_.IsCached(key0, hash_file1_)); | |
| 474 | |
| 475 package_cache_.PurgeOldPackagesIfNecessary(); | |
| 476 | |
| 477 // Verify that the oldes package is purged and the cache size is below limit. | |
| 478 EXPECT_FALSE(package_cache_.IsCached(key0, hash_file1_)); | |
| 479 EXPECT_LE(package_cache_.Size(), kSizeLimitBytes); | |
| 480 } | |
| 481 | |
| 482 TEST_F(PackageCacheTest, PurgeExpiredCacheFiles) { | |
| 483 EXPECT_HRESULT_SUCCEEDED(package_cache_.PurgeAll()); | |
| 484 | |
| 485 const int kCacheLifeLimitDays = 100; | |
| 486 SetCacheTimeLimitDays(kCacheLifeLimitDays); | |
| 487 | |
| 488 Key key1(_T("app1"), _T("version1"), _T("package1")); | |
| 489 Key key2(_T("app2"), _T("version2"), _T("package2")); | |
| 490 EXPECT_HRESULT_SUCCEEDED(package_cache_.Put(key1, | |
| 491 source_file1_, | |
| 492 hash_file1_)); | |
| 493 EXPECT_HRESULT_SUCCEEDED(package_cache_.Put(key2, | |
| 494 source_file2_, | |
| 495 hash_file2_)); | |
| 496 EXPECT_TRUE(package_cache_.IsCached(key1, hash_file1_)); | |
| 497 EXPECT_TRUE(package_cache_.IsCached(key2, hash_file2_)); | |
| 498 | |
| 499 // Expires one package and verifies it is purged. | |
| 500 EXPECT_HRESULT_SUCCEEDED(ExpireCache(key1)); | |
| 501 package_cache_.PurgeOldPackagesIfNecessary(); | |
| 502 EXPECT_FALSE(package_cache_.IsCached(key1, hash_file1_)); | |
| 503 EXPECT_TRUE(package_cache_.IsCached(key2, hash_file2_)); | |
| 504 | |
| 505 // Expires another package and verifies it is purged. | |
| 506 EXPECT_HRESULT_SUCCEEDED(ExpireCache(key2)); | |
| 507 package_cache_.PurgeOldPackagesIfNecessary(); | |
| 508 EXPECT_FALSE(package_cache_.IsCached(key1, hash_file1_)); | |
| 509 EXPECT_FALSE(package_cache_.IsCached(key2, hash_file2_)); | |
| 510 } | |
| 511 | |
| 512 TEST_F(PackageCacheTest, AuthenticateFile) { | |
| 513 EXPECT_HRESULT_SUCCEEDED(PackageCache::AuthenticateFile(source_file1_, | |
| 514 hash_file1_)); | |
| 515 EXPECT_EQ(SIGS_E_INVALID_SIGNATURE, | |
| 516 PackageCache::AuthenticateFile(source_file1_, hash_file2_)); | |
| 517 } | |
| 518 | |
| 519 } // namespace omaha | |
| 520 | |
| OLD | NEW |