diff --git a/src/api/telemetry/TelemetryCollection.js b/src/api/telemetry/TelemetryCollection.js index 4386a4729e..14085c2ad1 100644 --- a/src/api/telemetry/TelemetryCollection.js +++ b/src/api/telemetry/TelemetryCollection.js @@ -22,11 +22,7 @@ import _ from 'lodash'; import EventEmitter from 'EventEmitter'; - -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.' -}; +import { LOADED_ERROR, TIMESYSTEM_KEY_NOTIFICATION, TIMESYSTEM_KEY_WARNING } from './constants'; /** Class representing a Telemetry Collection. */ @@ -61,7 +57,7 @@ export class TelemetryCollection extends EventEmitter { */ load() { if (this.loaded) { - this._error(ERRORS.LOADED); + this._error(LOADED_ERROR); } this._setTimeSystem(this.openmct.time.timeSystem()); @@ -267,6 +263,10 @@ export class TelemetryCollection extends EventEmitter { this.lastBounds = bounds; if (isTick) { + if (this.timeKey === undefined) { + return; + } + // need to check futureBuffer and need to check // if anything has fallen out of bounds let startIndex = 0; @@ -306,7 +306,6 @@ export class TelemetryCollection extends EventEmitter { if (added.length > 0) { this.emit('add', added); } - } else { // user bounds change, reset this._reset(); @@ -326,12 +325,16 @@ export class TelemetryCollection extends EventEmitter { let domains = this.metadata.valuesForHints(['domain']); let domain = domains.find((d) => d.key === timeSystem.key); - if (domain === undefined) { - this._error(ERRORS.TIMESYSTEM_KEY); + if (domain !== undefined) { + // 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 valueFormatter = this.openmct.telemetry.getValueFormatter(metadataValue); @@ -402,4 +405,8 @@ export class TelemetryCollection extends EventEmitter { _error(message) { throw new Error(message); } + + _warn(message) { + console.warn(message); + } } diff --git a/src/api/telemetry/TelemetryCollectionSpec.js b/src/api/telemetry/TelemetryCollectionSpec.js new file mode 100644 index 0000000000..49907c3f5c --- /dev/null +++ b/src/api/telemetry/TelemetryCollectionSpec.js @@ -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(); + }); +}); diff --git a/src/api/telemetry/constants.js b/src/api/telemetry/constants.js new file mode 100644 index 0000000000..66b5c50bbe --- /dev/null +++ b/src/api/telemetry/constants.js @@ -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.';