end-to-end.spec.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. 'use strict';
  2. const { readFileSync } = require('fs');
  3. const path = require('path');
  4. const { expect } = require('chai');
  5. const sinon = require('sinon');
  6. const { Ven } = require('../../client/ven');
  7. const app = require('../../server');
  8. const { sequelize, Ven: VenDb } = require('../../db');
  9. const { port } = require('../../config');
  10. describe('VEN to VTN interactions', function() {
  11. const venId = '17:32:59:FD:0E:B5:99:31:27:9C';
  12. describe('registration and event retrieval', async function() {
  13. let clock;
  14. after(async () => {
  15. clock.restore();
  16. });
  17. let ven;
  18. before(async () => {
  19. clock = sinon.useFakeTimers(
  20. new Date('2020-04-26T01:00:00.000Z').getTime(),
  21. );
  22. await sequelize.sync();
  23. await VenDb.destroy({ truncate: true });
  24. await app.start();
  25. const clientCrtPem = readFileSync(
  26. path.join(__dirname, 'integration-client.crt'),
  27. 'utf-8',
  28. );
  29. ven = new Ven(
  30. `http://127.0.0.1:${port}`,
  31. clientCrtPem,
  32. 'aabbccddeeff',
  33. venId,
  34. 'ven.js1',
  35. );
  36. });
  37. it('should successfully return a vtnId from queryRegistration', async () => {
  38. const queryResponse = await ven.queryRegistration();
  39. expect(queryResponse.vtnId).to.be.a('string');
  40. });
  41. it('should successfully register and receive a vtnId and registrationId', async () => {
  42. const registrationResponse = await ven.register();
  43. expect(registrationResponse.vtnId).to.be.a('string');
  44. expect(registrationResponse.registrationId).to.be.a('string');
  45. });
  46. it('should successfully return a registrationId and venId from queryRegistration', async () => {
  47. const queryResponse = await ven.queryRegistration();
  48. expect(queryResponse.vtnId).to.be.a('string');
  49. expect(queryResponse.registrationId).to.be.a('string');
  50. expect(queryResponse.venId).to.be.a('string');
  51. });
  52. it('should return an event from requestEvents', async () => {
  53. const eventResponse = await ven.requestEvents();
  54. expect(eventResponse.events.length).to.eql(1);
  55. expect(eventResponse.vtnId).to.be.a('string');
  56. });
  57. it('should successfully cancel that registration', async () => {
  58. const cancelResponse = await ven.cancelRegistration();
  59. expect(cancelResponse.registrationId).to.be.a('string');
  60. expect(cancelResponse.venId).to.be.a('string');
  61. });
  62. after(async () => {
  63. await app.stop();
  64. });
  65. });
  66. describe('poll', async function() {
  67. let ven;
  68. let clock;
  69. after(async () => {
  70. clock.restore();
  71. });
  72. before(async () => {
  73. clock = sinon.useFakeTimers(
  74. new Date('2020-04-26T01:00:00.000Z').getTime(),
  75. );
  76. await sequelize.sync();
  77. await VenDb.destroy({ truncate: true });
  78. await app.start();
  79. const clientCrtPem = readFileSync(
  80. path.join(__dirname, 'integration-client.crt'),
  81. 'utf-8',
  82. );
  83. ven = new Ven(
  84. `http://127.0.0.1:${port}`,
  85. clientCrtPem,
  86. 'aabbccddeeff',
  87. venId,
  88. 'ven.js1',
  89. );
  90. await ven.register();
  91. });
  92. it('should successfully poll for events', async () => {
  93. const pollResponse = await ven.poll();
  94. expect(pollResponse._type).to.eql('oadrDistributeEvent');
  95. expect(pollResponse.events.length).to.eql(1);
  96. });
  97. after(async () => {
  98. await app.stop();
  99. });
  100. });
  101. describe('report', async function() {
  102. let ven;
  103. let clock;
  104. after(async () => {
  105. clock.restore();
  106. });
  107. before(async () => {
  108. clock = sinon.useFakeTimers(
  109. new Date('2020-04-26T01:00:00.000Z').getTime(),
  110. );
  111. await sequelize.sync();
  112. await VenDb.destroy({ truncate: true });
  113. await app.start();
  114. const clientCrtPem = readFileSync(
  115. path.join(__dirname, 'integration-client.crt'),
  116. 'utf-8',
  117. );
  118. ven = new Ven(
  119. `http://127.0.0.1:${port}`,
  120. clientCrtPem,
  121. 'aabbccddeeff',
  122. venId,
  123. 'ven.js1',
  124. );
  125. await ven.register();
  126. const pollResponse = await ven.poll();
  127. const events = pollResponse.events;
  128. const eventId = events[0].eventDescriptor.eventId;
  129. const modificationNumber = events[0].eventDescriptor.modificationNumber;
  130. await ven.opt('optIn', eventId, modificationNumber);
  131. });
  132. it('should successfully subscribe to reports and receive data', async () => {
  133. const reqs = [
  134. {
  135. reportRequestId: '31c5ce71a68a73ece370',
  136. reportSpecifierId: 'TELEMETRY_STATUS',
  137. createdDateTime: '2020-05-07T10:05:41.421-06:00',
  138. duration: 'PT1H',
  139. reportName: 'METADATA_TELEMETRY_STATUS',
  140. descriptions: [
  141. {
  142. reportId: 'ts1',
  143. reportType: 'x-resourceStatus',
  144. readingType: 'x-notApplicable',
  145. samplingRate: {
  146. minPeriod: 'PT1M',
  147. maxPeriod: 'PT1H',
  148. onChange: false,
  149. },
  150. },
  151. ],
  152. },
  153. {
  154. reportRequestId: '3d92d98e0b65d94e60a7',
  155. reportSpecifierId: 'TELEMETRY_USAGE',
  156. createdDateTime: '2020-05-07T10:05:41.421-06:00',
  157. duration: 'PT1H',
  158. reportName: 'METADATA_TELEMETRY_USAGE',
  159. descriptions: [
  160. {
  161. reportId: 'rep1',
  162. reportType: 'usage',
  163. readingType: 'Direct Read',
  164. samplingRate: {
  165. minPeriod: 'PT1M',
  166. maxPeriod: 'PT1H',
  167. onChange: false,
  168. },
  169. },
  170. ],
  171. },
  172. ];
  173. // register reports
  174. await ven.registerReports(reqs);
  175. const pollResponse = await ven.poll();
  176. // poll has a request to create reports
  177. expect(pollResponse._type).to.eql('oadrCreateReport');
  178. const createRequestId = pollResponse.reportRequestId;
  179. const [
  180. telemetryStatusReportRequestId,
  181. telemetryUsageReportRequestId,
  182. ] = pollResponse.requests.map(x => x.reportRequestId);
  183. // notify vtn that reports have been created
  184. await ven.notifyCreatedReports(createRequestId, [
  185. telemetryStatusReportRequestId,
  186. telemetryUsageReportRequestId,
  187. ]);
  188. // poll is empty, no reports to create
  189. const pollResponse2 = await ven.poll();
  190. expect(pollResponse2._type).to.eql('oadrResponse');
  191. // send report
  192. const reports = [
  193. {
  194. createdDateTime: '2020-05-08T21:27:49.591-06:00',
  195. duration: 'PT1M',
  196. intervals: [
  197. {
  198. duration: 'PT1M',
  199. reportPayloads: [
  200. {
  201. dataQuality: 'Quality Good - Non Specific',
  202. payloadFloat: 161.97970171999845,
  203. reportId: 'rep1',
  204. },
  205. ],
  206. startDate: '2020-05-08T21:26:49.562-06:00',
  207. },
  208. ],
  209. reportName: 'TELEMETRY_USAGE',
  210. reportRequestId: telemetryUsageReportRequestId,
  211. reportSpecifierId: 'TELEMETRY_USAGE',
  212. startDate: '2020-05-08T21:26:49.562-06:00',
  213. },
  214. {
  215. createdDateTime: '2020-05-13T10:56:11.058-06:00',
  216. duration: 'PT1M',
  217. intervals: [
  218. {
  219. duration: 'PT1M',
  220. reportPayloads: [
  221. {
  222. dataQuality: 'Quality Good - Non Specific',
  223. payloadStatus: {
  224. online: true,
  225. manualOverride: false,
  226. loadControlState: {
  227. oadrLevelOffset: {
  228. oadrNormal: 40,
  229. oadrCurrent: 50,
  230. },
  231. },
  232. },
  233. reportId: 'rep1',
  234. },
  235. ],
  236. startDate: '2020-05-13T10:56:11.058-06:00',
  237. },
  238. ],
  239. reportName: 'TELEMETRY_STATUS',
  240. reportRequestId: telemetryStatusReportRequestId,
  241. reportSpecifierId: 'TELEMETRY_STATUS',
  242. startDate: '2020-05-13T10:56:11.058-06:00',
  243. },
  244. ];
  245. await ven.sendReportData(reports);
  246. });
  247. after(async () => {
  248. await app.stop();
  249. });
  250. });
  251. describe('optIn', async function() {
  252. let clock;
  253. after(async () => {
  254. clock.restore();
  255. });
  256. let ven, events, pollResponse;
  257. before(async () => {
  258. clock = sinon.useFakeTimers(
  259. new Date('2020-04-26T01:00:00.000Z').getTime(),
  260. );
  261. await sequelize.sync();
  262. await VenDb.destroy({ truncate: true });
  263. await app.start();
  264. const clientCrtPem = readFileSync(
  265. path.join(__dirname, 'integration-client.crt'),
  266. 'utf-8',
  267. );
  268. ven = new Ven(
  269. `http://127.0.0.1:${port}`,
  270. clientCrtPem,
  271. 'aabbccddeeff',
  272. venId,
  273. 'ven.js1',
  274. );
  275. await ven.register();
  276. pollResponse = await ven.poll();
  277. events = pollResponse.events;
  278. });
  279. it('should successfully poll for events', async () => {
  280. expect(pollResponse._type).to.eql('oadrDistributeEvent');
  281. expect(pollResponse.events.length).to.eql(1);
  282. });
  283. it('should return same events if not opted', async () => {
  284. const pollResponse = await ven.poll();
  285. expect(pollResponse._type).to.eql('oadrDistributeEvent');
  286. expect(pollResponse.events.length).to.eql(1);
  287. });
  288. it('should return no events if opted', async () => {
  289. const eventId = events[0].eventDescriptor.eventId;
  290. const modificationNumber = events[0].eventDescriptor.modificationNumber;
  291. await ven.opt('optIn', eventId, modificationNumber);
  292. const pollResponse = await ven.poll();
  293. expect(pollResponse._type).to.eql('oadrResponse');
  294. });
  295. after(async () => {
  296. await app.stop();
  297. });
  298. });
  299. });