Bug 1398231 - P2: Add a test to verify cache work when there is a temporary padding file. r?bkelly draft
authorTom Tung <shes050117@gmail.com>
Sat, 09 Sep 2017 15:34:59 +0800
changeset 661884 e55b943ed5ef8acd2585b32986eb5c0148e297e6
parent 661832 d3fb59c4e63fafc4651dc8f3661b12c7a230b9f3
child 730691 aa97d2d764897015acf93c80b907cab5e095b625
push id78894
push userttung@mozilla.com
push dateSat, 09 Sep 2017 07:35:54 +0000
reviewersbkelly
bugs1398231
milestone57.0a1
Bug 1398231 - P2: Add a test to verify cache work when there is a temporary padding file. r?bkelly MozReview-Commit-ID: JhPuL7AmteM
dom/cache/test/xpcshell/head.js
dom/cache/test/xpcshell/test_padding_error_handle.js
dom/cache/test/xpcshell/xpcshell.ini
--- a/dom/cache/test/xpcshell/head.js
+++ b/dom/cache/test/xpcshell/head.js
@@ -14,17 +14,17 @@ var Cu = Components.utils;
 var ss = Cc['@mozilla.org/storage/service;1']
          .createInstance(Ci.mozIStorageService);
 var sts = Cc['@mozilla.org/network/stream-transport-service;1']
           .getService(Ci.nsIStreamTransportService);
 var hash = Cc['@mozilla.org/security/hash;1']
            .createInstance(Ci.nsICryptoHash);
 
 // Expose Cache and Fetch symbols on the global
-Cu.importGlobalProperties(['caches', 'fetch']);
+Cu.importGlobalProperties(['caches', 'File', 'fetch']);
 
 // Extract a zip file into the profile
 function create_test_profile(zipFileName) {
   do_get_profile();
 
   var directoryService = Cc['@mozilla.org/file/directory_service;1']
                          .getService(Ci.nsIProperties);
   var profileDir = directoryService.get('ProfD', Ci.nsIFile);
@@ -70,8 +70,24 @@ function create_test_profile(zipFileName
 
       istream.close();
       bostream.close();
     }
   }
 
   zipReader.close();
 }
+
+function getCacheDir()
+{
+  let dirService = Cc["@mozilla.org/file/directory_service;1"]
+                   .getService(Ci.nsIProperties);
+
+  let profileDir = dirService.get("ProfD", Ci.nsIFile);
+  let cacheDir = profileDir.clone();
+  cacheDir.append("storage");
+  cacheDir.append("default");
+  cacheDir.append("chrome");
+  cacheDir.append("cache");
+
+  return cacheDir;
+}
+
new file mode 100644
--- /dev/null
+++ b/dom/cache/test/xpcshell/test_padding_error_handle.js
@@ -0,0 +1,65 @@
+/**
+ *  This test is mainly to verify cache actions work as usual even there exists
+ *  an unexpected padding file.
+ */
+
+function getTempPaddingFilePath() {
+  let cacheDir = getCacheDir();
+  let temporaryPaddingFile = cacheDir.clone();
+  temporaryPaddingFile.append(".padding-tmp");
+  return temporaryPaddingFile;
+}
+
+function createTempPaddingFile () {
+  let temporaryPaddingFile = getTempPaddingFilePath();
+  temporaryPaddingFile.create(Ci.nsIFile.NORMAL_FILE_TYPE, parseInt("0644", 8));
+
+  ok(temporaryPaddingFile.exists(),
+     "Temporary padding file does be created by test");
+}
+
+async function run_test() {
+  do_test_pending();
+  create_test_profile('schema_25_profile.zip');
+  let cache = await caches.open("test");
+
+  // Step 1: Verify cache.match won't fail when there is a temporary padding
+  // file
+  createTempPaddingFile();
+
+  let response = await cache.match("https://www.mozilla.org");
+  ok(!!response, "Upgrade from 25 to 26 do succeed");
+
+  // Note: Only cache write actions(e.g. cache.put/add/addAll/delete) will
+  // remove unexpected temporary padding file when writting an opaque response
+  // into the file-system. Cache read actions(e.g. cache.keys/match) won't.
+  let temporaryPaddingFile = getTempPaddingFilePath();
+  ok(temporaryPaddingFile.exists(),
+     "Temporary padding file doesn't be removed by cache.match");
+
+  // Step 2: Verify cache.put won't fail when there is a temporary padding
+  // file
+  await cache.put("https://foo.com", response);
+  ok(!temporaryPaddingFile.exists(),
+     "Temporary padding file does be removed by cache.put");
+
+  // Step 3: Verify cache.keys won't fail when there is a temporary padding
+  // file
+  createTempPaddingFile();
+
+  let cacheEntries = await cache.keys("https://foo.com");
+  ok(cacheEntries.length === 1, "Cache.put does succeed");
+
+  ok(temporaryPaddingFile.exists(),
+     "Temporary padding file doesn't be removed by cache.keys");
+
+  // Step 4: Verify cache.delete won't fail when there is a temporary padding
+  // file
+  await cache.delete("https://foo.com");
+  ok(!temporaryPaddingFile.exists(),
+     "Temporary padding file does be removed by cache.delete");
+
+  await caches.delete("test");
+
+  do_test_finished();
+}
--- a/dom/cache/test/xpcshell/xpcshell.ini
+++ b/dom/cache/test/xpcshell/xpcshell.ini
@@ -8,9 +8,10 @@ support-files =
   schema_15_profile.zip
   schema_25_profile.zip
 
 # dummy test entry to generate profile zip files
 [make_profile.js]
   skip-if = true
 
 [test_migration.js]
+[test_padding_error_handle.js]
 [test_schema_26_upgrade.js]