зеркало из https://github.com/mozilla/gecko-dev.git
154 строки
4.8 KiB
JavaScript
154 строки
4.8 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
'use strict';
|
|
|
|
const { classes: Cc, interfaces: Ci } = Components;
|
|
const BIN_SUFFIX = mozinfo.bin_suffix;
|
|
const tempDir = do_get_tempdir();
|
|
|
|
/**
|
|
* Compares binary data of 2 arrays and throws if they aren't the same.
|
|
* Throws on mismatch, does nothing on match.
|
|
*
|
|
* @param arr1 The first array to compare
|
|
* @param arr2 The second array to compare
|
|
*/
|
|
function compareBinaryData(arr1, arr2) {
|
|
do_check_eq(arr1.length, arr2.length);
|
|
for (let i = 0; i < arr1.length; i++) {
|
|
if (arr1[i] != arr2[i]) {
|
|
throw "Data differs at index " + i +
|
|
", arr1: " + arr1[i] + ", arr2: " + arr2[i];
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Reads a file's data and returns it
|
|
*
|
|
* @param file The file to read the data from
|
|
* @return a byte array for the data in the file.
|
|
*/
|
|
function getBinaryFileData(file) {
|
|
let fileStream = Cc["@mozilla.org/network/file-input-stream;1"].
|
|
createInstance(Ci.nsIFileInputStream);
|
|
// Open as RD_ONLY with default permissions.
|
|
fileStream.init(file, -1, -1, null);
|
|
|
|
// Check the returned size versus the expected size.
|
|
let stream = Cc["@mozilla.org/binaryinputstream;1"].
|
|
createInstance(Ci.nsIBinaryInputStream);
|
|
stream.setInputStream(fileStream);
|
|
let bytes = stream.readByteArray(stream.available());
|
|
fileStream.close();
|
|
return bytes;
|
|
}
|
|
|
|
/**
|
|
* Runs each method in the passed in object
|
|
* Every method of the passed in object that starts with test_ will be ran
|
|
* The cleanup_per_test method of the object will be run right away, it will be
|
|
* registered to be the cleanup function, and it will be run between each test.
|
|
*
|
|
* @return The number of tests ran
|
|
*/
|
|
function run_tests(obj) {
|
|
let cleanup_per_test = obj.cleanup_per_test;
|
|
if (cleanup_per_test === undefined) {
|
|
cleanup_per_test = function __cleanup_per_test() {};
|
|
}
|
|
|
|
do_register_cleanup(cleanup_per_test);
|
|
|
|
// Make sure there's nothing left over from a preious failed test
|
|
cleanup_per_test();
|
|
|
|
let ranCount = 0;
|
|
// hasOwnProperty ensures we only see direct properties and not all
|
|
for (let f in obj) {
|
|
if (typeof obj[f] === "function" &&
|
|
obj.hasOwnProperty(f) &&
|
|
f.toString().indexOf("test_") === 0) {
|
|
obj[f]();
|
|
cleanup_per_test();
|
|
ranCount++;
|
|
}
|
|
}
|
|
return ranCount;
|
|
}
|
|
|
|
/**
|
|
* Creates a MAR file with the content of files.
|
|
*
|
|
* @param outMAR The file where the MAR should be created to
|
|
* @param dataDir The directory where the relative file paths exist
|
|
* @param files The relative file paths of the files to include in the MAR
|
|
*/
|
|
function createMAR(outMAR, dataDir, files) {
|
|
// You cannot create an empy MAR.
|
|
do_check_true(files.length > 0);
|
|
|
|
// Get an nsIProcess to the signmar binary.
|
|
let process = Cc["@mozilla.org/process/util;1"].
|
|
createInstance(Ci.nsIProcess);
|
|
let signmarBin = do_get_file("signmar" + BIN_SUFFIX);
|
|
|
|
// Make sure the signmar binary exists and is an executable.
|
|
do_check_true(signmarBin.exists());
|
|
do_check_true(signmarBin.isExecutable());
|
|
|
|
// Ensure on non Windows platforms we encode the same permissions
|
|
// as the refernence MARs contain. On Windows this is also safe.
|
|
// The reference MAR files have permissions of 0o664, so in case
|
|
// someone is running these tests locally with another permission
|
|
// (perhaps 0o777), make sure that we encode them as 0o664.
|
|
for (let filePath of files) {
|
|
let f = dataDir.clone();
|
|
f.append(filePath);
|
|
f.permissions = 0o664;
|
|
}
|
|
|
|
// Setup the command line arguments to create the MAR.
|
|
let args = ["-C", dataDir.path, "-H", "\@MAR_CHANNEL_ID\@",
|
|
"-V", "13.0a1", "-c", outMAR.path];
|
|
args = args.concat(files);
|
|
|
|
do_print('Running: ' + signmarBin.path);
|
|
process.init(signmarBin);
|
|
process.run(true, args, args.length);
|
|
|
|
// Verify signmar returned 0 for success.
|
|
do_check_eq(process.exitValue, 0);
|
|
|
|
// Verify the out MAR file actually exists.
|
|
do_check_true(outMAR.exists());
|
|
}
|
|
|
|
/**
|
|
* Extracts a MAR file to the specified output directory.
|
|
*
|
|
* @param mar The MAR file that should be matched
|
|
* @param dataDir The directory to extract to
|
|
*/
|
|
function extractMAR(mar, dataDir) {
|
|
// Get an nsIProcess to the signmar binary.
|
|
let process = Cc["@mozilla.org/process/util;1"].
|
|
createInstance(Ci.nsIProcess);
|
|
let signmarBin = do_get_file("signmar" + BIN_SUFFIX);
|
|
|
|
// Make sure the signmar binary exists and is an executable.
|
|
do_check_true(signmarBin.exists());
|
|
do_check_true(signmarBin.isExecutable());
|
|
|
|
// Setup the command line arguments to create the MAR.
|
|
let args = ["-C", dataDir.path, "-x", mar.path];
|
|
|
|
do_print('Running: ' + signmarBin.path);
|
|
process.init(signmarBin);
|
|
process.run(true, args, args.length);
|
|
|
|
// Verify signmar returned 0 for success.
|
|
do_check_eq(process.exitValue, 0);
|
|
}
|