summaryrefslogtreecommitdiffstats
path: root/dom/cache/test/xpcshell/test_originInit.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/cache/test/xpcshell/test_originInit.js')
-rw-r--r--dom/cache/test/xpcshell/test_originInit.js249
1 files changed, 249 insertions, 0 deletions
diff --git a/dom/cache/test/xpcshell/test_originInit.js b/dom/cache/test/xpcshell/test_originInit.js
new file mode 100644
index 0000000000..395cba8a0f
--- /dev/null
+++ b/dom/cache/test/xpcshell/test_originInit.js
@@ -0,0 +1,249 @@
+/**
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+add_task(async function testSteps() {
+ // ToDo: Replace storage and default with a getter function once we expose the
+ // filenames of them to a IDL file.
+ const basePath = `${storageDirName}/${defaultPersistenceDirName}/`;
+ const principal = getPrincipal("https://example.com");
+ const originDirName = "https+++example.com";
+
+ // ToDo: Replace caches.sqlite with a getter function once we expose the
+ // filename of it to a IDL file.
+ const cachesDatabase = getRelativeFile(
+ `${basePath}/${originDirName}/${cacheClientDirName()}/caches.sqlite`
+ );
+ // ToDo: Replace .padding with a getter function once we expose the filename
+ // of it to a IDL file.
+ const paddingFile = getRelativeFile(
+ `${basePath}/${originDirName}/${cacheClientDirName()}/.padding`
+ );
+ // ToDo: Replace .padding-tmp with a getter function once we expose the
+ // filename of it to a IDL file.
+ const paddingTempFile = getRelativeFile(
+ `${basePath}/${originDirName}/${cacheClientDirName()}/.padding-tmp`
+ );
+ // ToDo: Replace morgue with a getter function once we expose the
+ // filename of it to a IDL file.
+ const morgueDir = getRelativeFile(
+ `${basePath}/${originDirName}/${cacheClientDirName()}/morgue`
+ );
+
+ const persistentCacheDir = getRelativeFile(
+ `${storageDirName}/${persistentPersistenceDirName}/${originDirName}/` +
+ `${cacheClientDirName()}`
+ );
+
+ async function createNormalCacheOrigin() {
+ async function sandboxScript() {
+ const cache = await caches.open("myCache");
+ const request = new Request("https://example.com/index.html");
+ const response = new Response("hello world");
+ await cache.put(request, response);
+ }
+
+ const sandbox = new Cu.Sandbox(principal, {
+ wantGlobalProperties: ["caches", "fetch"],
+ });
+
+ const promise = new Promise(function (resolve, reject) {
+ sandbox.resolve = resolve;
+ sandbox.reject = reject;
+ });
+
+ Cu.evalInSandbox(
+ sandboxScript.toSource() + " sandboxScript().then(resolve, reject);",
+ sandbox
+ );
+ await promise;
+
+ let request = reset();
+ await requestFinished(request);
+ }
+
+ async function createPersistentTestOrigin() {
+ let database = getSimpleDatabase(principal, "persistent");
+
+ let request = database.open("data");
+ await requestFinished(request);
+
+ request = reset();
+ await requestFinished(request);
+ }
+
+ function removeFile(file) {
+ file.remove(false);
+ }
+
+ function removeDir(dir) {
+ dir.remove(true);
+ }
+
+ function createEmptyFile(file) {
+ file.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0o644);
+ }
+
+ function createEmptyDirectory(dir) {
+ dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0o0755);
+ }
+
+ async function initTestOrigin() {
+ let request = initStorage();
+ await requestFinished(request);
+
+ request = initTemporaryStorage();
+ await requestFinished(request);
+
+ request = initTemporaryOrigin(principal);
+ await requestFinished(request);
+ }
+
+ async function initPersistentTestOrigin() {
+ let request = initStorage();
+ await requestFinished(request);
+
+ request = initPersistentOrigin(principal);
+ await requestFinished(request);
+ }
+
+ function checkFiles(
+ expectCachesDatabase,
+ expectPaddingFile,
+ expectTempPaddingFile,
+ expectMorgueDir
+ ) {
+ let exists = cachesDatabase.exists();
+ if (expectCachesDatabase) {
+ ok(exists, "caches.sqlite does exist");
+ } else {
+ ok(!exists, "caches.sqlite doesn't exist");
+ }
+
+ exists = paddingFile.exists();
+ if (expectPaddingFile) {
+ ok(exists, ".padding does exist");
+ } else {
+ ok(!exists, ".padding doesn't exist");
+ }
+
+ exists = paddingTempFile.exists();
+ if (expectTempPaddingFile) {
+ ok(exists, ".padding-tmp does exist");
+ } else {
+ ok(!exists, ".padding-tmp doesn't exist");
+ }
+
+ exists = morgueDir.exists();
+ if (expectMorgueDir) {
+ ok(exists, "morgue does exist");
+ } else {
+ ok(!exists, "moruge doesn't exist");
+ }
+ }
+
+ async function clearTestOrigin() {
+ let request = clearOrigin(principal, defaultPersistence);
+ await requestFinished(request);
+ }
+
+ async function clearPersistentTestOrigin() {
+ let request = clearOrigin(principal, persistentPersistence);
+ await requestFinished(request);
+ }
+
+ async function testOriginInit(
+ createCachesDatabase,
+ createPaddingFile,
+ createTempPaddingFile,
+ createMorgueDir
+ ) {
+ info(
+ `Testing initialization of cache directory when caches.sqlite ` +
+ `${createCachesDatabase ? "exists" : "doesn't exist"}, .padding ` +
+ `${createPaddingFile ? "exists" : "doesn't exist"}, .padding-tmp ` +
+ `${createTempPaddingFile ? "exists" : "doesn't exist"}, morgue ` +
+ `${createMorgueDir ? "exists" : "doesn't exist"}`
+ );
+
+ await createNormalCacheOrigin();
+
+ checkFiles(true, true, false, true);
+
+ if (!createCachesDatabase) {
+ removeFile(cachesDatabase);
+ }
+
+ if (!createPaddingFile) {
+ removeFile(paddingFile);
+ }
+
+ if (createTempPaddingFile) {
+ createEmptyFile(paddingTempFile);
+ }
+
+ if (!createMorgueDir) {
+ removeDir(morgueDir);
+ }
+
+ await initTestOrigin();
+
+ checkFiles(
+ createCachesDatabase,
+ // After the origin is initialized, ".padding" should only exist when
+ // "caches.sqlite" exists.
+ createCachesDatabase,
+ // After the origin is initialized, ".padding-tmp" should have always been
+ // removed.
+ false,
+ createCachesDatabase && createMorgueDir
+ );
+
+ await clearTestOrigin();
+ }
+
+ // Test all possible combinations.
+ for (let createCachesDatabase of [false, true]) {
+ for (let createPaddingFile of [false, true]) {
+ for (let createTempPaddingFile of [false, true]) {
+ for (let createMorgueDir of [false, true]) {
+ await testOriginInit(
+ createCachesDatabase,
+ createPaddingFile,
+ createTempPaddingFile,
+ createMorgueDir
+ );
+ }
+ }
+ }
+ }
+
+ // Verify that InitializeOrigin doesn't fail when a
+ // storage/permanent/${origin}/cache exists.
+ async function testPermanentCacheDir() {
+ info(
+ "Testing initialization of cache directory placed in permanent origin " +
+ "directory"
+ );
+
+ await createPersistentTestOrigin();
+
+ createEmptyDirectory(persistentCacheDir);
+
+ try {
+ await initPersistentTestOrigin();
+
+ ok(true, "Should not have thrown");
+ } catch (ex) {
+ ok(false, "Should not have thrown");
+ }
+
+ let exists = persistentCacheDir.exists();
+ ok(exists, "cache directory in permanent origin directory does exist");
+
+ await clearPersistentTestOrigin();
+ }
+
+ await testPermanentCacheDir();
+});