@appsonair/codepush-cli
Version:
Management CLI for the Appsonair CodePush service
150 lines (149 loc) • 6.34 kB
JavaScript
;
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
Object.defineProperty(exports, "__esModule", { value: true });
const assert = require("assert");
const crypto = require("crypto");
const fs = require("fs");
const hashUtils = require("../script/hash-utils");
var mkdirp = require("mkdirp");
const os = require("os");
const path = require("path");
const q = require("q");
var yauzl = require("yauzl");
function randomString() {
var stringLength = 10;
return crypto
.randomBytes(Math.ceil(stringLength / 2))
.toString("hex") // convert to hexadecimal format
.slice(0, stringLength); // return required number of characters
}
function unzipToDirectory(zipPath, directoryPath) {
var deferred = q.defer();
var originalCwd = process.cwd();
mkdirp(directoryPath, (err) => {
if (err)
throw err;
process.chdir(directoryPath);
yauzl.open(zipPath, { lazyEntries: true }, function (err, zipfile) {
if (err)
throw err;
zipfile.readEntry();
zipfile.on("entry", function (entry) {
if (/\/$/.test(entry.fileName)) {
// directory file names end with '/'
mkdirp(entry.fileName, function (err) {
if (err)
throw err;
zipfile.readEntry();
});
}
else {
// file entry
zipfile.openReadStream(entry, function (err, readStream) {
if (err)
throw err;
// ensure parent directory exists
mkdirp(path.dirname(entry.fileName), function (err) {
if (err)
throw err;
readStream.pipe(fs.createWriteStream(entry.fileName));
readStream.on("end", function () {
zipfile.readEntry();
});
});
});
}
});
zipfile.on("end", function (err) {
if (err)
deferred.reject(err);
else
deferred.resolve(null);
});
});
});
return deferred.promise.finally(() => {
process.chdir(originalCwd);
});
}
describe("Hashing utility", () => {
const TEST_DIRECTORY = path.join(os.tmpdir(), "codepushtests", randomString());
const TEST_ARCHIVE_FILE_PATH = path.join(__dirname, "resources", "test.zip");
const TEST_ZIP_HASH = "540fed8df3553079e81d1353c5cc4e3cac7db9aea647a85d550f646e8620c317";
const TEST_ZIP_MANIFEST_HASH = "9e0499ce7df5c04cb304c9deed684dc137fc603cb484a5b027478143c595d80b";
const HASH_B = "3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d";
const HASH_C = "2e7d2c03a9507ae265ecf5b5356885a53393a2029d241394997265a1a25aefc6";
const HASH_D = "18ac3e7343f016890c510e93f935261169d9e3f565436429830faf0934f4f8e4";
const IGNORED_METADATA_ARCHIVE_FILE_PATH = path.join(__dirname, "resources", "ignoredMetadata.zip");
const INDEX_HASH = "b0693dc92f76e08bf1485b3dd9b514a2e31dfd6f39422a6b60edb722671dc98f";
it("generates a package hash from file", (done) => {
hashUtils.hashFile(TEST_ARCHIVE_FILE_PATH).done((packageHash) => {
assert.equal(packageHash, TEST_ZIP_HASH);
done();
});
});
it("generates a package manifest for an archive", (done) => {
hashUtils.generatePackageManifestFromZip(TEST_ARCHIVE_FILE_PATH).done((manifest) => {
var fileHashesMap = manifest.toMap();
assert.equal(fileHashesMap.size, 3);
var hash = fileHashesMap.get("b.txt");
assert.equal(hash, HASH_B);
hash = fileHashesMap.get("c.txt");
assert.equal(hash, HASH_C);
hash = fileHashesMap.get("d.txt");
assert.equal(hash, HASH_D);
done();
});
});
it("generates a package manifest for a directory", (done) => {
var directory = path.join(TEST_DIRECTORY, "testZip");
unzipToDirectory(TEST_ARCHIVE_FILE_PATH, directory)
.then(() => {
return hashUtils.generatePackageManifestFromDirectory(/*directoryPath*/ directory, /*basePath*/ directory);
})
.done((manifest) => {
var fileHashesMap = manifest.toMap();
assert.equal(fileHashesMap.size, 3);
var hash = fileHashesMap.get("b.txt");
assert.equal(hash, HASH_B);
hash = fileHashesMap.get("c.txt");
assert.equal(hash, HASH_C);
hash = fileHashesMap.get("d.txt");
assert.equal(hash, HASH_D);
done();
});
});
it("generates a package hash from manifest", (done) => {
hashUtils
.generatePackageManifestFromZip(TEST_ARCHIVE_FILE_PATH)
.then((manifest) => {
return manifest.computePackageHash();
})
.done((packageHash) => {
assert.equal(packageHash, TEST_ZIP_MANIFEST_HASH);
done();
});
});
it("generates a package manifest for an archive with ignorable metadata", (done) => {
hashUtils.generatePackageManifestFromZip(IGNORED_METADATA_ARCHIVE_FILE_PATH).done((manifest) => {
assert.equal(manifest.toMap().size, 1);
var hash = manifest.toMap().get("www/index.html");
assert.equal(hash, INDEX_HASH);
done();
});
});
it("generates a package manifest for a directory with ignorable metadata", (done) => {
var directory = path.join(TEST_DIRECTORY, "ignorableMetadata");
unzipToDirectory(IGNORED_METADATA_ARCHIVE_FILE_PATH, directory)
.then(() => {
return hashUtils.generatePackageManifestFromDirectory(/*directoryPath*/ directory, /*basePath*/ directory);
})
.done((manifest) => {
assert.equal(manifest.toMap().size, 1);
var hash = manifest.toMap().get("www/index.html");
assert.equal(hash, INDEX_HASH);
done();
});
});
});