report.spec.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. 'use strict';
  2. const { expect } = require('chai');
  3. const { v4 } = require('uuid');
  4. const sinon = require('sinon');
  5. const rewire = require('rewire');
  6. const {
  7. registerReportMax,
  8. createdReportGenerated1,
  9. updateReportTelemetryStatus,
  10. } = require('../xml/report/js-requests');
  11. const {
  12. createReportGenerated1,
  13. createReportGenerated2,
  14. } = require('../xml/report/js-responses');
  15. const { poll: oadrPollMessage } = require('../xml/poll/js-requests');
  16. const { sampleReport1 } = require('../modules/nantum-responses');
  17. describe('Report', function() {
  18. let clock;
  19. let rewired;
  20. let report;
  21. let uuidSequence;
  22. after(async () => {
  23. clock.restore();
  24. });
  25. beforeEach(async () => {
  26. clock = sinon.useFakeTimers(new Date('2020-04-26T01:00:00.000Z').getTime());
  27. uuidSequence = 0;
  28. });
  29. before(async () => {
  30. report = {};
  31. rewired = rewire('../../../processes/report.js');
  32. rewired.__set__({
  33. nantum: {
  34. fetchReport: venId => Promise.resolve(report[venId] || []),
  35. updateReport: async (venId, newReport) => {
  36. report[venId] = newReport;
  37. },
  38. },
  39. v4: () => `uuid${uuidSequence++}`,
  40. });
  41. });
  42. describe('requesting VEN reports', function() {
  43. it('successfully registers reports', async () => {
  44. const venId = registerReportMax.venId;
  45. const commonName = v4()
  46. .replace(/-/g, '')
  47. .substring(0, 12);
  48. const registeredReport = await rewired.registerReports(
  49. registerReportMax,
  50. commonName,
  51. venId,
  52. );
  53. expect(registeredReport.responseCode).to.eql('200');
  54. expect(report).to.eql(sampleReport1);
  55. });
  56. it('requests reports on next poll', async () => {
  57. const venId = registerReportMax.venId;
  58. const commonName = v4()
  59. .replace(/-/g, '')
  60. .substring(0, 12);
  61. const pollResponse = await rewired.pollForReports(
  62. oadrPollMessage,
  63. commonName,
  64. venId,
  65. );
  66. expect(pollResponse).to.eql(createReportGenerated1);
  67. });
  68. it('does not request reports again immediately following poll', async () => {
  69. const venId = registerReportMax.venId;
  70. const commonName = v4()
  71. .replace(/-/g, '')
  72. .substring(0, 12);
  73. const pollResponse = await rewired.pollForReports(
  74. oadrPollMessage,
  75. commonName,
  76. venId,
  77. );
  78. expect(pollResponse).to.eql(undefined);
  79. });
  80. it('does request reports again immediately following poll when enough time has elapsed', async () => {
  81. clock = sinon.useFakeTimers(
  82. new Date('2020-04-26T01:01:30.000Z').getTime(),
  83. );
  84. const venId = registerReportMax.venId;
  85. const commonName = v4()
  86. .replace(/-/g, '')
  87. .substring(0, 12);
  88. const pollResponse = await rewired.pollForReports(
  89. oadrPollMessage,
  90. commonName,
  91. venId,
  92. );
  93. expect(pollResponse).to.eql(createReportGenerated2);
  94. });
  95. it('re-sends create request when no data received for 95 seconds', async () => {
  96. const venId = registerReportMax.venId;
  97. const commonName = v4()
  98. .replace(/-/g, '')
  99. .substring(0, 12);
  100. const pollResponse1 = await rewired.pollForReports(
  101. oadrPollMessage,
  102. commonName,
  103. venId,
  104. );
  105. expect(pollResponse1).to.eql(undefined);
  106. await rewired.registerReports(registerReportMax, commonName, venId);
  107. const pollResponse2 = await rewired.pollForReports(
  108. oadrPollMessage,
  109. commonName,
  110. venId,
  111. );
  112. // should immediately request 2 reports
  113. expect(pollResponse2).to.not.be.undefined;
  114. expect(pollResponse2.requests.length).to.eql(2);
  115. // ven should respond that it has accepted those 2 report requests
  116. const createdResponse = await rewired.createdReports(
  117. createdReportGenerated1,
  118. commonName,
  119. venId,
  120. );
  121. expect(createdResponse.responseCode).to.eql('200');
  122. // ven sends report telemetry data
  123. const receiveResponse = await rewired.receiveReportData(
  124. updateReportTelemetryStatus,
  125. commonName,
  126. venId,
  127. );
  128. expect(receiveResponse.responseCode).to.eql('200');
  129. // advance time 45 seconds. subscription is valid, should not resubscribe
  130. clock = sinon.useFakeTimers(
  131. new Date('2020-04-26T01:00:45.000Z').getTime(),
  132. );
  133. const pollResponse3 = await rewired.pollForReports(
  134. oadrPollMessage,
  135. commonName,
  136. venId,
  137. );
  138. expect(pollResponse3).to.be.undefined;
  139. clock = sinon.useFakeTimers(
  140. new Date('2020-04-26T01:01:35.000Z').getTime(),
  141. ); // advance +95 seconds
  142. // should trigger a create request because data is stale
  143. const pollResponse4 = await rewired.pollForReports(
  144. oadrPollMessage,
  145. commonName,
  146. venId,
  147. );
  148. expect(pollResponse4).to.not.be.undefined;
  149. expect(pollResponse4._type).to.eql('oadrCreateReport');
  150. expect(pollResponse4.requests.length).to.eql(2);
  151. });
  152. it('re-sends create request when created not received', async () => {
  153. const venId = registerReportMax.venId;
  154. const commonName = v4()
  155. .replace(/-/g, '')
  156. .substring(0, 12);
  157. await rewired.registerReports(registerReportMax, commonName, venId);
  158. const pollResponse1 = await rewired.pollForReports(
  159. oadrPollMessage,
  160. commonName,
  161. venId,
  162. );
  163. expect(pollResponse1).to.not.be.undefined;
  164. expect(pollResponse1.requests.length).to.eql(2);
  165. // advance time 8 seconds. should offer to re-subscribe
  166. clock = sinon.useFakeTimers(
  167. new Date('2020-04-26T01:00:08.000Z').getTime(),
  168. );
  169. const pollResponse2 = await rewired.pollForReports(
  170. oadrPollMessage,
  171. commonName,
  172. venId,
  173. );
  174. expect(pollResponse2).to.not.be.undefined;
  175. expect(pollResponse2.requests.length).to.eql(2);
  176. // now VEN sends created response
  177. const createdResponse = await rewired.createdReports(
  178. createdReportGenerated1,
  179. commonName,
  180. venId,
  181. );
  182. expect(createdResponse.responseCode).to.eql('200');
  183. // advance time 8 seconds. should not offer to re-subscribe.
  184. clock = sinon.useFakeTimers(
  185. new Date('2020-04-26T01:00:16.000Z').getTime(),
  186. );
  187. const pollResponse3 = await rewired.pollForReports(
  188. oadrPollMessage,
  189. commonName,
  190. venId,
  191. );
  192. expect(pollResponse3).to.be.undefined;
  193. });
  194. });
  195. });