Skip to content

Commit

Permalink
Added performance tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
s-KaiNet committed May 22, 2016
1 parent 35fa6cd commit cd2eb26
Show file tree
Hide file tree
Showing 13 changed files with 260 additions and 8 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Expand Up @@ -2,6 +2,8 @@ demo
node_modules
reports
test/integration/config.ts
test/performance/config.ts
test/performance/files/*
/lib
*.js
*.js.map
Expand Down
4 changes: 2 additions & 2 deletions .vscode/launch.json
Expand Up @@ -5,12 +5,12 @@
"configurations": [
{
// Name of configuration; appears in the launch configuration drop down menu.
"name": "Run index.js",
"name": "Run performance test",
// Type of configuration. Possible values: "node", "mono".
"type": "node",
"request": "launch",
// Workspace relative or absolute path to the program.
"program": "${workspaceRoot}/demo/index.js",
"program": "${workspaceRoot}/lib/test/performance/index.js",
// Automatically stop program after launch.
"stopOnEntry": false,
// Command line arguments passed to the program.
Expand Down
1 change: 1 addition & 0 deletions package.json
Expand Up @@ -34,6 +34,7 @@
],
"devDependencies": {
"chai": "^3.5.0",
"console.table": "^0.7.0",
"coveralls": "^2.11.9",
"del": "^2.2.0",
"gulp": "^3.9.1",
Expand Down
2 changes: 1 addition & 1 deletion src/core/FileSaver.ts
Expand Up @@ -5,7 +5,7 @@ import * as url from 'url';
import * as _ from 'lodash';
import {IEnvironment, IUserCredentials} from 'sp-request';

import {FileContentOptions, CheckinType} from './ISPSaveOptions';
import {FileContentOptions, CheckinType} from './SPSaveOptions';
import {UrlHelper} from './../utils/UrlHelper';
import {FoldersCreator} from './../utils/FoldersCreator';
import {ILogger} from './../utils/ILogger';
Expand Down
2 changes: 1 addition & 1 deletion src/core/SPSave.ts
@@ -1,7 +1,7 @@
import * as Promise from 'bluebird';
import * as notifier from 'node-notifier';

import {SPSaveOptions, FileContentOptions, isFileContentOptions} from './ISPSaveOptions';
import {SPSaveOptions, FileContentOptions, isFileContentOptions} from './SPSaveOptions';
import {FileSaver} from './FileSaver';
import {ILogger} from './../utils/ILogger';
import {ConsoleLogger} from './../utils/ConsoleLogger';
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion src/index.ts
@@ -1,2 +1,2 @@
export * from './core/SPSave';
export * from './core/ISPSaveOptions';
export * from './core/SPSaveOptions';
6 changes: 5 additions & 1 deletion src/utils/ConsoleLogger.ts
@@ -1,5 +1,6 @@
import {ILogger} from './ILogger';
import * as colors from 'colors';
import * as util from 'util';

export class ConsoleLogger implements ILogger {
public error(message: string): void {
Expand All @@ -22,6 +23,9 @@ export class ConsoleLogger implements ILogger {
if (message === '') {
console.log('');
}
console.log(colors[color](`spsave: ${message}`));
let dateNow: Date = new Date();
let dateString: string = util.format('[%s:%s:%s]',
('0' + dateNow.getHours()).slice(-2), ('0' + dateNow.getMinutes()).slice(-2), ('0' + dateNow.getSeconds()).slice(-2));
console.log(colors[color](`${dateString} spsave: ${message}`));
}
}
2 changes: 1 addition & 1 deletion src/utils/OptionsParser.ts
Expand Up @@ -4,7 +4,7 @@ import * as path from 'path';
import * as globby from 'globby';
import * as fs from 'fs';

import * as opts from './../core/ISPSaveOptions';
import * as opts from './../core/SPSaveOptions';
import {UrlHelper} from './UrlHelper';

export class OptionsParser {
Expand Down
2 changes: 1 addition & 1 deletion test/integration/integration.spec.ts
Expand Up @@ -9,7 +9,7 @@ import * as vfs from 'vinyl-fs';
import File = require('vinyl');

import {spsave} from './../../src/core/SPSave';
import {FileContentOptions, VinylOptions, GlobOptions, CheckinType} from './../../src/core/ISPSaveOptions';
import {FileContentOptions, VinylOptions, GlobOptions, CheckinType} from './../../src/core/SPSaveOptions';
import {UrlHelper} from './../../src/utils/UrlHelper';

let config: any = require('./config');
Expand Down
21 changes: 21 additions & 0 deletions test/performance/config.sample.ts
@@ -0,0 +1,21 @@
import {IUserCredentials} from 'sp-request';
import {IEnvironment} from 'sp-request';

export var onprem: IUserCredentials = {
username: '[user]',
password: '[pass]'
};

export var env: IEnvironment = {
domain: 'sp'
};

export var online: IUserCredentials = {
username: '[user]',
password: '[pass]'
};

export var url: any = {
online: 'https://[domain].sharepoint.com',
onprem: 'http://onprem/sharepoint/url'
};
210 changes: 210 additions & 0 deletions test/performance/index.ts
@@ -0,0 +1,210 @@
import * as globby from 'globby';
import * as Promise from 'bluebird';
import * as path from 'path';
import * as fs from 'fs';
import * as _ from 'lodash';
require('console.table');

import {spsave} from './../../src/core/SPSave';
import {FileContentOptions, CoreOptions} from './../../src/core/SPSaveOptions';

let config: any = require('./config');
let spsaveLegacy: any = require(path.resolve('test/performance/legacy/node_modules/spsave/lib/spsave.js'));

let filesToSave: string[] = globby.sync('test/performance/files/*.*');
let folder: string = 'SiteAssets/files';

let onPremOptions: CoreOptions = {
username: config.onprem.username,
password: config.onprem.password,
domain: config.env.domain,
siteUrl: config.url.onprem
};

let onlineOptions: CoreOptions = {
username: config.online.username,
password: config.online.password,
domain: config.env.domain,
siteUrl: config.url.online
};

let legacyOnPremElapsedSeries: number;
let spsaveOnPremElapsedSeries: number;
let legacyOnPremElapsedParallel: number;
let spsaveOnPremElapsedParallel: number;

let legacyOnlineElapsedSeries: number;
let spsaveOnlineElapsedSeries: number;
let legacyOnlineElapsedParallel: number;
let spsaveOnlineElapsedParallel: number;

/* legacy: on-premise series run */
Promise.all([new Date().getTime(), savesFileArraySeriesLegacy(filesToSave, onPremOptions)])
.then((data) => {
legacyOnPremElapsedSeries = new Date().getTime() - data[0];

/* legacy: on-premise parallel run */
return Promise.all([new Date().getTime(), saveFilesArrayInParallelLegacy(filesToSave, onPremOptions)]);
})
.then((data) => {
legacyOnPremElapsedParallel = new Date().getTime() - data[0];

/* legacy: online series run */
return Promise.all([new Date().getTime(), savesFileArraySeriesLegacy(filesToSave, onlineOptions)]);
})
.then(data => {
legacyOnlineElapsedSeries = new Date().getTime() - data[0];

/* legacy: online parallel run */
return Promise.all([new Date().getTime(), saveFilesArrayInParallelLegacy(filesToSave, onlineOptions)]);
})
.then(data => {
legacyOnlineElapsedParallel = new Date().getTime() - data[0];

/* spsave 2.x: on-premise parallel run */
return Promise.all([new Date().getTime(), saveFilesArrayInParallel(filesToSave, onPremOptions)]);
})
.then((data) => {
spsaveOnPremElapsedParallel = new Date().getTime() - data[0];

/* spsave 2.x: on-premise series run */
return Promise.all([new Date().getTime(), saveFilesArraySeries(filesToSave, <FileContentOptions>onPremOptions)]);
})
.then((data) => {
spsaveOnPremElapsedSeries = new Date().getTime() - data[0];

/* spsave 2.x: online parallel run */
return Promise.all([new Date().getTime(), saveFilesArrayInParallel(filesToSave, onlineOptions)]);
})
.then(data => {
spsaveOnlineElapsedParallel = new Date().getTime() - data[0];

/* spsave 2.x: online series run */
return Promise.all([new Date().getTime(), saveFilesArraySeries(filesToSave, <FileContentOptions>onlineOptions)]);
})
.then(data => {
spsaveOnlineElapsedSeries = new Date().getTime() - data[0];
})
.then(printResults)
.catch(err => {
console.log(err);
});

