summaryrefslogtreecommitdiffstats
path: root/addon-sdk/source/test/test-file.js
diff options
context:
space:
mode:
Diffstat (limited to 'addon-sdk/source/test/test-file.js')
-rw-r--r--addon-sdk/source/test/test-file.js271
1 files changed, 271 insertions, 0 deletions
diff --git a/addon-sdk/source/test/test-file.js b/addon-sdk/source/test/test-file.js
new file mode 100644
index 000000000..268c7f791
--- /dev/null
+++ b/addon-sdk/source/test/test-file.js
@@ -0,0 +1,271 @@
+/* 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/. */
+"use strict";
+
+const { pathFor } = require('sdk/system');
+const file = require("sdk/io/file");
+const url = require("sdk/url");
+
+const byteStreams = require("sdk/io/byte-streams");
+const textStreams = require("sdk/io/text-streams");
+
+const ERRORS = {
+ FILE_NOT_FOUND: /^path does not exist: .+$/,
+ NOT_A_DIRECTORY: /^path is not a directory: .+$/,
+ NOT_A_FILE: /^path is not a file: .+$/,
+};
+
+// Use profile directory to list / read / write files.
+const profilePath = pathFor('ProfD');
+const fileNameInProfile = 'compatibility.ini';
+const dirNameInProfile = 'extensions';
+const filePathInProfile = file.join(profilePath, fileNameInProfile);
+const dirPathInProfile = file.join(profilePath, dirNameInProfile);
+
+exports.testDirName = function(assert) {
+ assert.equal(file.dirname(dirPathInProfile), profilePath,
+ "file.dirname() of dir should return parent dir");
+
+ assert.equal(file.dirname(filePathInProfile), profilePath,
+ "file.dirname() of file should return its dir");
+
+ let dir = profilePath;
+ while (dir)
+ dir = file.dirname(dir);
+
+ assert.equal(dir, "",
+ "dirname should return empty string when dir has no parent");
+};
+
+exports.testBasename = function(assert) {
+ // Get the top-most path -- the path with no basename. E.g., on Unix-like
+ // systems this will be /. We'll use it below to build up some test paths.
+ // We have to go to this trouble because file.join() needs a legal path as a
+ // base case; join("foo", "bar") doesn't work unfortunately.
+ let topPath = profilePath;
+ let parentPath = file.dirname(topPath);
+ while (parentPath) {
+ topPath = parentPath;
+ parentPath = file.dirname(topPath);
+ }
+
+ let path = topPath;
+ assert.equal(file.basename(path), "",
+ "basename should work on paths with no components");
+
+ path = file.join(path, "foo");
+ assert.equal(file.basename(path), "foo",
+ "basename should work on paths with a single component");
+
+ path = file.join(path, "bar");
+ assert.equal(file.basename(path), "bar",
+ "basename should work on paths with multiple components");
+};
+
+exports.testList = function(assert) {
+ let list = file.list(profilePath);
+ let found = list.filter(name => name === fileNameInProfile);
+
+ assert.equal(found.length, 1, "file.list() should work");
+
+ assert.throws(function() {
+ file.list(filePathInProfile);
+ }, ERRORS.NOT_A_DIRECTORY, "file.list() on non-dir should raise error");
+
+ assert.throws(function() {
+ file.list(file.join(dirPathInProfile, "does-not-exist"));
+ }, ERRORS.FILE_NOT_FOUND, "file.list() on nonexistent should raise error");
+};
+
+exports.testRead = function(assert) {
+ let contents = file.read(filePathInProfile);
+ assert.ok(/Compatibility/.test(contents),
+ "file.read() should work");
+
+ assert.throws(function() {
+ file.read(file.join(dirPathInProfile, "does-not-exists"));
+ }, ERRORS.FILE_NOT_FOUND, "file.read() on nonexistent file should throw");
+
+ assert.throws(function() {
+ file.read(dirPathInProfile);
+ }, ERRORS.NOT_A_FILE, "file.read() on dir should throw");
+};
+
+exports.testJoin = function(assert) {
+ let baseDir = file.dirname(filePathInProfile);
+
+ assert.equal(file.join(baseDir, fileNameInProfile),
+ filePathInProfile, "file.join() should work");
+};
+
+exports.testOpenNonexistentForRead = function (assert) {
+ var filename = file.join(profilePath, 'does-not-exists');
+ assert.throws(function() {
+ file.open(filename);
+ }, ERRORS.FILE_NOT_FOUND, "file.open() on nonexistent file should throw");
+
+ assert.throws(function() {
+ file.open(filename, "r");
+ }, ERRORS.FILE_NOT_FOUND, "file.open('r') on nonexistent file should throw");
+
+ assert.throws(function() {
+ file.open(filename, "zz");
+ }, ERRORS.FILE_NOT_FOUND, "file.open('zz') on nonexistent file should throw");
+};
+
+exports.testOpenNonexistentForWrite = function (assert) {
+ let filename = file.join(profilePath, 'open.txt');
+
+ let stream = file.open(filename, "w");
+ stream.close();
+
+ assert.ok(file.exists(filename),
+ "file.exists() should return true after file.open('w')");
+ file.remove(filename);
+ assert.ok(!file.exists(filename),
+ "file.exists() should return false after file.remove()");
+
+ stream = file.open(filename, "rw");
+ stream.close();
+
+ assert.ok(file.exists(filename),
+ "file.exists() should return true after file.open('rw')");
+ file.remove(filename);
+ assert.ok(!file.exists(filename),
+ "file.exists() should return false after file.remove()");
+};
+
+exports.testOpenDirectory = function (assert) {
+ let dir = dirPathInProfile;
+ assert.throws(function() {
+ file.open(dir);
+ }, ERRORS.NOT_A_FILE, "file.open() on directory should throw");
+
+ assert.throws(function() {
+ file.open(dir, "w");
+ }, ERRORS.NOT_A_FILE, "file.open('w') on directory should throw");
+};
+
+exports.testOpenTypes = function (assert) {
+ let filename = file.join(profilePath, 'open-types.txt');
+
+
+ // Do the opens first to create the data file.
+ var stream = file.open(filename, "w");
+ assert.ok(stream instanceof textStreams.TextWriter,
+ "open(w) should return a TextWriter");
+ stream.close();
+
+ stream = file.open(filename, "wb");
+ assert.ok(stream instanceof byteStreams.ByteWriter,
+ "open(wb) should return a ByteWriter");
+ stream.close();
+
+ stream = file.open(filename);
+ assert.ok(stream instanceof textStreams.TextReader,
+ "open() should return a TextReader");
+ stream.close();
+
+ stream = file.open(filename, "r");
+ assert.ok(stream instanceof textStreams.TextReader,
+ "open(r) should return a TextReader");
+ stream.close();
+
+ stream = file.open(filename, "b");
+ assert.ok(stream instanceof byteStreams.ByteReader,
+ "open(b) should return a ByteReader");
+ stream.close();
+
+ stream = file.open(filename, "rb");
+ assert.ok(stream instanceof byteStreams.ByteReader,
+ "open(rb) should return a ByteReader");
+ stream.close();
+
+ file.remove(filename);
+};
+
+exports.testMkpathRmdir = function (assert) {
+ let basePath = profilePath;
+ let dirs = [];
+ for (let i = 0; i < 3; i++)
+ dirs.push("test-file-dir");
+
+ let paths = [];
+ for (let i = 0; i < dirs.length; i++) {
+ let args = [basePath].concat(dirs.slice(0, i + 1));
+ paths.unshift(file.join.apply(null, args));
+ }
+
+ for (let i = 0; i < paths.length; i++) {
+ assert.ok(!file.exists(paths[i]),
+ "Sanity check: path should not exist: " + paths[i]);
+ }
+
+ file.mkpath(paths[0]);
+ assert.ok(file.exists(paths[0]), "mkpath should create path: " + paths[0]);
+
+ for (let i = 0; i < paths.length; i++) {
+ file.rmdir(paths[i]);
+ assert.ok(!file.exists(paths[i]),
+ "rmdir should remove path: " + paths[i]);
+ }
+};
+
+exports.testMkpathTwice = function (assert) {
+ let dir = profilePath;
+ let path = file.join(dir, "test-file-dir");
+ assert.ok(!file.exists(path),
+ "Sanity check: path should not exist: " + path);
+ file.mkpath(path);
+ assert.ok(file.exists(path), "mkpath should create path: " + path);
+ file.mkpath(path);
+ assert.ok(file.exists(path),
+ "After second mkpath, path should still exist: " + path);
+ file.rmdir(path);
+ assert.ok(!file.exists(path), "rmdir should remove path: " + path);
+};
+
+exports.testMkpathExistingNondirectory = function (assert) {
+ var fname = file.join(profilePath, 'conflict.txt');
+ file.open(fname, "w").close();
+ assert.ok(file.exists(fname), "File should exist");
+ assert.throws(() => file.mkpath(fname),
+ /^The path already exists and is not a directory: .+$/,
+ "mkpath on file should raise error");
+ file.remove(fname);
+};
+
+exports.testRmdirNondirectory = function (assert) {
+ var fname = file.join(profilePath, 'not-a-dir')
+ file.open(fname, "w").close();
+ assert.ok(file.exists(fname), "File should exist");
+ assert.throws(function() {
+ file.rmdir(fname);
+ }, ERRORS.NOT_A_DIRECTORY, "rmdir on file should raise error");
+ file.remove(fname);
+ assert.ok(!file.exists(fname), "File should not exist");
+ assert.throws(() => file.rmdir(fname),
+ ERRORS.FILE_NOT_FOUND,
+ "rmdir on non-existing file should raise error");
+};
+
+exports.testRmdirNonempty = function (assert) {
+ let dir = profilePath;
+ let path = file.join(dir, "test-file-dir");
+ assert.ok(!file.exists(path),
+ "Sanity check: path should not exist: " + path);
+ file.mkpath(path);
+ let filePath = file.join(path, "file");
+ file.open(filePath, "w").close();
+ assert.ok(file.exists(filePath),
+ "Sanity check: path should exist: " + filePath);
+ assert.throws(() => file.rmdir(path),
+ /^The directory is not empty: .+$/,
+ "rmdir on non-empty directory should raise error");
+ file.remove(filePath);
+ file.rmdir(path);
+ assert.ok(!file.exists(path), "Path should not exist");
+};
+
+require('sdk/test').run(exports);