493 lines
15 KiB
JavaScript
493 lines
15 KiB
JavaScript
|
var clean = require('gulp-clean');
|
||
|
var fs = require('fs');
|
||
|
var gulp = require('gulp');
|
||
|
var log = require('gulp-util').log;
|
||
|
var gzip = require('../');
|
||
|
var nid = require('nid');
|
||
|
var rename = require('gulp-rename');
|
||
|
var should = require('should');
|
||
|
var Stream = require('stream');
|
||
|
var tap = require('gulp-tap');
|
||
|
var zlib = require('zlib');
|
||
|
|
||
|
// monkeys are fixing cwd for gulp-mocha
|
||
|
// node lives in one process/scope/directory
|
||
|
process.chdir('./test');
|
||
|
|
||
|
describe('gulp-gzip', function() {
|
||
|
|
||
|
describe('config', function() {
|
||
|
|
||
|
it('should have default config', function(done) {
|
||
|
var instance = gzip();
|
||
|
instance.config.should.eql({
|
||
|
append: true,
|
||
|
gzipOptions: {},
|
||
|
skipGrowingFiles: false,
|
||
|
threshold: false
|
||
|
});
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
it('should merge options with defaults', function(done) {
|
||
|
var instance = gzip({ append: false });
|
||
|
instance.config.should.eql({
|
||
|
append: false,
|
||
|
gzipOptions: {},
|
||
|
skipGrowingFiles: false,
|
||
|
threshold: false
|
||
|
});
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('file extension', function() {
|
||
|
|
||
|
it('should append .gz to the file extension, by default', function(done) {
|
||
|
gulp.src('files/small.txt')
|
||
|
.pipe(gzip())
|
||
|
.pipe(tap(function(file) {
|
||
|
file.path.should.endWith('.gz');
|
||
|
done();
|
||
|
}));
|
||
|
});
|
||
|
|
||
|
it('should not append .gz to the file extension receiving { append: false }', function(done) {
|
||
|
gulp.src('files/small.txt')
|
||
|
.pipe(gzip({ append: false }))
|
||
|
.pipe(tap(function(file) {
|
||
|
file.path.should.not.endWith('.gz');
|
||
|
done();
|
||
|
}));
|
||
|
});
|
||
|
|
||
|
it('should accept an arbitrary extension with the `extension` option', function(done) {
|
||
|
gulp.src('files/small.txt')
|
||
|
.pipe(gzip({ extension: 'zip' }))
|
||
|
.pipe(tap(function(file) {
|
||
|
file.path.should.endWith('.zip');
|
||
|
done();
|
||
|
}));
|
||
|
});
|
||
|
|
||
|
it('should accept an arbitrary pre-extension with the `preExtension` option', function(done) {
|
||
|
gulp.src('files/small.txt')
|
||
|
.pipe(gzip({ preExtension: 'gz' }))
|
||
|
.pipe(tap(function(file) {
|
||
|
file.path.should.endWith('.gz.txt');
|
||
|
done();
|
||
|
}));
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('file type', function() {
|
||
|
|
||
|
it('should return file contents as a Buffer', function(done) {
|
||
|
gulp.src('files/small.txt')
|
||
|
.pipe(gzip())
|
||
|
.pipe(tap(function(file) {
|
||
|
file.contents.should.be.instanceof(Buffer);
|
||
|
done();
|
||
|
}));
|
||
|
});
|
||
|
|
||
|
it('should return file contents as a Stream', function(done) {
|
||
|
gulp.src('files/small.txt', { buffer: false })
|
||
|
.pipe(gzip())
|
||
|
.pipe(tap(function(file) {
|
||
|
file.contents.should.be.instanceof(Stream);
|
||
|
done();
|
||
|
}));
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('file properties', function() {
|
||
|
it('should not lose any properties from the Vinyl file', function(done) {
|
||
|
gulp.src('files/small.txt')
|
||
|
.pipe(tap(function(file) {
|
||
|
file.test = 'test';
|
||
|
}))
|
||
|
.pipe(gzip())
|
||
|
.pipe(tap(function(file) {
|
||
|
file.should.have.property('test', 'test');
|
||
|
done();
|
||
|
}));
|
||
|
});
|
||
|
|
||
|
it('should set `contentEncoding`', function(done) {
|
||
|
gulp.src('files/small.txt')
|
||
|
.pipe(gzip())
|
||
|
.pipe(tap(function(file) {
|
||
|
file.should.have.property('contentEncoding');
|
||
|
file.contentEncoding.should.containEql('gzip');
|
||
|
done();
|
||
|
}));
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('gzip options', function() {
|
||
|
|
||
|
it('should set gzipOptions object', function(done) {
|
||
|
var instance = gzip({ gzipOptions: { level: 9, memLevel: 1} });
|
||
|
instance.config.should.have.property('gzipOptions');
|
||
|
instance.config.gzipOptions.should.have.property('level', 9);
|
||
|
instance.config.gzipOptions.should.have.property('memLevel', 1);
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
it('should handle compression level in buffer mode', function(done) {
|
||
|
var id_lowest_compression = nid();
|
||
|
var id_highest_compression = nid();
|
||
|
|
||
|
var out_lowest_compression = gulp.dest('tmp');
|
||
|
var out_highest_compression = gulp.dest('tmp');
|
||
|
|
||
|
var size_lowest_compression = 0;
|
||
|
var size_highest_compression = 0;
|
||
|
|
||
|
out_lowest_compression.on('end', function() {
|
||
|
fs.stat('./tmp/' + id_lowest_compression + '.txt.gz', function (err, stats) {
|
||
|
size_lowest_compression = stats.size;
|
||
|
|
||
|
if (size_highest_compression > 0) {
|
||
|
size_highest_compression.should.be.lessThan(size_lowest_compression);
|
||
|
done();
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
|
||
|
out_highest_compression.on('end', function() {
|
||
|
fs.stat('./tmp/' + id_highest_compression + '.txt.gz', function (err, stats) {
|
||
|
size_highest_compression = stats.size;
|
||
|
|
||
|
if (size_lowest_compression > 0) {
|
||
|
size_highest_compression.should.be.lessThan(size_lowest_compression);
|
||
|
done();
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
|
||
|
gulp.src('files/big.txt')
|
||
|
.pipe(rename({ basename: id_lowest_compression }))
|
||
|
.pipe(gzip({ gzipOptions: { level: 1 } }))
|
||
|
.pipe(out_lowest_compression);
|
||
|
|
||
|
gulp.src('files/big.txt')
|
||
|
.pipe(rename({ basename: id_highest_compression }))
|
||
|
.pipe(gzip({ gzipOptions: { level: 9 } }))
|
||
|
.pipe(out_highest_compression);
|
||
|
});
|
||
|
|
||
|
it('should handle compression level in stream mode', function(done) {
|
||
|
var id_lowest_compression = nid();
|
||
|
var id_highest_compression = nid();
|
||
|
|
||
|
var out_lowest_compression = gulp.dest('tmp');
|
||
|
var out_highest_compression = gulp.dest('tmp');
|
||
|
|
||
|
var size_lowest_compression = 0;
|
||
|
var size_highest_compression = 0;
|
||
|
|
||
|
out_lowest_compression.on('end', function() {
|
||
|
fs.stat('./tmp/' + id_lowest_compression + '.txt.gz', function (err, stats) {
|
||
|
size_lowest_compression = stats.size;
|
||
|
|
||
|
if (size_highest_compression > 0) {
|
||
|
size_highest_compression.should.be.lessThan(size_lowest_compression);
|
||
|
done();
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
|
||
|
out_highest_compression.on('end', function() {
|
||
|
fs.stat('./tmp/' + id_highest_compression + '.txt.gz', function (err, stats) {
|
||
|
size_highest_compression = stats.size;
|
||
|
|
||
|
if (size_lowest_compression > 0) {
|
||
|
size_highest_compression.should.be.lessThan(size_lowest_compression);
|
||
|
done();
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
|
||
|
gulp.src('files/big.txt', { buffer: false })
|
||
|
.pipe(rename({ basename: id_lowest_compression }))
|
||
|
.pipe(gzip({ gzipOptions: { level: 1 } }))
|
||
|
.pipe(out_lowest_compression);
|
||
|
|
||
|
gulp.src('files/big.txt', { buffer: false })
|
||
|
.pipe(rename({ basename: id_highest_compression }))
|
||
|
.pipe(gzip({ gzipOptions: { level: 9 } }))
|
||
|
.pipe(out_highest_compression);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('threshold option', function() {
|
||
|
|
||
|
it('should set threshold to false while receiving false', function(done) {
|
||
|
var instance = gzip({ threshold: false });
|
||
|
instance.config.threshold.should.be.false;
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
it('should set threshold to 150 while receiving true', function(done) {
|
||
|
var instance = gzip({ threshold: true });
|
||
|
instance.config.threshold.should.eql(150);
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
it('should set threshold to Number while receiving Number', function(done) {
|
||
|
var instance = gzip({ threshold: 1024 });
|
||
|
instance.config.should.have.property('threshold', 1024);
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
it('should set threshold to 150 while receiving Number < 150', function(done) {
|
||
|
var instance = gzip({ threshold: 100 });
|
||
|
instance.config.should.have.property('threshold', 150);
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
it('should set threshold to Number while receiving String (bytes result)', function(done) {
|
||
|
var instance = gzip({ threshold: '1kb' });
|
||
|
instance.config.should.have.property('threshold', 1024);
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
it('should set threshold to 150 while receiving String (bytes result < 150)', function(done) {
|
||
|
var instance = gzip({ threshold: '1kb' });
|
||
|
instance.config.should.have.property('threshold', 1024);
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
it('should handle threshold of 1kb by passing through small.txt (<1kb)', function(done) {
|
||
|
var id = nid();
|
||
|
var out = gulp.dest('tmp');
|
||
|
|
||
|
out.on('end', function() {
|
||
|
fs.readFile('./tmp/' + id + '.txt', { encoding: 'utf-8' }, function(err, file) {
|
||
|
fs.readFile('./files/small.txt', { encoding: 'utf-8' }, function(err, original) {
|
||
|
file.should.equal(original);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
gulp.src('files/small.txt')
|
||
|
.pipe(rename({ basename: id }))
|
||
|
.pipe(gzip({ threshold: '1kb' }))
|
||
|
.pipe(out);
|
||
|
});
|
||
|
|
||
|
it('should handle threshold of 1kb by compressing big.txt (>1kb)', function(done) {
|
||
|
var id = nid();
|
||
|
var out = gulp.dest('tmp');
|
||
|
|
||
|
out.on('end', function() {
|
||
|
fs.readFile('./tmp/' + id + '.txt.gz', function(err, file) {
|
||
|
zlib.unzip(file, function(err, buffer) {
|
||
|
file = buffer.toString('utf-8');
|
||
|
|
||
|
fs.readFile('./files/big.txt', { encoding: 'utf-8' }, function(err, original) {
|
||
|
file.should.equal(original);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
gulp.src('files/big.txt')
|
||
|
.pipe(rename({ basename: id }))
|
||
|
.pipe(gzip({ threshold: '1kb' }))
|
||
|
.pipe(out);
|
||
|
});
|
||
|
|
||
|
it('should handle threshold of 1kb by passing through small.txt (<1kb)', function(done) {
|
||
|
var id = nid();
|
||
|
var out = gulp.dest('tmp');
|
||
|
|
||
|
out.on('end', function() {
|
||
|
fs.readFile('./tmp/' + id + '.txt', { encoding: 'utf-8' }, function(err, file) {
|
||
|
fs.readFile('./files/small.txt', { encoding: 'utf-8' }, function(err, original) {
|
||
|
file.should.equal(original);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
gulp.src('files/small.txt', { buffer: false })
|
||
|
.pipe(rename({ basename: id }))
|
||
|
.pipe(gzip({ threshold: '1kb' }))
|
||
|
.pipe(out);
|
||
|
});
|
||
|
|
||
|
it('should handle threshold of 1kb by compressing big.txt (>1kb)', function(done) {
|
||
|
var id = nid();
|
||
|
var out = gulp.dest('tmp');
|
||
|
|
||
|
out.on('end', function() {
|
||
|
fs.readFile('./tmp/' + id + '.txt.gz', function(err, file) {
|
||
|
zlib.unzip(file, function(err, buffer) {
|
||
|
file = buffer.toString('utf-8');
|
||
|
|
||
|
fs.readFile('./files/big.txt', { encoding: 'utf-8' }, function(err, original) {
|
||
|
file.should.equal(original);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
gulp.src('files/big.txt', { buffer: false })
|
||
|
.pipe(rename({ basename: id }))
|
||
|
.pipe(gzip({ threshold: '1kb' }))
|
||
|
.pipe(out);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('delete mode', function() {
|
||
|
|
||
|
it('should not delete existing gzipped files when { deleteMode : false }', function(done) {
|
||
|
var id = nid();
|
||
|
var out = gulp.dest('tmp');
|
||
|
|
||
|
out.on('end', function() {
|
||
|
fs.readFile('./tmp/' + id + '.txt.gz', function(err, file) {
|
||
|
should.not.exist(err);
|
||
|
should.exist(file);
|
||
|
file.should.not.be.empty;
|
||
|
|
||
|
var out = gulp.dest('tmp');
|
||
|
out.on('end', function() {
|
||
|
fs.readFile('./tmp/' + id + '.txt.gz', function(err, file) {
|
||
|
should.not.exist(err);
|
||
|
should.exist(file);
|
||
|
file.should.not.be.empty;
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
gulp.src('files/small.txt')
|
||
|
.pipe(rename({ basename: id }))
|
||
|
.pipe(gzip({ threshold: 1024 }))
|
||
|
.pipe(out);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
gulp.src('files/big.txt')
|
||
|
.pipe(rename({ basename: id }))
|
||
|
.pipe(gzip({ threshold: 1024 }))
|
||
|
.pipe(out);
|
||
|
});
|
||
|
|
||
|
it('should delete existing gzipped files if the files changed from big.txt (over threshold) to small.txt (under threshold) when { deleteMode : true }', function(done) {
|
||
|
var id = nid();
|
||
|
var out = gulp.dest('tmp');
|
||
|
|
||
|
out.on('end', function() {
|
||
|
fs.readFile('./tmp/' + id + '.txt.gz', function(err, file) {
|
||
|
should.not.exist(err);
|
||
|
should.exist(file);
|
||
|
file.should.not.be.empty;
|
||
|
|
||
|
var out = gulp.dest('tmp');
|
||
|
|
||
|
out.on('end', function() {
|
||
|
fs.exists('./tmp/' + id + '.txt.gz', function(exists) {
|
||
|
exists.should.be.false;
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
gulp.src('files/small.txt')
|
||
|
.pipe(rename({ basename: id }))
|
||
|
.pipe(gzip({ threshold: 1024, deleteMode: 'tmp' }))
|
||
|
.pipe(out);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
gulp.src('files/big.txt')
|
||
|
.pipe(rename({ basename: id }))
|
||
|
.pipe(gzip({ threshold: 1024, deleteMode: 'tmp' }))
|
||
|
.pipe(out);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe ('uncompress the compressed file', function() {
|
||
|
|
||
|
it('should match original in buffer mode', function(done) {
|
||
|
var id = nid();
|
||
|
var out = gulp.dest('tmp');
|
||
|
|
||
|
out.on('end', function() {
|
||
|
fs.readFile('./tmp/' + id + '.txt.gz', function(err, file) {
|
||
|
zlib.unzip(file, function(err, buffer) {
|
||
|
file = buffer.toString('utf-8', 0, buffer.length);
|
||
|
|
||
|
fs.readFile('./files/small.txt', { encoding: 'utf-8' }, function(err, original) {
|
||
|
file.should.equal(original);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
gulp.src('files/small.txt')
|
||
|
.pipe(rename({ basename: id }))
|
||
|
.pipe(gzip())
|
||
|
.pipe(out);
|
||
|
});
|
||
|
|
||
|
it('should match original in stream mode', function(done) {
|
||
|
var id = nid();
|
||
|
var out = gulp.dest('tmp');
|
||
|
|
||
|
out.on('end', function() {
|
||
|
fs.readFile('./tmp/' + id + '.txt.gz', function(err, file) {
|
||
|
zlib.unzip(file, function(err, buffer) {
|
||
|
file = buffer.toString('utf-8', 0, buffer.length);
|
||
|
|
||
|
fs.readFile('./files/small.txt', { encoding: 'utf-8' }, function(err, original) {
|
||
|
file.should.equal(original);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
gulp.src('files/small.txt', { buffer: false })
|
||
|
.pipe(rename({ basename: id }))
|
||
|
.pipe(gzip())
|
||
|
.pipe(out);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('skip files that get larger after compression', function() {
|
||
|
it('handles buffers', function(done) {
|
||
|
var originalBuffer;
|
||
|
gulp.src('files/too_small.txt')
|
||
|
.pipe(tap(function(file) {
|
||
|
originalBuffer = file.contents;
|
||
|
}))
|
||
|
.pipe(gzip({ skipGrowingFiles: true }))
|
||
|
.pipe(tap(function(file) {
|
||
|
file.contents.should.equal(originalBuffer);
|
||
|
done();
|
||
|
}));
|
||
|
});
|
||
|
|
||
|
it('handles streams', function(done) {
|
||
|
var originalStream;
|
||
|
gulp.src('files/too_small.txt', { buffer: false })
|
||
|
.pipe(tap(function(file) {
|
||
|
originalStream = file.contents;
|
||
|
}))
|
||
|
.pipe(gzip({ skipGrowingFiles: true }))
|
||
|
.pipe(tap(function(file) {
|
||
|
file.contents.should.equal(originalStream);
|
||
|
done();
|
||
|
}));
|
||
|
});
|
||
|
});
|
||
|
});
|