function printResults(): void {
console.log('');
console.log('');
console.log('');
(<any>console).table(`${filesToSave.length} files upload: in series`, [
{
'spsave': 'spsave 1.x',
'on-premise': `${legacyOnPremElapsedSeries / 1000}s`,
'online': `${legacyOnlineElapsedSeries / 1000}s`
},
{
'spsave': 'spsave 2.x',
'on-premise': `${spsaveOnPremElapsedSeries / 1000}s`,
'online': `${spsaveOnlineElapsedSeries / 1000}s`
}
]);

(<any>console).table(`${filesToSave.length} files upload: in parallel`, [
{
'spsave': 'spsave 1.x',
'on-premise': `${legacyOnPremElapsedParallel / 1000}s`,
'online': `${legacyOnlineElapsedParallel / 1000}s`
},
{
'spsave': 'spsave 2.x',
'on-premise': `${spsaveOnPremElapsedParallel / 1000}s`,
'online': `${spsaveOnlineElapsedParallel / 1000}s`
}
]);
}

function saveFilesArrayInParallelLegacy(files: string[], opts: any): Promise<any> {
let promises: Promise<any>[] = [];

files.forEach(file => {
opts.fileName = path.basename(file);
opts.fileContent = fs.readFileSync(file);
opts.folder = folder;
let newOptions: any = _.extend({}, opts);
let deferred: Promise.Resolver<any> = Promise.defer<any>();

((o) => {
spsaveLegacy(o, (err: any, data: any) => {
if (err) {
deferred.reject(err);
return;
}
deferred.resolve();
});
})(newOptions);
promises.push(deferred.promise);
});

return Promise.all(promises);
}

