mirror of
https://github.com/nasa/openmct.git
synced 2024-12-21 22:17:49 +00:00
Added tests for MeanTelemetryProvider
This commit is contained in:
parent
0a9ea48355
commit
8a66731271
@ -1,33 +1,55 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2017, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is licensed 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.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
define(['./src/MeanTelemetryProvider'], function (MeanTelemetryProvider) {
|
define(['./src/MeanTelemetryProvider'], function (MeanTelemetryProvider) {
|
||||||
var DEFAULT_SAMPLES = 10;
|
var DEFAULT_SAMPLES = 10;
|
||||||
|
|
||||||
function plugin() {
|
function plugin() {
|
||||||
return function install(openmct) {
|
return function install(openmct) {
|
||||||
openmct.types.addType('telemetry-mean', {
|
openmct.types.addType('telemetry-mean', {
|
||||||
name: 'Telemetry Mean',
|
name: 'Telemetry Filter',
|
||||||
description: 'Provides telemetry values that represent the mean of the last N values of a telemetry stream',
|
description: 'Provides telemetry values that represent the mean of the last N values of a telemetry stream',
|
||||||
creatable: true,
|
creatable: true,
|
||||||
cssClass: 'icon-telemetry',
|
cssClass: 'icon-telemetry',
|
||||||
initialize: function (domainObject) {
|
initialize: function (domainObject) {
|
||||||
domainObject.samples = DEFAULT_SAMPLES;
|
domainObject.samples = DEFAULT_SAMPLES;
|
||||||
domainObject.telemetry = {};
|
domainObject.telemetry = {};
|
||||||
domainObject.telemetry.values =
|
domainObject.telemetry.values =
|
||||||
openmct.time.getAllTimeSystems().map(function (timeSystem, index) {
|
openmct.time.getAllTimeSystems().map(function (timeSystem, index) {
|
||||||
return {
|
return {
|
||||||
key: timeSystem.key,
|
key: timeSystem.key,
|
||||||
name: timeSystem.name,
|
name: timeSystem.name,
|
||||||
hints: {
|
hints: {
|
||||||
domain: index + 1
|
domain: index + 1
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
});
|
});
|
||||||
domainObject.telemetry.values.push({
|
domainObject.telemetry.values.push({
|
||||||
key: "value",
|
key: "value",
|
||||||
name: "Value",
|
name: "Value",
|
||||||
hints: {
|
hints: {
|
||||||
range: 1
|
range: 1
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
form: [
|
form: [
|
||||||
{
|
{
|
||||||
@ -44,7 +66,7 @@ define(['./src/MeanTelemetryProvider'], function (MeanTelemetryProvider) {
|
|||||||
"required": true,
|
"required": true,
|
||||||
"cssClass": "l-input-sm"
|
"cssClass": "l-input-sm"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
openmct.telemetry.addProvider(new MeanTelemetryProvider(openmct));
|
openmct.telemetry.addProvider(new MeanTelemetryProvider(openmct));
|
||||||
};
|
};
|
||||||
|
@ -19,7 +19,8 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
/*jshint latedef: nofunc */
|
||||||
|
/*global console */
|
||||||
define([
|
define([
|
||||||
'../../../api/objects/object-utils',
|
'../../../api/objects/object-utils',
|
||||||
'./TelemetryAverager'
|
'./TelemetryAverager'
|
||||||
@ -47,18 +48,20 @@ define([
|
|||||||
var objectId = objectUtils.parseKeyString(domainObject.telemetryPoint);
|
var objectId = objectUtils.parseKeyString(domainObject.telemetryPoint);
|
||||||
var samples = domainObject.samples;
|
var samples = domainObject.samples;
|
||||||
|
|
||||||
this.objectAPI.get(objectId).then(function (linkedDomainObject) {
|
this.objectAPI.get(objectId)
|
||||||
if (!unsubscribeCalled) {
|
.then(function (linkedDomainObject) {
|
||||||
wrappedUnsubscribe = this.subscribeToAverage(linkedDomainObject, samples, callback);
|
if (!unsubscribeCalled) {
|
||||||
}
|
wrappedUnsubscribe = this.subscribeToAverage(linkedDomainObject, samples, callback);
|
||||||
}.bind(this));
|
}
|
||||||
|
}.bind(this))
|
||||||
|
.catch(logError);
|
||||||
|
|
||||||
return function unsubscribe(){
|
return function unsubscribe() {
|
||||||
unsubscribeCalled = true;
|
unsubscribeCalled = true;
|
||||||
if (wrappedUnsubscribe !== undefined) {
|
if (wrappedUnsubscribe !== undefined) {
|
||||||
wrappedUnsubscribe();
|
wrappedUnsubscribe();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
MeanTelemetryProvider.prototype.subscribeToAverage = function (domainObject, samples, callback) {
|
MeanTelemetryProvider.prototype.subscribeToAverage = function (domainObject, samples, callback) {
|
||||||
@ -67,11 +70,11 @@ define([
|
|||||||
return this.telemetryAPI.subscribe(domainObject, function (telemetryDatum) {
|
return this.telemetryAPI.subscribe(domainObject, function (telemetryDatum) {
|
||||||
var avgData = telemetryAverager.createAverageDatum(telemetryDatum);
|
var avgData = telemetryAverager.createAverageDatum(telemetryDatum);
|
||||||
|
|
||||||
if (telemetryAverager.sampleCount() === samples){
|
if (telemetryAverager.sampleCount() === samples) {
|
||||||
callback(avgData);
|
callback(avgData);
|
||||||
}
|
}
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
}
|
};
|
||||||
|
|
||||||
MeanTelemetryProvider.prototype.request = function (domainObject, request) {
|
MeanTelemetryProvider.prototype.request = function (domainObject, request) {
|
||||||
var objectId = objectUtils.parseKeyString(domainObject.telemetryPoint);
|
var objectId = objectUtils.parseKeyString(domainObject.telemetryPoint);
|
||||||
@ -89,18 +92,18 @@ define([
|
|||||||
var averageData = [];
|
var averageData = [];
|
||||||
var telemetryAverager = new TelemetryAverager(this.telemetryAPI, this.timeAPI, domainObject, samples);
|
var telemetryAverager = new TelemetryAverager(this.telemetryAPI, this.timeAPI, domainObject, samples);
|
||||||
|
|
||||||
return this.telemetryAPI.request(domainObject, request).then(function (telemetryData){
|
return this.telemetryAPI.request(domainObject, request).then(function (telemetryData) {
|
||||||
telemetryData.forEach(function (datum){
|
telemetryData.forEach(function (datum) {
|
||||||
var avgData = telemetryAverager.createAverageDatum(datum);
|
var avgDatum = telemetryAverager.createAverageDatum(datum);
|
||||||
|
|
||||||
if (telemetryAverager.sampleCount() === samples){
|
if (telemetryAverager.sampleCount() === samples) {
|
||||||
averageData.push(avgData);
|
averageData.push(avgDatum);
|
||||||
}
|
}
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
|
|
||||||
return averageData;
|
return averageData;
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
}
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
@ -110,5 +113,13 @@ define([
|
|||||||
return this.objectAPI.get(objectId);
|
return this.objectAPI.get(objectId);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function logError(error) {
|
||||||
|
if (error.stack) {
|
||||||
|
console.error(error.stack);
|
||||||
|
} else {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return MeanTelemetryProvider;
|
return MeanTelemetryProvider;
|
||||||
});
|
});
|
||||||
|
460
src/plugins/telemetryMean/src/MeanTelemetryProviderSpec.js
Normal file
460
src/plugins/telemetryMean/src/MeanTelemetryProviderSpec.js
Normal file
@ -0,0 +1,460 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT Web is licensed 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.
|
||||||
|
*
|
||||||
|
* Open MCT Web includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
/*jshint latedef: nofunc */
|
||||||
|
define([
|
||||||
|
"./MeanTelemetryProvider",
|
||||||
|
"./MockTelemetryApi"
|
||||||
|
], function (
|
||||||
|
MeanTelemetryProvider,
|
||||||
|
MockTelemetryApi
|
||||||
|
) {
|
||||||
|
var RANGE_KEY = 'value';
|
||||||
|
|
||||||
|
describe("The Mean Telemetry Provider", function () {
|
||||||
|
var mockApi;
|
||||||
|
var meanTelemetryProvider;
|
||||||
|
var outstandingPromises = 0;
|
||||||
|
var mockDomainObject;
|
||||||
|
var associatedObject;
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
createMockApi();
|
||||||
|
setTimeSystemTo('utc');
|
||||||
|
createMockObjects();
|
||||||
|
meanTelemetryProvider = new MeanTelemetryProvider(mockApi);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("supports telemetry-mean objects only", function () {
|
||||||
|
var mockTelemetryMeanObject = mockObjectWithType('telemetry-mean');
|
||||||
|
var mockOtherObject = mockObjectWithType('other');
|
||||||
|
|
||||||
|
expect(meanTelemetryProvider.canProvideTelemetry(mockTelemetryMeanObject)).toBe(true);
|
||||||
|
expect(meanTelemetryProvider.canProvideTelemetry(mockOtherObject)).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("the subscribe function", function () {
|
||||||
|
var subscriptionCallback;
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
subscriptionCallback = jasmine.createSpy('subscriptionCallback');
|
||||||
|
});
|
||||||
|
|
||||||
|
it("subscribes to telemetry for the associated object", function () {
|
||||||
|
meanTelemetryProvider.subscribe(mockDomainObject);
|
||||||
|
|
||||||
|
expectObjectWasSubscribedTo(associatedObject);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns a function that unsubscribes from the associated object", function () {
|
||||||
|
var unsubscribe = meanTelemetryProvider.subscribe(mockDomainObject);
|
||||||
|
|
||||||
|
waitsFor(allPromisesToBeResolved);
|
||||||
|
runs(unsubscribe);
|
||||||
|
|
||||||
|
expectUnsubscribeFrom(associatedObject);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns an average only when the sample size is reached", function () {
|
||||||
|
var inputTelemetry = [
|
||||||
|
{'utc': 1, 'defaultRange': 123.1231},
|
||||||
|
{'utc': 2, 'defaultRange': 321.3223},
|
||||||
|
{'utc': 3, 'defaultRange': 111.4446},
|
||||||
|
{'utc': 4, 'defaultRange': 555.2313}
|
||||||
|
];
|
||||||
|
|
||||||
|
setSampleSize(5);
|
||||||
|
meanTelemetryProvider.subscribe(mockDomainObject, subscriptionCallback);
|
||||||
|
feedInputTelemetry(inputTelemetry);
|
||||||
|
|
||||||
|
expectNoAverageForTelemetry(inputTelemetry);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("correctly averages a sample of five values", function () {
|
||||||
|
var inputTelemetry = [
|
||||||
|
{'utc': 1, 'defaultRange': 123.1231},
|
||||||
|
{'utc': 2, 'defaultRange': 321.3223},
|
||||||
|
{'utc': 3, 'defaultRange': 111.4446},
|
||||||
|
{'utc': 4, 'defaultRange': 555.2313},
|
||||||
|
{'utc': 5, 'defaultRange': 1.1231}
|
||||||
|
];
|
||||||
|
var expectedAverages = [{
|
||||||
|
'utc': 5, 'value': 222.44888
|
||||||
|
}];
|
||||||
|
|
||||||
|
setSampleSize(5);
|
||||||
|
meanTelemetryProvider.subscribe(mockDomainObject, subscriptionCallback);
|
||||||
|
feedInputTelemetry(inputTelemetry);
|
||||||
|
|
||||||
|
expectAveragesForTelemetry(expectedAverages, inputTelemetry);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("correctly averages a sample of ten values", function () {
|
||||||
|
var inputTelemetry = [
|
||||||
|
{'utc': 1, 'defaultRange': 123.1231},
|
||||||
|
{'utc': 2, 'defaultRange': 321.3223},
|
||||||
|
{'utc': 3, 'defaultRange': 111.4446},
|
||||||
|
{'utc': 4, 'defaultRange': 555.2313},
|
||||||
|
{'utc': 5, 'defaultRange': 1.1231},
|
||||||
|
{'utc': 6, 'defaultRange': 2323.12},
|
||||||
|
{'utc': 7, 'defaultRange': 532.12},
|
||||||
|
{'utc': 8, 'defaultRange': 453.543},
|
||||||
|
{'utc': 9, 'defaultRange': 89.2111},
|
||||||
|
{'utc': 10, 'defaultRange': 0.543}
|
||||||
|
];
|
||||||
|
var expectedAverages = [{
|
||||||
|
'utc': 10, 'value': 451.07815
|
||||||
|
}];
|
||||||
|
|
||||||
|
setSampleSize(10);
|
||||||
|
meanTelemetryProvider.subscribe(mockDomainObject, subscriptionCallback);
|
||||||
|
feedInputTelemetry(inputTelemetry);
|
||||||
|
|
||||||
|
expectAveragesForTelemetry(expectedAverages, inputTelemetry);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("only averages values within its sample window", function () {
|
||||||
|
var inputTelemetry = [
|
||||||
|
{'utc': 1, 'defaultRange': 123.1231},
|
||||||
|
{'utc': 2, 'defaultRange': 321.3223},
|
||||||
|
{'utc': 3, 'defaultRange': 111.4446},
|
||||||
|
{'utc': 4, 'defaultRange': 555.2313},
|
||||||
|
{'utc': 5, 'defaultRange': 1.1231},
|
||||||
|
{'utc': 6, 'defaultRange': 2323.12},
|
||||||
|
{'utc': 7, 'defaultRange': 532.12},
|
||||||
|
{'utc': 8, 'defaultRange': 453.543},
|
||||||
|
{'utc': 9, 'defaultRange': 89.2111},
|
||||||
|
{'utc': 10, 'defaultRange': 0.543}
|
||||||
|
];
|
||||||
|
var expectedAverages = [
|
||||||
|
{'utc': 5, 'value': 222.44888},
|
||||||
|
{'utc': 6, 'value': 662.4482599999999},
|
||||||
|
{'utc': 7, 'value': 704.6078},
|
||||||
|
{'utc': 8, 'value': 773.02748},
|
||||||
|
{'utc': 9, 'value': 679.8234399999999},
|
||||||
|
{'utc': 10, 'value': 679.70742}
|
||||||
|
];
|
||||||
|
|
||||||
|
setSampleSize(5);
|
||||||
|
meanTelemetryProvider.subscribe(mockDomainObject, subscriptionCallback);
|
||||||
|
feedInputTelemetry(inputTelemetry);
|
||||||
|
|
||||||
|
expectAveragesForTelemetry(expectedAverages, inputTelemetry);
|
||||||
|
});
|
||||||
|
describe("given telemetry input with range values", function () {
|
||||||
|
var inputTelemetry;
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
inputTelemetry = [{
|
||||||
|
'utc': 1,
|
||||||
|
'rangeKey': 5678,
|
||||||
|
'otherKey': 9999
|
||||||
|
}];
|
||||||
|
setSampleSize(1);
|
||||||
|
});
|
||||||
|
it("uses the 'rangeKey' input range, when it is the default, to calculate the average", function () {
|
||||||
|
var averageTelemetryForRangeKey = [{
|
||||||
|
'utc': 1,
|
||||||
|
'value': 5678
|
||||||
|
}];
|
||||||
|
|
||||||
|
meanTelemetryProvider.subscribe(mockDomainObject, subscriptionCallback);
|
||||||
|
mockApi.telemetry.setDefaultRangeTo('rangeKey');
|
||||||
|
feedInputTelemetry(inputTelemetry);
|
||||||
|
|
||||||
|
expectAveragesForTelemetry(averageTelemetryForRangeKey, inputTelemetry);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("uses the 'otherKey' input range, when it is the default, to calculate the average", function () {
|
||||||
|
var averageTelemetryForOtherKey = [{
|
||||||
|
'utc': 1,
|
||||||
|
'value': 9999
|
||||||
|
}];
|
||||||
|
|
||||||
|
meanTelemetryProvider.subscribe(mockDomainObject, subscriptionCallback);
|
||||||
|
mockApi.telemetry.setDefaultRangeTo('otherKey');
|
||||||
|
feedInputTelemetry(inputTelemetry);
|
||||||
|
|
||||||
|
expectAveragesForTelemetry(averageTelemetryForOtherKey, inputTelemetry);
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
||||||
|
describe("given telemetry input with range values", function () {
|
||||||
|
var inputTelemetry;
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
inputTelemetry = [{
|
||||||
|
'utc': 1,
|
||||||
|
'rangeKey': 5678,
|
||||||
|
'otherKey': 9999
|
||||||
|
}];
|
||||||
|
setSampleSize(1);
|
||||||
|
});
|
||||||
|
it("uses the 'rangeKey' input range, when it is the default, to calculate the average", function () {
|
||||||
|
var averageTelemetryForRangeKey = [{
|
||||||
|
'utc': 1,
|
||||||
|
'value': 5678
|
||||||
|
}];
|
||||||
|
|
||||||
|
meanTelemetryProvider.subscribe(mockDomainObject, subscriptionCallback);
|
||||||
|
mockApi.telemetry.setDefaultRangeTo('rangeKey');
|
||||||
|
feedInputTelemetry(inputTelemetry);
|
||||||
|
|
||||||
|
expectAveragesForTelemetry(averageTelemetryForRangeKey, inputTelemetry);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("uses the 'otherKey' input range, when it is the default, to calculate the average", function () {
|
||||||
|
var averageTelemetryForOtherKey = [{
|
||||||
|
'utc': 1,
|
||||||
|
'value': 9999
|
||||||
|
}];
|
||||||
|
|
||||||
|
meanTelemetryProvider.subscribe(mockDomainObject, subscriptionCallback);
|
||||||
|
mockApi.telemetry.setDefaultRangeTo('otherKey');
|
||||||
|
feedInputTelemetry(inputTelemetry);
|
||||||
|
|
||||||
|
expectAveragesForTelemetry(averageTelemetryForOtherKey, inputTelemetry);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function feedInputTelemetry(inputTelemetry) {
|
||||||
|
waitsFor(allPromisesToBeResolved);
|
||||||
|
runs(function () {
|
||||||
|
inputTelemetry.forEach(mockApi.telemetry.mockReceiveTelemetry);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function expectNoAverageForTelemetry(inputTelemetry) {
|
||||||
|
waitsFor(allPromisesToBeResolved);
|
||||||
|
runs(function () {
|
||||||
|
expect(subscriptionCallback).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function expectAveragesForTelemetry(expectedAverages) {
|
||||||
|
waitsFor(allPromisesToBeResolved);
|
||||||
|
runs(function () {
|
||||||
|
expectedAverages.forEach(function (averageDatum) {
|
||||||
|
expect(subscriptionCallback).toHaveBeenCalledWith(averageDatum);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function expectObjectWasSubscribedTo(object) {
|
||||||
|
waitsFor(allPromisesToBeResolved);
|
||||||
|
runs(function () {
|
||||||
|
expect(mockApi.telemetry.subscribe).toHaveBeenCalledWith(object, jasmine.any(Function));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function expectUnsubscribeFrom() {
|
||||||
|
waitsFor(allPromisesToBeResolved);
|
||||||
|
runs(function () {
|
||||||
|
expect(mockApi.telemetry.unsubscribe).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("the request function", function () {
|
||||||
|
|
||||||
|
it("requests telemetry for the associated object", function () {
|
||||||
|
meanTelemetryProvider.request(mockDomainObject);
|
||||||
|
|
||||||
|
expectTelemetryToBeRequestedFor(associatedObject);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns an average only when the sample size is reached", function () {
|
||||||
|
var inputTelemetry = [
|
||||||
|
{'utc': 1, 'defaultRange': 123.1231},
|
||||||
|
{'utc': 2, 'defaultRange': 321.3223},
|
||||||
|
{'utc': 3, 'defaultRange': 111.4446},
|
||||||
|
{'utc': 4, 'defaultRange': 555.2313}
|
||||||
|
];
|
||||||
|
var promiseForAverage;
|
||||||
|
|
||||||
|
setSampleSize(5);
|
||||||
|
whenTelemetryRequestedReturn(inputTelemetry);
|
||||||
|
promiseForAverage = meanTelemetryProvider.request(mockDomainObject);
|
||||||
|
|
||||||
|
expectEmptyResponse(promiseForAverage);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("correctly averages a sample of five values", function () {
|
||||||
|
var inputTelemetry = [
|
||||||
|
{'utc': 1, 'defaultRange': 123.1231},
|
||||||
|
{'utc': 2, 'defaultRange': 321.3223},
|
||||||
|
{'utc': 3, 'defaultRange': 111.4446},
|
||||||
|
{'utc': 4, 'defaultRange': 555.2313},
|
||||||
|
{'utc': 5, 'defaultRange': 1.1231}
|
||||||
|
];
|
||||||
|
var promiseForAverage;
|
||||||
|
|
||||||
|
setSampleSize(5);
|
||||||
|
whenTelemetryRequestedReturn(inputTelemetry);
|
||||||
|
promiseForAverage = meanTelemetryProvider.request(mockDomainObject);
|
||||||
|
|
||||||
|
expectAverageToBe(222.44888, promiseForAverage);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("correctly averages a sample of ten values", function () {
|
||||||
|
var inputTelemetry = [
|
||||||
|
{'utc': 1, 'defaultRange': 123.1231},
|
||||||
|
{'utc': 2, 'defaultRange': 321.3223},
|
||||||
|
{'utc': 3, 'defaultRange': 111.4446},
|
||||||
|
{'utc': 4, 'defaultRange': 555.2313},
|
||||||
|
{'utc': 5, 'defaultRange': 1.1231},
|
||||||
|
{'utc': 6, 'defaultRange': 2323.12},
|
||||||
|
{'utc': 7, 'defaultRange': 532.12},
|
||||||
|
{'utc': 8, 'defaultRange': 453.543},
|
||||||
|
{'utc': 9, 'defaultRange': 89.2111},
|
||||||
|
{'utc': 10, 'defaultRange': 0.543}
|
||||||
|
];
|
||||||
|
var promiseForAverage;
|
||||||
|
|
||||||
|
setSampleSize(10);
|
||||||
|
whenTelemetryRequestedReturn(inputTelemetry);
|
||||||
|
promiseForAverage = meanTelemetryProvider.request(mockDomainObject);
|
||||||
|
|
||||||
|
expectAverageToBe(451.07815, promiseForAverage);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("only averages values within its sample window", function () {
|
||||||
|
var inputTelemetry = [
|
||||||
|
{'utc': 1, 'defaultRange': 123.1231},
|
||||||
|
{'utc': 2, 'defaultRange': 321.3223},
|
||||||
|
{'utc': 3, 'defaultRange': 111.4446},
|
||||||
|
{'utc': 4, 'defaultRange': 555.2313},
|
||||||
|
{'utc': 5, 'defaultRange': 1.1231},
|
||||||
|
{'utc': 6, 'defaultRange': 2323.12},
|
||||||
|
{'utc': 7, 'defaultRange': 532.12},
|
||||||
|
{'utc': 8, 'defaultRange': 453.543},
|
||||||
|
{'utc': 9, 'defaultRange': 89.2111},
|
||||||
|
{'utc': 10, 'defaultRange': 0.543}
|
||||||
|
];
|
||||||
|
var promiseForAverage;
|
||||||
|
|
||||||
|
setSampleSize(5);
|
||||||
|
whenTelemetryRequestedReturn(inputTelemetry);
|
||||||
|
promiseForAverage = meanTelemetryProvider.request(mockDomainObject);
|
||||||
|
|
||||||
|
expectAverageToBe(679.70742, promiseForAverage);
|
||||||
|
});
|
||||||
|
|
||||||
|
function expectAverageToBe(expectedValue, promiseForAverage) {
|
||||||
|
var averageData;
|
||||||
|
|
||||||
|
promiseForAverage.then(function (data) {
|
||||||
|
averageData = data;
|
||||||
|
});
|
||||||
|
|
||||||
|
waitsFor(function () {
|
||||||
|
return averageData !== undefined;
|
||||||
|
}, 'data to return from request', 1);
|
||||||
|
runs(function () {
|
||||||
|
var averageDatum = averageData[averageData.length - 1];
|
||||||
|
expect(averageDatum[RANGE_KEY]).toBe(expectedValue);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function expectEmptyResponse(promiseForAverage) {
|
||||||
|
var averageData;
|
||||||
|
|
||||||
|
promiseForAverage.then(function (data) {
|
||||||
|
averageData = data;
|
||||||
|
});
|
||||||
|
|
||||||
|
waitsFor(function () {
|
||||||
|
return averageData !== undefined;
|
||||||
|
}, 'data to return from request', 1);
|
||||||
|
runs(function () {
|
||||||
|
expect(averageData.length).toBe(0);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function whenTelemetryRequestedReturn(telemetry) {
|
||||||
|
mockApi.telemetry.request.andReturn(resolvePromiseWith(telemetry));
|
||||||
|
}
|
||||||
|
|
||||||
|
function expectTelemetryToBeRequestedFor(object) {
|
||||||
|
waitsFor(allPromisesToBeResolved);
|
||||||
|
runs(function () {
|
||||||
|
expect(mockApi.telemetry.request).toHaveBeenCalledWith(object, undefined);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function createMockObjects() {
|
||||||
|
mockDomainObject = {
|
||||||
|
telemetryPoint: 'someTelemetryPoint'
|
||||||
|
};
|
||||||
|
associatedObject = {};
|
||||||
|
mockApi.objects.get.andReturn(resolvePromiseWith(associatedObject));
|
||||||
|
}
|
||||||
|
|
||||||
|
function setSampleSize(sampleSize) {
|
||||||
|
mockDomainObject.samples = sampleSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createMockApi() {
|
||||||
|
mockApi = {
|
||||||
|
telemetry: new MockTelemetryApi(),
|
||||||
|
objects: createMockObjectApi(),
|
||||||
|
time: createMockTimeApi()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function createMockObjectApi() {
|
||||||
|
return jasmine.createSpyObj('ObjectAPI', [
|
||||||
|
'get'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
function mockObjectWithType(type) {
|
||||||
|
return {
|
||||||
|
type: type
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolvePromiseWith(value) {
|
||||||
|
outstandingPromises++;
|
||||||
|
return Promise.resolve(value).then(function () {
|
||||||
|
outstandingPromises--;
|
||||||
|
return value;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function allPromisesToBeResolved() {
|
||||||
|
return outstandingPromises === 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createMockTimeApi() {
|
||||||
|
return jasmine.createSpyObj("timeApi", ['timeSystem']);
|
||||||
|
}
|
||||||
|
|
||||||
|
function setTimeSystemTo(timeSystemKey) {
|
||||||
|
mockApi.time.timeSystem.andReturn({
|
||||||
|
key: timeSystemKey
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
106
src/plugins/telemetryMean/src/MockTelemetryApi.js
Normal file
106
src/plugins/telemetryMean/src/MockTelemetryApi.js
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2017, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is licensed 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.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
/*global jasmine, spyOn */
|
||||||
|
define([], function () {
|
||||||
|
|
||||||
|
function MockTelemetryApi() {
|
||||||
|
this.createSpy('subscribe');
|
||||||
|
this.createSpy('getMetadata');
|
||||||
|
|
||||||
|
this.metadata = this.createMockMetadata();
|
||||||
|
this.setDefaultRangeTo('defaultRange');
|
||||||
|
this.unsubscribe = jasmine.createSpy('unsubscribe');
|
||||||
|
this.mockReceiveTelemetry = this.mockReceiveTelemetry.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
MockTelemetryApi.prototype.subscribe = function () {
|
||||||
|
return this.unsubscribe;
|
||||||
|
};
|
||||||
|
|
||||||
|
MockTelemetryApi.prototype.getMetadata = function (object) {
|
||||||
|
return this.metadata;
|
||||||
|
};
|
||||||
|
|
||||||
|
MockTelemetryApi.prototype.request = jasmine.createSpy('request');
|
||||||
|
|
||||||
|
MockTelemetryApi.prototype.getValueFormatter = function (valueMetadata) {
|
||||||
|
var mockValueFormatter = jasmine.createSpyObj("valueFormatter", [
|
||||||
|
"parse"
|
||||||
|
]);
|
||||||
|
|
||||||
|
mockValueFormatter.parse.andCallFake(function (value) {
|
||||||
|
return value[valueMetadata.key];
|
||||||
|
});
|
||||||
|
|
||||||
|
return mockValueFormatter;
|
||||||
|
};
|
||||||
|
|
||||||
|
MockTelemetryApi.prototype.mockReceiveTelemetry = function (newTelemetryDatum) {
|
||||||
|
var subscriptionCallback = this.subscribe.mostRecentCall.args[1];
|
||||||
|
subscriptionCallback(newTelemetryDatum);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
MockTelemetryApi.prototype.onRequestReturn = function (telemetryData) {
|
||||||
|
this.requestTelemetry = telemetryData;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
MockTelemetryApi.prototype.setDefaultRangeTo = function (rangeKey) {
|
||||||
|
var mockMetadataValue = {
|
||||||
|
key: rangeKey
|
||||||
|
};
|
||||||
|
this.metadata.valuesForHints.andReturn([mockMetadataValue]);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
MockTelemetryApi.prototype.createMockMetadata = function () {
|
||||||
|
var mockMetadata = jasmine.createSpyObj("metadata", [
|
||||||
|
'value',
|
||||||
|
'valuesForHints'
|
||||||
|
]);
|
||||||
|
|
||||||
|
mockMetadata.value.andCallFake(function (key) {
|
||||||
|
return {
|
||||||
|
key: key
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return mockMetadata;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
MockTelemetryApi.prototype.createSpy = function (functionName) {
|
||||||
|
this[functionName] = this[functionName].bind(this);
|
||||||
|
spyOn(this, functionName);
|
||||||
|
this[functionName].andCallThrough();
|
||||||
|
};
|
||||||
|
|
||||||
|
return MockTelemetryApi;
|
||||||
|
});
|
@ -30,10 +30,10 @@ define([], function () {
|
|||||||
this.samples = samples;
|
this.samples = samples;
|
||||||
this.averagingWindow = [];
|
this.averagingWindow = [];
|
||||||
|
|
||||||
this.rangeKey = undefined
|
this.rangeKey = undefined;
|
||||||
this.rangeFormatter = undefined;
|
this.rangeFormatter = undefined;
|
||||||
this.setRangeKeyAndFormatter();
|
this.setRangeKeyAndFormatter();
|
||||||
|
|
||||||
// Defined dynamically based on current time system
|
// Defined dynamically based on current time system
|
||||||
this.domainKey = undefined;
|
this.domainKey = undefined;
|
||||||
this.domainFormatter = undefined;
|
this.domainFormatter = undefined;
|
||||||
@ -44,16 +44,16 @@ define([], function () {
|
|||||||
|
|
||||||
var timeValue = this.domainFormatter.parse(telemetryDatum);
|
var timeValue = this.domainFormatter.parse(telemetryDatum);
|
||||||
var rangeValue = this.rangeFormatter.parse(telemetryDatum);
|
var rangeValue = this.rangeFormatter.parse(telemetryDatum);
|
||||||
|
|
||||||
this.averagingWindow.push(rangeValue);
|
this.averagingWindow.push(rangeValue);
|
||||||
if (this.averagingWindow.length > this.samples) {
|
if (this.averagingWindow.length > this.samples) {
|
||||||
this.averagingWindow.shift();
|
this.averagingWindow.shift();
|
||||||
}
|
}
|
||||||
var averageValue = this.calculateMean();
|
var averageValue = this.calculateMean();
|
||||||
|
|
||||||
var meanDatum = {};
|
var meanDatum = {};
|
||||||
meanDatum[this.domainKey] = timeValue;
|
meanDatum[this.domainKey] = timeValue;
|
||||||
meanDatum['value'] = averageValue
|
meanDatum.value = averageValue;
|
||||||
|
|
||||||
return meanDatum;
|
return meanDatum;
|
||||||
};
|
};
|
||||||
@ -92,7 +92,7 @@ define([], function () {
|
|||||||
|
|
||||||
this.rangeKey = rangeValues[0].key;
|
this.rangeKey = rangeValues[0].key;
|
||||||
this.rangeFormatter = this.getFormatter(this.rangeKey);
|
this.rangeFormatter = this.getFormatter(this.rangeKey);
|
||||||
}
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
|
Loading…
Reference in New Issue
Block a user