diff options
author | Shefali Joshi <simplyrender@gmail.com> | 2020-07-23 01:22:31 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-23 01:22:31 +0300 |
commit | afeb89a51abd6aa5fbefb3d5248242c1d3a7211d (patch) | |
tree | 6c2791b74c5e83bbc7ddf1a0a5e50bf751472731 | |
parent | 07992f0b2adb362698ba9ffe64b43a91e3333896 (diff) |
[VIPEROMCT-16] Creates a closure for telemetryObject so that requests can resolve correctly even if the telemetryObject is destroyed (#3210)v1.2-RC1
Co-authored-by: Deep Tailor <deep.j.tailor@nasa.gov>
3 files changed, 34 insertions, 4 deletions
diff --git a/src/plugins/condition/criterion/AllTelemetryCriterion.js b/src/plugins/condition/criterion/AllTelemetryCriterion.js index 8bce13bcc..e56263ec1 100644 --- a/src/plugins/condition/criterion/AllTelemetryCriterion.js +++ b/src/plugins/condition/criterion/AllTelemetryCriterion.js @@ -127,7 +127,7 @@ export default class AllTelemetryCriterion extends TelemetryCriterion { if (validatedData) { if (this.isStalenessCheck()) { - if (this.stalenessSubscription[validatedData.id]) { + if (this.stalenessSubscription && this.stalenessSubscription[validatedData.id]) { this.stalenessSubscription[validatedData.id].update(validatedData); } this.telemetryDataCache[validatedData.id] = false; diff --git a/src/plugins/condition/criterion/TelemetryCriterion.js b/src/plugins/condition/criterion/TelemetryCriterion.js index 1e39ae19b..cbc5f07bb 100644 --- a/src/plugins/condition/criterion/TelemetryCriterion.js +++ b/src/plugins/condition/criterion/TelemetryCriterion.js @@ -142,12 +142,14 @@ export default class TelemetryCriterion extends EventEmitter { }; } + let telemetryObject = this.telemetryObject; + return this.openmct.telemetry.request( this.telemetryObject, options ).then(results => { const latestDatum = results.length ? results[results.length - 1] : {}; - const normalizedDatum = this.createNormalizedDatum(latestDatum, this.telemetryObject); + const normalizedDatum = this.createNormalizedDatum(latestDatum, telemetryObject); return { id: this.id, diff --git a/src/plugins/condition/criterion/TelemetryCriterionSpec.js b/src/plugins/condition/criterion/TelemetryCriterionSpec.js index 340c6d221..7283acd3a 100644 --- a/src/plugins/condition/criterion/TelemetryCriterionSpec.js +++ b/src/plugins/condition/criterion/TelemetryCriterionSpec.js @@ -21,12 +21,14 @@ *****************************************************************************/ import TelemetryCriterion from "./TelemetryCriterion"; +import { getMockTelemetry } from "utils/testing"; let openmct = {}, mockListener, testCriterionDefinition, testTelemetryObject, - telemetryCriterion; + telemetryCriterion, + mockTelemetry = getMockTelemetry(); describe("The telemetry criterion", function () { @@ -60,7 +62,7 @@ describe("The telemetry criterion", function () { }; openmct.objects = jasmine.createSpyObj('objects', ['get', 'makeKeyString']); openmct.objects.makeKeyString.and.returnValue(testTelemetryObject.identifier.key); - openmct.telemetry = jasmine.createSpyObj('telemetry', ['isTelemetryObject', "subscribe", "getMetadata", "getValueFormatter"]); + openmct.telemetry = jasmine.createSpyObj('telemetry', ['isTelemetryObject', "subscribe", "getMetadata", "getValueFormatter", "request"]); openmct.telemetry.isTelemetryObject.and.returnValue(true); openmct.telemetry.subscribe.and.returnValue(function () {}); openmct.telemetry.getValueFormatter.and.returnValue({ @@ -109,4 +111,30 @@ describe("The telemetry criterion", function () { }); expect(telemetryCriterion.result).toBeTrue(); }); + + describe('the LAD request', () => { + beforeEach(async () => { + let telemetryRequestResolve; + let telemetryRequestPromise = new Promise((resolve) => { + telemetryRequestResolve = resolve; + }); + openmct.telemetry.request.and.callFake(() => { + setTimeout(() => { + telemetryRequestResolve(mockTelemetry); + }, 100); + return telemetryRequestPromise; + }); + }); + + it("returns results for slow LAD requests", async function () { + const criteriaRequest = telemetryCriterion.requestLAD(); + telemetryCriterion.destroy(); + expect(telemetryCriterion.telemetryObject).toBeUndefined(); + setTimeout(() => { + criteriaRequest.then((result) => { + expect(result).toBeDefined(); + }); + }, 300); + }); + }); }); |