modules/libjar/zipwriter/test/unit/test_alignment.js

changeset 0
6474c204b198
     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 +}

mercurial