Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import networkInfo, { default as NetworkInfo } from '../connectivity/NetworkInfo';
  2. import { nextTick } from '../util/TestUtils';
  3. import ResumeTask from './ResumeTask';
  4. /**
  5. * A mock of the stream management plugin.
  6. */
  7. class MockStreamManagement {
  8. /**
  9. * @return {string}
  10. */
  11. getResumeToken() {
  12. return '1234';
  13. }
  14. /**
  15. * @returns {void}
  16. */
  17. // eslint-disable-next-line no-empty-function,require-jsdoc
  18. resume() {
  19. }
  20. }
  21. /**
  22. * A minimal set of Strophe.Connection class required by the {@link ResumeTask}.
  23. */
  24. class MockStropheConection {
  25. /**
  26. * A constructor.
  27. */
  28. constructor() {
  29. this.streamManagement = new MockStreamManagement();
  30. this.service = 'wss://something.com/xmpp-websocket';
  31. }
  32. }
  33. describe('ResumeTask', () => {
  34. let connection, resumeTask;
  35. beforeEach(() => {
  36. NetworkInfo.updateNetworkInfo({ isOnline: true });
  37. connection = new MockStropheConection();
  38. resumeTask = new ResumeTask(connection);
  39. jasmine.clock().install();
  40. });
  41. afterEach(() => {
  42. jasmine.clock().uninstall();
  43. // Need to unregister the listener added to the networkInfo global
  44. resumeTask.cancel();
  45. });
  46. describe('the retry task', () => {
  47. it('should be scheduled immediately if the internet is online', () => {
  48. const retrySpy = spyOn(connection.streamManagement, 'resume');
  49. resumeTask.schedule();
  50. expect(resumeTask.retryDelay).not.toBe(undefined);
  51. return nextTick(resumeTask.retryDelay + 10).then(() => {
  52. expect(retrySpy).toHaveBeenCalled();
  53. });
  54. });
  55. it('should be scheduled when the internet comes back online', () => {
  56. NetworkInfo.updateNetworkInfo({ isOnline: false });
  57. resumeTask.schedule();
  58. expect(resumeTask.retryDelay).toBe(undefined);
  59. NetworkInfo.updateNetworkInfo({ isOnline: true });
  60. expect(resumeTask.retryDelay).not.toBe(undefined);
  61. });
  62. it('should not execute first scheduled and then canceled', () => {
  63. const retrySpy = spyOn(connection.streamManagement, 'resume');
  64. resumeTask.schedule();
  65. const retryDelay = resumeTask.retryDelay;
  66. resumeTask.cancel();
  67. return nextTick(retryDelay + 10).then(() => {
  68. expect(retrySpy).not.toHaveBeenCalled();
  69. });
  70. });
  71. it('should be rescheduled if internet goes offline/online', () => {
  72. resumeTask.schedule();
  73. expect(resumeTask.retryDelay).not.toBe(undefined);
  74. NetworkInfo.updateNetworkInfo({ isOnline: false });
  75. expect(resumeTask.retryDelay).toBe(undefined);
  76. NetworkInfo.updateNetworkInfo({ isOnline: true });
  77. expect(resumeTask.retryDelay).not.toBe(undefined);
  78. });
  79. });
  80. describe('the retryDelay', () => {
  81. const between1and3seconds = delay => delay >= 1000 && delay <= 3000;
  82. const between3and9seconds = delay => delay >= 3000 && delay <= 9000;
  83. const between4500msAnd27seconds = delay => delay >= 4500 && delay <= 27000;
  84. it('should be between 1 - 3 seconds for the first attempt', () => {
  85. resumeTask.schedule();
  86. expect(between1and3seconds(resumeTask.retryDelay)).toBeTruthy();
  87. });
  88. it('should be between 3 - 9 seconds for the second attempt', () => {
  89. resumeTask.schedule();
  90. resumeTask.schedule();
  91. expect(between3and9seconds(resumeTask.retryDelay)).toBeTruthy(`retryDelay=${resumeTask.retryDelay}`);
  92. });
  93. it('should be between 4.5 - 27 seconds for the third attempt', () => {
  94. resumeTask.schedule();
  95. resumeTask.schedule();
  96. resumeTask.schedule();
  97. expect(between4500msAnd27seconds(resumeTask.retryDelay)).toBeTruthy();
  98. // It should remain within the last range after the 3rd retry
  99. resumeTask.schedule();
  100. expect(between4500msAnd27seconds(resumeTask.retryDelay)).toBeTruthy();
  101. });
  102. it('should not increase when internet goes offline/online', () => {
  103. resumeTask.schedule();
  104. networkInfo.updateNetworkInfo({ isOnline: false });
  105. networkInfo.updateNetworkInfo({ isOnline: true });
  106. networkInfo.updateNetworkInfo({ isOnline: false });
  107. networkInfo.updateNetworkInfo({ isOnline: true });
  108. expect(between1and3seconds(resumeTask.retryDelay)).toBeTruthy();
  109. });
  110. });
  111. });