RyanMqttNetworkFaultToleranceMemoryTest.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. #include "RyanMqttTest.h"
  2. /**
  3. * @brief 混乱随机的qos消息测试
  4. *
  5. * @param count
  6. * @param delayms
  7. * @return RyanMqttError_e
  8. */
  9. static RyanMqttError_e RyanMqttNetworkFaultPublishHybridTest(int32_t count, uint32_t delayms)
  10. {
  11. #define RyanMqttPubHybridTestPubTopic "testlinux/aa/pub/adfa/kkk"
  12. #define RyanMqttPubHybridTestSubTopic "testlinux/aa/+/#"
  13. RyanMqttError_e result = RyanMqttSuccessError;
  14. RyanMqttClient_t *client;
  15. char *pubStr = "hello, this is a mqtt publish test string.";
  16. uint32_t pubStrLen = strlen(pubStr);
  17. result = RyanMqttTestInit(&client, RyanMqttTrue, RyanMqttTrue, 120, NULL, NULL);
  18. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, RyanMqttFailedError, RyanMqttLog_e, { goto __exit; });
  19. // 等待订阅主题成功
  20. RyanMqttSubscribe(client, RyanMqttPubHybridTestSubTopic, RyanMqttQos2);
  21. RyanMqttSubscribe(client, RyanMqttPubHybridTestPubTopic, RyanMqttQos2);
  22. delay(2);
  23. enableRandomNetworkFault();
  24. for (int32_t i = 0; i < count; i++)
  25. {
  26. if (RyanMqttConnectState != RyanMqttGetState(client))
  27. {
  28. RyanMqttLog_e("mqtt 发布测试,销毁mqtt客户端 %d", i);
  29. result = RyanMqttFailedError;
  30. goto __exit;
  31. }
  32. char *pubTopic = RyanMqttPubHybridTestPubTopic;
  33. RyanMqttPublishWithUserData(client, pubTopic, RyanMqttStrlen(pubTopic), pubStr, pubStrLen, i % 3,
  34. RyanMqttFalse, NULL);
  35. if (delayms)
  36. {
  37. delay(delayms);
  38. }
  39. }
  40. RyanMqttUnSubscribe(client, RyanMqttPubHybridTestSubTopic);
  41. __exit:
  42. disableRandomNetworkFault();
  43. RyanMqttLog_i("mqtt 发布测试,销毁mqtt客户端");
  44. RyanMqttTestDestroyClient(client);
  45. return result;
  46. }
  47. static RyanMqttError_e RyanMqttNetworkFaultSubscribeHybridTest(int32_t count, int32_t testCount)
  48. {
  49. RyanMqttError_e result = RyanMqttSuccessError;
  50. RyanMqttClient_t *client;
  51. RyanMqttUnSubscribeData_t *unSubscribeManyData = NULL;
  52. RyanMqttSubscribeData_t *subscribeManyData = NULL;
  53. result = RyanMqttTestInit(&client, RyanMqttTrue, RyanMqttTrue, 120, NULL, NULL);
  54. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, RyanMqttFailedError, RyanMqttLog_e, { goto __exit; });
  55. // 生成需要订阅的主题数据
  56. {
  57. subscribeManyData = (RyanMqttSubscribeData_t *)malloc(sizeof(RyanMqttSubscribeData_t) * count);
  58. if (NULL == subscribeManyData)
  59. {
  60. RyanMqttLog_e("内存不足");
  61. result = RyanMqttNotEnoughMemError;
  62. goto __exit;
  63. }
  64. for (int32_t i = 0; i < count; i++)
  65. {
  66. subscribeManyData[i].qos = i % 3;
  67. char *topic = (char *)malloc(64);
  68. if (NULL == topic)
  69. {
  70. RyanMqttLog_e("内存不足");
  71. result = RyanMqttNotEnoughMemError;
  72. goto __exit;
  73. }
  74. RyanMqttSnprintf(topic, 64, "test/subscribe/%d", i);
  75. subscribeManyData[i].topic = topic;
  76. subscribeManyData[i].topicLen = RyanMqttStrlen(topic);
  77. }
  78. }
  79. // 生成取消所有订阅消息
  80. unSubscribeManyData = malloc(sizeof(RyanMqttUnSubscribeData_t) * count);
  81. if (NULL == unSubscribeManyData)
  82. {
  83. RyanMqttLog_e("内存不足");
  84. result = RyanMqttNotEnoughMemError;
  85. goto __exit;
  86. }
  87. for (int32_t i = 0; i < count; i++)
  88. {
  89. char *topic = (char *)malloc(64);
  90. if (NULL == topic)
  91. {
  92. RyanMqttLog_e("内存不足");
  93. result = RyanMqttNotEnoughMemError;
  94. goto __exit;
  95. }
  96. RyanMqttSnprintf(topic, 64, "test/subscribe/%d", i);
  97. unSubscribeManyData[i].topic = topic;
  98. unSubscribeManyData[i].topicLen = RyanMqttStrlen(topic);
  99. }
  100. enableRandomNetworkFault();
  101. for (int32_t testCount2 = 0; testCount2 < testCount; testCount2++)
  102. {
  103. // 订阅全部主题
  104. RyanMqttSubscribeMany(client, count - 1, subscribeManyData);
  105. RyanMqttSubscribe(client, subscribeManyData[count - 1].topic, subscribeManyData[count - 1].qos);
  106. // 测试重复订阅,不修改qos等级
  107. RyanMqttSubscribeMany(client, count / 2, subscribeManyData);
  108. // 测试重复订阅并且修改qos等级
  109. for (int32_t i = count; i > 0; i--)
  110. {
  111. subscribeManyData[count - i].qos = i % 3;
  112. }
  113. RyanMqttSubscribeMany(client, count, subscribeManyData);
  114. RyanMqttUnSubscribeMany(client, count - 1, unSubscribeManyData);
  115. RyanMqttUnSubscribe(client, unSubscribeManyData[count - 1].topic);
  116. // 重复取消订阅主题
  117. RyanMqttUnSubscribeMany(client, count / 2, unSubscribeManyData);
  118. }
  119. __exit:
  120. disableRandomNetworkFault();
  121. // 删除
  122. for (int32_t i = 0; i < count; i++)
  123. {
  124. if (NULL != subscribeManyData && NULL != subscribeManyData[i].topic)
  125. {
  126. free(subscribeManyData[i].topic);
  127. }
  128. if (NULL != unSubscribeManyData && NULL != unSubscribeManyData[i].topic)
  129. {
  130. free(unSubscribeManyData[i].topic);
  131. }
  132. }
  133. if (NULL != subscribeManyData)
  134. {
  135. free(subscribeManyData);
  136. }
  137. if (NULL != unSubscribeManyData)
  138. {
  139. free(unSubscribeManyData);
  140. }
  141. RyanMqttLog_i("mqtt 订阅测试,销毁mqtt客户端");
  142. RyanMqttTestDestroyClient(client);
  143. return result;
  144. }
  145. /**
  146. * @brief 网络容错内存测试
  147. *
  148. * @return RyanMqttError_e
  149. */
  150. RyanMqttError_e RyanMqttNetworkFaultToleranceMemoryTest(void)
  151. {
  152. RyanMqttError_e result = RyanMqttSuccessError;
  153. result = RyanMqttNetworkFaultPublishHybridTest(2000, 1);
  154. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, RyanMqttFailedError, RyanMqttLog_e, { goto __exit; });
  155. checkMemory;
  156. result = RyanMqttNetworkFaultSubscribeHybridTest(1000, 5);
  157. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, RyanMqttFailedError, RyanMqttLog_e, { goto __exit; });
  158. checkMemory;
  159. return RyanMqttSuccessError;
  160. __exit:
  161. return RyanMqttFailedError;
  162. }