Files
cloudron-box/api/test/syncer-test.js
T
2013-09-08 13:44:33 -07:00

148 lines
5.8 KiB
JavaScript

'use strict';
/* global it:false */
/* global describe:false */
var syncer = require('../syncer'),
crypto = require('crypto'),
fs = require('fs'),
path = require('path'),
assert = require('assert'),
expect = require('expect.js'),
os = require('os');
describe('Diff', function () {
var leftTree, baseTree, rightTree;
function initTrees() {
leftTree = { entries: [ ] };
baseTree = { entries: [ ] };
rightTree = { entries: [ ] };
}
it('diff - never synced. non-conflicts', function (done) {
initTrees();
rightTree.entries.push({ path: 'A', sha1: 'SHA1', mtime: 10, size: 20 });
leftTree.entries.push({ path: 'B', sha1: 'SHA2', mtime: 10, size: 20 });
var changes = syncer.diff(leftTree, baseTree, rightTree);
expect(changes[0].action).to.equal('download');
expect(changes[0].path).to.equal('A');
expect(changes[0].sha1).to.equal('SHA1');
expect(changes[0].conflict).to.equal(false);
expect(changes[1].action).to.equal('add');
expect(changes[1].path).to.equal('B');
expect(changes[1].sha1).to.equal('SHA2');
expect(changes[1].conflict).to.equal(false);
done();
});
it('diff - never synced. conflicts', function (done) {
initTrees();
// Same file on both sides, mtime wins
rightTree.entries.push({ path: 'A', sha1: 'SHA0', mtime: 10, size: 20 });
leftTree.entries.push({ path: 'A', sha1: 'SHA1', mtime: 30, size: 20 });
// B is more recent on client
rightTree.entries.push({ path: 'B', sha1: 'SHA2', mtime: 10, size: 99 });
leftTree.entries.push({ path: 'B', sha1: 'SHA3', mtime: 30, size: 23 });
// C is more recent on server
rightTree.entries.push({ path: 'C', sha1: 'SHA4', mtime: 50, size: 40 });
leftTree.entries.push({ path: 'C', sha1: 'SHA5', mtime: 40, size: 23 });
var changes = syncer.diff(leftTree, baseTree, rightTree);
expect(changes[0].action).to.equal('update');
expect(changes[0].path).to.equal('A');
expect(changes[0].sha1).to.equal('SHA1');
expect(changes[0].conflict).to.equal(true);
expect(changes[1].action).to.equal('update');
expect(changes[1].path).to.equal('B');
expect(changes[1].sha1).to.equal('SHA3');
expect(changes[1].conflict).to.equal(true);
expect(changes[2].action).to.equal('download');
expect(changes[2].path).to.equal('C');
expect(changes[2].sha1).to.equal('SHA4');
expect(changes[2].conflict).to.equal(true);
done();
});
it('diff - synced before. non-conflicts', function (done) {
initTrees();
// same file everywhere
rightTree.entries.push({ path: 'A', sha1: 'SHA1', mtime: 10, size: 20 });
baseTree.entries.push({ path: 'A', sha1: 'SHA1', mtime: 10, size: 20 });
leftTree.entries.push({ path: 'A', sha1: 'SHA1', mtime: 30, size: 20 });
// client removed B
rightTree.entries.push({ path: 'B', sha1: 'SHA2', mtime: 10, size: 20 });
baseTree.entries.push({ path: 'B', sha1: 'SHA2', mtime: 10, size: 20 });
// someone removed C
baseTree.entries.push({ path: 'C', sha1: 'SHA3', mtime: 10, size: 20 });
leftTree.entries.push({ path: 'C', sha1: 'SHA3', mtime: 10, size: 20 });
var changes = syncer.diff(leftTree, baseTree, rightTree);
expect(changes[0].action).to.equal('remove');
expect(changes[0].path).to.equal('B');
expect(changes[0].sha1).to.equal('SHA2');
expect(changes[0].conflict).to.equal(false);
expect(changes[1].action).to.equal('unlink');
expect(changes[1].path).to.equal('C');
expect(changes[1].sha1).to.equal('SHA3');
expect(changes[1].conflict).to.equal(false);
done();
});
it('diff - synced before. conflicts', function (done) {
initTrees();
// client removed file but it was modified elsewhere
rightTree.entries.push({ path: 'A', sha1: 'SHA2', mtime: 20, size: 20 });
baseTree.entries.push({ path: 'A', sha1: 'SHA1', mtime: 10, size: 20 });
// modified everywhere, client wins
rightTree.entries.push({ path: 'B', sha1: 'SHA3', mtime: 30, size: 20 });
baseTree.entries.push({ path: 'B', sha1: 'SHA4', mtime: 10, size: 20 });
leftTree.entries.push({ path: 'B', sha1: 'SHA5', mtime: 40, size: 20 });
// modified everywhere server wins
rightTree.entries.push({ path: 'C', sha1: 'SHA6', mtime: 30, size: 20 });
baseTree.entries.push({ path: 'C', sha1: 'SHA7', mtime: 10, size: 20 });
leftTree.entries.push({ path: 'C', sha1: 'SHA8', mtime: 20, size: 20 });
// client modified but someone removed it on server
baseTree.entries.push({ path: 'D', sha1: 'SHA9', mtime: 10, size: 20 });
leftTree.entries.push({ path: 'D', sha1: 'SHA0', mtime: 20, size: 20 });
var changes = syncer.diff(leftTree, baseTree, rightTree);
expect(changes[0].action).to.equal('download');
expect(changes[0].path).to.equal('A');
expect(changes[0].sha1).to.equal('SHA2');
expect(changes[0].conflict).to.equal(true);
expect(changes[1].action).to.equal('update');
expect(changes[1].path).to.equal('B');
expect(changes[1].sha1).to.equal('SHA5');
expect(changes[1].conflict).to.equal(true);
expect(changes[2].action).to.equal('download');
expect(changes[2].path).to.equal('C');
expect(changes[2].sha1).to.equal('SHA6');
expect(changes[2].conflict).to.equal(true);
expect(changes[3].action).to.equal('add');
expect(changes[3].path).to.equal('D');
expect(changes[3].sha1).to.equal('SHA0');
expect(changes[3].conflict).to.equal(true);
done();
});
});
describe('canUpdate', function() {
});