blob: e975677cd5cc0fbcb4f0b02f22e7288c3a45c9a5 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* 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 CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var App = require('app');
require('views/common/chart/linear_time');
var testHelpers = require('test/helpers');
describe('App.ChartLinearTimeView', function () {
var chartLinearTimeView;
beforeEach(function() {
chartLinearTimeView = App.ChartLinearTimeView.create();
sinon.stub(App.ajax, 'abortRequests', Em.K);
});
afterEach(function () {
App.ajax.abortRequests.restore();
});
describe("#isRequestRunning", function () {
it("isPopup true, running request", function() {
chartLinearTimeView.setProperties({
isPopup: true,
runningPopupRequests: [{
ajaxIndex: 'req1'
}],
ajaxIndex: 'req1'
});
chartLinearTimeView.propertyDidChange('isRequestRunning');
expect(chartLinearTimeView.get('isRequestRunning')).to.be.true;
});
it("isPopup false, running request", function() {
chartLinearTimeView.setProperties({
isPopup: false,
runningRequests: [{
ajaxIndex: 'req1'
}],
ajaxIndex: 'req1'
});
chartLinearTimeView.propertyDidChange('isRequestRunning');
expect(chartLinearTimeView.get('isRequestRunning')).to.be.true;
});
it("isPopup false, no running request", function() {
chartLinearTimeView.setProperties({
isPopup: false,
runningRequests: [],
ajaxIndex: 'req1'
});
chartLinearTimeView.propertyDidChange('isRequestRunning');
expect(chartLinearTimeView.get('isRequestRunning')).to.be.false;
});
it("isPopup true, no running request", function() {
chartLinearTimeView.setProperties({
isPopup: true,
runningPopupRequests: [],
ajaxIndex: 'req1'
});
chartLinearTimeView.propertyDidChange('isRequestRunning');
expect(chartLinearTimeView.get('isRequestRunning')).to.be.false;
});
});
describe('#transformData', function () {
var result;
var data = [[1, 1200000000], [2, 1200000000], [3, 1200000000]];
var name = 'abc';
beforeEach(function () {
sinon.stub(App.router, 'get').withArgs('userSettingsController.userSettings.timezone').returns('(UTC+00:00) Greenwich');
sinon.stub(App, 'dateTimeWithTimeZone').returns(1);
});
afterEach(function () {
App.router.get.restore();
App.dateTimeWithTimeZone.restore();
});
it('"name" should be "abc" ', function () {
result = chartLinearTimeView.transformData(data, name);
expect(result.name).to.equal('abc');
});
it('data size should be 3 ', function () {
result = chartLinearTimeView.transformData(data, name);
expect(result.data.length).to.equal(3);
});
it('data[0].y should be 1 ', function () {
result = chartLinearTimeView.transformData(data, name);
expect(result.data[0].y).to.equal(1);
})
});
describe('#yAxisFormatter', function() {
var tests = [
{m:'undefined to 0',i:undefined,e:0},
{m:'NaN to 0',i:NaN,e:0},
{m:'0 to 0',i:'0',e:'0'},
{m:'1000 to 1K',i:'1000',e:'1K'},
{m:'1000000 to 1M',i:'1000000',e:'1M'},
{m:'1000000000 to 1B',i:'1000000000',e:'1B'},
{m:'1000000000000 to 1T',i:'1000000000000',e:'1T'},
{m:'1048576 to 1.049M',i:'1048576',e:'1.049M'},
{m:'1073741824 to 1.074B',i:'1073741824',e:'1.074B'}
];
tests.forEach(function(test) {
it(test.m + ' ', function () {
expect(chartLinearTimeView.yAxisFormatter(test.i)).to.equal(test.e);
});
});
});
describe('#checkSeries', function() {
var tests = [
{m:'undefined - false',i:undefined,e:false},
{m:'NaN - false',i:NaN,e:false},
{m:'object without data property - false',i:[{}],e:false},
{m:'object with empty data property - false',i:[{data:[]}],e:false},
{m:'object with invalid data property - false',i:[{data:[1]}],e:false},
{m:'object with valid data property - true',i:[{data:[{x:1,y:1},{x:2,y:2}]}],e:true}
];
tests.forEach(function(test) {
it(test.m + ' ', function () {
expect(chartLinearTimeView.checkSeries(test.i)).to.equal(test.e);
});
});
});
describe('#BytesFormatter', function() {
var tests = [
{m:'undefined to "0 B"',i:undefined,e:'0 B'},
{m:'NaN to "0 B"',i:NaN,e:'0 B'},
{m:'0 to "0 B"',i:0,e:'0 B'},
{m:'124 to "124 B"',i:124,e:'124 B'},
{m:'1024 to "1 KB"',i:1024,e:'1 KB'},
{m:'1536 to "1 KB"',i:1536,e:'1.5 KB'},
{m:'1048576 to "1 MB"',i:1048576,e:'1 MB'},
{m:'1073741824 to "1 GB"',i:1073741824,e:'1 GB'},
{m:'1610612736 to "1.5 GB"',i:1610612736,e:'1.5 GB'}
];
tests.forEach(function(test) {
it(test.m + ' ', function () {
expect(App.ChartLinearTimeView.BytesFormatter(test.i)).to.equal(test.e);
});
});
});
describe('#PercentageFormatter', function() {
var tests = [
{m:'undefined to "0 %"',i:undefined,e:'0 %'},
{m:'NaN to "0 %"',i:NaN,e:'0 %'},
{m:'0 to "0 %"',i:0,e:'0 %'},
{m:'1 to "1%"',i:1,e:'1%'},
{m:'1.12341234 to "1.123%"',i:1.12341234,e:'1.123%'},
{m:'-11 to "-11%"',i:-11,e:'-11%'},
{m:'-11.12341234 to "-11.123%"',i:-11.12341234,e:'-11.123%'}
];
tests.forEach(function(test) {
it(test.m + ' ', function () {
expect(App.ChartLinearTimeView.PercentageFormatter(test.i)).to.equal(test.e);
});
});
});
describe('#TimeElapsedFormatter', function() {
var tests = [
{m:'undefined to "0 ms"',i:undefined,e:'0 ms'},
{m:'NaN to "0 ms"',i:NaN,e:'0 ms'},
{m:'0 to "0 ms"',i:0,e:'0 ms'},
{m:'1000 to "1000 ms"',i:1000,e:'1000 ms'},
{m:'120000 to "2 m"',i:120000,e:'2 m'},
{m:'3600000 to "60 m"',i:3600000,e:'60 m'},
{m:'5000000 to "1 hr"',i:5000000,e:'1 hr'},
{m:'7200000 to "2 hr"',i:7200000,e:'2 hr'},
{m:'90000000 to "1 d"',i:90000000,e:'1 d'}
];
tests.forEach(function(test) {
it(test.m + ' ', function () {
expect(App.ChartLinearTimeView.TimeElapsedFormatter(test.i)).to.equal(test.e);
});
});
});
describe("#getDataForAjaxRequest()", function() {
var services = {
yarnService: [],
hdfsService: []
};
var rangeCases = [
{
currentTimeIndex: 0,
customStartTime: 100000,
customEndTime: 200000,
fromSeconds: -3599,
toSeconds: 1,
title: 'preset time range'
},
{
currentTimeIndex: 8,
customStartTime: 100000,
customEndTime: 200000,
fromSeconds: 100,
toSeconds: 200,
title: 'custom time range'
},
{
currentTimeIndex: 8,
customStartTime: null,
customEndTime: null,
fromSeconds: -3599,
toSeconds: 1,
title: 'custom time range, no boundaries set'
}
];
beforeEach(function(){
sinon.stub(App.HDFSService, 'find', function(){return services.hdfsService});
sinon.stub(App.YARNService, 'find', function(){return services.yarnService});
sinon.stub(App, 'dateTime').returns(1000);
chartLinearTimeView.set('content', null);
});
afterEach(function(){
App.HDFSService.find.restore();
App.YARNService.find.restore();
App.dateTime.restore();
});
it("content has hostName", function() {
chartLinearTimeView.set('content', Em.Object.create({
hostName: 'host1'
}));
expect(chartLinearTimeView.getDataForAjaxRequest()).to.be.eql({
toSeconds: 1,
fromSeconds: -3599,
stepSeconds: 15,
hostName: 'host1',
resourceManager: ''
});
});
it("get Namenode host", function() {
services.hdfsService = [
Em.Object.create({
nameNode: {hostName: 'host1'}
})
];
expect(chartLinearTimeView.getDataForAjaxRequest()).to.be.eql({
toSeconds: 1,
fromSeconds: -3599,
stepSeconds: 15,
hostName: '',
resourceManager: ''
});
services.hdfsService = [];
});
it("get Namenode host HA", function() {
services.hdfsService = [
Em.Object.create({
activeNameNode: {hostName: 'host1'}
})
];
expect(chartLinearTimeView.getDataForAjaxRequest()).to.be.eql({
toSeconds: 1,
fromSeconds: -3599,
stepSeconds: 15,
hostName: '',
resourceManager: ''
});
services.hdfsService = [];
});
it("get resourceManager host", function() {
services.yarnService = [
Em.Object.create({
resourceManager: {hostName: 'host1'}
})
];
expect(chartLinearTimeView.getDataForAjaxRequest()).to.be.eql({
toSeconds: 1,
fromSeconds: -3599,
stepSeconds: 15,
hostName: '',
resourceManager: 'host1'
});
services.yarnService = [];
});
rangeCases.forEach(function (item) {
it(item.title, function () {
chartLinearTimeView.setProperties({
currentTimeIndex: item.currentTimeIndex,
customStartTime: item.customStartTime,
customEndTime: item.customEndTime,
timeUnitSeconds: 3600
});
var requestData = Em.Object.create(chartLinearTimeView.getDataForAjaxRequest());
expect(requestData.getProperties(['fromSeconds', 'toSeconds'])).to.eql({
fromSeconds: item.fromSeconds,
toSeconds: item.toSeconds
});
});
});
});
describe('#setCurrentTimeIndexFromParent', function () {
var view,
cases = [
{
parent: 1,
child: 2,
result: 2,
title: 'child and parent have currentTimeRangeIndex'
},
{
parent: undefined,
child: 2,
result: 2,
title: 'only child has currentTimeRangeIndex'
},
{
parent: 1,
child: undefined,
result: 1,
title: 'only parent has currentTimeRangeIndex'
}
],
isReadyCases = [
{
inWidget: true,
isClusterMetricsWidget: true,
parentViewIsLoaded: true,
isReady: false,
title: 'cluster metrics widget'
},
{
inWidget: true,
isClusterMetricsWidget: false,
parentViewIsLoaded: false,
isReady: true,
title: 'enhanced service widget'
},
{
inWidget: false,
isClusterMetricsWidget: false,
parentViewIsLoaded: true,
isReady: false,
title: 'non-widget graph'
}
];
beforeEach(function () {
view = App.ChartLinearTimeView.create({
isReady: true,
controller: {},
parentView: Em.Object.create({
currentTimeRangeIndex: 1,
isLoaded: true,
parentView: Em.Object.create({
currentTimeRangeIndex: 2
})
}),
timeUnitSecondsSetter: Em.K
});
});
cases.forEach(function (item) {
it(item.title, function () {
view.set('parentView.currentTimeRangeIndex', item.child);
view.set('parentView.parentView.currentTimeRangeIndex', item.parent);
view.propertyDidChange('parentView.currentTimeRangeIndex');
expect(view.get('currentTimeIndex')).to.equal(item.result);
});
});
isReadyCases.forEach(function (item) {
describe(item.title, function () {
beforeEach(function () {
view.set('inWidget', item.inWidget);
view.set('parentView.isClusterMetricsWidget', item.isClusterMetricsWidget);
view.propertyDidChange('parentView.currentTimeRangeIndex');
});
it('parentView.isLoaded', function () {
expect(view.get('parentView.isLoaded')).to.eql(item.parentViewIsLoaded);
});
it('isReady', function () {
expect(view.get('isReady')).to.eql(item.isReady);
});
});
});
});
describe('#loadDataSuccessCallback', function () {
beforeEach(function () {
sinon.stub(chartLinearTimeView, '_refreshGraph', Em.K);
});
afterEach(function () {
chartLinearTimeView._refreshGraph.restore();
});
it('should refresh graph', function () {
var response = {
key: 'value'
};
chartLinearTimeView.loadDataSuccessCallback(response);
expect(chartLinearTimeView._refreshGraph.calledOnce).to.be.true;
expect(chartLinearTimeView._refreshGraph.calledWith(response)).to.be.true;
});
});
describe('#setYAxisFormatter', function () {
var view,
cases = [
{
displayUnit: '%',
formatter: 'PercentageFormatter'
},
{
displayUnit: 'B',
formatter: 'BytesFormatter'
},
{
displayUnit: 'ms',
formatter: 'TimeElapsedFormatter'
},
{
displayUnit: 'kg',
formatter: 'DefaultFormatter',
title: 'other display unit'
},
{
formatter: 'DefaultFormatter',
title: 'no display unit'
}
],
methodNames = ['PercentageFormatter', 'CreateRateFormatter', 'BytesFormatter', 'TimeElapsedFormatter', 'DefaultFormatter'];
beforeEach(function () {
view = App.ChartLinearTimeView.create();
methodNames.forEach(function (name) {
sinon.stub(App.ChartLinearTimeView, name, Em.K);
});
});
afterEach(function () {
methodNames.forEach(function (name) {
App.ChartLinearTimeView[name].restore();
});
});
cases.forEach(function (item) {
describe(item.title || item.displayUnit, function () {
beforeEach(function () {
view.set('displayUnit', item.displayUnit);
view.setYAxisFormatter();
view.yAxisFormatter();
});
methodNames.forEach(function (name) {
it(name, function () {
expect(App.ChartLinearTimeView[name].callCount).to.equal(Number(name === item.formatter));
});
});
});
});
});
describe('#localeTimeUnit', function () {
var cases = [
{
timeUnitSeconds: 240,
localeTimeUnit: '1 minute'
},
{
timeUnitSeconds: 172788,
localeTimeUnit: '719.95 minute'
},
{
timeUnitSeconds: 172800,
localeTimeUnit: 'day'
},
{
timeUnitSeconds: 1209599,
localeTimeUnit: 'day'
},
{
timeUnitSeconds: 1209600,
localeTimeUnit: 'week'
},
{
timeUnitSeconds: 5183999,
localeTimeUnit: 'week'
},
{
timeUnitSeconds: 5184000,
localeTimeUnit: 'month'
},
{
timeUnitSeconds: 62207999,
localeTimeUnit: 'month'
},
{
timeUnitSeconds: 622080000,
localeTimeUnit: 'year'
},
{
timeUnitSeconds: 700000000,
localeTimeUnit: 'year'
}
];
beforeEach(function () {
sinon.stub(Rickshaw.Fixtures, 'Time').returns({
unit: function (name) {
return {
name: name
};
}
});
});
afterEach(function () {
Rickshaw.Fixtures.Time.restore();
});
cases.forEach(function (item) {
it(item.timeUnitSeconds + 's', function () {
expect(chartLinearTimeView.localeTimeUnit(item.timeUnitSeconds).name).to.equal(item.localeTimeUnit);
});
});
});
});
describe('App.ChartLinearTimeView.LoadAggregator', function () {
var aggregator = App.ChartLinearTimeView.LoadAggregator;
describe("#groupRequests()", function () {
var result;
beforeEach(function () {
var requests = [
{
name: 'r1',
context: 'c1',
fields: ['f1']
},
{
name: 'r2',
context: 'c2',
fields: ['f2']
},
{
name: 'r2',
context: 'c3',
fields: ['f3', 'f4']
}
];
result = aggregator.groupRequests(requests);
});
it("result['r1'].subRequests.length", function () {
expect(result.r1.subRequests.length).to.equal(1);
});
it("result['r1'].fields.length", function () {
expect(result.r1.fields.length).to.equal(1);
});
it("result['r2'].subRequests.length", function () {
expect(result.r2.subRequests.length).to.equal(2);
});
it("result['r2'].fields.length", function () {
expect(result.r2.fields.length).to.equal(3);
});
});
describe("#runRequests()", function () {
beforeEach(function () {
sinon.stub(aggregator, 'groupRequests', function (requests) {
return requests;
});
sinon.stub(aggregator, 'formatRequestData', function(_request){
return _request.fields;
});
App.ajax.send.restore();
sinon.stub(App.ajax, 'send', function(){
return {
done: Em.K,
fail: Em.K,
always: Em.K
}
});
});
afterEach(function () {
aggregator.groupRequests.restore();
aggregator.formatRequestData.restore();
});
it("valid request is sent", function () {
var context = Em.Object.create({
content: {
hostName: 'host1'
},
runningRequests: []
});
var requests = {
'r1': {
name: 'r1',
context: context,
fields: ['f3', 'f4']
}
};
aggregator.runRequests(requests);
var args = testHelpers.findAjaxRequest('name', 'r1');
expect(args[0]).exists;
expect(args[0].sender).to.be.eql(context);
expect(args[0].data).to.be.eql({
fields: ['f3', 'f4'],
hostName: 'host1'
});
});
});
describe("#formatRequestData()", function () {
var cases = [
{
currentTimeIndex: 0,
customStartTime: 100000,
customEndTime: 200000,
result: 'f3[400,4000,15],f4[400,4000,15]',
title: 'preset time range'
},
{
currentTimeIndex: 8,
customStartTime: 100000,
customEndTime: 200000,
result: 'f3[100,200,15],f4[100,200,15]',
title: 'custom time range'
},
{
currentTimeIndex: 8,
customStartTime: null,
customEndTime: null,
result: 'f3[400,4000,15],f4[400,4000,15]',
title: 'custom time range, no boundaries set'
}
];
beforeEach(function () {
sinon.stub(App, 'dateTime').returns(4000000);
});
afterEach(function () {
App.dateTime.restore();
});
cases.forEach(function (item) {
it(item.title, function () {
var context = Em.Object.create({
timeUnitSeconds: 3600,
currentTimeIndex: item.currentTimeIndex,
customStartTime: item.customStartTime,
customEndTime: item.customEndTime
});
var request = {
name: 'r1',
context: context,
fields: ['f3', 'f4']
};
expect(aggregator.formatRequestData(request)).to.equal(item.result);
});
});
});
});