summaryrefslogtreecommitdiffstats
path: root/dom/quota/test/xpcshell/test_storagePressure.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/quota/test/xpcshell/test_storagePressure.js')
-rw-r--r--dom/quota/test/xpcshell/test_storagePressure.js135
1 files changed, 135 insertions, 0 deletions
diff --git a/dom/quota/test/xpcshell/test_storagePressure.js b/dom/quota/test/xpcshell/test_storagePressure.js
new file mode 100644
index 0000000000..b3c0cb5005
--- /dev/null
+++ b/dom/quota/test/xpcshell/test_storagePressure.js
@@ -0,0 +1,135 @@
+/**
+ * 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.
+ */
+
+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");
+ ok(
+ e.resultCode === NS_ERROR_FILE_NO_DEVICE_SPACE,
+ "Threw right result code"
+ );
+ }
+
+ info("Checking the storage pressure event");
+
+ let usage = await promiseStoragePressure;
+ ok(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;
+ ok(usage == globalLimitKB * 1024, "Got correct usage");
+
+ info("Resetting limits");
+
+ resetGlobalLimit();
+
+ request = reset();
+ await requestFinished(request);
+}