michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. michael@0: */ michael@0: michael@0: const DATA = "ZIP WRITER TEST DATA"; michael@0: michael@0: var TESTS = []; michael@0: michael@0: function build_tests() { michael@0: var id = 0; michael@0: michael@0: // Minimum mode is 0o400 michael@0: for (let u = 4; u <= 7; u++) { michael@0: for (let g = 0; g <= 7; g++) { michael@0: for (let o = 0; o <= 7; o++) { michael@0: TESTS[id] = { michael@0: name: "test" + u + g + o, michael@0: permission: (u << 6) + (g << 3) + o michael@0: }; michael@0: id++; michael@0: } michael@0: } michael@0: } michael@0: } michael@0: michael@0: function run_test() { michael@0: build_tests(); michael@0: michael@0: var foStream = Cc["@mozilla.org/network/file-output-stream;1"]. michael@0: createInstance(Ci.nsIFileOutputStream); michael@0: michael@0: var tmp = tmpDir.clone(); michael@0: tmp.append("temp-permissions"); michael@0: tmp.createUnique(Ci.nsILocalFile.DIRECTORY_TYPE, 0755); michael@0: michael@0: var file = tmp.clone(); michael@0: file.append("tempfile"); michael@0: michael@0: zipW.open(tmpFile, PR_RDWR | PR_CREATE_FILE | PR_TRUNCATE); michael@0: for (let i = 0; i < TESTS.length; i++) { michael@0: // Open the file with the permissions to match how the zipreader extracts michael@0: // This obeys the umask michael@0: foStream.init(file, 0x02 | 0x08 | 0x20, TESTS[i].permission, 0); michael@0: foStream.close(); michael@0: michael@0: // umask may have altered the permissions so test against what they really were. michael@0: // This reduces the coverage of the test but there isn't much we can do michael@0: var perm = file.permissions & 0xfff; michael@0: if (TESTS[i].permission != perm) { michael@0: dump("File permissions for " + TESTS[i].name + " were " + perm.toString(8) + "\n"); michael@0: TESTS[i].permission = perm; michael@0: } michael@0: michael@0: zipW.addEntryFile(TESTS[i].name, Ci.nsIZipWriter.COMPRESSION_NONE, file, false); michael@0: do_check_eq(zipW.getEntry(TESTS[i].name).permissions, TESTS[i].permission | 0o400); michael@0: file.permissions = 0o600; michael@0: file.remove(true); michael@0: } michael@0: zipW.close(); michael@0: michael@0: zipW.open(tmpFile, PR_RDWR); michael@0: for (let i = 0; i < TESTS.length; i++) { michael@0: dump("Testing zipwriter file permissions for " + TESTS[i].name + "\n"); michael@0: do_check_eq(zipW.getEntry(TESTS[i].name).permissions, TESTS[i].permission | 0o400); michael@0: } michael@0: zipW.close(); michael@0: michael@0: var zipR = new ZipReader(tmpFile); michael@0: for (let i = 0; i < TESTS.length; i++) { michael@0: dump("Testing zipreader file permissions for " + TESTS[i].name + "\n"); michael@0: do_check_eq(zipR.getEntry(TESTS[i].name).permissions, TESTS[i].permission | 0o400); michael@0: dump("Testing extracted file permissions for " + TESTS[i].name + "\n"); michael@0: zipR.extract(TESTS[i].name, file); michael@0: do_check_eq(file.permissions & 0xfff, TESTS[i].permission); michael@0: do_check_false(file.isDirectory()); michael@0: file.permissions = 0o600; michael@0: file.remove(true); michael@0: } michael@0: zipR.close(); michael@0: michael@0: tmp.remove(true); michael@0: }