function saveFilesArrayInParallel(files: string[], opts: any): Promise<any> {
let promises: Promise<any>[] = [];

files.forEach(file => {
opts.fileName = path.basename(file);
opts.fileContent = fs.readFileSync(file);
opts.folder = folder;
promises.push(spsave(opts));
});

return Promise.all(promises);
}

function savesFileArraySeriesLegacy(files: string[], opts: any, deferred?: Promise.Resolver<any>): Promise<any> {
if (!deferred) {
deferred = Promise.defer<any>();
}

if (files.length > 0) {

opts.fileName = path.basename(files[0]);
opts.fileContent = fs.readFileSync(files[0]);
opts.folder = folder;

spsaveLegacy(opts, (err: any, data: any) => {
if (err) {
deferred.reject(err);
return;
}
savesFileArraySeriesLegacy(files.slice(1, files.length), opts, deferred);
});
} else {
deferred.resolve();
}

return deferred.promise;
}

function saveFilesArraySeries(files: string[], opts: FileContentOptions, deferred?: Promise.Resolver<any>): Promise<any> {
if (!deferred) {
deferred = Promise.defer<any>();
}

if (files.length > 0) {

opts.fileName = path.basename(files[0]);
opts.fileContent = fs.readFileSync(files[0]);
opts.folder = folder;

spsave(opts)
.then(() => {
saveFilesArraySeries(files.slice(1, files.length), opts, deferred);
})
.catch(err => {
deferred.reject(err);
});
} else {
deferred.resolve();
}

return deferred.promise;
}
14 changes: 14 additions & 0 deletions test/performance/legacy/package.json
@@ -0,0 +1,14 @@
{
"name": "legacy",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"devDependencies": {
"spsave": "^1.0.15"
}
}

0 comments on commit cd2eb26

Please sign in to comment.