node-smb-server
Version:
A Pure JavaScript SMB Server Implementation
1,367 lines (1,264 loc) • 61.3 kB
JavaScript
/*
* Copyright 2016 Adobe Systems Incorporated. All rights reserved.
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. You may obtain a copy
* of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
* OF ANY KIND, either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
var RQCommon = require('./rq-common');
var RQTree = RQCommon.require(__dirname, '../../../../lib/backends/rq/tree');
var utils = RQCommon.require(__dirname, '../../../../lib/utils');
describe('RQTree', function () {
var c;
beforeEach(function () {
c = new RQCommon();
spyOn(c.remoteTree, 'list').andCallThrough();
});
describe('Exists', function () {
it('testExistsFalse', function (done) {
c.testTree.exists('/testfile', function (err, exists) {
expect(err).toBeFalsy();
expect(exists).toBeFalsy();
done();
});
});
it('testExistsRemoteOnly', function (done) {
c.addFile(c.remoteTree, '/testfile', function () {
c.testTree.exists('/testfile', function (err, exists) {
expect(err).toBeFalsy();
expect(exists).toBeTruthy();
done();
});
});
});
it('testExistsLocalOnly', function (done) {
c.addFile(c.localTree, '/testfile', function () {
c.testTree.exists('/testfile', function (err, exists) {
expect(err).toBeFalsy();
expect(exists).toBeTruthy();
done();
});
});
});
it('testExistsLocalAndRemote', function (done) {
c.addFile(c.localTree, '/testFile', function () {
c.addFile(c.remoteTree, '/testFile', function () {
c.testTree.exists('/testFile', function (err, exists) {
expect(err).toBeFalsy();
expect(exists).toBeTruthy();
done();
});
});
});
});
it('testExistsDeleted', function (done) {
c.addFile(c.remoteTree, '/testfile', function () {
c.testTree.open('/testfile', function (err, rqfile) {
expect(err).toBeFalsy();
rqfile.cacheFile(function (err) {
expect(err).toBeFalsy();
rqfile.delete(function (err) {
expect(err).toBeFalsy();
c.expectQueuedMethod('/', 'testfile', 'DELETE', function () {
c.testTree.exists('/testfile', function (err, exists) {
expect(err).toBeFalsy();
expect(exists).toBeFalsy();
done();
});
});
});
});
});
});
});
});
describe('RefreshWorkFiles', function () {
it('testRefreshWorkFiles', function (done) {
c.addFile(c.remoteTree, '/testfile', function (remoteFile) {
setTimeout(function () {
c.testTree.open('/testfile', function (err, rqFile) {
rqFile.cacheFile(function (err, cached) {
c.expectLocalFileExist('/testfile', true, false, function () {
c.localRawTree.open('/testfile', function (err, localFile) {
c.localTree.open('/testfile', function (err, file) {
expect(err).toBeFalsy();
expect(file.getLastSyncDate()).toBeTruthy();
var lastSynced = file.getLastSyncDate();
var lastModified = file.lastModified();
expect(file.lastModified()).toEqual(remoteFile.lastModified());
setTimeout(function () {
// pause ever so slightly to allow time to change
c.testTree.refreshWorkFiles('/testfile', function (err) {
expect(err).toBeFalsy();
c.localTree.open('/testfile', function (err, file) {
expect(err).toBeFalsy();
expect(file.getLastSyncDate()).toBeGreaterThan(lastSynced);
expect(file.lastModified()).toEqual(localFile.lastModified());
done();
});
});
}, 10);
});
});
});
});
});
}, 10);
});
});
it('testRefreshWorkFilesMissing', function (done) {
c.addFile(c.remoteTree, '/testfile', function () {
c.addFile(c.localTree, '/testfile', function () {
c.testTree.refreshWorkFiles('/testfile', function (err) {
expect(err).toBeFalsy();
done();
});
});
});
});
});
describe('CanDelete', function () {
it('testCanDeleteRemoteOnlyPath', function (done) {
c.addFile(c.remoteTree, '/testfile', function (remoteFile) {
c.testTree.canDelete('/testfile', function (err, canDelete) {
expect(err).toBeFalsy();
expect(canDelete).toBeTruthy();
done();
});
});
});
it('testCanDeleteRemoteOnlyFile', function (done) {
c.addFile(c.remoteTree, '/testfile', function (remoteFile) {
c.testTree.canDelete('/testfile', function (err, canDelete) {
expect(err).toBeFalsy();
expect(canDelete).toBeTruthy();
done();
});
});
});
it('testCanDeleteDirectory', function (done) {
c.addDirectory(c.localTree, '/test', function (dir) {
c.testTree.canDelete('/test', function (err, canDelete) {
expect(err).toBeFalsy();
expect(canDelete).toBeTruthy();
c.testTree.canDelete('/test', function (err, canDelete) {
expect(err).toBeFalsy();
expect(canDelete).toBeTruthy();
done();
});
});
});
});
it('testCanDeleteFile', function (done) {
c.addFile(c.remoteTree, '/testfile', function (remoteFile) {
c.testTree.open('/testfile', function (err, rqFile) {
rqFile.cacheFile(function (err, localFile) {
expect(err).toBeFalsy();
c.testTree.canDelete('/testfile', function (err, canDelete) {
expect(err).toBeFalsy();
expect(canDelete).toBeTruthy();
c.testTree.canDelete('/testfile', function (err, canDelete) {
expect(canDelete).toBeTruthy();
c.expectLocalFileExist('/testfile', true, false, done);
});
});
});
});
});
});
it('testCanDeleteFileModified', function (done) {
c.addFile(c.remoteTree, '/testfile', function (remoteFile) {
c.testTree.open('/testfile', function (err, rqFile) {
expect(err).toBeFalsy();
rqFile.cacheFile(function (err, localFile) {
expect(err).toBeFalsy();
localFile.setLastModified(localFile.lastModified() + 10000);
localFile.close(function (err) {
expect(err).toBeFalsy();
c.testTree.open('/testfile', function (err, rqFile) {
expect(err).toBeFalsy();
c.testTree.canDelete('/testfile', function (err, canDelete) {
expect(err).toBeFalsy();
expect(canDelete).toBeFalsy();
c.testTree.canDelete('/testfile', function (err, canDelete) {
expect(err).toBeFalsy();
expect(canDelete).toBeFalsy();
done();
});
});
});
});
});
});
});
});
it('testCanDeleteFileLocallyCreated', function (done) {
c.addQueuedFile('/testfile', function (file) {
c.testTree.canDelete('/testfile', function (err, canDelete) {
expect(err).toBeFalsy();
expect(canDelete).toBeFalsy();
c.expectLocalFileExist('/testfile', true, true, done);
});
});
});
it('testCanDeleteMissingWorkFile', function (done) {
c.addFile(c.localTree, '/testfile', function () {
c.testTree.canDelete('/testfile', function (err, canDelete) {
expect(err).toBeFalsy();
expect(canDelete).toBeFalsy();
done();
});
});
});
});
describe('Open', function () {
it('testOpenRemoteOnly', function (done) {
c.addFile(c.remoteTree, '/testfile', function () {
c.testTree.open('/testfile', function (err, file) {
expect(err).toBeFalsy();
expect(file).toBeDefined();
done();
});
});
});
it('testOpenLocalOnly', function (done) {
c.addQueuedFile('/testfile', function (file) {
c.testTree.open('/testfile', function (err, file) {
expect(err).toBeFalsy();
expect(file).toBeDefined();
done();
});
});
});
it('testOpenLocalAndRemote', function (done) {
c.addFile(c.localTree, '/testfile', function () {
c.addFile(c.remoteTree, '/testfile', function () {
c.testTree.open('/testfile', function (err, file) {
expect(err).toBeFalsy();
expect(file).toBeDefined();
done();
});
});
});
});
});
describe('List', function () {
var expectHasFile = function (files, path) {
var hasFile = false;
if (files) {
for (var i = 0; i < files.length; i++) {
if (files[i].getPath() == path) {
hasFile = true;
break;
}
}
}
expect(hasFile).toBeTruthy();
};
it('testListRemoteOnly', function (done) {
c.addFiles(c.remoteTree, 3, function () {
c.testTree.list('/*', function (err, files) {
expect(err).toBeFalsy();
expectHasFile(files, '/testfile1');
expectHasFile(files, '/testfile2');
expectHasFile(files, '/testfile3');
done();
});
});
});
it('testListLocalCreated', function (done) {
c.addFile(c.remoteTree, '/testremote', function () {
c.testTree.createFile('/testfile1', function (err, file) {
expect(err).toBeFalsy();
c.testTree.list('/*', function (err, files) {
expect(err).toBeFalsy();
expectHasFile(files, '/testremote');
expectHasFile(files, '/testfile1');
done();
});
});
});
});
it('testListLocalNoCreatedUnsafeDelete', function (done) {
var currTime = new Date().getTime();
c.addLocalFileWithDates('/testlocal', false, 'content', currTime, currTime + 20000, function (file) {
c.testTree.list('/*', function (err, files) {
expect(err).toBeFalsy();
expect(files.length).toEqual(1);
expect(c.testShare.emit.mostRecentCall.args[0]).toEqual('syncconflict');
c.expectLocalFileExist('/testlocal', true, false, done);
});
});
});
it('testListLocalTempFile', function (done) {
c.addFiles(c.remoteTree, 3, function () {
c.addFile(c.localTree, '/.tempfile', function () {
c.testTree.list('/*', function (err, files) {
expect(err).toBeFalsy();
expect(files.length).toEqual(4);
expectHasFile(files, '/.tempfile');
c.expectLocalFileExistExt('/.tempfile', true, false, false, done);
});
});
});
});
it('testListRemoteDeletedLocally', function (done) {
c.addFiles(c.remoteTree, 3, function () {
c.testTree.delete('/testfile1', function (err) {
expect(err).toBeFalsy();
c.testTree.list('/*', function (err, files) {
expect(err).toBeFalsy();
expect(files.length).toEqual(2);
expectHasFile(files, '/testfile2');
expectHasFile(files, '/testfile3');
done();
});
});
});
});
it('testListRemoteDeleted', function (done) {
c.addFiles(c.remoteTree, 3, function () {
c.addLocalFiles(3, function () {
c.remoteTree.delete('/testfile1', function (err) {
expect(err).toBeFalsy();
c.testTree.list('/*', function (err, files) {
expect(err).toBeFalsy();
expect(files.length).toEqual(2);
expectHasFile(files, '/testfile2');
expectHasFile(files, '/testfile3');
c.expectQueuedMethod('/', 'testfile1', false, function () {
c.expectLocalFileExist('/testfile1', false, false, done);
});
});
});
});
});
});
it('testListRemoteDeletedCantDelete', function (done) {
var currTime = new Date().getTime();
c.addFiles(c.remoteTree, 3, function () {
c.addLocalFiles(2, function () {
c.addLocalFileWithDates('/testfile3', false, 'content', currTime, currTime + 20000, function (file) {
c.remoteTree.delete('/testfile3', function (err) {
expect(err).toBeFalsy();
c.testTree.list('/*', function (err, files) {
expect(err).toBeFalsy();
expect(files.length).toEqual(3);
expectHasFile(files, '/testfile1');
expectHasFile(files, '/testfile2');
expectHasFile(files, '/testfile3');
c.expectQueuedMethod('/', 'testfile3', false, function () {
expect(c.testShare.emit.mostRecentCall.args[0]).toEqual('syncconflict');
c.expectLocalFileExist('/testfile3', true, false, done);
});
});
});
});
});
});
});
it('testListRemoteDirectoryDeleted', function (done) {
c.addFiles(c.remoteTree, 3, function () {
c.addDirectory(c.remoteTree, '/test', function () {
c.addDirectory(c.localTree, '/test', function () {
c.remoteTree.deleteDirectory('/test', function (err) {
expect(err).toBeFalsy();
c.testTree.list('/*', function (err, items) {
expect(err).toBeFalsy();
expect(items.length).toEqual(3);
expectHasFile(items, '/testfile1');
expectHasFile(items, '/testfile2');
expectHasFile(items, '/testfile3');
c.expectPathExist(c.localTree, '/test', false, done);
});
});
});
});
});
});
it('testListEncoding', function (done) {
// 이두吏讀
var remoteFileName = decodeURI('/%EC%9D%B4%EB%91%90%E5%90%8F%E8%AE%80.jpg');
var localFileName = decodeURI('/%E1%84%8B%E1%85%B5%E1%84%83%E1%85%AE%E5%90%8F%E8%AE%80.jpg');
c.addFile(c.remoteTree, remoteFileName, function () {
c.addFile(c.localTree, localFileName, function () {
c.localTree.open(localFileName, function (err) {
expect(err).toBeFalsy();
c.expectLocalFileExist(localFileName, true, false, function () {
c.testTree.list('/*', function (err, files) {
expect(err).toBeFalsy();
expect(files.length).toEqual(1);
c.expectLocalFileExist(localFileName, true, false, done);
});
});
});
});
});
});
it('testListEncodingDeleted', function (done) {
var remoteFileName = decodeURI('/%EC%9D%B4%EB%91%90%E5%90%8F%E8%AE%80.jpg');
var localFileName = decodeURI('/%E1%84%8B%E1%85%B5%E1%84%83%E1%85%AE%E5%90%8F%E8%AE%80.jpg');
c.addFile(c.remoteTree, remoteFileName, function () {
c.addFile(c.localTree, localFileName, function () {
c.localTree.open(localFileName, function (err) {
expect(err).toBeFalsy();
c.expectLocalFileExist(localFileName, true, false, function () {
c.testTree.delete(localFileName, function (err) {
c.testTree.list('/*', function (err, files) {
expect(err).toBeFalsy();
expect(files.length).toEqual(0);
c.expectLocalFileExist(localFileName, false, false, done);
});
});
});
});
});
});
});
it('testListCaching', function (done) {
c.addFile(c.remoteTree, '/testfile', function () {
c.testTree.list('/*', function (err, files) {
expect(err).toBeFalsy();
expect(files.length).toEqual(1);
expect(c.remoteTree.list.calls.length).toEqual(1);
c.testTree.list('/*', function (err, files) {
// should be cached now
expect(err).toBeFalsy();
expect(files.length).toEqual(1);
expect(c.remoteTree.list.calls.length).toEqual(1);
done();
});
});
});
});
it('testListCachingExpired', function (done) {
c.addFile(c.remoteTree, '/testfile', function () {
c.testTree.list('/*', function (err, files) {
expect(err).toBeFalsy();
expect(files.length).toEqual(1);
expect(c.remoteTree.list.calls.length).toEqual(1);
setTimeout(function () {
c.testTree.list('/*', function (err, files) {
expect(err).toBeFalsy();
expect(files.length).toEqual(1);
expect(c.remoteTree.list.calls.length).toEqual(2);
done();
});
}, 500);
});
});
});
it('testListFileRemote', function (done) {
c.addFile(c.remoteTree, '/testfile', function () {
c.testTree.list('/testfile', function (err, files) {
expect(err).toBeFalsy();
expect(files.length).toEqual(1);
done();
});
});
});
it('testListFileLocal', function (done) {
c.addFile(c.localTree, '/testfile', function () {
c.testTree.list('/testfile', function (err, files) {
expect(err).toBeFalsy();
expect(files.length).toEqual(1);
done();
});
});
});
it('testListFileTempNoExist', function (done) {
c.testTree.list('/.tempfile', function (err, files) {
expect(err).toBeFalsy();
expect(files.length).toEqual(0);
expect(c.remoteTree.list).not.toHaveBeenCalled();
done();
});
});
it('testListDeletedFile', function (done) {
c.addFile(c.remoteTree, '/testfile', function () {
c.testTree.open('/testfile', function (err, rqfile) {
expect(err).toBeFalsy();
rqfile.cacheFile(function (err) {
expect(err).toBeFalsy();
rqfile.delete(function (err) {
expect(err).toBeFalsy();
c.expectQueuedMethod('/', 'testfile', 'DELETE', function () {
c.testTree.list('/testfile', function (err, files) {
expect(err).toBeFalsy();
expect(files.length).toEqual(0);
done();
});
});
});
});
});
});
});
it('testListMissingWork', function (done) {
c.addFile(c.remoteTree, '/testfile', function () {
c.addFile(c.localTree, '/testfile', function () {
c.testTree.list('/*', function (err, files) {
expect(err).toBeFalsy();
expect(files.length).toEqual(1);
done();
});
});
});
});
});
describe('DeleteLocalDirectoryRecursive', function () {
it('testDeleteLocalDirectoryRecursive', function (done) {
c.addDirectory(c.localTree, '/removeme', function () {
c.addLocalFile('/removeme/file1', function () {
c.addDirectory(c.localTree, '/removeme/subfolder', function () {
c.addLocalFile('/removeme/subfolder/file2', function () {
c.testTree.deleteLocalDirectoryRecursive('/', function (err) {
expect(err).toBeFalsy();
c.expectPathExist(c.localTree, '/removeme', false, function () {
c.expectPathExist(c.localTree, '/removeme/subfolder', false, function () {
c.expectLocalFileExist('/removeme/file1', false, false, function () {
c.expectLocalFileExist('/removeme/subfolder/file2', false, false, function () {
c.expectPathExist(c.localTree, '/', true, done);
});
});
});
});
});
});
});
});
});
});
it('testDeleteLocalDirectoryRecursiveCantDelete', function (done) {
c.addDirectory(c.localTree, '/removeme', function () {
c.addDirectory(c.localTree, '/removeme/sub', function () {
c.addLocalFile('/removeme/sub/file1', function () {
c.addLocalFile('/removeme/sub/file2', function () {
c.localTree.open('/removeme/sub/file1', function (err, file) {
expect(err).toBeFalsy();
file.setLastModified(file.lastModified() + 100000);
file.close(function (err) {
expect(err).toBeFalsy();
c.testTree.deleteLocalDirectoryRecursive('/removeme', function (err) {
expect(err).toBeFalsy();
c.expectPathExist(c.localTree, '/removeme', true, function () {
c.expectPathExist(c.localTree, '/removeme/sub', true, function () {
c.expectLocalFileExist('/removeme/sub/file1', true, false, function () {
c.expectLocalFileExist('/removeme/sub/file2', false, false, function () {
expect(c.testShare.emit.mostRecentCall.args[0]).toEqual('syncconflict');
done();
});
});
});
});
});
});
});
});
});
});
});
});
it('testDeleteLocalDirectoryRecursiveWork', function (done) {
c.addDirectory(c.remoteTree, '/removeme', function () {
c.addDirectory(c.remoteTree, '/removeme/sub', function () {
c.addFile(c.remoteTree, '/removeme/file1', function () {
c.addFile(c.remoteTree, '/removeme/sub/file2', function () {
c.testTree.open('/removeme/file1', function (err, file) {
expect(err).toBeFalsy();
file.cacheFile(function (err, cached) {
expect(err).toBeFalsy();
cached.setLastModified(cached.lastModified() + 100000);
cached.close(function (err) {
expect(err).toBeFalsy();
c.testTree.open('/removeme/sub/file2', function (err, file) {
expect(err).toBeFalsy();
file.cacheFile(function (err, cached) {
c.addQueuedFile('/removeme/file3', function () {
c.testTree.deleteLocalDirectoryRecursive('/removeme', function (err) {
expect(err).toBeFalsy();
c.expectLocalFileExist('/remoteme/file3', false, false, function () {
expect(c.testShare.emit).toHaveBeenCalledWith('syncconflict', {path: '/removeme/file3'});
expect(c.testShare.emit.calls.length).toEqual(2);
done();
});
});
});
});
});
});
});
});
});
});
});
});
});
});
describe('QueueData', function () {
it('testQueueData', function (done) {
c.testTree.queueData('/testfile', 'PUT', false, function (err) {
expect(err).toBeFalsy();
c.expectQueuedMethod('/', 'testfile', 'PUT', done);
});
});
it('testQueueDataNewName', function (done) {
c.testTree.queueData('/testfile', 'PUT', '/testfile2', function (err) {
expect(err).toBeFalsy();
c.expectQueuedMethod('/', 'testfile', 'PUT', done);
});
});
it('testQueueDataTempFile', function (done) {
c.testTree.queueData('/.tempfile', 'PUT', false, function (err) {
expect(err).toBeFalsy();
c.expectQueuedMethod('/', '.tempfile', false, done);
});
});
it('testQueueDataTempFileDestTempFile', function (done) {
c.testTree.queueData('/.tempfile', 'MOVE', '/.tempfile2', function (err) {
expect(err).toBeFalsy();
c.expectQueuedMethod('/', '.tempfile', false, function () {
c.expectQueuedMethod('/', '.tempfile2', false, done);
});
});
});
it('testQueueDataTempFileDestNormalFile', function (done) {
c.testTree.queueData('/.tempfile', 'MOVE', '/testfile', function (err) {
expect(err).toBeFalsy();
c.expectQueuedMethod('/', '.tempfile', false, function () {
c.expectQueuedMethod('/', 'testfile', 'PUT', done);
});
});
});
it('testQueueDataNormalFileDestTempFile', function (done) {
c.addQueuedFile('/testfile', function () {
c.testTree.queueData('/testfile', 'MOVE', '/.tempfile', function (err) {
expect(err).toBeFalsy();
c.expectQueuedMethod('/', 'testfile', false, function () {
c.expectQueuedMethod('/', '.tempfile', false, done);
});
});
});
});
it('testQueueDataNormalFileDestNormalFile', function (done) {
c.testTree.queueData('/testfile', 'MOVE', '/testfile2', function (err) {
expect(err).toBeFalsy();
c.expectQueuedMethod('/', 'testfile', 'DELETE', function () {
c.expectQueuedMethod('/', 'testfile2', 'PUT', done);
});
});
});
it('testQueueDataCopyTempFileDestTempFile', function (done) {
c.testTree.queueData('/.tempfile', 'COPY', '/.tempfile2', function (err) {
expect(err).toBeFalsy();
c.expectQueuedMethod('/', '.tempfile', false, function () {
c.expectQueuedMethod('/', '.tempfile2', false, done);
});
});
});
it('testQueueDataCopyTempFileDestNormalFile', function (done) {
c.testTree.queueData('/.tempfile', 'COPY', '/testfile', function (err) {
expect(err).toBeFalsy();
c.expectQueuedMethod('/', '.tempfile', false, function () {
c.expectQueuedMethod('/', 'testfile', 'PUT', done);
});
});
});
it('testQueueDataCopyNormalFileDestTempFile', function (done) {
c.addQueuedFile('/testfile', function () {
c.testTree.queueData('/testfile', 'COPY', '/.tempfile', function (err) {
expect(err).toBeFalsy();
c.expectQueuedMethod('/', 'testfile', 'PUT', function () {
c.expectQueuedMethod('/', '.tempfile', false, done);
});
});
});
});
it('testQueueDataCopyNormalFileDestNormalFile', function (done) {
c.testTree.queueData('/testfile', 'COPY', '/testfile2', function (err) {
expect(err).toBeFalsy();
c.expectQueuedMethod('/', 'testfile', false, function () {
c.expectQueuedMethod('/', 'testfile2', 'PUT', done);
});
});
});
});
it('testCreateFile', function (done) {
c.testTree.createFile('/testfile1', function (err, file) {
c.expectLocalFileExist('/testfile1', true, true, done);
});
});
it('testCreateFileWorkExists', function (done) {
c.addFile(c.localTree, '/.aem/testfile', function () {
c.testTree.createFile('/testfile', function (err, file) {
expect(err).toBeFalsy();
c.expectLocalFileExist('/testfile', true, true, done);
});
});
});
it('testCreateDirectory', function (done) {
c.testTree.createDirectory('/test', function (err, dir) {
expect(err).toBeFalsy();
expect(dir.isDirectory()).toBeTruthy();
c.localTree.exists('/test', function (err, exists) {
expect(err).toBeFalsy();
expect(exists).toBeTruthy();
c.remoteTree.exists('/test', function (err, exists) {
expect(err).toBeFalsy();
expect(exists).toBeTruthy();
done();
});
});
});
});
it('testCreateDirectoryTemp', function (done) {
c.testTree.createDirectory('/.test', function (err, dir) {
expect(err).toBeFalsy();
expect(dir.isDirectory()).toBeTruthy();
c.expectPathExist(c.localTree, '/.test', true, function () {
c.expectPathExist(c.remoteTree, '/.test', false, done);
});
});
});
describe('Delete', function () {
it('testDeleteLocalOnly', function (done) {
c.testTree.createFile('/testfile', function (err, file) {
expect(err).toBeFalsy();
expect(file.isFile()).toBeTruthy();
c.expectLocalFileExist('/testfile', true, true, function () {
c.testTree.delete('/testfile', function (err) {
expect(err).toBeFalsy();
c.expectLocalFileExistExt('/testfile', false, false, false, function () {
c.expectQueuedMethod('/', 'testfile', false, done);
});
});
});
});
});
it('testDeleteLocal', function (done) {
c.addFile(c.remoteTree, '/testfile', function (file) {
c.testTree.open('/testfile', function (err, rqFile) {
expect(err).toBeFalsy();
rqFile.cacheFile(function (err) {
expect(err).toBeFalsy();
c.testTree.delete('/testfile', function (err) {
expect(err).toBeFalsy();
c.expectLocalFileExistExt('/testfile', false, false, false, function () {
c.remoteTree.exists('/testfile', function (err, exists) {
expect(err).toBeFalsy();
expect(exists).toBeTruthy();
c.expectQueuedMethod('/', 'testfile', 'DELETE', done);
});
});
});
});
});
});
});
it('testDeleteRemoteOnly', function (done) {
c.addFile(c.remoteTree, '/testfile', function (file) {
c.testTree.delete('/testfile', function (err) {
expect(err).toBeFalsy();
c.remoteTree.exists('/testfile', function (err, exists) {
expect(err).toBeFalsy();
expect(exists).toBeTruthy();
c.expectQueuedMethod('/', 'testfile', 'DELETE', done);
});
});
});
});
it('testDeleteTempFile', function (done) {
c.addFile(c.localTree, '/.tempfile.ext', function (file) {
c.testTree.delete('/.tempfile.ext', function (err) {
expect(err).toBeFalsy();
c.expectQueuedMethod('/', '.tempfile.ext', false, done);
});
});
});
it('testDeleteMissingWork', function (done) {
c.addFile(c.localTree, '/testfile', function () {
c.testTree.delete('/testfile', function (err) {
expect(err).toBeFalsy();
c.expectLocalFileExist('/testfile', false, false, function () {
c.expectQueuedMethod('/', 'testfile', 'DELETE', done);
});
});
});
});
});
describe('DeleteDirectory', function () {
it('testDeleteDirectoryLocal', function (done) {
c.testTree.createDirectory('/test', function (err) {
expect(err).toBeFalsy();
c.testTree.createFile('/test/testfile', function (err) {
expect(err).toBeFalsy();
c.testTree.delete('/test/testfile', function (err) {
expect(err).toBeFalsy();
c.testTree.deleteDirectory('/test', function (err) {
expect(err).toBeFalsy();
c.expectPathExist(c.remoteTree, '/test', false, function () {
c.expectPathExist(c.localTree, '/test', false, function () {
c.expectPathExist(c.localRawTree, '/test/.aem', false, function () {
c.expectQueuedMethod('/test', 'testfile', false, done);
});
});
});
});
});
});
});
});
it('testDeleteDirectoryRemoteOnly', function (done) {
c.addDirectory(c.remoteTree, '/test', function (dir) {
c.testTree.deleteDirectory('/test', function (err) {
expect(err).toBeUndefined();
c.expectPathExist(c.remoteTree, '/test', false, done);
});
});
});
it('testDeleteDirectoryTempName', function (done) {
c.addDirectory(c.localTree, '/.test', function () {
c.testTree.deleteDirectory('/.test', function (err) {
expect(err).toBeFalsy();
c.expectPathExist(c.localTree, '/.test', false, function () {
expect(c.remoteTree.deleteDirectory).not.toHaveBeenCalled();
done();
});
});
});
});
});
describe('Rename', function () {
it('testRenameLocalFile', function (done) {
c.addQueuedFile('/testfile', function () {
c.testTree.rename('/testfile', '/testfile2', function (err) {
expect(err).toBeFalsy();
c.expectLocalFileExist('/testfile', false, false, function () {
c.expectLocalFileExist('/testfile2', true, true, function () {
c.expectQueuedMethod('/', 'testfile2', 'PUT', function () {
c.expectQueuedMethod('/', 'testfile', false, done);
});
});
});
});
});
});
it('testRenameFileRemoteOnly', function (done) {
c.addFile(c.remoteTree, '/testfile', function () {
c.testTree.rename('/testfile', '/testfile2', function (err) {
expect(err).toBeFalsy();
c.expectPathExist(c.remoteTree, '/testfile', false, function () {
c.expectPathExist(c.remoteTree, '/testfile2', true, done);
});
});
});
});
it('testRenameFolderRemoteOnly', function (done) {
c.addDirectory(c.remoteTree, '/test', function () {
c.testTree.rename('/test', '/test2', function (err) {
expect(err).toBeFalsy();
c.expectPathExist(c.remoteTree, '/test', false, function () {
c.expectPathExist(c.remoteTree, '/test2', true, done);
});
});
});
});
it('testRenameFolderLocal', function (done) {
c.addDirectory(c.remoteTree, '/test', function () {
c.addDirectory(c.localTree, '/test', function () {
c.testTree.rename('/test', '/test2', function (err) {
expect(err).toBeFalsy();
c.expectPathExist(c.remoteTree, '/test', false, function () {
c.expectPathExist(c.localTree, '/test', false, function () {
c.expectPathExist(c.remoteTree, '/test2', true, function () {
c.expectPathExist(c.localTree, '/test2', true, done);
});
});
});
});
});
});
});
it('testRenameFolderToTemp', function (done) {
c.addDirectory(c.remoteTree, '/test', function () {
c.addDirectory(c.localTree, '/test', function () {
c.testTree.rename('/test', '/.test', function (err) {
c.expectPathExist(c.remoteTree, '/test', true, function () {
c.expectPathExist(c.remoteTree, '/.test', false, function () {
c.expectPathExist(c.localTree, '/test', false, function () {
c.expectPathExist(c.localTree, '/.test', true, done);
});
});
});
});
});
});
});
it('testRenameFolderFromTemp', function (done) {
c.addDirectory(c.remoteTree, '/.test', function () {
c.addDirectory(c.localTree, '/.test', function () {
c.testTree.rename('/.test', '/test', function (err) {
c.expectPathExist(c.remoteTree, '/.test', true, function () {
c.expectPathExist(c.remoteTree, '/test', false, function () {
c.expectPathExist(c.localTree, '/.test', false, function () {
c.expectPathExist(c.localTree, '/test', true, done);
});
});
});
});
});
});
});
it('testRenameFolderMissingWork', function (done) {
c.addDirectory(c.remoteTree, '/test', function () {
c.addDirectory(c.localTree, '/test', function () {
c.testTree.rename('/test', '/test2', function (err) {
expect(err).toBeFalsy();
c.expectPathExist(c.localTree, '/test2', true, done);
});
});
});
});
it('testRenameFileMissingWork', function (done) {
c.addFile(c.localTree, '/testfile', function () {
c.testTree.rename('/testfile', '/testfile2', function (err) {
expect(err).toBeFalsy();
c.expectLocalFileExistExt('/testfile2', true, true, true, done);
});
});
});
it('testRenameOverwrite', function (done) {
c.testTree.createFile('/destfile', function (err, file) {
expect(err).toBeFalsy();
c.addFile(c.remoteTree, '/somefile', function () {
c.testTree.open('/somefile', function (err, file) {
expect(err).toBeFalsy();
file.cacheFile(function (err) {
expect(err).toBeFalsy();
c.testTree.rename('/somefile', '/destfile', function (err) {
expect(err).toBeFalsy();
c.expectLocalFileExist('/destfile', true, true, function () {
c.expectLocalFileExist('/somefile', false, false, done);
});
});
});
});
});
});
});
});
describe('TempFiles', function () {
it('testTempFileExists', function (done) {
c.addFile(c.localTree, '/.temp', function () {
c.testTree.exists('/.temp', function (err, exists) {
expect(err).toBeFalsy();
expect(exists).toBeTruthy();
expect(c.remoteTree.exists).not.toHaveBeenCalled();
done();
});
});
});
it('testTempFileNoExist', function (done) {
c.testTree.exists('/.temp', function (err, exists) {
expect(err).toBeFalsy();
expect(exists).toBeFalsy();
expect(c.remoteTree.exists).not.toHaveBeenCalled();
done();
});
});
it('testOpenTempFile', function (done) {
c.addFile(c.localTree, '/.temp', function () {
c.testTree.open('/.temp', function (err, file) {
expect(err).toBeFalsy();
expect(file).toBeDefined();
expect(c.remoteTree.open).not.toHaveBeenCalled();
done();
});
});
});
it('testOpenTempFileNoExist', function (done) {
c.testTree.open('/.temp', function (err, file) {
expect(err).toBeTruthy();
expect(c.remoteTree.open).not.toHaveBeenCalled();
done();
});
});
it('testListTempFile', function (done) {
c.addFile(c.localTree, '/.temp', function () {
c.addFile(c.remoteTree, '/file', function () {
c.testTree.list('/*', function (err, files) {
expect(err).toBeFalsy();
expect(files.length).toEqual(2);
done();
});
});
});
});
it('testListTempFileOnly', function (done) {
c.addFile(c.localTree, '/.temp', function () {
c.testTree.list('/.temp', function (err, files) {
expect(err).toBeFalsy();
expect(files.length).toEqual(1);
expect(c.remoteTree.list).not.toHaveBeenCalled();
done();
});
});
});
it('testCreateFileTempFile', function (done) {
c.testTree.createFile('/.temp', function (err, file) {
expect(err).toBeFalsy();
expect(file).toBeDefined();
c.expectLocalFileExistExt('/.temp', true, false, false, done);
});
});
it('testDeleteTempFile', function (done) {
c.addFile(c.localTree, '/.temp', function () {
c.testTree.delete('/.temp', function (err) {
expect(err).toBeFalsy();
expect(c.remoteTree.delete).not.toHaveBeenCalled();
c.expectLocalFileExist('/.temp', false, false, done);
});
});
});
it('testDeleteTempFileNoExist', function (done) {
c.testTree.delete('/.temp', function (err) {
expect(err).toBeTruthy();
expect(c.remoteTree.delete).not.toHaveBeenCalled();
done();
});
});
it('testRenameQueuedToTempFile', function (done) {
c.addQueuedFile('/file', function () {
c.testTree.rename('/file', '/.temp', function (err) {
expect(err).toBeFalsy();
c.expectQueuedMethod('/', 'file', false, function () {
c.expectLocalFileExistExt('/.temp', true, false, false, function () {
c.expectLocalFileExist('/file', false, false, done);
});
});
});
});
});
it('testRenameCachedToTempFile', function (done) {
c.addFile(c.remoteTree, '/file', function () {
c.testTree.open('/file', function (err, file) {
expect(err).toBeFalsy();
file.cacheFile(function (err) {
expect(err).toBeFalsy();
c.testTree.rename('/file', '/.temp', function (err) {
expect(err).toBeFalsy();
c.expectQueuedMethod('/', 'file', 'DELETE', function () {
c.expectLocalFileExistExt('/.temp', true, false, false, function () {
c.expectLocalFileExist('/file', false, false, done);
});
});
});
});
});
});
});
it('testRenameTempToNormal', function (done) {
c.addFile(c.localTree, '/.temp', function () {
c.testTree.rename('/.temp', '/file', function (err) {
expect(err).toBeFalsy();
c.expectQueuedMethod('/', 'file', 'PUT', function () {
c.expectLocalFileExist('/.temp', false, false, function () {
c.expectLocalFileExist('/file', true, true, done);
});
});
});
});
});
it('testListRemoteTempFile', function (done) {
c.addFile(c.remoteTree, '/.temp', function () {
c.testTree.list('/*', function (err, list) {
expect(err).toBeFalsy();
expect(list.length).toEqual(0);
c.testTree.list('/.temp', function (err, list) {
expect(err).toBeFalsy();
expect(list.length).toEqual(0);
c.testTree.exists('/.temp', function (err, exists) {
expect(exists).toBeFalsy();
done();
});
});
});
});
});
});
describe('ConcurrencyTests', function () {
it('testOpenDownloadingFile', function (done) {
// in this test we're creating a situation where a file is in the process of being downloaded, and another
// "thread" attempts to open the file. we're ensuring that if this happens then we don't end up with a file
// whose length is incorrect
c.setPipeDelay(function (delayCb) {
// a second thread attempts to open the same file before the fetch is complete
c.testTree.open('/somefile', function (err, testFile) {
expect(err).toBeFalsy();
expect(testFile.size()).toEqual('/somefile'.length);
delayCb();
});
});
c.addFileWithContent(c.remoteTree, '/somefile', '/somefile', function () {
c.testTree.open('/somefile', function (err, file) {
expect(err).toBeFalsy();
// flush the file to force a cache of the file
file.flush(function (err) {
expect(err).toBeFalsy();
c.expectLocalFileExist('/somefile', true, false, function () {
c.localRawTree.open('/somefile', function (err, fetched) {
expect(err).toBeFalsy();
// set the fetched file's length to 1 to simulate that the file isn't completely downloaded
fetched.setLength(1, function (err) {
expect(err).toBeFalsy();
fetched.close(function (err) {
expect(err).toBeFalsy();
done();
});
});
});
});
});
});
});
});
it('testMultipleDownloadFile', function (done) {
// this test verifies the case where multiple "threads" attempt to download the same file
c.setPipeDelay(function (delayCb) {
// a second thread attempts to download the same file before the first fetch is complete
c.testTree.open('/multiplefile', function (err, testFile) {
expect(err).toBeFalsy();
testFile.flush(function (err) {
expect(err).toBeFalsy();
c.testTree.open('/multiplefile', function (err, verifyFile) {
expect(err).toBeFalsy();
expect(verifyFile.size()).toEqual(100);
delayCb();
});
});
});
});
// first "thread" downloads the file
c.addFileWithContent(c.remoteTree, '/multiplefile', '/multiplefile', function () {
c.testTree.open('/multiplefile', function (err, file) {
expect(err).toBeFalsy();
file.setLength(100, function (err) {
expect(err).toBeFalsy();
expect(file.size()).toEqual(100);
file.close(function (err) {
expect(err).toBeFalsy();
c.expectLocalFileExist('/multiplefile', true, false, function () {
done();
});
});
});
});
});
});
it('testWorkConflict', function (done) {
// simulate a file that is being downloaded whose information is requested mid-download
c.addFile(c.remoteTree, '/test', function () {
c.addFile(c.localRawTree, '/test', function () {
c.localTree.setDownloading('/test', true);
c.testTree.list('/*', function (err, list) {
expect(err).toBeFalsy();
expect(list.length).toEqual(1);
c.localTree.exists('/test', function (err, exists) {
expect(err).toBeFalsy();
expect(exists).toBeFalsy();
c.localTree.open('/test', function (err, file) {
expect(err).toBeTruthy();
c.localTree.list('/test', function (err, list) {
expect(err).toBeFalsy();
expect(list.length).toEqual(0);
c.localTree.createFile('/test', function (err) {
expect(err).toBeTruthy();
c.localTree.rename('/test', '/test2', function (err) {
expect(err).toBeTruthy();
c.localTree.delete('/test', function (err) {
expect(err).toBeTruthy();
done();
});
});
});
});
});
});
});
});
});
});
});
describe('DateTests', function () {
it('testLastModifiedCachedFile', function (done) {
c.addFileWithDates(c.remoteTree, '/testfile', 'content', 123456, 123459, function () {
c.testTree.open('/testfile', function (err, file) {
expect(err).toBeFalsy();
file.cacheFile(function (err) {
expect(err).toBeFalsy();
file.close(function (err) {
expect(err).toBeFalsy();
c.testTree.open('/testfile', function (err, file) {
expect(err).toBeFalsy();
expect(file.lastModified()).toEqual(123459);
done();
})
});
});
});
});
});
it('testRevertedRemoteVersion', function (done) {
c.addCachedFile('/testfile', function () {
c.remoteTree.open('/testfile', function (err, file) {
expect(err).toBeFalsy();
var prevModified = file.lastModified();
var newModified = file.lastModified() - 2000;
file.setLastModified(newModified);
file.close(function (err) {
expect(err).toBeFalsy();
c.testTree.open('/testfile', function (err, file) {
expect(err).toBeFalsy();
expect(file.lastModified()).toEqual(prevModified);
file.cacheFile(function (err) {
expect(err).toBeFalsy();
expect(file.lastModified()).toEqual(newModified);
done();
});
});
});
});
});
});
it('testListDates', function (done) {
function verifyListDates(file1, file2, cb) {
c.testTree.list('/*', function (err, files) {
expect(err).toBeFalsy();
expect(files.length).toEqual(2);
var list1 = files[0];
var list2 = files[1];
if (list1.getPath() == file2.getPath()) {
var swap = list1;
list1 = list2;
list2 = swap;
}
expect(list1.lastModified()).toEqual(file1.lastModified());
expect(list2.lastModified()).toEqual(file2.lastModified());
cb();
});
}
function verifySingleDate(toVerify, cb) {
c.testTree.list(toVerify.getPath(), function (err, files) {
expect(err).toBeFalsy();
expect(files.length).toEqual(1);
expect(files[0].lastModified()).toEqual(toVerify.lastModified());
cb();
});
}
// this test will make sure that file dates remain the same in list view after caching files.
c.addFile(c.remoteTree, '/testfile1', function () {
c.addFile(c.remoteTree, '/testfile2