summaryrefslogtreecommitdiffstats
path: root/storage/test/unit/test_readonly-immutable-nolock_vfs.js
diff options
context:
space:
mode:
Diffstat (limited to 'storage/test/unit/test_readonly-immutable-nolock_vfs.js')
-rw-r--r--storage/test/unit/test_readonly-immutable-nolock_vfs.js47
1 files changed, 47 insertions, 0 deletions
diff --git a/storage/test/unit/test_readonly-immutable-nolock_vfs.js b/storage/test/unit/test_readonly-immutable-nolock_vfs.js
new file mode 100644
index 0000000000..5c11150b0a
--- /dev/null
+++ b/storage/test/unit/test_readonly-immutable-nolock_vfs.js
@@ -0,0 +1,47 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// This file tests the readonly-immutable-nolock VFS.
+
+add_task(async function test() {
+ const path = PathUtils.join(PathUtils.profileDir, "ro");
+ await IOUtils.makeDirectory(path);
+ const dbpath = PathUtils.join(path, "test-immutable.sqlite");
+
+ let conn = await Sqlite.openConnection({ path: dbpath });
+ await conn.execute("PRAGMA journal_mode = WAL");
+ await conn.execute("CREATE TABLE test (id INTEGER PRIMARY KEY)");
+ Assert.ok(await IOUtils.exists(dbpath + "-wal"), "wal journal exists");
+ await conn.close();
+
+ // The wal should have been merged at this point, but just in case...
+ info("Remove auxiliary files and set the folder as readonly");
+ await IOUtils.remove(dbpath + "-wal", { ignoreAbsent: true });
+ await IOUtils.setPermissions(path, 0o555);
+ registerCleanupFunction(async () => {
+ await IOUtils.setPermissions(path, 0o777);
+ await IOUtils.remove(path, { recursive: true });
+ });
+
+ // Windows doesn't disallow creating files in read only folders.
+ if (AppConstants.platform == "macosx" || AppConstants.platform == "linux") {
+ await Assert.rejects(
+ Sqlite.openConnection({ path: dbpath, readOnly: true }),
+ /NS_ERROR_FILE/,
+ "Should not be able to open the db because it can't create a wal journal"
+ );
+ }
+
+ // Open the database with ignoreLockingMode.
+ let conn2 = await Sqlite.openConnection({
+ path: dbpath,
+ ignoreLockingMode: true,
+ });
+ await conn2.execute("SELECT * FROM sqlite_master");
+ Assert.ok(
+ !(await IOUtils.exists(dbpath + "-wal")),
+ "wal journal was not created"
+ );
+ await conn2.close();
+});