@nraynaud/xo-vmdk-to-vhd
Version:
JS lib streaming a vmdk file to a vhd
239 lines (198 loc) • 8.9 kB
JavaScript
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var _chai = require('chai');
var _chai2 = _interopRequireDefault(_chai);
var _chaiAsPromised = require('chai-as-promised');
var _chaiAsPromised2 = _interopRequireDefault(_chaiAsPromised);
var _fs = require('fs');
var _mocha = require('mocha');
var _childProcessPromise = require('child-process-promise');
var _fsPromise = require('fs-promise');
var _vhdWrite = require('./vhd-write');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
_chai2.default.use(_chaiAsPromised2.default);
(0, _mocha.describe)('VHD writing', function () {
(0, _mocha.it)('computeChecksum() is correct against some reference values', function () {
// those values were taken from a file generated by qemu
var testValue1 = '636F6E6563746978000000020001000000000000000002001F34DB9F71656D75000500035769326B0000000000019800000000000001980000030411000000030000000033B3A5E17F94433498376740246E5660';
var expectedChecksum1 = 0xFFFFEFB2;
var testValue2 = '6378737061727365FFFFFFFFFFFFFFFF0000000000000600000100000000000100200000';
var expectedChecksum2 = 0xFFFFF476;
_chai.assert.equal((0, _vhdWrite.computeChecksum)(new Buffer(testValue1, 'hex')), expectedChecksum1);
_chai.assert.equal((0, _vhdWrite.computeChecksum)(new Buffer(testValue2, 'hex')), expectedChecksum2);
});
(0, _mocha.it)('createFooter() does not crash', function () {
(0, _vhdWrite.createFooter)(104448, Math.floor(Date.now() / 1000), { cylinders: 3, heads: 4, sectorsPerTrack: 17 });
});
(0, _mocha.it)('createDynamicDiskHeader() does not crash', function () {
(0, _vhdWrite.createDynamicDiskHeader)(1, 0x00200000);
});
(0, _mocha.it)('ReadableRawVHDStream does not crash', (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee2() {
var data, index, mockParser, stream, pipe;
return _regenerator2.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
data = [{
lbaBytes: 100,
grain: new Buffer('azerzaerazeraze', 'ascii')
}, {
lbaBytes: 700,
grain: new Buffer('gdfslkdfguer', 'ascii')
}];
index = 0;
mockParser = {
next: function () {
var _ref2 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee() {
var result;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (!(index < data.length)) {
_context.next = 6;
break;
}
result = data[index];
index++;
return _context.abrupt('return', result);
case 6:
return _context.abrupt('return', null);
case 7:
case 'end':
return _context.stop();
}
}
}, _callee, undefined);
}));
function next() {
return _ref2.apply(this, arguments);
}
return next;
}()
};
stream = new _vhdWrite.ReadableRawVHDStream(100000, mockParser);
pipe = stream.pipe((0, _fs.createWriteStream)('outputStream'));
_context2.next = 7;
return new _promise2.default(function (resolve, reject) {
pipe.on('finish', resolve);
pipe.on('error', reject);
});
case 7:
case 'end':
return _context2.stop();
}
}
}, _callee2, undefined);
})));
(0, _mocha.it)('ReadableRawVHDStream detects when blocks are out of order', (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee4() {
var data, index, mockParser;
return _regenerator2.default.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
data = [{
lbaBytes: 700,
grain: new Buffer('azerzaerazeraze', 'ascii')
}, {
lbaBytes: 100,
grain: new Buffer('gdfslkdfguer', 'ascii')
}];
index = 0;
mockParser = {
next: function () {
var _ref4 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee3() {
var result;
return _regenerator2.default.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
if (!(index < data.length)) {
_context3.next = 6;
break;
}
result = data[index];
index++;
return _context3.abrupt('return', result);
case 6:
return _context3.abrupt('return', null);
case 7:
case 'end':
return _context3.stop();
}
}
}, _callee3, undefined);
}));
function next() {
return _ref4.apply(this, arguments);
}
return next;
}()
};
return _context4.abrupt('return', _chai.assert.isRejected(new _promise2.default(function (resolve, reject) {
var stream = new _vhdWrite.ReadableRawVHDStream(100000, mockParser);
stream.on('error', reject);
var pipe = stream.pipe((0, _fs.createWriteStream)('outputStream'));
pipe.on('finish', resolve);
pipe.on('error', reject);
})));
case 4:
case 'end':
return _context4.stop();
}
}
}, _callee4, undefined);
})));
(0, _mocha.it)('writing a known file with VHDFile is successful', (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee5() {
var fileName, rawFilename, randomFileName, geometry, dataSize, buffer, f, splitPoint, fileContent, i;
return _regenerator2.default.wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
fileName = 'output.vhd';
rawFilename = 'output.raw';
randomFileName = 'random.raw';
geometry = (0, _vhdWrite.computeGeometryForSize)(1024 * 1024 * 8);
dataSize = geometry.actualSize;
_context5.next = 7;
return (0, _childProcessPromise.exec)('base64 /dev/urandom | head -c ' + dataSize + ' > ' + randomFileName);
case 7:
_context5.next = 9;
return (0, _fsPromise.readFile)(randomFileName);
case 9:
buffer = _context5.sent;
f = new _vhdWrite.VHDFile(buffer.length, 523557791);
splitPoint = Math.floor(Math.random() * buffer.length);
f.writeBuffer(buffer.slice(splitPoint), splitPoint);
f.writeBuffer(buffer.slice(0, splitPoint), 0);
f.writeBuffer(buffer.slice(splitPoint), splitPoint);
_context5.next = 17;
return f.writeFile(fileName);
case 17:
_context5.next = 19;
return (0, _childProcessPromise.exec)('qemu-img convert -fvpc -Oraw ' + fileName + ' ' + rawFilename);
case 19:
_context5.next = 21;
return (0, _fsPromise.readFile)(rawFilename);
case 21:
fileContent = _context5.sent;
_chai.assert.equal(fileContent.length, dataSize);
for (i = 0; i < fileContent.length; i++) {
if (fileContent[i] !== buffer[i]) {
_chai.assert.fail(fileContent[i], 0);
}
}
case 24:
case 'end':
return _context5.stop();
}
}
}, _callee5, undefined);
})));
});
//# sourceMappingURL=vhd-write.spec.js.map
;