report.spec.js 6.5 KB

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