enb
Version:
Faster BEM/BEViS assembler
608 lines (546 loc) • 19.2 kB
JavaScript
var BuildProfiler = require('../../lib/build-profiler');
describe('BuildProfiler', function () {
var buildGraph;
var buildTimes;
var profiler;
describe('setStartTime', function () {
beforeEach(function () {
buildTimes = {};
profiler = new BuildProfiler(buildTimes);
});
it('should set target with specified start time', function () {
var expected = { 'bundle/target': { startTime: 100500, techName: 'tech' } };
profiler.setStartTime('bundle/target', 'tech', 100500);
expect(buildTimes).to.be.deep.equal(expected);
});
it('should reset target with specified start time', function () {
var expected = { 'bundle/target': { startTime: 100501, techName: 'tech' } };
profiler.setStartTime('bundle/target', 'tech', 100500);
profiler.setStartTime('bundle/target', 'tech', 100501);
expect(buildTimes).to.be.deep.equal(expected);
});
it('should set current time (Date.now())', function () {
var expected = { 'bundle/target': { startTime: 0, techName: undefined } };
profiler.setStartTime('bundle/target');
expect(buildTimes).not.to.be.deep.equal(expected);
});
});
describe('setEndTime', function () {
beforeEach(function () {
buildTimes = {};
profiler = new BuildProfiler(buildTimes);
});
it('shouldn\'t set end time if there is no start time', function () {
var expected = {};
profiler.setEndTime('some-bundle', 'some-target');
expect(buildTimes).to.be.deep.equal(expected);
});
it('should set specified end time', function () {
var expected = { 'bundle/target': { startTime: 100500, endTime: 100501, techName: 'tech' } };
profiler.setStartTime('bundle/target', 'tech', 100500); // need to initialize benchmark object
profiler.setEndTime('bundle/target', 100501);
expect(buildTimes).to.be.deep.equal(expected);
});
});
describe('calculateBuildTimes', function () {
var graph = {
'bundle/dep': {
deps: []
},
'bundle/target': {
deps: [
'bundle/dep'
]
}
};
beforeEach(function () {
buildGraph = function (graph) {
return {
graph: graph,
getDirectDeps: function (targetName) {
return this.graph[targetName] ? this.graph[targetName].deps : [];
}
};
};
});
it('should calculate time for each target if parallel run targets', function () {
buildTimes = {
'bundle/dep': {
startTime: 100500,
endTime: 100501
},
'bundle/target': {
startTime: 100500,
endTime: 100503
}
};
profiler = new BuildProfiler(buildTimes);
var expected = {
'bundle/dep': {
startTime: 100500,
endTime: 100501,
selfTime: 1,
totalTime: 1,
watingTime: 0,
timeline: [{
startTime: 100500,
endTime: 100501
}]
},
'bundle/target': {
startTime: 100500,
endTime: 100503,
selfTime: 2,
totalTime: 3,
watingTime: 1,
timeline: [{
startTime: 100501,
endTime: 100503
}]
}
};
profiler.calculateBuildTimes(buildGraph(graph));
expect(buildTimes).to.be.deep.equal(expected);
});
it('should calculate time for each target if parent target run deps after some time ', function () {
buildTimes = {
'bundle/dep': {
startTime: 100503,
endTime: 100504
},
'bundle/target': {
startTime: 100500,
endTime: 100506
}
};
profiler = new BuildProfiler(buildTimes);
var expected = {
'bundle/dep': {
startTime: 100503,
endTime: 100504,
selfTime: 1,
totalTime: 1,
watingTime: 0,
timeline: [{
startTime: 100503,
endTime: 100504
}]
},
'bundle/target': {
startTime: 100500,
endTime: 100506,
selfTime: 5,
totalTime: 6,
watingTime: 1,
timeline: [
{
startTime: 100500,
endTime: 100503
},
{
startTime: 100504,
endTime: 100506
}
]
}
};
profiler.calculateBuildTimes(buildGraph(graph));
expect(buildTimes).to.be.deep.equal(expected);
});
it('should calculate time for each target if deps run before target', function () {
buildTimes = {
'bundle/dep': {
startTime: 100500,
endTime: 100504
},
'bundle/target': {
startTime: 100501,
endTime: 100510
}
};
profiler = new BuildProfiler(buildTimes);
var expected = {
'bundle/dep': {
startTime: 100500,
endTime: 100504,
selfTime: 4,
totalTime: 4,
watingTime: 0,
timeline: [{
startTime: 100500,
endTime: 100504
}]
},
'bundle/target': {
startTime: 100501,
endTime: 100510,
selfTime: 6,
totalTime: 9,
watingTime: 3,
timeline: [{
startTime: 100504,
endTime: 100510
}]
}
};
profiler.calculateBuildTimes(buildGraph(graph));
expect(buildTimes).to.be.deep.equal(expected);
});
it('should calculate time for each target if deps end before target run', function () {
buildTimes = {
'bundle/dep': {
startTime: 100500,
endTime: 100505
},
'bundle/target': {
startTime: 100506,
endTime: 100510
}
};
profiler = new BuildProfiler(buildTimes);
var expected = {
'bundle/dep': {
startTime: 100500,
endTime: 100505,
selfTime: 5,
totalTime: 5,
watingTime: 0,
timeline: [{
startTime: 100500,
endTime: 100505
}]
},
'bundle/target': {
startTime: 100506,
endTime: 100510,
selfTime:4,
totalTime: 4,
watingTime: 0,
timeline: [{
startTime: 100506,
endTime: 100510
}]
}
};
profiler.calculateBuildTimes(buildGraph(graph));
expect(buildTimes).to.be.deep.equal(expected);
});
it('should calculate time for each target which are independent of each other', function () {
graph = {
'some-bundle/parallel-target-1': { deps: [] },
'some-bundle/parallel-target-2': { deps: [] }
};
buildTimes = {
'some-bundle/parallel-target-1': {
startTime: 100500,
endTime: 100504
},
'some-bundle/parallel-target-2': {
startTime: 100501,
endTime: 100503
}
};
profiler = new BuildProfiler(buildTimes);
var expected = {
'some-bundle/parallel-target-1': {
startTime: 100500,
endTime: 100504,
selfTime: 4,
totalTime: 4,
watingTime: 0,
timeline: [{
startTime: 100500,
endTime: 100504
}]
},
'some-bundle/parallel-target-2': {
startTime: 100501,
endTime: 100503,
selfTime: 2,
totalTime: 2,
watingTime: 0,
timeline: [{
startTime: 100501,
endTime: 100503
}]
}
};
profiler.calculateBuildTimes(buildGraph(graph));
expect(buildTimes).to.be.deep.equal(expected);
});
it('should calculate time target which waiting targets with breaks', function () {
graph = {
'bundle/target': { deps: ['bundle/dep-1', 'bundle/dep-2', 'bundle/dep-3'] },
'bundle/dep-1': { deps: [] },
'bundle/dep-2': { deps: [] },
'bundle/dep-3': { deps: [] }
};
buildTimes = {
'bundle/target': {
startTime: 0,
endTime: 100
},
'bundle/dep-1': {
startTime: 10,
endTime: 20
},
'bundle/dep-2': {
startTime: 30,
endTime: 40
},
'bundle/dep-3': {
startTime: 50,
endTime: 60
}
};
profiler = new BuildProfiler(buildTimes);
var expected = {
'bundle/target': {
startTime: 0,
endTime: 100,
totalTime: 100,
selfTime: 70,
watingTime: 30,
timeline: [
{
startTime: 0,
endTime: 10
},
{
startTime: 20,
endTime: 30
},
{
startTime: 40,
endTime: 50
},
{
startTime: 60,
endTime: 100
}
]
},
'bundle/dep-1': {
startTime: 10,
endTime: 20,
selfTime: 10,
totalTime: 10,
watingTime: 0,
timeline: [{
startTime: 10,
endTime: 20
}]
},
'bundle/dep-2': {
startTime: 30,
endTime: 40,
selfTime: 10,
totalTime: 10,
watingTime: 0,
timeline: [{
startTime: 30,
endTime: 40
}]
},
'bundle/dep-3': {
startTime: 50,
endTime: 60,
selfTime: 10,
totalTime: 10,
watingTime: 0,
timeline: [{
startTime: 50,
endTime: 60
}]
}
};
profiler.calculateBuildTimes(buildGraph(graph));
expect(buildTimes).to.be.deep.equal(expected);
});
});
describe('calculateTechMetrics', function () {
beforeEach(function () {
profiler = new BuildProfiler({});
});
it('should return empty metrics', function () {
var buildTimes = {};
var metrics = profiler.calculateTechMetrics(buildTimes);
expect(metrics).to.be.deep.equal([]);
});
it('should calculate metrics for target', function () {
var buildTimes = {
'target.css': {
techName: 'css',
startTime: 10,
endTime: 20,
selfTime: 10,
totalTime: 10,
watingTime: 0,
timeline: [{
startTime: 10,
endTime: 20
}]
}
};
var metrics = profiler.calculateTechMetrics(buildTimes);
expect(metrics).to.be.deep.equal([
{
tech: 'css',
callNumber: 1,
buildTime: 10,
buildTimePercent: 100,
buildTimes: [10]
}
]);
});
it('should aggregate times by tech', function () {
var buildTimes = {
'bundle-1/target.css': {
techName: 'css',
startTime: 0,
endTime: 10,
selfTime: 10,
totalTime: 10,
watingTime: 0,
timeline: [{
startTime: 0,
endTime: 10
}]
},
'bundle-2/target.css': {
techName: 'css',
startTime: 10,
endTime: 20,
selfTime: 10,
totalTime: 10,
watingTime: 0,
timeline: [{
startTime: 10,
endTime: 20
}]
}
};
var metrics = profiler.calculateTechMetrics(buildTimes);
expect(metrics).to.be.deep.equal([
{
tech: 'css',
callNumber: 2,
buildTime: 20,
buildTimePercent: 100,
buildTimes: [10, 10]
}
]);
});
it('should calculate real tech time', function () {
var targetTimes = {
techName: 'css',
startTime: 0,
endTime: 10,
selfTime: 10,
totalTime: 10,
watingTime: 0,
timeline: [{
startTime: 0,
endTime: 10
}]
};
var buildTimes = {
'bundle-1/target.css': targetTimes,
'bundle-2/target.css': targetTimes
};
var metrics = profiler.calculateTechMetrics(buildTimes);
expect(metrics).to.be.deep.equal([
{
tech: 'css',
callNumber: 2,
buildTime: 10,
buildTimePercent: 100,
buildTimes: [10, 10]
}
]);
});
it('should ignore wait time', function () {
var buildTimes = {
'bundle-1/target.css': {
techName: 'css',
startTime: 0,
endTime: 100,
selfTime: 50,
totalTime: 100,
watingTime: 50,
timeline: [{
startTime: 50,
endTime: 100
}]
},
'bundle-2/target.css': {
techName: 'css',
startTime: 150,
endTime: 200,
selfTime: 30,
totalTime: 50,
watingTime: 20,
timeline: [{
startTime: 170,
endTime: 200
}]
}
};
var metrics = profiler.calculateTechMetrics(buildTimes);
expect(metrics).to.be.deep.equal([
{
tech: 'css',
callNumber: 2,
buildTime: 80,
buildTimePercent: 100,
buildTimes: [50, 30]
}
]);
});
it('should calculate metrics for different techs', function () {
var buildTimes = {
'bundle-1/target.js': {
techName: 'js',
startTime: 0,
endTime: 100,
selfTime: 50,
totalTime: 100,
watingTime: 50,
timeline: [{
startTime: 50,
endTime: 100
}]
},
'bundle-2/target.css': {
techName: 'css',
startTime: 150,
endTime: 200,
selfTime: 30,
totalTime: 50,
watingTime: 20,
timeline: [{
startTime: 170,
endTime: 200
}]
}
};
var metrics = profiler.calculateTechMetrics(buildTimes);
expect(metrics).to.be.deep.equal([
{
tech: 'js',
callNumber: 1,
buildTime: 50,
buildTimePercent: 62.5,
buildTimes: [50]
},
{
tech: 'css',
callNumber: 1,
buildTime: 30,
buildTimePercent: 37.5,
buildTimes: [30]
}
]);
});
});
});