RyanMqttReconnectTest.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include "RyanMqttTest.h"
  2. // todo 增加在回调函数里面调用重连函数的测试,应该会失败
  3. static RyanMqttBool_e reconnectCheckMqttConnectState(RyanMqttClient_t *client)
  4. {
  5. for (uint32_t i = 0; i < 5000; i++)
  6. {
  7. if (RyanMqttConnectState == RyanMqttGetState(client))
  8. {
  9. break;
  10. }
  11. delay(1);
  12. }
  13. if (RyanMqttConnectState == RyanMqttGetState(client))
  14. {
  15. return RyanMqttTrue;
  16. }
  17. return RyanMqttFalse;
  18. }
  19. static RyanMqttError_e autoReconnectTest(uint32_t count, uint32_t delayms)
  20. {
  21. RyanMqttError_e result = RyanMqttSuccessError;
  22. RyanMqttClient_t *client = NULL;
  23. result = RyanMqttTestInit(&client, RyanMqttTrue, RyanMqttTrue, 120, NULL, NULL);
  24. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, RyanMqttFailedError, RyanMqttLog_e, { goto __exit; });
  25. for (uint32_t i = 0; i < count; i++)
  26. {
  27. // 应该失败
  28. result = RyanMqttReconnect(client);
  29. RyanMqttCheckCodeNoReturn(RyanMqttConnectError == result, RyanMqttFailedError, RyanMqttLog_e,
  30. { goto __exit; });
  31. result = RyanMqttDisconnect(client, i % 2 == 0);
  32. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, RyanMqttFailedError, RyanMqttLog_e,
  33. { goto __exit; });
  34. // 应该失败
  35. result = RyanMqttReconnect(client);
  36. RyanMqttCheckCodeNoReturn(RyanMqttNoRescourceError == result, RyanMqttFailedError, RyanMqttLog_e, {
  37. result = RyanMqttFailedError;
  38. goto __exit;
  39. });
  40. RyanMqttLog_i("mqtt自动重连测试,将在 %dms 后重新连接", client->config.reconnectTimeout);
  41. RyanMqttCheckCodeNoReturn(RyanMqttTrue == reconnectCheckMqttConnectState(client), RyanMqttFailedError,
  42. RyanMqttLog_e, {
  43. result = RyanMqttFailedError;
  44. goto __exit;
  45. });
  46. if (delayms)
  47. {
  48. delay(delayms);
  49. }
  50. }
  51. result = RyanMqttSuccessError;
  52. __exit:
  53. RyanMqttLog_i("mqtt 重连,销毁mqtt客户端");
  54. if (client)
  55. {
  56. RyanMqttTestDestroyClient(client);
  57. }
  58. return result;
  59. }
  60. static RyanMqttError_e manualReconnectTest(uint32_t count, uint32_t delayms)
  61. {
  62. RyanMqttError_e result = RyanMqttSuccessError;
  63. RyanMqttClient_t *client = NULL;
  64. result = RyanMqttTestInit(&client, RyanMqttTrue, RyanMqttFalse, 120, NULL, NULL);
  65. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, RyanMqttFailedError, RyanMqttLog_e, { goto __exit; });
  66. for (uint32_t i = 0; i < count; i++)
  67. {
  68. // 应该失败
  69. result = RyanMqttReconnect(client);
  70. RyanMqttCheckCodeNoReturn(RyanMqttConnectError == result, RyanMqttFailedError, RyanMqttLog_e,
  71. { goto __exit; });
  72. result = RyanMqttDisconnect(client, i % 2 == 0);
  73. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, RyanMqttFailedError, RyanMqttLog_e,
  74. { goto __exit; });
  75. // todo
  76. // 这里可能还没有调度mqtt线程就更新状态了,目前通过延时强制等待mqtt线程调度完成
  77. // 这里可以使用信号量也通知应用层,但又要增加plarform移植难度和内存占用
  78. delay(20);
  79. // 应该成功
  80. result = RyanMqttReconnect(client);
  81. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, RyanMqttFailedError, RyanMqttLog_e,
  82. { goto __exit; });
  83. RyanMqttCheckCodeNoReturn(RyanMqttTrue == reconnectCheckMqttConnectState(client), RyanMqttFailedError,
  84. RyanMqttLog_e, {
  85. result = RyanMqttFailedError;
  86. goto __exit;
  87. });
  88. if (delayms)
  89. {
  90. delay(delayms);
  91. }
  92. }
  93. result = RyanMqttSuccessError;
  94. __exit:
  95. RyanMqttLog_i("mqtt 重连,销毁mqtt客户端");
  96. if (client)
  97. {
  98. RyanMqttTestDestroyClient(client);
  99. }
  100. return result;
  101. }
  102. RyanMqttError_e RyanMqttReconnectTest(void)
  103. {
  104. RyanMqttError_e result = RyanMqttSuccessError;
  105. result = autoReconnectTest(3, 2);
  106. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, RyanMqttFailedError, RyanMqttLog_e, { goto __exit; });
  107. result = manualReconnectTest(10, 0);
  108. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, RyanMqttFailedError, RyanMqttLog_e, { goto __exit; });
  109. checkMemory;
  110. return RyanMqttSuccessError;
  111. __exit:
  112. return RyanMqttFailedError;
  113. }