code-push-cli
Version:
Management CLI for the CodePush service
150 lines (148 loc) • 6.27 kB
JavaScript
var assert = require("assert");
var crypto = require("crypto");
var fs = require("fs");
var hashUtils = require("../script/hash-utils");
var mkdirp = require("mkdirp");
var os = require("os");
var path = require("path");
var 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, function (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(function () {
process.chdir(originalCwd);
});
}
describe("Hashing utility", function () {
var TEST_DIRECTORY = path.join(os.tmpdir(), "codepushtests", randomString());
var TEST_ARCHIVE_FILE_PATH = path.join(__dirname, "resources", "test.zip");
var TEST_ZIP_HASH = "540fed8df3553079e81d1353c5cc4e3cac7db9aea647a85d550f646e8620c317";
var TEST_ZIP_MANIFEST_HASH = "9e0499ce7df5c04cb304c9deed684dc137fc603cb484a5b027478143c595d80b";
var HASH_B = "3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d";
var HASH_C = "2e7d2c03a9507ae265ecf5b5356885a53393a2029d241394997265a1a25aefc6";
var HASH_D = "18ac3e7343f016890c510e93f935261169d9e3f565436429830faf0934f4f8e4";
var IGNORED_METADATA_ARCHIVE_FILE_PATH = path.join(__dirname, "resources", "ignoredMetadata.zip");
var INDEX_HASH = "b0693dc92f76e08bf1485b3dd9b514a2e31dfd6f39422a6b60edb722671dc98f";
it("generates a package hash from file", function (done) {
hashUtils.hashFile(TEST_ARCHIVE_FILE_PATH)
.done(function (packageHash) {
assert.equal(packageHash, TEST_ZIP_HASH);
done();
});
});
it("generates a package manifest for an archive", function (done) {
hashUtils.generatePackageManifestFromZip(TEST_ARCHIVE_FILE_PATH)
.done(function (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", function (done) {
var directory = path.join(TEST_DIRECTORY, "testZip");
unzipToDirectory(TEST_ARCHIVE_FILE_PATH, directory)
.then(function () {
return hashUtils.generatePackageManifestFromDirectory(directory, directory);
})
.done(function (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", function (done) {
hashUtils.generatePackageManifestFromZip(TEST_ARCHIVE_FILE_PATH)
.then(function (manifest) {
return manifest.computePackageHash();
})
.done(function (packageHash) {
assert.equal(packageHash, TEST_ZIP_MANIFEST_HASH);
done();
});
});
it("generates a package manifest for an archive with ignorable metadata", function (done) {
hashUtils.generatePackageManifestFromZip(IGNORED_METADATA_ARCHIVE_FILE_PATH)
.done(function (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", function (done) {
var directory = path.join(TEST_DIRECTORY, "ignorableMetadata");
unzipToDirectory(IGNORED_METADATA_ARCHIVE_FILE_PATH, directory)
.then(function () {
return hashUtils.generatePackageManifestFromDirectory(directory, directory);
})
.done(function (manifest) {
assert.equal(manifest.toMap().size, 1);
var hash = manifest.toMap().get("www/index.html");
assert.equal(hash, INDEX_HASH);
done();
});
});
});
//# sourceMappingURL=hash-utils.js.map