Files
cloudron-box/src/test/storage-test.js

292 lines
10 KiB
JavaScript
Raw Normal View History

/* global it:false */
/* global describe:false */
/* global before:false */
/* global after:false */
'use strict';
2017-10-02 20:08:00 -07:00
var BackupsError = require('../backups.js').BackupsError,
2017-09-27 10:25:36 -07:00
expect = require('expect.js'),
filesystem = require('../storage/filesystem.js'),
fs = require('fs'),
2017-09-27 10:25:36 -07:00
MockS3 = require('mock-aws-s3'),
2017-10-02 20:08:00 -07:00
noop = require('../storage/noop.js'),
os = require('os'),
path = require('path'),
rimraf = require('rimraf'),
2017-10-02 20:08:00 -07:00
s3 = require('../storage/s3.js');
describe('Storage', function () {
describe('filesystem', function () {
2017-10-02 20:08:00 -07:00
var gTmpFolder;
2017-10-02 20:08:00 -07:00
var gBackupConfig = {
provider: 'filesystem',
key: 'key',
backupFolder: null,
format: 'tgz'
};
before(function (done) {
2017-10-02 20:08:00 -07:00
gTmpFolder = fs.mkdtempSync(path.join(os.tmpdir(), 'filesystem-storage-test_'));
2017-10-02 20:08:00 -07:00
gBackupConfig.backupFolder = path.join(gTmpFolder, 'backups/');
2017-10-02 20:08:00 -07:00
done();
});
2017-10-02 20:08:00 -07:00
after(function (done) {
rimraf.sync(gTmpFolder);
done();
});
2017-10-02 20:08:00 -07:00
it('can upload', function (done) {
var sourceFile = path.join(__dirname, 'storage/data/test.txt');
var sourceStream = fs.createReadStream(sourceFile);
var destFile = gTmpFolder + '/uploadtest/test.txt';
filesystem.upload(gBackupConfig, destFile, sourceStream, function (error) {
expect(error).to.be(null);
expect(fs.existsSync(destFile));
expect(fs.statSync(sourceFile).size).to.be(fs.statSync(destFile).size);
done();
});
});
2017-10-02 20:08:00 -07:00
it('upload waits for empty file to be created', function (done) {
var sourceFile = path.join(__dirname, 'storage/data/empty');
var sourceStream = fs.createReadStream(sourceFile);
var destFile = gTmpFolder + '/uploadtest/empty';
filesystem.upload(gBackupConfig, destFile, sourceStream, function (error) {
expect(error).to.be(null);
2017-10-02 20:08:00 -07:00
expect(fs.existsSync(destFile));
expect(fs.statSync(sourceFile).size).to.be(fs.statSync(destFile).size);
2017-09-19 20:40:38 -07:00
done();
});
});
2017-10-02 20:08:00 -07:00
it('upload unlinks old file', function (done) {
var sourceFile = path.join(__dirname, 'storage/data/test.txt');
var sourceStream = fs.createReadStream(sourceFile);
var destFile = gTmpFolder + '/uploadtest/test.txt';
var oldStat = fs.statSync(destFile);
filesystem.upload(gBackupConfig, destFile, sourceStream, function (error) {
expect(error).to.be(null);
expect(fs.existsSync(destFile)).to.be(true);
expect(fs.statSync(sourceFile).size).to.be(fs.statSync(destFile).size);
expect(oldStat.inode).to.not.be(fs.statSync(destFile).size);
done();
});
});
2017-10-02 20:08:00 -07:00
it('can download file', function (done) {
var sourceFile = gTmpFolder + '/uploadtest/test.txt';
2017-10-02 20:08:00 -07:00
filesystem.download(gBackupConfig, sourceFile, function (error, stream) {
expect(error).to.be(null);
2017-10-02 20:08:00 -07:00
expect(stream).to.be.an('object');
done();
});
});
2017-10-02 20:08:00 -07:00
it('download errors for missing file', function (done) {
var sourceFile = gTmpFolder + '/uploadtest/missing';
2017-10-02 20:08:00 -07:00
filesystem.download(gBackupConfig, sourceFile, function (error) {
expect(error.reason).to.be(BackupsError.NOT_FOUND);
done();
});
});
2017-10-02 20:08:00 -07:00
it('download dir copies contents of source dir', function (done) {
var sourceDir = path.join(__dirname, 'storage');
2017-10-10 20:23:04 -07:00
var events = filesystem.downloadDir(gBackupConfig, sourceDir, gTmpFolder);
events.on('done', function (error) {
2017-10-02 20:08:00 -07:00
expect(error).to.be(null);
expect(fs.statSync(path.join(gTmpFolder, 'data/empty')).size).to.be(0);
done();
});
});
2017-10-02 20:08:00 -07:00
it('can copy', function (done) {
var sourceFile = gTmpFolder + '/uploadtest/test.txt'; // keep the test within save device
var destFile = gTmpFolder + '/uploadtest/test-hardlink.txt';
var events = filesystem.copy(gBackupConfig, sourceFile, destFile);
events.on('done', function (error) {
2017-10-02 20:08:00 -07:00
expect(error).to.be(null);
expect(fs.statSync(destFile).nlink).to.be(2); // created a hardlink
done();
});
});
2017-10-02 20:08:00 -07:00
it('can remove file', function (done) {
var sourceFile = gTmpFolder + '/uploadtest/test-hardlink.txt';
2017-10-02 20:08:00 -07:00
filesystem.remove(gBackupConfig, sourceFile, function (error) {
expect(error).to.be(null);
expect(fs.existsSync(sourceFile)).to.be(false);
done();
});
});
2017-10-02 20:08:00 -07:00
it('can remove empty dir', function (done) {
var sourceDir = gTmpFolder + '/emptydir';
fs.mkdirSync(sourceDir);
2017-10-02 20:08:00 -07:00
filesystem.remove(gBackupConfig, sourceDir, function (error) {
expect(error).to.be(null);
expect(fs.existsSync(sourceDir)).to.be(false);
2017-09-28 14:26:39 -07:00
done();
});
});
2017-10-02 20:08:00 -07:00
});
2017-10-02 20:08:00 -07:00
describe('noop', function () {
var gBackupConfig = {
provider: 'noop',
format: 'tgz'
};
it('upload works', function (done) {
noop.upload(gBackupConfig, 'file', { }, function (error) {
expect(error).to.be(null);
2017-10-02 20:08:00 -07:00
done();
});
});
2017-10-02 20:08:00 -07:00
it('can download file', function (done) {
noop.download(gBackupConfig, 'file', function (error) {
expect(error).to.be.an(Error);
done();
});
});
2017-10-02 20:08:00 -07:00
it('download dir copies contents of source dir', function (done) {
2017-10-10 20:23:04 -07:00
var events = noop.downloadDir(gBackupConfig, 'sourceDir', 'destDir');
events.on('done', function (error) {
2017-10-02 20:08:00 -07:00
expect(error).to.be.an(Error);
done();
});
});
2017-10-02 20:08:00 -07:00
it('can copy', function (done) {
var events = noop.copy(gBackupConfig, 'sourceFile', 'destFile');
events.on('done', function (error) {
2017-10-02 20:08:00 -07:00
expect(error).to.be(null);
done();
});
});
2017-10-02 20:08:00 -07:00
it('can remove file', function (done) {
noop.remove(gBackupConfig, 'sourceFile', function (error) {
expect(error).to.be(null);
done();
});
});
2017-10-02 20:08:00 -07:00
it('can remove empty dir', function (done) {
noop.remove(gBackupConfig, 'sourceDir', function (error) {
expect(error).to.be(null);
done();
});
});
});
describe('s3', function () {
this.timeout(10000);
2017-10-02 20:08:00 -07:00
var gS3Folder;
var gBackupConfig = {
provider: 's3',
key: 'key',
prefix: 'unit.test',
bucket: 'cloudron-storage-test',
2017-04-18 19:15:56 +02:00
accessKeyId: 'testkeyid',
secretAccessKey: 'testsecret',
region: 'eu-central-1',
format: 'tgz'
};
2017-10-02 20:08:00 -07:00
before(function () {
2017-04-18 19:15:56 +02:00
MockS3.config.basePath = path.join(os.tmpdir(), 's3-backup-test-buckets/');
2017-10-02 20:08:00 -07:00
rimraf.sync(MockS3.config.basePath);
gS3Folder = path.join(MockS3.config.basePath, gBackupConfig.bucket);
2017-04-18 19:15:56 +02:00
s3._mockInject(MockS3);
});
2017-10-02 20:08:00 -07:00
after(function () {
2017-04-18 19:15:56 +02:00
s3._mockRestore();
rimraf.sync(MockS3.config.basePath);
2017-10-02 20:08:00 -07:00
});
2017-04-18 19:15:56 +02:00
2017-10-02 20:08:00 -07:00
it('can upload', function (done) {
var sourceFile = path.join(__dirname, 'storage/data/test.txt');
var sourceStream = fs.createReadStream(sourceFile);
var destKey = 'uploadtest/test.txt';
s3.upload(gBackupConfig, destKey, sourceStream, function (error) {
expect(error).to.be(null);
2017-10-02 20:08:00 -07:00
expect(fs.existsSync(path.join(gS3Folder, destKey))).to.be(true);
expect(fs.statSync(path.join(gS3Folder, destKey)).size).to.be(fs.statSync(sourceFile).size);
done();
});
});
2017-10-02 20:08:00 -07:00
it('can download file', function (done) {
var sourceKey = 'uploadtest/test.txt';
s3.download(gBackupConfig, sourceKey, function (error, stream) {
expect(error).to.be(null);
2017-10-02 20:08:00 -07:00
expect(stream).to.be.an('object');
done();
});
});
2017-10-02 20:08:00 -07:00
it('download dir copies contents of source dir', function (done) {
var sourceFile = path.join(__dirname, 'storage/data/test.txt');
var sourceKey = '';
var destDir = path.join(os.tmpdir(), 's3-destdir');
2017-10-10 20:23:04 -07:00
var events = s3.downloadDir(gBackupConfig, sourceKey, destDir);
events.on('done', function (error) {
2017-10-02 20:08:00 -07:00
expect(error).to.be(null);
expect(fs.statSync(path.join(destDir, 'uploadtest/test.txt')).size).to.be(fs.statSync(sourceFile).size);
done();
});
});
2017-10-02 20:08:00 -07:00
it('can copy', function (done) {
fs.writeFileSync(path.join(gS3Folder, 'uploadtest/C++.gitignore'), 'special', 'utf8');
2017-10-02 20:08:00 -07:00
var sourceKey = 'uploadtest';
2017-10-02 18:29:16 -07:00
var events = s3.copy(gBackupConfig, sourceKey, 'uploadtest-copy');
events.on('done', function (error) {
2017-10-02 20:08:00 -07:00
var sourceFile = path.join(__dirname, 'storage/data/test.txt');
expect(error).to.be(null);
2017-10-02 20:08:00 -07:00
expect(fs.statSync(path.join(gS3Folder, 'uploadtest-copy/test.txt')).size).to.be(fs.statSync(sourceFile).size);
expect(fs.statSync(path.join(gS3Folder, 'uploadtest-copy/C++.gitignore')).size).to.be(7);
2017-10-02 20:08:00 -07:00
done();
});
});
2017-10-02 20:08:00 -07:00
it('can remove file', function (done) {
s3.remove(gBackupConfig, 'uploadtest-copy/test.txt', function (error) {
expect(error).to.be(null);
2017-10-02 20:08:00 -07:00
expect(fs.existsSync(path.join(gS3Folder, 'uploadtest-copy/test.txt'))).to.be(false);
done();
});
});
2017-10-02 20:08:00 -07:00
it('can remove non-existent dir', function (done) {
noop.remove(gBackupConfig, 'blah', function (error) {
expect(error).to.be(null);
done();
});
});
});
});