/**
* 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();
});