RyanMqttPublicApiParamCheckTest.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575
  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. // 非法主题
  98. result = RyanMqttSetLwt(validClient, "", "offline", 7, RyanMqttQos1, RyanMqttTrue);
  99. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  100. // NULL负载但长度不为0
  101. result = RyanMqttSetLwt(validClient, "test/lwt", NULL, 7, RyanMqttQos1, RyanMqttTrue);
  102. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  103. // payloadLen 超长
  104. result = RyanMqttSetLwt(validClient, "test/lwt", "offline", RyanMqttMaxPayloadLen + 1, RyanMqttQos1,
  105. RyanMqttTrue);
  106. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  107. // 无效QoS
  108. result = RyanMqttSetLwt(validClient, "test/lwt", "offline", 7, invalidQos(), RyanMqttTrue);
  109. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  110. // 清理资源
  111. if (validClient)
  112. {
  113. RyanMqttTestDestroyClient(validClient);
  114. }
  115. return RyanMqttSuccessError;
  116. __exit:
  117. RyanMqttLog_e("result: %d", result);
  118. // 清理资源
  119. if (validClient)
  120. {
  121. RyanMqttTestDestroyClient(validClient);
  122. }
  123. return RyanMqttFailedError;
  124. }
  125. static RyanMqttError_e RyanMqttConfigApiParamCheckTest(void)
  126. {
  127. RyanMqttError_e result = RyanMqttSuccessError;
  128. RyanMqttClient_t *validClient = NULL;
  129. /**
  130. * @brief RyanMqttSetConfig
  131. *
  132. */
  133. RyanMqttClientConfig_t baseMqttConfig = {.clientId = RyanMqttClientId,
  134. .userName = RyanMqttUserName,
  135. .password = RyanMqttPassword,
  136. .host = RyanMqttHost,
  137. .port = RyanMqttPort,
  138. .taskName = "mqttThread",
  139. .taskPrio = 16,
  140. .taskStack = 4096,
  141. .mqttVersion = 4,
  142. .ackHandlerRepeatCountWarning = 6,
  143. .ackHandlerCountWarning = 60000,
  144. .autoReconnectFlag = RyanMqttTrue,
  145. .cleanSessionFlag = RyanMqttTrue,
  146. .reconnectTimeout = 3000,
  147. .recvTimeout = 2000,
  148. .sendTimeout = 1800,
  149. .ackTimeout = 10000,
  150. .keepaliveTimeoutS = 120,
  151. .mqttEventHandle = NULL,
  152. .userData = NULL};
  153. result = RyanMqttInit(&validClient);
  154. RyanMqttCheck(RyanMqttSuccessError == result, result, RyanMqttLog_e);
  155. RyanMqttClientConfig_t mqttConfig = {0};
  156. // NULL客户端指针
  157. result = RyanMqttSetConfig(NULL, &mqttConfig);
  158. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  159. // NULL配置指针
  160. result = RyanMqttSetConfig(validClient, NULL);
  161. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  162. #define checkSetConfigParam(code, errType) \
  163. do \
  164. { \
  165. RyanMqttMemcpy(&mqttConfig, &baseMqttConfig, sizeof(RyanMqttClientConfig_t)); \
  166. {code}; \
  167. result = RyanMqttSetConfig(validClient, &mqttConfig); \
  168. RyanMqttCheckCodeNoReturn((errType) == result, result, RyanMqttLog_e, { goto __exit; }); \
  169. } while (0)
  170. checkSetConfigParam({ mqttConfig.host = NULL; }, RyanMqttParamInvalidError);
  171. checkSetConfigParam({ mqttConfig.taskName = NULL; }, RyanMqttParamInvalidError);
  172. checkSetConfigParam({ mqttConfig.clientId = NULL; }, RyanMqttParamInvalidError);
  173. // NULL用户名密码
  174. checkSetConfigParam({ mqttConfig.userName = NULL; }, RyanMqttSuccessError);
  175. checkSetConfigParam({ mqttConfig.password = NULL; }, RyanMqttSuccessError);
  176. // 0长度
  177. checkSetConfigParam({ mqttConfig.clientId = ""; }, RyanMqttSuccessError);
  178. checkSetConfigParam({ mqttConfig.userName = ""; }, RyanMqttSuccessError);
  179. checkSetConfigParam({ mqttConfig.password = ""; }, RyanMqttSuccessError);
  180. // 配置错误
  181. checkSetConfigParam(
  182. {
  183. mqttConfig.recvTimeout = 10;
  184. mqttConfig.keepaliveTimeoutS = 20 - 1;
  185. },
  186. RyanMqttParamInvalidError);
  187. checkSetConfigParam(
  188. {
  189. mqttConfig.recvTimeout = 10;
  190. mqttConfig.sendTimeout = 11;
  191. },
  192. RyanMqttParamInvalidError);
  193. RyanMqttSetConfig(validClient, &baseMqttConfig);
  194. RyanMqttDestroy(validClient);
  195. validClient = NULL;
  196. /**
  197. * @brief RyanMqttGetConfig
  198. *
  199. */
  200. // 准备一个有效的客户端用于某些测试
  201. result = RyanMqttTestInit(&validClient, RyanMqttTrue, RyanMqttFalse, 120, NULL, NULL);
  202. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, result, RyanMqttLog_e, { goto __exit; });
  203. RyanMqttDisconnect(validClient, RyanMqttTrue);
  204. // NULL客户端指针
  205. result = RyanMqttGetConfig(NULL, NULL);
  206. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  207. RyanMqttClientConfig_t *getConfig = NULL;
  208. /**
  209. * @brief RyanMqttGetConfig
  210. *
  211. */
  212. // NULL客户端指针
  213. result = RyanMqttGetConfig(NULL, &getConfig);
  214. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  215. // NULL配置指针
  216. result = RyanMqttGetConfig(validClient, NULL);
  217. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  218. // NULL配置指针
  219. result = RyanMqttFreeConfigFromGet(NULL);
  220. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  221. // 清理资源
  222. if (validClient)
  223. {
  224. RyanMqttTestDestroyClient(validClient);
  225. }
  226. return RyanMqttSuccessError;
  227. __exit:
  228. // 清理资源
  229. if (validClient)
  230. {
  231. RyanMqttTestDestroyClient(validClient);
  232. }
  233. return RyanMqttFailedError;
  234. }
  235. static RyanMqttError_e RyanMqttSubApiParamCheckTest(void)
  236. {
  237. RyanMqttError_e result = RyanMqttSuccessError;
  238. RyanMqttClient_t *validClient = NULL;
  239. // 准备一个有效的客户端用于某些测试
  240. result = RyanMqttTestInit(&validClient, RyanMqttTrue, RyanMqttFalse, 120, NULL, NULL);
  241. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, result, RyanMqttLog_e, { goto __exit; });
  242. // NULL客户端指针
  243. result = RyanMqttSubscribe(NULL, "test/topic", RyanMqttQos1);
  244. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  245. // NULL主题指针
  246. result = RyanMqttSubscribe(validClient, NULL, RyanMqttQos1);
  247. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  248. // 无效QoS级别
  249. result = RyanMqttSubscribe(validClient, "test/topic", invalidQos());
  250. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  251. // 分配测试数据
  252. RyanMqttSubscribeData_t subscribeData[2] = {0};
  253. subscribeData[0].topic = "test/topic1";
  254. subscribeData[0].topicLen = strlen("test/topic1");
  255. subscribeData[0].qos = RyanMqttQos1;
  256. subscribeData[1].topic = "test/topic2";
  257. subscribeData[1].topicLen = strlen("test/topic2");
  258. subscribeData[1].qos = RyanMqttQos2;
  259. // NULL客户端指针
  260. result = RyanMqttSubscribeMany(NULL, 2, subscribeData);
  261. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  262. // 无效数量
  263. result = RyanMqttSubscribeMany(validClient, 0, subscribeData);
  264. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  265. result = RyanMqttSubscribeMany(validClient, -1, subscribeData);
  266. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  267. // NULL数据指针
  268. result = RyanMqttSubscribeMany(validClient, 2, NULL);
  269. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  270. for (uint32_t i = 0; i < getArraySize(subscribeData); i++)
  271. {
  272. // subscribeData 内数据无效
  273. subscribeData[i].topic = NULL;
  274. subscribeData[i].topicLen = strlen("test/topic2");
  275. subscribeData[i].qos = RyanMqttQos2;
  276. result = RyanMqttSubscribeMany(validClient, 2, subscribeData);
  277. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  278. // subscribeData 内数据无效
  279. subscribeData[i].topic = "test/topic2";
  280. subscribeData[i].topicLen = 0;
  281. subscribeData[i].qos = RyanMqttQos2;
  282. result = RyanMqttSubscribeMany(validClient, 2, subscribeData);
  283. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  284. // subscribeData 内数据无效
  285. subscribeData[i].topic = "test/topic2";
  286. subscribeData[i].topicLen = strlen("test/topic2");
  287. subscribeData[i].qos = invalidQos();
  288. result = RyanMqttSubscribeMany(validClient, 2, subscribeData);
  289. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  290. // 恢复 subscribeData 内数据
  291. subscribeData[i].topic = "test/topic2";
  292. subscribeData[i].topicLen = strlen("test/topic2");
  293. subscribeData[i].qos = RyanMqttQos2;
  294. }
  295. // NULL客户端指针
  296. result = RyanMqttUnSubscribe(NULL, "test/topic");
  297. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  298. // NULL主题指针
  299. result = RyanMqttUnSubscribe(validClient, NULL);
  300. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  301. // 分配测试数据
  302. RyanMqttUnSubscribeData_t unsubscribeData[2] = {0};
  303. unsubscribeData[0].topic = "test/topic1";
  304. unsubscribeData[0].topicLen = strlen("test/topic1");
  305. unsubscribeData[1].topic = "test/topic2";
  306. unsubscribeData[1].topicLen = strlen("test/topic2");
  307. // NULL客户端指针
  308. result = RyanMqttUnSubscribeMany(NULL, 2, unsubscribeData);
  309. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  310. // 无效数量
  311. result = RyanMqttUnSubscribeMany(validClient, 0, unsubscribeData);
  312. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  313. // NULL数据指针
  314. result = RyanMqttUnSubscribeMany(validClient, 2, NULL);
  315. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  316. for (uint32_t i = 0; i < getArraySize(unsubscribeData); i++)
  317. {
  318. // unsubscribeData 内数据无效
  319. unsubscribeData[i].topic = NULL;
  320. unsubscribeData[i].topicLen = strlen("test/topic2");
  321. result = RyanMqttUnSubscribeMany(validClient, 2, unsubscribeData);
  322. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  323. // unsubscribeData 内数据无效
  324. unsubscribeData[i].topic = "test/topic2";
  325. unsubscribeData[i].topicLen = 0;
  326. result = RyanMqttUnSubscribeMany(validClient, 2, unsubscribeData);
  327. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  328. // 恢复 unsubscribeData 内数据
  329. unsubscribeData[i].topic = "test/topic2";
  330. unsubscribeData[i].topicLen = strlen("test/topic2");
  331. }
  332. /**
  333. * @brief
  334. *
  335. */
  336. RyanMqttMsgHandler_t *msgHandles = NULL;
  337. int32_t subscribeNum = 0;
  338. int32_t totalCount = 0;
  339. // NULL客户端指针
  340. result = RyanMqttGetSubscribeSafe(NULL, &msgHandles, &subscribeNum);
  341. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  342. // NULL消息句柄指针
  343. result = RyanMqttGetSubscribeSafe(validClient, NULL, &subscribeNum);
  344. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  345. // NULL数量指针
  346. result = RyanMqttGetSubscribeSafe(validClient, &msgHandles, NULL);
  347. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  348. // NULL指针但数量不为0
  349. result = RyanMqttSafeFreeSubscribeResources(NULL, 5);
  350. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  351. // NULL客户端指针
  352. result = RyanMqttGetSubscribeTotalCount(NULL, &totalCount);
  353. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  354. // NULL总数指针
  355. result = RyanMqttGetSubscribeTotalCount(validClient, NULL);
  356. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e,
  357. { goto __exit; }); // 清理资源
  358. /**
  359. * @brief
  360. *
  361. */
  362. RyanMqttMsgHandler_t msgHandlesStatic[3] = {0};
  363. RyanMqttGetSubscribe(NULL, msgHandlesStatic, getArraySize(msgHandlesStatic), &subscribeNum);
  364. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  365. RyanMqttGetSubscribe(validClient, NULL, getArraySize(msgHandlesStatic), &subscribeNum);
  366. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  367. RyanMqttGetSubscribe(validClient, msgHandlesStatic, 0, &subscribeNum);
  368. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  369. RyanMqttGetSubscribe(validClient, msgHandlesStatic, getArraySize(msgHandlesStatic), NULL);
  370. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  371. if (validClient)
  372. {
  373. RyanMqttTestDestroyClient(validClient);
  374. }
  375. return RyanMqttSuccessError;
  376. __exit:
  377. // 清理资源
  378. if (validClient)
  379. {
  380. RyanMqttTestDestroyClient(validClient);
  381. }
  382. return RyanMqttFailedError;
  383. }
  384. static RyanMqttError_e RyanMqttPubApiParamCheckTest(void)
  385. {
  386. RyanMqttError_e result = RyanMqttSuccessError;
  387. RyanMqttClient_t *validClient = NULL;
  388. // 准备一个有效的客户端用于某些测试
  389. result = RyanMqttTestInit(&validClient, RyanMqttTrue, RyanMqttFalse, 120, NULL, NULL);
  390. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, result, RyanMqttLog_e, { goto __exit; });
  391. // NULL客户端指针
  392. result = RyanMqttPublish(NULL, "test/topic", "payload", 7, RyanMqttQos0, RyanMqttFalse);
  393. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  394. // NULL主题指针
  395. result = RyanMqttPublish(validClient, NULL, "payload", 7, RyanMqttQos0, RyanMqttFalse);
  396. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  397. // NULL负载指针但长度不为0
  398. result = RyanMqttPublish(validClient, "test/topic", NULL, 7, RyanMqttQos0, RyanMqttFalse);
  399. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  400. // 无效QoS级别
  401. result = RyanMqttPublish(validClient, "test/topic", "payload", 7, invalidQos(), RyanMqttFalse);
  402. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  403. // 超大负载长度
  404. result = RyanMqttPublish(validClient, "test/topic", "payload", RyanMqttMaxPayloadLen + 1, RyanMqttQos0,
  405. RyanMqttFalse);
  406. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  407. // NULL客户端指针
  408. result = RyanMqttPublishWithUserData(NULL, "test/topic", 10, "payload", 7, RyanMqttQos1, RyanMqttFalse, NULL);
  409. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  410. // NULL主题指针
  411. result = RyanMqttPublishWithUserData(validClient, NULL, 10, "payload", 7, RyanMqttQos1, RyanMqttFalse, NULL);
  412. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  413. // 主题长度为0
  414. result = RyanMqttPublishWithUserData(validClient, "test/topic", 0, "payload", 7, RyanMqttQos1, RyanMqttFalse,
  415. NULL);
  416. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  417. // 无效QoS级别
  418. result = RyanMqttPublishWithUserData(validClient, "test/topic", strlen("test/topic"), "payload", 7,
  419. invalidQos(), RyanMqttFalse, NULL);
  420. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e,
  421. { goto __exit; }); // 清理资源
  422. // 负载长度>0但负载指针为NULL
  423. result = RyanMqttPublishWithUserData(validClient, "test/topic", strlen("test/topic"), NULL, 7, RyanMqttQos1,
  424. RyanMqttFalse, NULL);
  425. RyanMqttCheckCodeNoReturn(RyanMqttParamInvalidError == result, result, RyanMqttLog_e, { goto __exit; });
  426. if (validClient)
  427. {
  428. RyanMqttTestDestroyClient(validClient);
  429. }
  430. return RyanMqttSuccessError;
  431. __exit:
  432. // 清理资源
  433. if (validClient)
  434. {
  435. RyanMqttTestDestroyClient(validClient);
  436. }
  437. return RyanMqttFailedError;
  438. }
  439. RyanMqttError_e RyanMqttPublicApiParamCheckTest(void)
  440. {
  441. RyanMqttError_e result = RyanMqttSuccessError;
  442. result = RyanMqttBaseApiParamCheckTest();
  443. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, result, RyanMqttLog_e, { goto __exit; });
  444. checkMemory;
  445. result = RyanMqttLwtApiParamCheckTest();
  446. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, result, RyanMqttLog_e, { goto __exit; });
  447. checkMemory;
  448. result = RyanMqttConfigApiParamCheckTest();
  449. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, result, RyanMqttLog_e, { goto __exit; });
  450. checkMemory;
  451. result = RyanMqttSubApiParamCheckTest();
  452. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, result, RyanMqttLog_e, { goto __exit; });
  453. checkMemory;
  454. result = RyanMqttPubApiParamCheckTest();
  455. RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, result, RyanMqttLog_e, { goto __exit; });
  456. checkMemory;
  457. return RyanMqttSuccessError;
  458. __exit:
  459. return RyanMqttFailedError;
  460. }