127 lines
3.1 KiB
JavaScript
127 lines
3.1 KiB
JavaScript
/**
|
|
* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/
|
|
*/
|
|
|
|
/**
|
|
* 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.
|
|
*/
|
|
|
|
const { TestUtils } = ChromeUtils.importESModule(
|
|
"resource://testing-common/TestUtils.sys.mjs"
|
|
);
|
|
|
|
loadScript("dom/quota/test/common/file.js");
|
|
|
|
async function awaitStoragePressure() {
|
|
const [subject] = await TestUtils.topicObserved(
|
|
"QuotaManager::StoragePressure"
|
|
);
|
|
const usage = subject.QueryInterface(Ci.nsISupportsPRUint64).data;
|
|
return usage;
|
|
}
|
|
|
|
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);
|
|
}
|