mirror of
https://github.com/nasa/openmct.git
synced 2025-02-23 10:30:29 +00:00
Warn user if telemetry not all telemetry metadata matches time system (#4996)
* warn user if telemetry not all telemetry metadata matches time system * create spec file for telemetry collections * Add tests (#4999) - Test for warn if metadata does not match active TimeSystem - Test for no warn if metadata matches active TimeSystem * unset timeKey if no matching domain found * Extract errors to constants file and update tests Co-authored-by: Jesse Mazzella <jesse.d.mazzella@nasa.gov>
This commit is contained in:
parent
09da373d1c
commit
03e7d912be
src/api/telemetry
@ -22,11 +22,7 @@
|
|||||||
|
|
||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import EventEmitter from 'EventEmitter';
|
import EventEmitter from 'EventEmitter';
|
||||||
|
import { LOADED_ERROR, TIMESYSTEM_KEY_NOTIFICATION, TIMESYSTEM_KEY_WARNING } from './constants';
|
||||||
const ERRORS = {
|
|
||||||
TIMESYSTEM_KEY: 'All telemetry metadata must have a telemetry value with a key that matches the key of the active time system.',
|
|
||||||
LOADED: 'Telemetry Collection has already been loaded.'
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Class representing a Telemetry Collection. */
|
/** Class representing a Telemetry Collection. */
|
||||||
|
|
||||||
@ -61,7 +57,7 @@ export class TelemetryCollection extends EventEmitter {
|
|||||||
*/
|
*/
|
||||||
load() {
|
load() {
|
||||||
if (this.loaded) {
|
if (this.loaded) {
|
||||||
this._error(ERRORS.LOADED);
|
this._error(LOADED_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._setTimeSystem(this.openmct.time.timeSystem());
|
this._setTimeSystem(this.openmct.time.timeSystem());
|
||||||
@ -267,6 +263,10 @@ export class TelemetryCollection extends EventEmitter {
|
|||||||
this.lastBounds = bounds;
|
this.lastBounds = bounds;
|
||||||
|
|
||||||
if (isTick) {
|
if (isTick) {
|
||||||
|
if (this.timeKey === undefined) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// need to check futureBuffer and need to check
|
// need to check futureBuffer and need to check
|
||||||
// if anything has fallen out of bounds
|
// if anything has fallen out of bounds
|
||||||
let startIndex = 0;
|
let startIndex = 0;
|
||||||
@ -306,7 +306,6 @@ export class TelemetryCollection extends EventEmitter {
|
|||||||
if (added.length > 0) {
|
if (added.length > 0) {
|
||||||
this.emit('add', added);
|
this.emit('add', added);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// user bounds change, reset
|
// user bounds change, reset
|
||||||
this._reset();
|
this._reset();
|
||||||
@ -326,12 +325,16 @@ export class TelemetryCollection extends EventEmitter {
|
|||||||
let domains = this.metadata.valuesForHints(['domain']);
|
let domains = this.metadata.valuesForHints(['domain']);
|
||||||
let domain = domains.find((d) => d.key === timeSystem.key);
|
let domain = domains.find((d) => d.key === timeSystem.key);
|
||||||
|
|
||||||
if (domain === undefined) {
|
if (domain !== undefined) {
|
||||||
this._error(ERRORS.TIMESYSTEM_KEY);
|
// timeKey is used to create a dummy datum used for sorting
|
||||||
|
this.timeKey = domain.source;
|
||||||
|
} else {
|
||||||
|
this.timeKey = undefined;
|
||||||
|
|
||||||
|
this._warn(TIMESYSTEM_KEY_WARNING);
|
||||||
|
this.openmct.notifications.alert(TIMESYSTEM_KEY_NOTIFICATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
// timeKey is used to create a dummy datum used for sorting
|
|
||||||
this.timeKey = domain.source; // this defaults to key if no source is set
|
|
||||||
let metadataValue = this.metadata.value(timeSystem.key) || { format: timeSystem.key };
|
let metadataValue = this.metadata.value(timeSystem.key) || { format: timeSystem.key };
|
||||||
let valueFormatter = this.openmct.telemetry.getValueFormatter(metadataValue);
|
let valueFormatter = this.openmct.telemetry.getValueFormatter(metadataValue);
|
||||||
|
|
||||||
@ -402,4 +405,8 @@ export class TelemetryCollection extends EventEmitter {
|
|||||||
_error(message) {
|
_error(message) {
|
||||||
throw new Error(message);
|
throw new Error(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_warn(message) {
|
||||||
|
console.warn(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
101
src/api/telemetry/TelemetryCollectionSpec.js
Normal file
101
src/api/telemetry/TelemetryCollectionSpec.js
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2022, 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.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
import {
|
||||||
|
createOpenMct,
|
||||||
|
resetApplicationState
|
||||||
|
} from 'utils/testing';
|
||||||
|
import { TIMESYSTEM_KEY_WARNING } from './constants';
|
||||||
|
|
||||||
|
describe('Telemetry Collection', () => {
|
||||||
|
let openmct;
|
||||||
|
let mockMetadataProvider;
|
||||||
|
let mockMetadata = {};
|
||||||
|
let domainObject;
|
||||||
|
|
||||||
|
beforeEach(done => {
|
||||||
|
openmct = createOpenMct();
|
||||||
|
openmct.on('start', done);
|
||||||
|
|
||||||
|
domainObject = {
|
||||||
|
identifier: {
|
||||||
|
key: 'a',
|
||||||
|
namespace: 'b'
|
||||||
|
},
|
||||||
|
type: 'sample-type'
|
||||||
|
};
|
||||||
|
|
||||||
|
mockMetadataProvider = {
|
||||||
|
key: 'mockMetadataProvider',
|
||||||
|
supportsMetadata() {
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
getMetadata() {
|
||||||
|
return mockMetadata;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
openmct.telemetry.addProvider(mockMetadataProvider);
|
||||||
|
openmct.startHeadless();
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
return resetApplicationState();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Warns if telemetry metadata does not match the active timesystem', () => {
|
||||||
|
mockMetadata.values = [
|
||||||
|
{
|
||||||
|
key: 'foo',
|
||||||
|
name: 'Bar',
|
||||||
|
hints: {
|
||||||
|
domain: 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
const telemetryCollection = openmct.telemetry.requestCollection(domainObject);
|
||||||
|
spyOn(telemetryCollection, '_warn');
|
||||||
|
telemetryCollection.load();
|
||||||
|
|
||||||
|
expect(telemetryCollection._warn).toHaveBeenCalledOnceWith(TIMESYSTEM_KEY_WARNING);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Does not warn if telemetry metadata matches the active timesystem', () => {
|
||||||
|
mockMetadata.values = [
|
||||||
|
{
|
||||||
|
key: 'utc',
|
||||||
|
name: 'Timestamp',
|
||||||
|
format: 'utc',
|
||||||
|
hints: {
|
||||||
|
domain: 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
const telemetryCollection = openmct.telemetry.requestCollection(domainObject);
|
||||||
|
spyOn(telemetryCollection, '_warn');
|
||||||
|
telemetryCollection.load();
|
||||||
|
|
||||||
|
expect(telemetryCollection._warn).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
25
src/api/telemetry/constants.js
Normal file
25
src/api/telemetry/constants.js
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2022, 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.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
export const TIMESYSTEM_KEY_WARNING = 'All telemetry metadata must have a telemetry value with a key that matches the key of the active time system.';
|
||||||
|
export const TIMESYSTEM_KEY_NOTIFICATION = 'Telemetry metadata does not match the active time system.';
|
||||||
|
export const LOADED_ERROR = 'Telemetry Collection has already been loaded.';
|
Loading…
x
Reference in New Issue
Block a user