Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/**
* Any copyright is dedicated to the Public Domain.
*/
/**
* This test is mainly to verify that the storage pressure event is fired when
* the eviction process is not able to free some space when a quota client
* attempts to write over the global limit or when the global limit is reduced
* below the global usage.
*/
loadScript("dom/quota/test/common/file.js");
function awaitStoragePressure() {
let promise_resolve;
let promise = new Promise(function (resolve) {
promise_resolve = resolve;
});
function observer(subject, topic) {
ok(true, "Got the storage pressure event");
Services.obs.removeObserver(observer, topic);
let usage = subject.QueryInterface(Ci.nsISupportsPRUint64).data;
promise_resolve(usage);
}
Services.obs.addObserver(observer, "QuotaManager::StoragePressure");
return promise;
}
async function testSteps() {
const globalLimitKB = 2;
const principal = getPrincipal("https://example.com");
info("Setting limits");
setGlobalLimit(globalLimitKB);
info("Initializing");
let request = init();
await requestFinished(request);
info("Initializing temporary storage");
request = initTemporaryStorage();
await requestFinished(request);
info("Persisting and filling an origin");
// We need to persist the origin first to omit the group limit checks.
// Otherwise, we would have to fill five separate origins.
request = persist(principal);
await requestFinished(request);
let database = getSimpleDatabase(principal);
request = database.open("data");
await requestFinished(request);
try {
request = database.write(getBuffer(globalLimitKB * 1024));
await requestFinished(request);
ok(true, "Should not have thrown");
} catch (ex) {
ok(false, "Should not have thrown");
}
info("Testing storage pressure by writing over the global limit");
info("Storing one more byte to get the storage pressure event while writing");
let promiseStoragePressure = awaitStoragePressure();
try {
request = database.write(getBuffer(1));
await requestFinished(request);
ok(false, "Should have thrown");
} catch (e) {
ok(true, "Should have thrown");
Assert.strictEqual(
e.resultCode,
NS_ERROR_FILE_NO_DEVICE_SPACE,
"Threw right result code"
);
}
info("Checking the storage pressure event");
let usage = await promiseStoragePressure;
Assert.equal(usage, globalLimitKB * 1024, "Got correct usage");
info("Testing storage pressure by reducing the global limit");
info(
"Reducing the global limit to get the storage pressuse event while the" +
" temporary storage is being initialized"
);
setGlobalLimit(globalLimitKB - 1);
request = reset();
await requestFinished(request);
info("Initializing");
request = init();
await requestFinished(request);
promiseStoragePressure = awaitStoragePressure();
info("Initializing temporary storage");
request = initTemporaryStorage();
await requestFinished(request);
info("Checking the storage pressure event");
usage = await promiseStoragePressure;
Assert.equal(usage, globalLimitKB * 1024, "Got correct usage");
info("Resetting limits");
resetGlobalLimit();
request = reset();
await requestFinished(request);
}