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: const FILENAME = "test_data.txt"; michael@0: const CRC = 0xe6164331; michael@0: const time = 1199145600000; // Jan 1st 2008 michael@0: michael@0: var TESTS = [ michael@0: { michael@0: name: "test.txt", michael@0: compression: Ci.nsIZipWriter.COMPRESSION_DEFAULT michael@0: }, michael@0: { michael@0: name: "test.png", michael@0: compression: Ci.nsIZipWriter.COMPRESSION_NONE michael@0: } michael@0: ]; michael@0: michael@0: function swap16(n) michael@0: { michael@0: return (((n >> 8) & 0xFF) << 0) | michael@0: (((n >> 0) & 0xFF) << 8); michael@0: } michael@0: michael@0: function swap32(n) michael@0: { michael@0: return (((n >> 24) & 0xFF) << 0) | michael@0: (((n >> 16) & 0xFF) << 8) | michael@0: (((n >> 8) & 0xFF) << 16) | michael@0: (((n >> 0) & 0xFF) << 24); michael@0: } michael@0: michael@0: function move_to_data(bis, offset) michael@0: { michael@0: bis.readBytes(18); // Move to compressed size michael@0: var size = swap32(bis.read32()); michael@0: bis.readBytes(4); michael@0: var file_len = swap16(bis.read16()); michael@0: var extra_len = swap16(bis.read16()); michael@0: var file = bis.readBytes(file_len); michael@0: bis.readBytes(extra_len); michael@0: offset += ZIP_FILE_HEADER_SIZE + file_len + extra_len; michael@0: michael@0: return {offset: offset, size: size}; michael@0: } michael@0: michael@0: function test_alignment(align_size) michael@0: { michael@0: // Create zip for testing. michael@0: zipW.open(tmpFile, PR_RDWR | PR_CREATE_FILE | PR_TRUNCATE); michael@0: for (var i = 0; i < TESTS.length; i++) { michael@0: var source = do_get_file(DATA_DIR + TESTS[i].name); michael@0: zipW.addEntryFile(TESTS[i].name, TESTS[i].compression, source, false); michael@0: } michael@0: var stream = Cc["@mozilla.org/io/string-input-stream;1"] michael@0: .createInstance(Ci.nsIStringInputStream); michael@0: stream.setData(DATA, DATA.length); michael@0: zipW.addEntryStream(FILENAME, time * PR_USEC_PER_MSEC, michael@0: Ci.nsIZipWriter.COMPRESSION_NONE, stream, false); michael@0: zipW.alignStoredFiles(align_size); michael@0: zipW.close(); michael@0: michael@0: // Check data can be decompressed. michael@0: var zipR = new ZipReader(tmpFile); michael@0: var stream = Cc["@mozilla.org/scriptableinputstream;1"] michael@0: .createInstance(Ci.nsIScriptableInputStream); michael@0: stream.init(zipR.getInputStream(FILENAME)); michael@0: var result = stream.read(DATA.length); michael@0: do_check_eq(result, DATA); michael@0: stream.close(); michael@0: zipR.close(); michael@0: michael@0: // Check data is correct and aligned. michael@0: var fis = Cc["@mozilla.org/network/file-input-stream;1"] michael@0: .createInstance(Ci.nsIFileInputStream); michael@0: fis.init(tmpFile, -1, -1, null); michael@0: let bis = Cc["@mozilla.org/binaryinputstream;1"] michael@0: .createInstance(Ci.nsIBinaryInputStream); michael@0: bis.setInputStream(fis); michael@0: var offset = 0; michael@0: michael@0: var ret = move_to_data(bis, offset); // "test.txt" michael@0: offset = ret.offset; michael@0: bis.readBytes(ret.size); michael@0: offset += ret.size; michael@0: michael@0: ret = move_to_data(bis, offset); // "test.png" michael@0: offset = ret.offset; michael@0: do_check_eq(offset % align_size, 0); michael@0: bis.readBytes(ret.size); michael@0: offset += ret.size; michael@0: michael@0: ret = move_to_data(bis, offset); // "test_data.txt" michael@0: offset = ret.offset; michael@0: var result = bis.readBytes(DATA.length); michael@0: do_check_eq(result, DATA); michael@0: do_check_eq(offset % align_size, 0); michael@0: michael@0: fis.close(); michael@0: bis.close(); michael@0: } michael@0: michael@0: function run_test() michael@0: { michael@0: test_alignment(2); michael@0: test_alignment(4); michael@0: test_alignment(16); michael@0: test_alignment(4096); michael@0: test_alignment(32768); michael@0: }