diff --git a/src/storage/filesystem.js b/src/storage/filesystem.js index 414fd6571..7833a475a 100644 --- a/src/storage/filesystem.js +++ b/src/storage/filesystem.js @@ -17,6 +17,7 @@ var assert = require('assert'), async = require('async'), BackupsError = require('../backups.js').BackupsError, crypto = require('crypto'), + config = require('../config.js'), debug = require('debug')('box:storage/filesystem'), fs = require('fs'), mkdirp = require('mkdirp'), @@ -28,6 +29,7 @@ var assert = require('assert'), var FALLBACK_BACKUP_FOLDER = '/var/backups'; var FILE_TYPE = '.tar.gz.enc'; +var BACKUP_USER = config.TEST ? process.env.USER : 'yellowtent'; // internal only function getBackupFilePath(apiConfig, backupId) { @@ -90,7 +92,7 @@ function backup(apiConfig, backupId, sourceDirectories, callback) { fileStream.on('close', function () { debug('[%s] backup: changing ownership.', backupId); - if (!safe.child_process.execSync('chown -R yellowtent:yellowtent ' + path.dirname(backupFilePath))) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, safe.error.message)); + if (!safe.child_process.execSync('chown -R ' + BACKUP_USER + ':' + BACKUP_USER + ' ' + path.dirname(backupFilePath))) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, safe.error.message)); debug('[%s] backup: done.', backupId); @@ -143,7 +145,7 @@ function restore(apiConfig, backupId, destination, callback) { extract.on('finish', function () { debug('[%s] restore: %s done.', backupId); - callback(); + callback(null); }); fileStream.pipe(decipher).pipe(gunzip).pipe(extract); @@ -180,7 +182,7 @@ function copyBackup(apiConfig, oldBackupId, newBackupId, callback) { }); writeStream.on('close', function () { - if (!safe.child_process.execSync('chown -R yellowtent:yellowtent ' + path.dirname(newFilePath))) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, safe.error.message)); + if (!safe.child_process.execSync('chown -R ' + BACKUP_USER + ':' + BACKUP_USER + ' ' + path.dirname(newFilePath))) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, safe.error.message)); callback(); }); diff --git a/src/storage/s3.js b/src/storage/s3.js index 2a072d51c..4c84d52c5 100644 --- a/src/storage/s3.js +++ b/src/storage/s3.js @@ -185,7 +185,7 @@ function restore(apiConfig, backupId, destination, callback) { extract.on('finish', function () { debug('[%s] restore: done.', backupId); - callback(); + callback(null); }); s3get.pipe(decrypt).pipe(gunzip).pipe(extract); diff --git a/src/test/storage-test.js b/src/test/storage-test.js index d1597ef68..1128724c8 100644 --- a/src/test/storage-test.js +++ b/src/test/storage-test.js @@ -21,6 +21,7 @@ var async = require('async'), filesystem = require('../storage/filesystem.js'), expect = require('expect.js'), settings = require('../settings.js'), + SettingsError = settings.SettingsError, stream = require('stream'); function setup(done) { @@ -114,18 +115,34 @@ describe('Storage', function () { gSourceFolder = path.join(__dirname, 'storage'); gDestinationFolder = path.join(gTmpFolder, 'destination/'); - settings.setBackupConfig(gBackupConfig, function (error) { - expect(error).to.be(null); - - done(); - }); + done(); }); }); after(function (done) { cleanup(function (error) { expect(error).to.be(null); - rimraf(gTmpFolder, done); + done() + // rimraf(gTmpFolder, done); + }); + }); + + it('fails to set backup config for non-existing folder', function (done) { + settings.setBackupConfig(gBackupConfig, function (error) { + expect(error).to.be.a(SettingsError); + expect(error.reason).to.equal(SettingsError.BAD_FIELD); + + done(); + }); + }); + + it('succeeds to set backup config', function (done) { + mkdirp.sync(gBackupConfig.backupFolder); + + settings.setBackupConfig(gBackupConfig, function (error) { + expect(error).to.be(null); + + done(); }); }); @@ -146,20 +163,17 @@ describe('Storage', function () { }); it('can restore', function (done) { - var restoreMapping = [{ - source: '/datadir', - destination: path.join(gDestinationFolder, 'data') - }, { - source: '/addondir', - destination: path.join(gDestinationFolder, 'addon') - }]; - - filesystem.restore(gBackupConfig, gBackupId_1, restoreMapping, function (error) { + filesystem.restore(gBackupConfig, gBackupId_1, gDestinationFolder, function (error) { expect(error).to.be(null); - compareDirectories(gSourceFolder, gDestinationFolder, function (error) { + compareDirectories(path.join(gSourceFolder, 'data'), path.join(gDestinationFolder, 'datadir'), function (error) { expect(error).to.equal(null); - rimraf(gDestinationFolder, done); + + compareDirectories(path.join(gSourceFolder, 'addon'), path.join(gDestinationFolder, 'addondir'), function (error) { + expect(error).to.equal(null); + + rimraf(gDestinationFolder, done); + }); }); }); }); @@ -175,12 +189,7 @@ describe('Storage', function () { }); it('cannot restore deleted backup', function (done) { - var restoreMapping = [{ - source: '/datadir', - destination: path.join(gDestinationFolder, 'data') - }]; - - filesystem.restore(gBackupConfig, gBackupId_1, restoreMapping, function (error) { + filesystem.restore(gBackupConfig, gBackupId_1, gDestinationFolder, function (error) { expect(error).to.be.an('object'); expect(error.reason).to.equal(BackupsError.NOT_FOUND); @@ -189,18 +198,18 @@ describe('Storage', function () { }); it('can restore backup copy', function (done) { - var restoreMapping = [{ - source: '/datadir', - destination: path.join(gDestinationFolder, 'data') - }, { - source: '/addondir', - destination: path.join(gDestinationFolder, 'addon') - }]; - - filesystem.restore(gBackupConfig, gBackupId_2, restoreMapping, function (error) { + filesystem.restore(gBackupConfig, gBackupId_2, gDestinationFolder, function (error) { expect(error).to.be(null); - rimraf(gDestinationFolder, done); + compareDirectories(path.join(gSourceFolder, 'data'), path.join(gDestinationFolder, 'datadir'), function (error) { + expect(error).to.equal(null); + + compareDirectories(path.join(gSourceFolder, 'addon'), path.join(gDestinationFolder, 'addondir'), function (error) { + expect(error).to.equal(null); + + rimraf(gDestinationFolder, done); + }); + }); }); }); @@ -290,20 +299,17 @@ describe('Storage', function () { }); it('can restore', function (done) { - var restoreMapping = [{ - source: '/datadir', - destination: path.join(gDestinationFolder, 'data') - }, { - source: '/addondir', - destination: path.join(gDestinationFolder, 'addon') - }]; - - s3.restore(gBackupConfig, gBackupId_1, restoreMapping, function (error) { + s3.restore(gBackupConfig, gBackupId_1, gDestinationFolder, function (error) { expect(error).to.be(null); - compareDirectories(gSourceFolder, gDestinationFolder, function (error) { + compareDirectories(path.join(gSourceFolder, 'data'), path.join(gDestinationFolder, 'datadir'), function (error) { expect(error).to.equal(null); - rimraf(gDestinationFolder, done); + + compareDirectories(path.join(gSourceFolder, 'addon'), path.join(gDestinationFolder, 'addondir'), function (error) { + expect(error).to.equal(null); + + rimraf(gDestinationFolder, done); + }); }); }); }); @@ -319,12 +325,7 @@ describe('Storage', function () { }); it('cannot restore deleted backup', function (done) { - var restoreMapping = [{ - source: '/datadir', - destination: path.join(gDestinationFolder, 'data') - }]; - - s3.restore(gBackupConfig, gBackupId_1, restoreMapping, function (error) { + s3.restore(gBackupConfig, gBackupId_1, gDestinationFolder, function (error) { expect(error).to.be.an('object'); expect(error.reason).to.equal(BackupsError.NOT_FOUND); @@ -333,18 +334,18 @@ describe('Storage', function () { }); it('can restore backup copy', function (done) { - var restoreMapping = [{ - source: '/datadir', - destination: path.join(gDestinationFolder, 'data') - }, { - source: '/addondir', - destination: path.join(gDestinationFolder, 'addon') - }]; - - s3.restore(gBackupConfig, gBackupId_2, restoreMapping, function (error) { + s3.restore(gBackupConfig, gBackupId_2, gDestinationFolder, function (error) { expect(error).to.be(null); - rimraf(gDestinationFolder, done); + compareDirectories(path.join(gSourceFolder, 'data'), path.join(gDestinationFolder, 'datadir'), function (error) { + expect(error).to.equal(null); + + compareDirectories(path.join(gSourceFolder, 'addon'), path.join(gDestinationFolder, 'addondir'), function (error) { + expect(error).to.equal(null); + + rimraf(gDestinationFolder, done); + }); + }); }); });