RyanMqttPublicApiParamCheckTest.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  1. #include "RyanMqttTest.h"
  2. static RyanMqttQos_e invalidQos()
  3. {
  4. static bool aa = true;
  5. if (aa)
  6. {
  7. aa = false;
  8. // NOLINTNEXTLINE(clang-analyzer-optin.core.EnumCastOutOfRange)
  9. return (RyanMqttQos_e)(uintptr_t)10;
  10. }
  11. aa = true;
  12. return RyanMqttSubFail;
  13. }
  14. static RyanMqttError_e RyanMqttBaseApiParamCheckTest(void)
  15. {
  16. RyanMqttError_e result = RyanMqttSuccessError;
  17. RyanMqttClient_t *validClient = NULL;
  18. // 准备一个有效的客户端用于某些测试
  19. result = RyanMqttTestInit(&validClient, RyanMqttTrue, RyanMqttFalse, 120, NULL, NULL);
  20. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, result, RyanMqttLog_e, { goto __exit; });
  21. result = RyanMqttInit(NULL);
  22. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  23. result = RyanMqttDestroy(NULL);
  24. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  25. // todo 可能增加状态判断
  26. result = RyanMqttStart(NULL);
  27. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  28. // todo 可能增加状态判断
  29. result = RyanMqttDisconnect(NULL, RyanMqttTrue);
  30. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  31. // todo 可能增加状态判断
  32. result = RyanMqttReconnect(NULL);
  33. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  34. // NULL客户端指针
  35. RyanMqttState_e state = RyanMqttGetState(NULL);
  36. RyanMqttCheckCodeNoReturn(state == RyanMqttInvalidState, RyanMqttFailedError, RyanMqttLog_e, { goto __exit; });
  37. result = RyanMqttGetKeepAliveRemain(NULL, NULL);
  38. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  39. uint32_t keepAliveRemain;
  40. // NULL客户端指针
  41. result = RyanMqttGetKeepAliveRemain(NULL, &keepAliveRemain);
  42. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  43. // NULL剩余时间指针
  44. result = RyanMqttGetKeepAliveRemain(validClient, NULL);
  45. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  46. // NULL客户端指针
  47. result = RyanMqttDiscardAckHandler(NULL, MQTT_PACKET_TYPE_PUBACK, 1);
  48. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  49. // 无效包ID (0 是无效的)
  50. result = RyanMqttDiscardAckHandler(validClient, MQTT_PACKET_TYPE_PUBACK, 0);
  51. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  52. // 超过最大包ID
  53. result = RyanMqttDiscardAckHandler(validClient, MQTT_PACKET_TYPE_PUBACK, RyanMqttMaxPacketId + 1);
  54. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  55. RyanMqttEventId_e eventId = RyanMqttEventConnected;
  56. // NULL客户端指针
  57. result = RyanMqttGetEventId(NULL, &eventId);
  58. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  59. // NULL eventId指针
  60. result = RyanMqttGetEventId(validClient, NULL);
  61. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  62. // NULL客户端指针
  63. result = RyanMqttRegisterEventId(NULL, RyanMqttEventConnected);
  64. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  65. // NULL客户端指针
  66. result = RyanMqttCancelEventId(NULL, RyanMqttEventConnected);
  67. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  68. // 清理资源
  69. if (validClient)
  70. {
  71. RyanMqttTestDestroyClient(validClient);
  72. }
  73. return RyanMqttSuccessError;
  74. __exit:
  75. // 清理资源
  76. if (validClient)
  77. {
  78. RyanMqttTestDestroyClient(validClient);
  79. }
  80. return RyanMqttFailedError;
  81. }
  82. static RyanMqttError_e RyanMqttLwtApiParamCheckTest(void)
  83. {
  84. RyanMqttError_e result = RyanMqttSuccessError;
  85. RyanMqttClient_t *validClient = NULL;
  86. // 准备一个有效的客户端用于某些测试
  87. result = RyanMqttTestInit(&validClient, RyanMqttTrue, RyanMqttFalse, 120, NULL, NULL);
  88. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, result, RyanMqttLog_e, { goto __exit; });
  89. RyanMqttDisconnect(validClient, RyanMqttTrue);
  90. // 增加一个get接口
  91. // NULL客户端指针
  92. result = RyanMqttSetLwt(NULL, "test/lwt", "offline", 7, RyanMqttQos1, RyanMqttTrue);
  93. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  94. // NULL主题指针
  95. result = RyanMqttSetLwt(validClient, NULL, "offline", 7, RyanMqttQos1, RyanMqttTrue);
  96. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  97. // NULL负载但长度不为0
  98. result = RyanMqttSetLwt(validClient, "test/lwt", NULL, 7, RyanMqttQos1, RyanMqttTrue);
  99. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  100. // payloadLen 超长
  101. result = RyanMqttSetLwt(validClient, "test/lwt", "offline", RyanMqttMaxPayloadLen + 1, RyanMqttQos1,
  102. RyanMqttTrue);
  103. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  104. // 无效QoS
  105. result = RyanMqttSetLwt(validClient, "test/lwt", "offline", 7, invalidQos(), RyanMqttTrue);
  106. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  107. // 无效retain
  108. // NOLINTNEXTLINE(clang-analyzer-optin.core.EnumCastOutOfRange)
  109. result = RyanMqttSetLwt(validClient, "test/lwt", "offline", 7, RyanMqttQos1, 200);
  110. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  111. // 清理资源
  112. if (validClient)
  113. {
  114. RyanMqttTestDestroyClient(validClient);
  115. }
  116. return RyanMqttSuccessError;
  117. __exit:
  118. RyanMqttLog_e("result: %d", result);
  119. // 清理资源
  120. if (validClient)
  121. {
  122. RyanMqttTestDestroyClient(validClient);
  123. }
  124. return RyanMqttFailedError;
  125. }
  126. static RyanMqttError_e RyanMqttConfigApiParamCheckTest(void)
  127. {
  128. RyanMqttError_e result = RyanMqttSuccessError;
  129. RyanMqttClient_t *validClient = NULL;
  130. // 准备一个有效的客户端用于某些测试
  131. result = RyanMqttTestInit(&validClient, RyanMqttTrue, RyanMqttFalse, 120, NULL, NULL);
  132. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, result, RyanMqttLog_e, { goto __exit; });
  133. RyanMqttDisconnect(validClient, RyanMqttTrue);
  134. // NULL客户端指针
  135. result = RyanMqttGetConfig(NULL, NULL);
  136. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  137. RyanMqttClientConfig_t *getConfig = NULL;
  138. /**
  139. * @brief RyanMqttGetConfig
  140. *
  141. */
  142. // NULL客户端指针
  143. result = RyanMqttGetConfig(NULL, &getConfig);
  144. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  145. // NULL配置指针
  146. result = RyanMqttGetConfig(validClient, NULL);
  147. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  148. // NULL配置指针
  149. result = RyanMqttFreeConfigFromGet(NULL);
  150. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  151. /**
  152. * @brief RyanMqttSetConfig
  153. *
  154. */
  155. RyanMqttClientConfig_t baseMqttConfig = {.clientId = RyanMqttClientId,
  156. .userName = RyanMqttUserName,
  157. .password = RyanMqttPassword,
  158. .host = RyanMqttHost,
  159. .port = RyanMqttPort,
  160. .taskName = "mqttThread",
  161. .taskPrio = 16,
  162. .taskStack = 4096,
  163. .mqttVersion = 4,
  164. .ackHandlerRepeatCountWarning = 6,
  165. .ackHandlerCountWarning = 60000,
  166. .autoReconnectFlag = RyanMqttTrue,
  167. .cleanSessionFlag = RyanMqttTrue,
  168. .reconnectTimeout = 3000,
  169. .recvTimeout = 2000,
  170. .sendTimeout = 1800,
  171. .ackTimeout = 10000,
  172. .keepaliveTimeoutS = 120,
  173. .mqttEventHandle = NULL,
  174. .userData = NULL};
  175. RyanMqttClientConfig_t mqttConfig = {0};
  176. // NULL客户端指针
  177. result = RyanMqttSetConfig(NULL, &mqttConfig);
  178. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  179. // NULL配置指针
  180. result = RyanMqttSetConfig(validClient, NULL);
  181. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  182. #define checkSetConfigParam(code) \
  183. do \
  184. { \
  185. RyanMqttMemcpy(&mqttConfig, &baseMqttConfig, sizeof(RyanMqttClientConfig_t)); \
  186. {code}; \
  187. result = RyanMqttSetConfig(validClient, &mqttConfig); \
  188. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, \
  189. { goto __exit; }); \
  190. } while (0)
  191. checkSetConfigParam({ mqttConfig.clientId = NULL; });
  192. checkSetConfigParam({ mqttConfig.host = NULL; });
  193. checkSetConfigParam({ mqttConfig.taskName = NULL; });
  194. checkSetConfigParam({
  195. mqttConfig.recvTimeout = 10;
  196. mqttConfig.keepaliveTimeoutS = 20 - 1;
  197. });
  198. checkSetConfigParam({
  199. mqttConfig.recvTimeout = 10;
  200. mqttConfig.sendTimeout = 11;
  201. });
  202. // 清理资源
  203. if (validClient)
  204. {
  205. RyanMqttTestDestroyClient(validClient);
  206. }
  207. return RyanMqttSuccessError;
  208. __exit:
  209. // 清理资源
  210. if (validClient)
  211. {
  212. RyanMqttTestDestroyClient(validClient);
  213. }
  214. return RyanMqttFailedError;
  215. }
  216. static RyanMqttError_e RyanMqttSubApiParamCheckTest(void)
  217. {
  218. RyanMqttError_e result = RyanMqttSuccessError;
  219. RyanMqttClient_t *validClient = NULL;
  220. // 准备一个有效的客户端用于某些测试
  221. result = RyanMqttTestInit(&validClient, RyanMqttTrue, RyanMqttFalse, 120, NULL, NULL);
  222. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, result, RyanMqttLog_e, { goto __exit; });
  223. // NULL客户端指针
  224. result = RyanMqttSubscribe(NULL, "test/topic", RyanMqttQos1);
  225. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  226. // NULL主题指针
  227. result = RyanMqttSubscribe(validClient, NULL, RyanMqttQos1);
  228. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  229. // 无效QoS级别
  230. result = RyanMqttSubscribe(validClient, "test/topic", invalidQos());
  231. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  232. // 分配测试数据
  233. RyanMqttSubscribeData_t subscribeData[2] = {0};
  234. subscribeData[0].topic = "test/topic1";
  235. subscribeData[0].topicLen = strlen("test/topic1");
  236. subscribeData[0].qos = RyanMqttQos1;
  237. subscribeData[1].topic = "test/topic2";
  238. subscribeData[1].topicLen = strlen("test/topic2");
  239. subscribeData[1].qos = RyanMqttQos2;
  240. // NULL客户端指针
  241. result = RyanMqttSubscribeMany(NULL, 2, subscribeData);
  242. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  243. // 无效数量
  244. result = RyanMqttSubscribeMany(validClient, 0, subscribeData);
  245. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  246. result = RyanMqttSubscribeMany(validClient, -1, subscribeData);
  247. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  248. // NULL数据指针
  249. result = RyanMqttSubscribeMany(validClient, 2, NULL);
  250. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  251. for (uint32_t i = 0; i < getArraySize(subscribeData); i++)
  252. {
  253. // subscribeData 内数据无效
  254. subscribeData[i].topic = NULL;
  255. subscribeData[i].topicLen = strlen("test/topic2");
  256. subscribeData[i].qos = RyanMqttQos2;
  257. result = RyanMqttSubscribeMany(validClient, 2, subscribeData);
  258. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  259. // subscribeData 内数据无效
  260. subscribeData[i].topic = "test/topic2";
  261. subscribeData[i].topicLen = 0;
  262. subscribeData[i].qos = RyanMqttQos2;
  263. result = RyanMqttSubscribeMany(validClient, 2, subscribeData);
  264. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  265. // subscribeData 内数据无效
  266. subscribeData[i].topic = "test/topic2";
  267. subscribeData[i].topicLen = strlen("test/topic2");
  268. subscribeData[i].qos = invalidQos();
  269. result = RyanMqttSubscribeMany(validClient, 2, subscribeData);
  270. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  271. // 恢复 subscribeData 内数据
  272. subscribeData[i].topic = "test/topic2";
  273. subscribeData[i].topicLen = strlen("test/topic2");
  274. subscribeData[i].qos = RyanMqttQos2;
  275. }
  276. // NULL客户端指针
  277. result = RyanMqttUnSubscribe(NULL, "test/topic");
  278. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  279. // NULL主题指针
  280. result = RyanMqttUnSubscribe(validClient, NULL);
  281. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  282. // 分配测试数据
  283. RyanMqttUnSubscribeData_t unsubscribeData[2] = {0};
  284. unsubscribeData[0].topic = "test/topic1";
  285. unsubscribeData[0].topicLen = strlen("test/topic1");
  286. unsubscribeData[1].topic = "test/topic2";
  287. unsubscribeData[1].topicLen = strlen("test/topic2");
  288. // NULL客户端指针
  289. result = RyanMqttUnSubscribeMany(NULL, 2, unsubscribeData);
  290. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  291. // 无效数量
  292. result = RyanMqttUnSubscribeMany(validClient, 0, unsubscribeData);
  293. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  294. // NULL数据指针
  295. result = RyanMqttUnSubscribeMany(validClient, 2, NULL);
  296. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  297. for (uint32_t i = 0; i < getArraySize(unsubscribeData); i++)
  298. {
  299. // unsubscribeData 内数据无效
  300. unsubscribeData[i].topic = NULL;
  301. unsubscribeData[i].topicLen = strlen("test/topic2");
  302. result = RyanMqttUnSubscribeMany(validClient, 2, unsubscribeData);
  303. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  304. // unsubscribeData 内数据无效
  305. unsubscribeData[i].topic = "test/topic2";
  306. unsubscribeData[i].topicLen = 0;
  307. result = RyanMqttUnSubscribeMany(validClient, 2, unsubscribeData);
  308. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  309. // 恢复 unsubscribeData 内数据
  310. unsubscribeData[i].topic = "test/topic2";
  311. unsubscribeData[i].topicLen = strlen("test/topic2");
  312. }
  313. /**
  314. * @brief
  315. *
  316. */
  317. RyanMqttMsgHandler_t *msgHandles = NULL;
  318. int32_t subscribeNum = 0;
  319. int32_t totalCount = 0;
  320. // NULL客户端指针
  321. result = RyanMqttGetSubscribeSafe(NULL, &msgHandles, &subscribeNum);
  322. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  323. // NULL消息句柄指针
  324. result = RyanMqttGetSubscribeSafe(validClient, NULL, &subscribeNum);
  325. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  326. // NULL数量指针
  327. result = RyanMqttGetSubscribeSafe(validClient, &msgHandles, NULL);
  328. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  329. // NULL指针但数量不为0
  330. result = RyanMqttSafeFreeSubscribeResources(NULL, 5);
  331. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  332. // NULL客户端指针
  333. result = RyanMqttGetSubscribeTotalCount(NULL, &totalCount);
  334. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  335. // NULL总数指针
  336. result = RyanMqttGetSubscribeTotalCount(validClient, NULL);
  337. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e,
  338. { goto __exit; }); // 清理资源
  339. /**
  340. * @brief
  341. *
  342. */
  343. RyanMqttMsgHandler_t msgHandlesStatic[3] = {0};
  344. RyanMqttGetSubscribe(NULL, msgHandlesStatic, getArraySize(msgHandlesStatic), &subscribeNum);
  345. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  346. RyanMqttGetSubscribe(validClient, NULL, getArraySize(msgHandlesStatic), &subscribeNum);
  347. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  348. RyanMqttGetSubscribe(validClient, msgHandlesStatic, 0, &subscribeNum);
  349. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  350. RyanMqttGetSubscribe(validClient, msgHandlesStatic, getArraySize(msgHandlesStatic), NULL);
  351. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  352. if (validClient)
  353. {
  354. RyanMqttTestDestroyClient(validClient);
  355. }
  356. return RyanMqttSuccessError;
  357. __exit:
  358. // 清理资源
  359. if (validClient)
  360. {
  361. RyanMqttTestDestroyClient(validClient);
  362. }
  363. return RyanMqttFailedError;
  364. }
  365. static RyanMqttError_e RyanMqttPubApiParamCheckTest(void)
  366. {
  367. RyanMqttError_e result = RyanMqttSuccessError;
  368. RyanMqttClient_t *validClient = NULL;
  369. // 准备一个有效的客户端用于某些测试
  370. result = RyanMqttTestInit(&validClient, RyanMqttTrue, RyanMqttFalse, 120, NULL, NULL);
  371. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, result, RyanMqttLog_e, { goto __exit; });
  372. // NULL客户端指针
  373. result = RyanMqttPublish(NULL, "test/topic", "payload", 7, RyanMqttQos0, RyanMqttFalse);
  374. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  375. // NULL主题指针
  376. result = RyanMqttPublish(validClient, NULL, "payload", 7, RyanMqttQos0, RyanMqttFalse);
  377. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  378. // NULL负载指针但长度不为0
  379. result = RyanMqttPublish(validClient, "test/topic", NULL, 7, RyanMqttQos0, RyanMqttFalse);
  380. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  381. // 无效QoS级别
  382. result = RyanMqttPublish(validClient, "test/topic", "payload", 7, invalidQos(), RyanMqttFalse);
  383. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  384. // 超大负载长度
  385. result = RyanMqttPublish(validClient, "test/topic", "payload", RyanMqttMaxPayloadLen + 1, RyanMqttQos0,
  386. RyanMqttFalse);
  387. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  388. // NULL客户端指针
  389. result = RyanMqttPublishWithUserData(NULL, "test/topic", 10, "payload", 7, RyanMqttQos1, RyanMqttFalse, NULL);
  390. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  391. // NULL主题指针
  392. result = RyanMqttPublishWithUserData(validClient, NULL, 10, "payload", 7, RyanMqttQos1, RyanMqttFalse, NULL);
  393. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  394. // 主题长度为0
  395. result = RyanMqttPublishWithUserData(validClient, "test/topic", 0, "payload", 7, RyanMqttQos1, RyanMqttFalse,
  396. NULL);
  397. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  398. // 无效QoS级别
  399. result = RyanMqttPublishWithUserData(validClient, "test/topic", strlen("test/topic"), "payload", 7,
  400. invalidQos(), RyanMqttFalse, NULL);
  401. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e,
  402. { goto __exit; }); // 清理资源
  403. // 负载长度>0但负载指针为NULL
  404. result = RyanMqttPublishWithUserData(validClient, "test/topic", strlen("test/topic"), NULL, 7, RyanMqttQos1,
  405. RyanMqttFalse, NULL);
  406. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  407. if (validClient)
  408. {
  409. RyanMqttTestDestroyClient(validClient);
  410. }
  411. return RyanMqttSuccessError;
  412. __exit:
  413. // 清理资源
  414. if (validClient)
  415. {
  416. RyanMqttTestDestroyClient(validClient);
  417. }
  418. return RyanMqttFailedError;
  419. }
  420. RyanMqttError_e RyanMqttPublicApiParamCheckTest(void)
  421. {
  422. RyanMqttError_e result = RyanMqttSuccessError;
  423. result = RyanMqttBaseApiParamCheckTest();
  424. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, result, RyanMqttLog_e, { goto __exit; });
  425. checkMemory;
  426. result = RyanMqttLwtApiParamCheckTest();
  427. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, result, RyanMqttLog_e, { goto __exit; });
  428. checkMemory;
  429. result = RyanMqttConfigApiParamCheckTest();
  430. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, result, RyanMqttLog_e, { goto __exit; });
  431. checkMemory;
  432. result = RyanMqttSubApiParamCheckTest();
  433. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, result, RyanMqttLog_e, { goto __exit; });
  434. checkMemory;
  435. result = RyanMqttPubApiParamCheckTest();
  436. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, result, RyanMqttLog_e, { goto __exit; });
  437. checkMemory;
  438. return RyanMqttSuccessError;
  439. __exit:
  440. return RyanMqttFailedError;
  441. }