From f8464fa76fc5a7a9c9b6921bd42c86e771f6b38f Mon Sep 17 00:00:00 2001 From: Joshi Date: Fri, 27 Dec 2019 12:57:30 -0800 Subject: [PATCH 1/5] 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(); + }); + +}); From fe3cc661d31f20a62109ccb1c6eb7ebeef91d830 Mon Sep 17 00:00:00 2001 From: Joshi Date: Wed, 8 Jan 2020 12:20:17 -0800 Subject: [PATCH 2/5] Fixes tests. --- src/plugins/condition/criterion/TelemetryCriterionSpec.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/plugins/condition/criterion/TelemetryCriterionSpec.js b/src/plugins/condition/criterion/TelemetryCriterionSpec.js index f5b1bc3bc4..c49cd96bd8 100644 --- a/src/plugins/condition/criterion/TelemetryCriterionSpec.js +++ b/src/plugins/condition/criterion/TelemetryCriterionSpec.js @@ -23,7 +23,7 @@ import TelemetryCriterion from "./TelemetryCriterion"; import { createOpenMct } from "../../../testTools"; -let openmct, +let openmct = createOpenMct(), mockListener, testTelemetryObject, telemetryCriterion; @@ -31,7 +31,6 @@ let openmct, describe("The telemetry criterion", function () { beforeEach (() => { - openmct = createOpenMct(); mockListener = jasmine.createSpy('listener'); testTelemetryObject = { identifier:{ namespace: "", key: "test-object"}, From 36055b7c0469aa28ee5a9df083213a02464b6754 Mon Sep 17 00:00:00 2001 From: Joshi Date: Thu, 9 Jan 2020 06:44:19 -0800 Subject: [PATCH 3/5] Changes name of emitted event --- src/plugins/condition/criterion/TelemetryCriterion.js | 2 +- src/plugins/condition/criterion/TelemetryCriterionSpec.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/condition/criterion/TelemetryCriterion.js b/src/plugins/condition/criterion/TelemetryCriterion.js index 9f02851a6e..0637c34269 100644 --- a/src/plugins/condition/criterion/TelemetryCriterion.js +++ b/src/plugins/condition/criterion/TelemetryCriterion.js @@ -52,7 +52,7 @@ export default class TelemetryCriterion extends EventEmitter { } emitResult(data, error) { - this.emit('criterion::Update', { + this.emit('criterionUpdated', { identifier: this.telemetryObjectIdAsString, data: data, error: error diff --git a/src/plugins/condition/criterion/TelemetryCriterionSpec.js b/src/plugins/condition/criterion/TelemetryCriterionSpec.js index c49cd96bd8..302e706dd7 100644 --- a/src/plugins/condition/criterion/TelemetryCriterionSpec.js +++ b/src/plugins/condition/criterion/TelemetryCriterionSpec.js @@ -58,7 +58,7 @@ describe("The telemetry criterion", function () { openmct ); - telemetryCriterion.on('criterion::Update', mockListener); + telemetryCriterion.on('criterionUpdated', mockListener); }); From 7cf6dc386f10b89f28c3d10b7b2856b19b62075d Mon Sep 17 00:00:00 2001 From: Joshi Date: Mon, 13 Jan 2020 13:58:25 -0800 Subject: [PATCH 4/5] Removes use of createOpenMCT and uses mock object for openmct instead. --- .../condition/criterion/TelemetryCriterion.js | 10 ++++++---- .../condition/criterion/TelemetryCriterionSpec.js | 14 ++++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/plugins/condition/criterion/TelemetryCriterion.js b/src/plugins/condition/criterion/TelemetryCriterion.js index 0637c34269..bfc38e2877 100644 --- a/src/plugins/condition/criterion/TelemetryCriterion.js +++ b/src/plugins/condition/criterion/TelemetryCriterion.js @@ -24,15 +24,15 @@ import * as EventEmitter from 'eventemitter3'; export default class TelemetryCriterion extends EventEmitter { - constructor(telemetryDomainObject, openmct) { + constructor(telemetryDomainObjectKey, openmct) { super(); - this.telemetryObject = telemetryDomainObject; this.openmct = openmct; + this.telemetryObject = this.openmct.objects.get(this.openmct.objects.makeKeyString(telemetryDomainObjectKey)); this.telemetryAPI = this.openmct.telemetry; this.subscription = null; - this.telemetryObjectIdAsString = null; this.telemetryMetadata = null; + this.telemetryObjectIdAsString = null; if (this.telemetryAPI.isTelemetryObject(this.telemetryObject)) { this.telemetryObjectIdAsString = this.openmct.objects.makeKeyString(this.telemetryObject.identifier); } @@ -73,7 +73,9 @@ export default class TelemetryCriterion extends EventEmitter { */ unsubscribe() { //unsubscribe from telemetry source - this.subscription(); + if (typeof this.subscription === 'function') { + this.subscription(); + } delete this.subscription; this.emit('criterion::Remove', this.telemetryObjectIdAsString); delete this.telemetryObjectIdAsString; diff --git a/src/plugins/condition/criterion/TelemetryCriterionSpec.js b/src/plugins/condition/criterion/TelemetryCriterionSpec.js index 302e706dd7..e85947f7ef 100644 --- a/src/plugins/condition/criterion/TelemetryCriterionSpec.js +++ b/src/plugins/condition/criterion/TelemetryCriterionSpec.js @@ -21,9 +21,8 @@ *****************************************************************************/ import TelemetryCriterion from "./TelemetryCriterion"; -import { createOpenMct } from "../../../testTools"; -let openmct = createOpenMct(), +let openmct = {}, mockListener, testTelemetryObject, telemetryCriterion; @@ -31,7 +30,6 @@ let openmct = createOpenMct(), describe("The telemetry criterion", function () { beforeEach (() => { - mockListener = jasmine.createSpy('listener'); testTelemetryObject = { identifier:{ namespace: "", key: "test-object"}, type: "test-object", @@ -52,9 +50,17 @@ describe("The telemetry criterion", function () { }] } }; + openmct.objects = jasmine.createSpyObj('objects', ['get', 'makeKeyString', ]); + openmct.objects.get.and.returnValue(testTelemetryObject); + openmct.objects.makeKeyString.and.returnValue(testTelemetryObject.identifier.key); + openmct.telemetry = jasmine.createSpyObj('telemetry', ['isTelemetryObject', "subscribe"]); + openmct.telemetry.isTelemetryObject.and.returnValue(true); + openmct.telemetry.subscribe.and.returnValue(function () {}); + + mockListener = jasmine.createSpy('listener'); telemetryCriterion = new TelemetryCriterion( - testTelemetryObject, + testTelemetryObject.identifier, openmct ); From 1ffe76a5251acd7bfdbd0425b262c60aec5863dd Mon Sep 17 00:00:00 2001 From: Joshi Date: Mon, 13 Jan 2020 14:09:59 -0800 Subject: [PATCH 5/5] Fixes linting issue. --- src/plugins/condition/criterion/TelemetryCriterionSpec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/condition/criterion/TelemetryCriterionSpec.js b/src/plugins/condition/criterion/TelemetryCriterionSpec.js index e85947f7ef..7218279e8b 100644 --- a/src/plugins/condition/criterion/TelemetryCriterionSpec.js +++ b/src/plugins/condition/criterion/TelemetryCriterionSpec.js @@ -50,7 +50,7 @@ describe("The telemetry criterion", function () { }] } }; - openmct.objects = jasmine.createSpyObj('objects', ['get', 'makeKeyString', ]); + openmct.objects = jasmine.createSpyObj('objects', ['get', 'makeKeyString']); openmct.objects.get.and.returnValue(testTelemetryObject); openmct.objects.makeKeyString.and.returnValue(testTelemetryObject.identifier.key); openmct.telemetry = jasmine.createSpyObj('telemetry', ['isTelemetryObject', "subscribe"]);