Tile-based output filename may not exist, check g_stat return value

This commit is contained in:
Lovell Fuller 2016-11-06 14:31:28 +00:00
parent 9911863441
commit a7b024d4fa
2 changed files with 127 additions and 104 deletions

View File

@ -917,8 +917,9 @@ class PipelineWorker : public Nan::AsyncWorker {
} else { } else {
// Add file size to info // Add file size to info
GStatBuf st; GStatBuf st;
g_stat(baton->fileOut.data(), &st); if (g_stat(baton->fileOut.data(), &st) == 0) {
Set(info, New("size").ToLocalChecked(), New<v8::Uint32>(static_cast<uint32_t>(st.st_size))); Set(info, New("size").ToLocalChecked(), New<v8::Uint32>(static_cast<uint32_t>(st.st_size)));
}
argv[1] = info; argv[1] = info;
} }
} }

View File

@ -140,125 +140,147 @@ describe('Tile', function () {
}); });
}); });
if (sharp.format.dz.output.file) { it('Deep Zoom layout', function (done) {
it('Deep Zoom layout', function (done) { const directory = fixtures.path('output.dzi_files');
const directory = fixtures.path('output.dzi_files'); rimraf(directory, function () {
rimraf(directory, function () { sharp(fixtures.inputJpg)
sharp(fixtures.inputJpg) .toFile(fixtures.path('output.dzi'), function (err, info) {
.toFile(fixtures.path('output.dzi'), function (err, info) { if (err) throw err;
if (err) throw err; assert.strictEqual('dz', info.format);
assert.strictEqual('dz', info.format); assert.strictEqual(2725, info.width);
assertDeepZoomTiles(directory, 256, 13, done); assert.strictEqual(2225, info.height);
}); assert.strictEqual(3, info.channels);
}); assert.strictEqual('undefined', typeof info.size);
assertDeepZoomTiles(directory, 256, 13, done);
});
}); });
});
it('Deep Zoom layout with custom size+overlap', function (done) { it('Deep Zoom layout with custom size+overlap', function (done) {
const directory = fixtures.path('output.512.dzi_files'); const directory = fixtures.path('output.512.dzi_files');
rimraf(directory, function () { rimraf(directory, function () {
sharp(fixtures.inputJpg) sharp(fixtures.inputJpg)
.tile({ .tile({
size: 512, size: 512,
overlap: 16 overlap: 16
}) })
.toFile(fixtures.path('output.512.dzi'), function (err, info) { .toFile(fixtures.path('output.512.dzi'), function (err, info) {
if (err) throw err; if (err) throw err;
assert.strictEqual('dz', info.format); assert.strictEqual('dz', info.format);
assertDeepZoomTiles(directory, 512 + 2 * 16, 13, done); assert.strictEqual(2725, info.width);
}); assert.strictEqual(2225, info.height);
}); assert.strictEqual(3, info.channels);
assert.strictEqual('undefined', typeof info.size);
assertDeepZoomTiles(directory, 512 + 2 * 16, 13, done);
});
}); });
});
it('Zoomify layout', function (done) { it('Zoomify layout', function (done) {
const directory = fixtures.path('output.zoomify.dzi'); const directory = fixtures.path('output.zoomify.dzi');
rimraf(directory, function () { rimraf(directory, function () {
sharp(fixtures.inputJpg) sharp(fixtures.inputJpg)
.tile({ .tile({
layout: 'zoomify' layout: 'zoomify'
}) })
.toFile(fixtures.path('output.zoomify.dzi'), function (err, info) { .toFile(fixtures.path('output.zoomify.dzi'), function (err, info) {
if (err) throw err;
assert.strictEqual('dz', info.format);
assert.strictEqual(2725, info.width);
assert.strictEqual(2225, info.height);
assert.strictEqual(3, info.channels);
assert.strictEqual('number', typeof info.size);
fs.stat(path.join(directory, 'ImageProperties.xml'), function (err, stat) {
if (err) throw err; if (err) throw err;
assert.strictEqual('dz', info.format); assert.strictEqual(true, stat.isFile());
fs.stat(path.join(directory, 'ImageProperties.xml'), function (err, stat) { assert.strictEqual(true, stat.size > 0);
if (err) throw err; done();
assert.strictEqual(true, stat.isFile());
assert.strictEqual(true, stat.size > 0);
done();
});
}); });
}); });
}); });
});
it('Google layout', function (done) { it('Google layout', function (done) {
const directory = fixtures.path('output.google.dzi'); const directory = fixtures.path('output.google.dzi');
rimraf(directory, function () { rimraf(directory, function () {
sharp(fixtures.inputJpg) sharp(fixtures.inputJpg)
.tile({ .tile({
layout: 'google' layout: 'google'
}) })
.toFile(directory, function (err, info) { .toFile(directory, function (err, info) {
if (err) throw err;
assert.strictEqual('dz', info.format);
assert.strictEqual(2725, info.width);
assert.strictEqual(2225, info.height);
assert.strictEqual(3, info.channels);
assert.strictEqual('number', typeof info.size);
fs.stat(path.join(directory, '0', '0', '0.jpg'), function (err, stat) {
if (err) throw err; if (err) throw err;
assert.strictEqual('dz', info.format); assert.strictEqual(true, stat.isFile());
fs.stat(path.join(directory, '0', '0', '0.jpg'), function (err, stat) { assert.strictEqual(true, stat.size > 0);
if (err) throw err; done();
assert.strictEqual(true, stat.isFile());
assert.strictEqual(true, stat.size > 0);
done();
});
}); });
}); });
}); });
});
it('Write to ZIP container using file extension', function (done) { it('Write to ZIP container using file extension', function (done) {
const container = fixtures.path('output.dz.container.zip'); const container = fixtures.path('output.dz.container.zip');
const extractTo = fixtures.path('output.dz.container'); const extractTo = fixtures.path('output.dz.container');
const directory = path.join(extractTo, 'output.dz.container_files'); const directory = path.join(extractTo, 'output.dz.container_files');
rimraf(directory, function () { rimraf(directory, function () {
sharp(fixtures.inputJpg) sharp(fixtures.inputJpg)
.toFile(container, function (err, info) { .toFile(container, function (err, info) {
if (err) throw err;
assert.strictEqual('dz', info.format);
assert.strictEqual(2725, info.width);
assert.strictEqual(2225, info.height);
assert.strictEqual(3, info.channels);
assert.strictEqual('number', typeof info.size);
fs.stat(container, function (err, stat) {
if (err) throw err; if (err) throw err;
assert.strictEqual('dz', info.format); assert.strictEqual(true, stat.isFile());
fs.stat(container, function (err, stat) { assert.strictEqual(true, stat.size > 0);
if (err) throw err; fs.createReadStream(container)
assert.strictEqual(true, stat.isFile()); .pipe(unzip.Extract({path: path.dirname(extractTo)}))
assert.strictEqual(true, stat.size > 0); .on('error', function (err) { throw err; })
fs.createReadStream(container) .on('close', function () {
.pipe(unzip.Extract({path: path.dirname(extractTo)})) assertDeepZoomTiles(directory, 256, 13, done);
.on('error', function (err) { throw err; }) });
.on('close', function () {
assertDeepZoomTiles(directory, 256, 13, done);
});
});
}); });
}); });
}); });
});
it('Write to ZIP container using container tile option', function (done) { it('Write to ZIP container using container tile option', function (done) {
const container = fixtures.path('output.dz.containeropt.zip'); const container = fixtures.path('output.dz.containeropt.zip');
const extractTo = fixtures.path('output.dz.containeropt'); const extractTo = fixtures.path('output.dz.containeropt');
const directory = path.join(extractTo, 'output.dz.containeropt_files'); const directory = path.join(extractTo, 'output.dz.containeropt_files');
rimraf(directory, function () { rimraf(directory, function () {
sharp(fixtures.inputJpg) sharp(fixtures.inputJpg)
.tile({ .tile({
container: 'zip' container: 'zip'
}) })
.toFile(container, function (err, info) { .toFile(container, function (err, info) {
// Vips overrides .dzi extension to .zip used by container var below // Vips overrides .dzi extension to .zip used by container var below
if (err) throw err;
assert.strictEqual('dz', info.format);
assert.strictEqual(2725, info.width);
assert.strictEqual(2225, info.height);
assert.strictEqual(3, info.channels);
assert.strictEqual('number', typeof info.size);
fs.stat(container, function (err, stat) {
if (err) throw err; if (err) throw err;
assert.strictEqual('dz', info.format); assert.strictEqual(true, stat.isFile());
fs.stat(container, function (err, stat) { assert.strictEqual(true, stat.size > 0);
if (err) throw err; fs.createReadStream(container)
assert.strictEqual(true, stat.isFile()); .pipe(unzip.Extract({path: path.dirname(extractTo)}))
assert.strictEqual(true, stat.size > 0); .on('error', function (err) { throw err; })
fs.createReadStream(container) .on('close', function () {
.pipe(unzip.Extract({path: path.dirname(extractTo)})) assertDeepZoomTiles(directory, 256, 13, done);
.on('error', function (err) { throw err; }) });
.on('close', function () {
assertDeepZoomTiles(directory, 256, 13, done);
});
});
}); });
}); });
}); });
} });
}); });