2017-04-17 14:46:39 +02:00
|
|
|
/* 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,
|
2018-08-02 14:59:50 -07:00
|
|
|
execSync = require('child_process').execSync,
|
2017-09-27 10:25:36 -07:00
|
|
|
expect = require('expect.js'),
|
|
|
|
|
filesystem = require('../storage/filesystem.js'),
|
2017-04-17 14:46:39 +02:00
|
|
|
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'),
|
2017-04-17 14:46:39 +02:00
|
|
|
os = require('os'),
|
|
|
|
|
path = require('path'),
|
|
|
|
|
rimraf = require('rimraf'),
|
2017-10-29 11:10:50 +01:00
|
|
|
mkdirp = require('mkdirp'),
|
2018-12-01 00:50:22 +01:00
|
|
|
recursive_readdir = require('recursive-readdir'),
|
2017-09-17 17:51:00 +02:00
|
|
|
s3 = require('../storage/s3.js'),
|
2017-10-29 11:10:50 +01:00
|
|
|
gcs = require('../storage/gcs.js'),
|
|
|
|
|
chunk = require('lodash.chunk');
|
2017-04-17 14:46:39 +02:00
|
|
|
|
|
|
|
|
describe('Storage', function () {
|
|
|
|
|
describe('filesystem', function () {
|
2017-10-02 20:08:00 -07:00
|
|
|
|
2017-04-17 14:46:39 +02:00
|
|
|
var gTmpFolder;
|
2017-10-02 20:08:00 -07:00
|
|
|
|
2017-04-17 14:46:39 +02:00
|
|
|
var gBackupConfig = {
|
|
|
|
|
provider: 'filesystem',
|
|
|
|
|
key: 'key',
|
2017-09-23 14:27:35 -07:00
|
|
|
backupFolder: null,
|
|
|
|
|
format: 'tgz'
|
2017-04-17 14:46:39 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
before(function (done) {
|
2017-10-02 20:08:00 -07:00
|
|
|
gTmpFolder = fs.mkdtempSync(path.join(os.tmpdir(), 'filesystem-storage-test_'));
|
2017-04-17 14:46:39 +02:00
|
|
|
|
2017-10-02 20:08:00 -07:00
|
|
|
gBackupConfig.backupFolder = path.join(gTmpFolder, 'backups/');
|
2017-04-17 14:46:39 +02:00
|
|
|
|
2017-10-02 20:08:00 -07:00
|
|
|
done();
|
|
|
|
|
});
|
2017-04-17 14:46:39 +02:00
|
|
|
|
2017-10-02 20:08:00 -07:00
|
|
|
after(function (done) {
|
|
|
|
|
rimraf.sync(gTmpFolder);
|
|
|
|
|
done();
|
|
|
|
|
});
|
2017-09-20 09:57:16 -07: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 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);
|
2017-04-21 17:21:10 +02:00
|
|
|
done();
|
2017-04-17 14:46:39 +02:00
|
|
|
});
|
|
|
|
|
});
|
2017-04-18 17:34:42 +02:00
|
|
|
|
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) {
|
2017-04-17 14:46:39 +02:00
|
|
|
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-04-21 17:21:10 +02:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
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);
|
2017-04-21 17:21:10 +02:00
|
|
|
done();
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2017-10-02 20:08:00 -07:00
|
|
|
it('can download file', function (done) {
|
|
|
|
|
var sourceFile = gTmpFolder + '/uploadtest/test.txt';
|
2017-04-21 17:21:10 +02:00
|
|
|
|
2017-10-02 20:08:00 -07:00
|
|
|
filesystem.download(gBackupConfig, sourceFile, function (error, stream) {
|
2017-04-21 17:21:10 +02:00
|
|
|
expect(error).to.be(null);
|
2017-10-02 20:08:00 -07:00
|
|
|
expect(stream).to.be.an('object');
|
2017-04-21 17:21:10 +02:00
|
|
|
done();
|
2017-04-17 14:46:39 +02:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2017-10-02 20:08:00 -07:00
|
|
|
it('download errors for missing file', function (done) {
|
|
|
|
|
var sourceFile = gTmpFolder + '/uploadtest/missing';
|
2017-04-17 14:46:39 +02:00
|
|
|
|
2017-10-02 20:08:00 -07:00
|
|
|
filesystem.download(gBackupConfig, sourceFile, function (error) {
|
|
|
|
|
expect(error.reason).to.be(BackupsError.NOT_FOUND);
|
2017-04-17 14:46:39 +02:00
|
|
|
done();
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2018-08-02 14:59:50 -07:00
|
|
|
it('list dir lists the source dir', function (done) {
|
2017-10-02 20:08:00 -07:00
|
|
|
var sourceDir = path.join(__dirname, 'storage');
|
2017-04-17 14:46:39 +02:00
|
|
|
|
2018-08-02 14:59:50 -07:00
|
|
|
var allFiles = [ ];
|
|
|
|
|
filesystem.listDir(gBackupConfig, sourceDir, 1, function (files, iteratorCallback) {
|
|
|
|
|
allFiles = allFiles.concat(files);
|
|
|
|
|
iteratorCallback();
|
|
|
|
|
}, function () {
|
|
|
|
|
var expectedFiles = execSync(`find ${sourceDir} -type f`, { encoding: 'utf8' }).trim().split('\n');
|
|
|
|
|
expect(allFiles.map(function (f) { return f.fullPath; }).sort()).to.eql(expectedFiles.sort());
|
|
|
|
|
|
2017-10-02 20:08:00 -07:00
|
|
|
done();
|
|
|
|
|
});
|
|
|
|
|
});
|
2017-04-21 17:21:10 +02:00
|
|
|
|
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';
|
2017-09-20 09:57:16 -07:00
|
|
|
|
2017-10-04 11:00:30 -07:00
|
|
|
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-04-17 14:46:39 +02:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2017-10-02 20:08:00 -07:00
|
|
|
it('can remove file', function (done) {
|
|
|
|
|
var sourceFile = gTmpFolder + '/uploadtest/test-hardlink.txt';
|
2017-04-17 14:46:39 +02:00
|
|
|
|
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-04-17 14:46:39 +02:00
|
|
|
});
|
|
|
|
|
|
2017-10-02 20:08:00 -07:00
|
|
|
it('can remove empty dir', function (done) {
|
|
|
|
|
var sourceDir = gTmpFolder + '/emptydir';
|
|
|
|
|
fs.mkdirSync(sourceDir);
|
2017-09-20 09:57:16 -07:00
|
|
|
|
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-04-17 14:46:39 +02:00
|
|
|
});
|
|
|
|
|
});
|
2017-10-02 20:08:00 -07:00
|
|
|
});
|
2017-04-17 14:46:39 +02: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) {
|
2017-04-17 14:46:39 +02:00
|
|
|
expect(error).to.be(null);
|
2017-10-02 20:08:00 -07:00
|
|
|
done();
|
|
|
|
|
});
|
|
|
|
|
});
|
2017-04-17 14:46:39 +02:00
|
|
|
|
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-04-21 17:21:10 +02:00
|
|
|
|
2018-08-02 14:59:50 -07:00
|
|
|
it('list dir contents of source dir', function (done) {
|
|
|
|
|
noop.listDir(gBackupConfig, 'sourceDir', 1000, function (files, iteratorDone) {
|
|
|
|
|
iteratorDone();
|
|
|
|
|
}, done);
|
2017-10-02 20:08:00 -07:00
|
|
|
});
|
2017-04-21 17:21:10 +02:00
|
|
|
|
2017-10-02 20:08:00 -07:00
|
|
|
it('can copy', function (done) {
|
2017-10-04 11:00:30 -07:00
|
|
|
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-09-20 09:57:16 -07:00
|
|
|
|
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-04-17 14:46:39 +02:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
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();
|
|
|
|
|
});
|
2017-04-17 14:46:39 +02:00
|
|
|
});
|
|
|
|
|
});
|
2017-04-18 17:34:42 +02:00
|
|
|
|
|
|
|
|
describe('s3', function () {
|
2017-10-02 20:08:00 -07:00
|
|
|
var gS3Folder;
|
2017-04-18 17:34:42 +02:00
|
|
|
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',
|
2017-09-23 14:27:35 -07:00
|
|
|
region: 'eu-central-1',
|
|
|
|
|
format: 'tgz'
|
2017-04-18 17:34:42 +02:00
|
|
|
};
|
|
|
|
|
|
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-04-18 17:34:42 +02:00
|
|
|
});
|
|
|
|
|
|
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) {
|
2017-04-18 17:34:42 +02:00
|
|
|
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);
|
2017-09-23 14:27:35 -07:00
|
|
|
done();
|
2017-04-18 17:34:42 +02:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
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) {
|
2017-04-18 17:34:42 +02:00
|
|
|
expect(error).to.be(null);
|
2017-10-02 20:08:00 -07:00
|
|
|
expect(stream).to.be.an('object');
|
2017-04-18 17:34:42 +02:00
|
|
|
done();
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2018-08-02 14:59:50 -07:00
|
|
|
it('list dir lists contents of source dir', function (done) {
|
|
|
|
|
var allFiles = [ ];
|
|
|
|
|
s3.listDir(gBackupConfig, '', 1, function (files, iteratorCallback) {
|
|
|
|
|
allFiles = allFiles.concat(files);
|
|
|
|
|
iteratorCallback();
|
|
|
|
|
}, function () {
|
|
|
|
|
expect(allFiles.map(function (f) { return f.fullPath; }).sort()).to.eql([ 'uploadtest/test.txt' ]);
|
2017-04-21 17:21:10 +02:00
|
|
|
|
2017-10-02 20:08:00 -07:00
|
|
|
done();
|
2017-04-18 17:34:42 +02:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2017-10-02 20:08:00 -07:00
|
|
|
it('can copy', function (done) {
|
2017-10-03 15:40:01 -07:00
|
|
|
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
|
|
|
|
2017-10-04 11:00:30 -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');
|
2017-09-20 09:57:16 -07:00
|
|
|
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);
|
2017-10-03 15:40:01 -07:00
|
|
|
|
|
|
|
|
expect(fs.statSync(path.join(gS3Folder, 'uploadtest-copy/C++.gitignore')).size).to.be(7);
|
|
|
|
|
|
2017-10-02 20:08:00 -07:00
|
|
|
done();
|
2017-04-18 17:34:42 +02:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2017-10-02 20:08:00 -07:00
|
|
|
it('can remove file', function (done) {
|
|
|
|
|
s3.remove(gBackupConfig, 'uploadtest-copy/test.txt', function (error) {
|
2017-04-18 17:34:42 +02:00
|
|
|
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-04-18 17:34:42 +02:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
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();
|
|
|
|
|
});
|
2017-04-18 17:34:42 +02:00
|
|
|
});
|
|
|
|
|
});
|
2017-09-17 17:51:00 +02:00
|
|
|
|
|
|
|
|
describe('gcs', function () {
|
|
|
|
|
var gBackupConfig = {
|
|
|
|
|
provider: 'gcs',
|
|
|
|
|
key: '',
|
|
|
|
|
prefix: 'unit.test',
|
|
|
|
|
bucket: 'cloudron-storage-test',
|
|
|
|
|
projectId: '',
|
|
|
|
|
credentials: {
|
|
|
|
|
client_email: '',
|
|
|
|
|
private_key: ''
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
var GCSMockBasePath = path.join(os.tmpdir(), 'gcs-backup-test-buckets/');
|
|
|
|
|
|
2017-10-29 11:10:50 +01:00
|
|
|
before(function () {
|
2017-09-17 17:51:00 +02:00
|
|
|
var mockGCS = function(cfg){
|
|
|
|
|
return {bucket: function(b){
|
2017-10-29 11:10:50 +01:00
|
|
|
var file = function(filename){
|
|
|
|
|
|
2017-09-17 17:51:00 +02:00
|
|
|
var ensurePathWritable = function (filename) {
|
|
|
|
|
filename = GCSMockBasePath + filename;
|
|
|
|
|
mkdirp.sync(path.dirname(filename));
|
|
|
|
|
return filename;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return {
|
2017-10-29 11:10:50 +01:00
|
|
|
name: filename,
|
2017-09-17 17:51:00 +02:00
|
|
|
createReadStream: function(cfg){
|
|
|
|
|
return fs.createReadStream(ensurePathWritable(filename))
|
|
|
|
|
.on('error', function(e){
|
2017-10-29 11:10:50 +01:00
|
|
|
console.log('error createReadStream: '+filename);
|
2017-10-31 11:40:00 +01:00
|
|
|
if (e.code == 'ENOENT') { e.code = 404; }
|
|
|
|
|
this.emit('error', e);
|
2017-09-17 17:51:00 +02:00
|
|
|
})
|
2017-10-31 11:40:00 +01:00
|
|
|
;
|
2017-09-17 17:51:00 +02:00
|
|
|
},
|
|
|
|
|
createWriteStream: function(cfg){
|
|
|
|
|
return fs.createWriteStream(ensurePathWritable(filename));
|
|
|
|
|
},
|
|
|
|
|
delete: function(cb){
|
|
|
|
|
fs.unlink(ensurePathWritable(filename), cb);
|
|
|
|
|
},
|
|
|
|
|
copy: function(dst, cb){
|
|
|
|
|
var notFoundHandler = function(e){
|
|
|
|
|
if (e && e.code == 'ENOENT') { e.code = 404; return cb(e);}
|
|
|
|
|
cb();
|
|
|
|
|
};
|
|
|
|
|
return fs.createReadStream(ensurePathWritable(filename))
|
|
|
|
|
.on('end', cb)
|
|
|
|
|
.on('error', notFoundHandler)
|
|
|
|
|
.pipe(fs.createWriteStream(ensurePathWritable(dst)))
|
|
|
|
|
.on('end', cb)
|
|
|
|
|
.on('error', notFoundHandler)
|
2018-12-01 00:50:22 +01:00
|
|
|
;
|
2017-09-17 17:51:00 +02:00
|
|
|
}
|
|
|
|
|
};
|
2017-10-29 11:10:50 +01:00
|
|
|
};
|
2017-09-17 17:51:00 +02:00
|
|
|
|
2017-10-29 11:10:50 +01:00
|
|
|
return {
|
|
|
|
|
file: file,
|
|
|
|
|
getFiles: function(q, cb){
|
|
|
|
|
var target = GCSMockBasePath + q.prefix;
|
|
|
|
|
recursive_readdir(target, function(e, files){
|
2017-09-17 17:51:00 +02:00
|
|
|
|
2017-10-29 11:10:50 +01:00
|
|
|
var pageToken = q.pageToken || 0;
|
2017-09-17 17:51:00 +02:00
|
|
|
|
2017-10-29 11:10:50 +01:00
|
|
|
var chunkedFiles = chunk(files, q.maxResults);
|
|
|
|
|
if (q.pageToken >= chunkedFiles.length) return cb(null, []);
|
2017-09-17 17:51:00 +02:00
|
|
|
|
2017-10-29 11:10:50 +01:00
|
|
|
var gFiles = chunkedFiles[pageToken].map(function(f){
|
|
|
|
|
return file(path.relative(GCSMockBasePath, f)); //convert to google
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
q.pageToken = pageToken + 1;
|
2017-10-31 11:40:00 +01:00
|
|
|
cb(null, gFiles, q.pageToken < chunkedFiles.length ? q : null);
|
2017-10-29 11:10:50 +01:00
|
|
|
});
|
|
|
|
|
}
|
2018-12-01 00:50:22 +01:00
|
|
|
};
|
2017-10-29 11:10:50 +01:00
|
|
|
}};
|
|
|
|
|
};
|
|
|
|
|
gcs._mockInject(mockGCS);
|
2017-09-17 17:51:00 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
after(function (done) {
|
|
|
|
|
gcs._mockRestore();
|
|
|
|
|
rimraf.sync(GCSMockBasePath);
|
2017-10-29 11:10:50 +01:00
|
|
|
done();
|
2017-09-17 17:51:00 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('can backup', function (done) {
|
2017-10-29 11:10:50 +01:00
|
|
|
var sourceFile = path.join(__dirname, 'storage/data/test.txt');
|
|
|
|
|
var sourceStream = fs.createReadStream(sourceFile);
|
|
|
|
|
var destKey = 'uploadtest/test.txt';
|
|
|
|
|
gcs.upload(gBackupConfig, destKey, sourceStream, function (error) {
|
2017-09-17 17:51:00 +02:00
|
|
|
expect(error).to.be(null);
|
|
|
|
|
|
|
|
|
|
done();
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2017-10-29 11:10:50 +01:00
|
|
|
it('can download file', function (done) {
|
|
|
|
|
var sourceKey = 'uploadtest/test.txt';
|
|
|
|
|
gcs.download(gBackupConfig, sourceKey, function (error, stream) {
|
2017-09-17 17:51:00 +02:00
|
|
|
expect(error).to.be(null);
|
2017-10-29 11:10:50 +01:00
|
|
|
expect(stream).to.be.an('object');
|
|
|
|
|
done();
|
|
|
|
|
});
|
|
|
|
|
});
|
2017-09-17 17:51:00 +02:00
|
|
|
|
2018-08-02 14:59:50 -07:00
|
|
|
it('list dir lists contents of source dir', function (done) {
|
|
|
|
|
var allFiles = [ ];
|
|
|
|
|
gcs.listDir(gBackupConfig, '', 1, function (files, iteratorCallback) {
|
|
|
|
|
allFiles = allFiles.concat(files);
|
|
|
|
|
iteratorCallback();
|
|
|
|
|
}, function () {
|
|
|
|
|
expect(allFiles.map(function (f) { return f.fullPath; }).sort()).to.eql([ 'uploadtest/test.txt' ]);
|
2017-09-17 17:51:00 +02:00
|
|
|
|
2017-10-29 11:10:50 +01:00
|
|
|
done();
|
2017-09-17 17:51:00 +02:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2017-10-29 11:10:50 +01:00
|
|
|
it('can copy', function (done) {
|
|
|
|
|
fs.writeFileSync(path.join(GCSMockBasePath, 'uploadtest/C++.gitignore'), 'special', 'utf8');
|
2017-09-17 17:51:00 +02:00
|
|
|
|
2017-10-29 11:10:50 +01:00
|
|
|
var sourceKey = 'uploadtest';
|
2017-09-17 17:51:00 +02:00
|
|
|
|
2017-10-29 11:10:50 +01:00
|
|
|
var events = gcs.copy(gBackupConfig, sourceKey, 'uploadtest-copy');
|
|
|
|
|
events.on('done', function (error) {
|
|
|
|
|
var sourceFile = path.join(__dirname, 'storage/data/test.txt');
|
|
|
|
|
expect(error).to.be(null);
|
|
|
|
|
expect(fs.statSync(path.join(GCSMockBasePath, 'uploadtest-copy/test.txt')).size).to.be(fs.statSync(sourceFile).size);
|
|
|
|
|
|
|
|
|
|
expect(fs.statSync(path.join(GCSMockBasePath, 'uploadtest-copy/C++.gitignore')).size).to.be(7);
|
2017-09-17 17:51:00 +02:00
|
|
|
|
|
|
|
|
done();
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2017-10-29 11:10:50 +01:00
|
|
|
it('can remove file', function (done) {
|
|
|
|
|
gcs.remove(gBackupConfig, 'uploadtest-copy/test.txt', function (error) {
|
2017-09-17 17:51:00 +02:00
|
|
|
expect(error).to.be(null);
|
2017-10-29 11:10:50 +01:00
|
|
|
expect(fs.existsSync(path.join(GCSMockBasePath, 'uploadtest-copy/test.txt'))).to.be(false);
|
|
|
|
|
done();
|
2017-09-17 17:51:00 +02:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2017-10-29 11:10:50 +01:00
|
|
|
it('can remove non-existent dir', function (done) {
|
|
|
|
|
gcs.remove(gBackupConfig, 'blah', function (error) {
|
|
|
|
|
expect(error).to.be(null);
|
|
|
|
|
done();
|
|
|
|
|
});
|
2017-09-17 17:51:00 +02:00
|
|
|
});
|
2017-10-29 11:10:50 +01:00
|
|
|
|
2017-09-17 17:51:00 +02:00
|
|
|
});
|
2017-04-17 14:46:39 +02:00
|
|
|
});
|