1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/modules/libjar/zipwriter/test/unit/test_alignment.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,113 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. 1.7 + */ 1.8 + 1.9 +const DATA = "ZIP WRITER TEST DATA"; 1.10 +const FILENAME = "test_data.txt"; 1.11 +const CRC = 0xe6164331; 1.12 +const time = 1199145600000; // Jan 1st 2008 1.13 + 1.14 +var TESTS = [ 1.15 + { 1.16 + name: "test.txt", 1.17 + compression: Ci.nsIZipWriter.COMPRESSION_DEFAULT 1.18 + }, 1.19 + { 1.20 + name: "test.png", 1.21 + compression: Ci.nsIZipWriter.COMPRESSION_NONE 1.22 + } 1.23 +]; 1.24 + 1.25 +function swap16(n) 1.26 +{ 1.27 + return (((n >> 8) & 0xFF) << 0) | 1.28 + (((n >> 0) & 0xFF) << 8); 1.29 +} 1.30 + 1.31 +function swap32(n) 1.32 +{ 1.33 + return (((n >> 24) & 0xFF) << 0) | 1.34 + (((n >> 16) & 0xFF) << 8) | 1.35 + (((n >> 8) & 0xFF) << 16) | 1.36 + (((n >> 0) & 0xFF) << 24); 1.37 +} 1.38 + 1.39 +function move_to_data(bis, offset) 1.40 +{ 1.41 + bis.readBytes(18); // Move to compressed size 1.42 + var size = swap32(bis.read32()); 1.43 + bis.readBytes(4); 1.44 + var file_len = swap16(bis.read16()); 1.45 + var extra_len = swap16(bis.read16()); 1.46 + var file = bis.readBytes(file_len); 1.47 + bis.readBytes(extra_len); 1.48 + offset += ZIP_FILE_HEADER_SIZE + file_len + extra_len; 1.49 + 1.50 + return {offset: offset, size: size}; 1.51 +} 1.52 + 1.53 +function test_alignment(align_size) 1.54 +{ 1.55 + // Create zip for testing. 1.56 + zipW.open(tmpFile, PR_RDWR | PR_CREATE_FILE | PR_TRUNCATE); 1.57 + for (var i = 0; i < TESTS.length; i++) { 1.58 + var source = do_get_file(DATA_DIR + TESTS[i].name); 1.59 + zipW.addEntryFile(TESTS[i].name, TESTS[i].compression, source, false); 1.60 + } 1.61 + var stream = Cc["@mozilla.org/io/string-input-stream;1"] 1.62 + .createInstance(Ci.nsIStringInputStream); 1.63 + stream.setData(DATA, DATA.length); 1.64 + zipW.addEntryStream(FILENAME, time * PR_USEC_PER_MSEC, 1.65 + Ci.nsIZipWriter.COMPRESSION_NONE, stream, false); 1.66 + zipW.alignStoredFiles(align_size); 1.67 + zipW.close(); 1.68 + 1.69 + // Check data can be decompressed. 1.70 + var zipR = new ZipReader(tmpFile); 1.71 + var stream = Cc["@mozilla.org/scriptableinputstream;1"] 1.72 + .createInstance(Ci.nsIScriptableInputStream); 1.73 + stream.init(zipR.getInputStream(FILENAME)); 1.74 + var result = stream.read(DATA.length); 1.75 + do_check_eq(result, DATA); 1.76 + stream.close(); 1.77 + zipR.close(); 1.78 + 1.79 + // Check data is correct and aligned. 1.80 + var fis = Cc["@mozilla.org/network/file-input-stream;1"] 1.81 + .createInstance(Ci.nsIFileInputStream); 1.82 + fis.init(tmpFile, -1, -1, null); 1.83 + let bis = Cc["@mozilla.org/binaryinputstream;1"] 1.84 + .createInstance(Ci.nsIBinaryInputStream); 1.85 + bis.setInputStream(fis); 1.86 + var offset = 0; 1.87 + 1.88 + var ret = move_to_data(bis, offset); // "test.txt" 1.89 + offset = ret.offset; 1.90 + bis.readBytes(ret.size); 1.91 + offset += ret.size; 1.92 + 1.93 + ret = move_to_data(bis, offset); // "test.png" 1.94 + offset = ret.offset; 1.95 + do_check_eq(offset % align_size, 0); 1.96 + bis.readBytes(ret.size); 1.97 + offset += ret.size; 1.98 + 1.99 + ret = move_to_data(bis, offset); // "test_data.txt" 1.100 + offset = ret.offset; 1.101 + var result = bis.readBytes(DATA.length); 1.102 + do_check_eq(result, DATA); 1.103 + do_check_eq(offset % align_size, 0); 1.104 + 1.105 + fis.close(); 1.106 + bis.close(); 1.107 +} 1.108 + 1.109 +function run_test() 1.110 +{ 1.111 + test_alignment(2); 1.112 + test_alignment(4); 1.113 + test_alignment(16); 1.114 + test_alignment(4096); 1.115 + test_alignment(32768); 1.116 +}