RyanMqttMemoryFaultToleranceTest.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  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. enableRandomMemoryFault();
  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. delay(RyanMqttAckTimeout * 2 + 200);
  41. RyanMqttUnSubscribe(client, RyanMqttPubHybridTestSubTopic);
  42. __exit:
  43. disableRandomMemoryFault();
  44. RyanMqttLog_i("mqtt 发布测试,销毁mqtt客户端");
  45. RyanMqttTestDestroyClient(client);
  46. return result;
  47. }
  48. static RyanMqttError_e RyanMqttNetworkFaultSubscribeHybridTest(int32_t count, int32_t testCount)
  49. {
  50. RyanMqttError_e result = RyanMqttSuccessError;
  51. RyanMqttClient_t *client;
  52. RyanMqttUnSubscribeData_t *unSubscribeManyData = NULL;
  53. RyanMqttSubscribeData_t *subscribeManyData = NULL;
  54. result = RyanMqttTestInit(&client, RyanMqttTrue, RyanMqttTrue, 120, NULL, NULL);
  55. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, RyanMqttFailedError, RyanMqttLog_e, { goto __exit; });
  56. // 生成需要订阅的主题数据
  57. {
  58. subscribeManyData = (RyanMqttSubscribeData_t *)malloc(sizeof(RyanMqttSubscribeData_t) * count);
  59. if (NULL == subscribeManyData)
  60. {
  61. RyanMqttLog_e("内存不足");
  62. result = RyanMqttNotEnoughMemError;
  63. goto __exit;
  64. }
  65. for (int32_t i = 0; i < count; i++)
  66. {
  67. subscribeManyData[i].qos = i % 3;
  68. char *topic = (char *)malloc(64);
  69. if (NULL == topic)
  70. {
  71. RyanMqttLog_e("内存不足");
  72. result = RyanMqttNotEnoughMemError;
  73. goto __exit;
  74. }
  75. RyanMqttSnprintf(topic, 64, "test/subscribe/%d", i);
  76. subscribeManyData[i].topic = topic;
  77. subscribeManyData[i].topicLen = RyanMqttStrlen(topic);
  78. }
  79. }
  80. // 生成取消所有订阅消息
  81. unSubscribeManyData = malloc(sizeof(RyanMqttUnSubscribeData_t) * count);
  82. if (NULL == unSubscribeManyData)
  83. {
  84. RyanMqttLog_e("内存不足");
  85. result = RyanMqttNotEnoughMemError;
  86. goto __exit;
  87. }
  88. for (int32_t i = 0; i < count; i++)
  89. {
  90. char *topic = (char *)malloc(64);
  91. if (NULL == topic)
  92. {
  93. RyanMqttLog_e("内存不足");
  94. result = RyanMqttNotEnoughMemError;
  95. goto __exit;
  96. }
  97. RyanMqttSnprintf(topic, 64, "test/subscribe/%d", i);
  98. unSubscribeManyData[i].topic = topic;
  99. unSubscribeManyData[i].topicLen = RyanMqttStrlen(topic);
  100. }
  101. enableRandomMemoryFault();
  102. for (int32_t testCount2 = 0; testCount2 < testCount; testCount2++)
  103. {
  104. // 订阅全部主题
  105. RyanMqttSubscribeMany(client, count - 1, subscribeManyData);
  106. RyanMqttSubscribe(client, subscribeManyData[count - 1].topic, subscribeManyData[count - 1].qos);
  107. // 测试重复订阅,不修改qos等级
  108. RyanMqttSubscribeMany(client, count / 2, subscribeManyData);
  109. // 测试重复订阅并且修改qos等级
  110. for (int32_t i = count; i > 0; i--)
  111. {
  112. subscribeManyData[count - i].qos = i % 3;
  113. }
  114. RyanMqttSubscribeMany(client, count, subscribeManyData);
  115. RyanMqttUnSubscribeMany(client, count - 1, unSubscribeManyData);
  116. RyanMqttUnSubscribe(client, unSubscribeManyData[count - 1].topic);
  117. // 重复取消订阅主题
  118. RyanMqttUnSubscribeMany(client, count / 2, unSubscribeManyData);
  119. }
  120. delay(RyanMqttAckTimeout * 2 + 200);
  121. __exit:
  122. disableRandomMemoryFault();
  123. // 删除
  124. for (int32_t i = 0; i < count; i++)
  125. {
  126. if (NULL != subscribeManyData && NULL != subscribeManyData[i].topic)
  127. {
  128. free(subscribeManyData[i].topic);
  129. }
  130. if (NULL != unSubscribeManyData && NULL != unSubscribeManyData[i].topic)
  131. {
  132. free(unSubscribeManyData[i].topic);
  133. }
  134. }
  135. if (NULL != subscribeManyData)
  136. {
  137. free(subscribeManyData);
  138. }
  139. if (NULL != unSubscribeManyData)
  140. {
  141. free(unSubscribeManyData);
  142. }
  143. RyanMqttLog_i("mqtt 订阅测试,销毁mqtt客户端");
  144. RyanMqttTestDestroyClient(client);
  145. return result;
  146. }
  147. static RyanMqttError_e RyanMqttNetworkFaultHybridTest(int32_t count)
  148. {
  149. RyanMqttError_e result = RyanMqttSuccessError;
  150. RyanMqttClient_t *client;
  151. result = RyanMqttTestInit(&client, RyanMqttTrue, RyanMqttTrue, 120, NULL, NULL);
  152. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, RyanMqttFailedError, RyanMqttLog_e, { goto __exit; });
  153. // 等待订阅主题成功
  154. RyanMqttSubscribe(client, RyanMqttPubHybridTestSubTopic, RyanMqttQos2);
  155. RyanMqttSubscribe(client, RyanMqttPubHybridTestPubTopic, RyanMqttQos2);
  156. delay(2);
  157. enableRandomMemoryFault();
  158. for (int32_t i = 0; i < count; i++)
  159. {
  160. RyanMqttMsgHandler_t *msgHandles = NULL;
  161. int32_t subscribeNum = 0;
  162. RyanMqttGetSubscribeSafe(client, &msgHandles, &subscribeNum);
  163. RyanMqttSafeFreeSubscribeResources(msgHandles, subscribeNum);
  164. RyanMqttMsgHandler_t msgHandlesStatic[3] = {0};
  165. RyanMqttGetSubscribe(client, msgHandlesStatic, getArraySize(msgHandlesStatic), &subscribeNum);
  166. int32_t subscribeTotalCount = 0;
  167. RyanMqttGetSubscribeTotalCount(client, &subscribeTotalCount);
  168. RyanMqttGetState(client);
  169. uint32_t keepAliveRemain = 0;
  170. RyanMqttGetKeepAliveRemain(client, &keepAliveRemain);
  171. RyanMqttClientConfig_t *pclientConfig = NULL;
  172. RyanMqttGetConfig(client, &pclientConfig);
  173. // 不管 pclientConfig 是否有效
  174. RyanMqttSetConfig(client, pclientConfig);
  175. RyanMqttFreeConfigFromGet(pclientConfig);
  176. RyanMqttSetLwt(client, "pub/lwt/test", "this is will", RyanMqttStrlen("this is will"), RyanMqttQos2, 0);
  177. RyanMqttDiscardAckHandler(client, MQTT_PACKET_TYPE_PUBACK, 1);
  178. RyanMqttEventId_e eventId = RyanMqttEventAnyId;
  179. RyanMqttGetEventId(client, &eventId);
  180. RyanMqttCancelEventId(client, eventId);
  181. RyanMqttRegisterEventId(client, eventId);
  182. }
  183. RyanMqttUnSubscribe(client, RyanMqttPubHybridTestSubTopic);
  184. __exit:
  185. disableRandomMemoryFault();
  186. RyanMqttTestDestroyClient(client);
  187. return result;
  188. }
  189. /**
  190. * @brief 内存故障测试
  191. *
  192. * @return RyanMqttError_e
  193. */
  194. RyanMqttError_e RyanMqttMemoryFaultToleranceTest(void)
  195. {
  196. RyanMqttError_e result = RyanMqttSuccessError;
  197. result = RyanMqttNetworkFaultPublishHybridTest(2000, 1);
  198. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, RyanMqttFailedError, RyanMqttLog_e, { goto __exit; });
  199. checkMemory;
  200. result = RyanMqttNetworkFaultSubscribeHybridTest(2000, 5);
  201. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, RyanMqttFailedError, RyanMqttLog_e, { goto __exit; });
  202. checkMemory;
  203. result = RyanMqttNetworkFaultHybridTest(5000);
  204. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, RyanMqttFailedError, RyanMqttLog_e, { goto __exit; });
  205. checkMemory;
  206. return RyanMqttSuccessError;
  207. __exit:
  208. return RyanMqttFailedError;
  209. }