From f8464fa76fc5a7a9c9b6921bd42c86e771f6b38f Mon Sep 17 00:00:00 2001 From: Joshi Date: Fri, 27 Dec 2019 12:57:30 -0800 Subject: [PATCH] Adds telemetry criterion class and related tests --- .../condition/criterion/TelemetryCriterion.js | 83 ++++++++++++++ .../criterion/TelemetryCriterionSpec.js | 107 ++++++++++++++++++ 2 files changed, 190 insertions(+) create mode 100644 src/plugins/condition/criterion/TelemetryCriterion.js create mode 100644 src/plugins/condition/criterion/TelemetryCriterionSpec.js diff --git a/src/plugins/condition/criterion/TelemetryCriterion.js b/src/plugins/condition/criterion/TelemetryCriterion.js new file mode 100644 index 0000000000..9f02851a6e --- /dev/null +++ b/src/plugins/condition/criterion/TelemetryCriterion.js @@ -0,0 +1,83 @@ +/***************************************************************************** + * Open MCT, Copyright (c) 2014-2019, 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 * as EventEmitter from 'eventemitter3'; + +export default class TelemetryCriterion extends EventEmitter { + + constructor(telemetryDomainObject, openmct) { + super(); + + this.telemetryObject = telemetryDomainObject; + this.openmct = openmct; + this.telemetryAPI = this.openmct.telemetry; + this.subscription = null; + this.telemetryObjectIdAsString = null; + this.telemetryMetadata = null; + if (this.telemetryAPI.isTelemetryObject(this.telemetryObject)) { + this.telemetryObjectIdAsString = this.openmct.objects.makeKeyString(this.telemetryObject.identifier); + } + } + + handleSubscription(datum) { + //data is telemetry values, error + //how do I get data here? + this.emitResult(this.normalizeData(datum)); + } + + //TODO: Revisit this logic + normalizeData(datum) { + return { + [datum.key]: datum[datum.source] + } + } + + emitResult(data, error) { + this.emit('criterion::Update', { + identifier: this.telemetryObjectIdAsString, + data: data, + error: error + }); + } + + /** + * Subscribes to the telemetry object and returns an unsubscribe function + */ + subscribe() { + this.subscription = this.telemetryAPI.subscribe(this.telemetryObject, (datum) => { + this.handleSubscription(datum); + }); + } + + /** + * Calls an unsubscribe function returned by subscribe() and deletes any initialized data + */ + unsubscribe() { + //unsubscribe from telemetry source + this.subscription(); + delete this.subscription; + this.emit('criterion::Remove', this.telemetryObjectIdAsString); + delete this.telemetryObjectIdAsString; + delete this.telemetryObject; + delete this.telemetryMetadata; + } +} diff --git a/src/plugins/condition/criterion/TelemetryCriterionSpec.js b/src/plugins/condition/criterion/TelemetryCriterionSpec.js new file mode 100644 index 0000000000..f5b1bc3bc4 --- /dev/null +++ b/src/plugins/condition/criterion/TelemetryCriterionSpec.js @@ -0,0 +1,107 @@ +/***************************************************************************** + * Open MCT, Copyright (c) 2014-2019, 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 TelemetryCriterion from "./TelemetryCriterion"; +import { createOpenMct } from "../../../testTools"; + +let openmct, + mockListener, + testTelemetryObject, + telemetryCriterion; + +describe("The telemetry criterion", function () { + + beforeEach (() => { + openmct = createOpenMct(); + mockListener = jasmine.createSpy('listener'); + testTelemetryObject = { + identifier:{ namespace: "", key: "test-object"}, + type: "test-object", + name: "Test Object", + telemetry: { + values: [{ + key: "some-key", + name: "Some attribute", + hints: { + domain: 1 + } + }, { + key: "some-other-key", + name: "Another attribute", + hints: { + range: 1 + } + }] + } + }; + + telemetryCriterion = new TelemetryCriterion( + testTelemetryObject, + openmct + ); + + telemetryCriterion.on('criterion::Update', mockListener); + + }); + + it("initializes with a telemetry objectId as string", function () { + expect(telemetryCriterion.telemetryObjectIdAsString).toEqual(testTelemetryObject.identifier.key); + }); + + it("subscribes to telemetry providers", function () { + telemetryCriterion.subscribe(); + expect(telemetryCriterion.subscription).toBeDefined(); + }); + + it("normalizes telemetry data", function () { + let result = telemetryCriterion.normalizeData({ + key: 'some-key', + source: 'testSource', + testSource: 'Hello' + }); + expect(result).toEqual({ + 'some-key': 'Hello' + }) + }); + + it("emits update event on new data from telemetry providers", function () { + spyOn(telemetryCriterion, 'emitResult').and.callThrough(); + telemetryCriterion.handleSubscription({ + key: 'some-key', + source: 'testSource', + testSource: 'Hello' + }); + expect(telemetryCriterion.emitResult).toHaveBeenCalled(); + expect(mockListener).toHaveBeenCalled(); + }); + + it("un-subscribes from telemetry providers", function () { + telemetryCriterion.subscribe(); + expect(telemetryCriterion.subscription).toBeDefined(); + telemetryCriterion.unsubscribe(); + expect(telemetryCriterion.subscription).toBeUndefined(); + expect(telemetryCriterion.telemetryObjectIdAsString).toBeUndefined(); + expect(telemetryCriterion.telemetryObject).toBeUndefined(); + expect(telemetryCriterion.telemetryMetadata).toBeUndefined(); + }); + +});