property_add.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648
  1. #include <CUnit/CUnit.h>
  2. #include <CUnit/Basic.h>
  3. #include "mqtt_protocol.h"
  4. #include "property_mosq.h"
  5. #include "packet_mosq.h"
  6. /* ========================================================================
  7. * BAD IDENTIFIER
  8. * ======================================================================== */
  9. static void bad_add_byte_helper(int identifier)
  10. {
  11. mosquitto_property *proplist = NULL;
  12. int rc;
  13. rc = mosquitto_property_add_byte(&proplist, identifier, 1);
  14. CU_ASSERT_EQUAL(rc, MOSQ_ERR_INVAL);
  15. CU_ASSERT_PTR_NULL(proplist);
  16. }
  17. static void bad_add_int16_helper(int identifier)
  18. {
  19. mosquitto_property *proplist = NULL;
  20. int rc;
  21. rc = mosquitto_property_add_int16(&proplist, identifier, 1);
  22. CU_ASSERT_EQUAL(rc, MOSQ_ERR_INVAL);
  23. CU_ASSERT_PTR_NULL(proplist);
  24. }
  25. static void bad_add_int32_helper(int identifier)
  26. {
  27. mosquitto_property *proplist = NULL;
  28. int rc;
  29. rc = mosquitto_property_add_int32(&proplist, identifier, 1);
  30. CU_ASSERT_EQUAL(rc, MOSQ_ERR_INVAL);
  31. CU_ASSERT_PTR_NULL(proplist);
  32. }
  33. static void bad_add_varint_helper(int identifier)
  34. {
  35. mosquitto_property *proplist = NULL;
  36. int rc;
  37. rc = mosquitto_property_add_varint(&proplist, identifier, 1);
  38. CU_ASSERT_EQUAL(rc, MOSQ_ERR_INVAL);
  39. CU_ASSERT_PTR_NULL(proplist);
  40. }
  41. static void bad_add_binary_helper(int identifier)
  42. {
  43. mosquitto_property *proplist = NULL;
  44. int rc;
  45. rc = mosquitto_property_add_binary(&proplist, identifier, "test", 4);
  46. CU_ASSERT_EQUAL(rc, MOSQ_ERR_INVAL);
  47. CU_ASSERT_PTR_NULL(proplist);
  48. }
  49. static void bad_add_string_helper(int identifier)
  50. {
  51. mosquitto_property *proplist = NULL;
  52. int rc;
  53. rc = mosquitto_property_add_string(&proplist, identifier, "test");
  54. CU_ASSERT_EQUAL(rc, MOSQ_ERR_INVAL);
  55. CU_ASSERT_PTR_NULL(proplist);
  56. }
  57. static void bad_add_string_pair_helper(int identifier)
  58. {
  59. mosquitto_property *proplist = NULL;
  60. int rc;
  61. rc = mosquitto_property_add_string_pair(&proplist, identifier, "key", "value");
  62. CU_ASSERT_EQUAL(rc, MOSQ_ERR_INVAL);
  63. CU_ASSERT_PTR_NULL(proplist);
  64. }
  65. static void TEST_add_bad_byte(void)
  66. {
  67. bad_add_byte_helper(MQTT_PROP_MESSAGE_EXPIRY_INTERVAL);
  68. bad_add_byte_helper(MQTT_PROP_CONTENT_TYPE);
  69. bad_add_byte_helper(MQTT_PROP_RESPONSE_TOPIC);
  70. bad_add_byte_helper(MQTT_PROP_CORRELATION_DATA);
  71. bad_add_byte_helper(MQTT_PROP_SUBSCRIPTION_IDENTIFIER);
  72. bad_add_byte_helper(MQTT_PROP_SESSION_EXPIRY_INTERVAL);
  73. bad_add_byte_helper(MQTT_PROP_ASSIGNED_CLIENT_IDENTIFIER);
  74. bad_add_byte_helper(MQTT_PROP_SERVER_KEEP_ALIVE);
  75. bad_add_byte_helper(MQTT_PROP_AUTHENTICATION_METHOD);
  76. bad_add_byte_helper(MQTT_PROP_AUTHENTICATION_DATA);
  77. bad_add_byte_helper(MQTT_PROP_WILL_DELAY_INTERVAL);
  78. bad_add_byte_helper(MQTT_PROP_RESPONSE_INFORMATION);
  79. bad_add_byte_helper(MQTT_PROP_SERVER_REFERENCE);
  80. bad_add_byte_helper(MQTT_PROP_REASON_STRING);
  81. bad_add_byte_helper(MQTT_PROP_RECEIVE_MAXIMUM);
  82. bad_add_byte_helper(MQTT_PROP_TOPIC_ALIAS_MAXIMUM);
  83. bad_add_byte_helper(MQTT_PROP_TOPIC_ALIAS);
  84. bad_add_byte_helper(MQTT_PROP_USER_PROPERTY);
  85. bad_add_byte_helper(MQTT_PROP_MAXIMUM_PACKET_SIZE);
  86. }
  87. static void TEST_add_bad_int16(void)
  88. {
  89. bad_add_int16_helper(MQTT_PROP_PAYLOAD_FORMAT_INDICATOR);
  90. bad_add_int16_helper(MQTT_PROP_MESSAGE_EXPIRY_INTERVAL);
  91. bad_add_int16_helper(MQTT_PROP_CONTENT_TYPE);
  92. bad_add_int16_helper(MQTT_PROP_RESPONSE_TOPIC);
  93. bad_add_int16_helper(MQTT_PROP_CORRELATION_DATA);
  94. bad_add_int16_helper(MQTT_PROP_SUBSCRIPTION_IDENTIFIER);
  95. bad_add_int16_helper(MQTT_PROP_SESSION_EXPIRY_INTERVAL);
  96. bad_add_int16_helper(MQTT_PROP_ASSIGNED_CLIENT_IDENTIFIER);
  97. bad_add_int16_helper(MQTT_PROP_AUTHENTICATION_METHOD);
  98. bad_add_int16_helper(MQTT_PROP_AUTHENTICATION_DATA);
  99. bad_add_int16_helper(MQTT_PROP_REQUEST_PROBLEM_INFORMATION);
  100. bad_add_int16_helper(MQTT_PROP_WILL_DELAY_INTERVAL);
  101. bad_add_int16_helper(MQTT_PROP_REQUEST_RESPONSE_INFORMATION);
  102. bad_add_int16_helper(MQTT_PROP_RESPONSE_INFORMATION);
  103. bad_add_int16_helper(MQTT_PROP_SERVER_REFERENCE);
  104. bad_add_int16_helper(MQTT_PROP_REASON_STRING);
  105. bad_add_int16_helper(MQTT_PROP_MAXIMUM_QOS);
  106. bad_add_int16_helper(MQTT_PROP_RETAIN_AVAILABLE);
  107. bad_add_int16_helper(MQTT_PROP_USER_PROPERTY);
  108. bad_add_int16_helper(MQTT_PROP_MAXIMUM_PACKET_SIZE);
  109. bad_add_int16_helper(MQTT_PROP_WILDCARD_SUB_AVAILABLE);
  110. bad_add_int16_helper(MQTT_PROP_SUBSCRIPTION_ID_AVAILABLE);
  111. bad_add_int16_helper(MQTT_PROP_SHARED_SUB_AVAILABLE);
  112. }
  113. static void TEST_add_bad_int32(void)
  114. {
  115. bad_add_int32_helper(MQTT_PROP_PAYLOAD_FORMAT_INDICATOR);
  116. bad_add_int32_helper(MQTT_PROP_CONTENT_TYPE);
  117. bad_add_int32_helper(MQTT_PROP_RESPONSE_TOPIC);
  118. bad_add_int32_helper(MQTT_PROP_CORRELATION_DATA);
  119. bad_add_int32_helper(MQTT_PROP_SUBSCRIPTION_IDENTIFIER);
  120. bad_add_int32_helper(MQTT_PROP_ASSIGNED_CLIENT_IDENTIFIER);
  121. bad_add_int32_helper(MQTT_PROP_SERVER_KEEP_ALIVE);
  122. bad_add_int32_helper(MQTT_PROP_AUTHENTICATION_METHOD);
  123. bad_add_int32_helper(MQTT_PROP_AUTHENTICATION_DATA);
  124. bad_add_int32_helper(MQTT_PROP_REQUEST_PROBLEM_INFORMATION);
  125. bad_add_int32_helper(MQTT_PROP_REQUEST_RESPONSE_INFORMATION);
  126. bad_add_int32_helper(MQTT_PROP_RESPONSE_INFORMATION);
  127. bad_add_int32_helper(MQTT_PROP_SERVER_REFERENCE);
  128. bad_add_int32_helper(MQTT_PROP_REASON_STRING);
  129. bad_add_int32_helper(MQTT_PROP_RECEIVE_MAXIMUM);
  130. bad_add_int32_helper(MQTT_PROP_TOPIC_ALIAS_MAXIMUM);
  131. bad_add_int32_helper(MQTT_PROP_TOPIC_ALIAS);
  132. bad_add_int32_helper(MQTT_PROP_MAXIMUM_QOS);
  133. bad_add_int32_helper(MQTT_PROP_RETAIN_AVAILABLE);
  134. bad_add_int32_helper(MQTT_PROP_USER_PROPERTY);
  135. bad_add_int32_helper(MQTT_PROP_WILDCARD_SUB_AVAILABLE);
  136. bad_add_int32_helper(MQTT_PROP_SUBSCRIPTION_ID_AVAILABLE);
  137. bad_add_int32_helper(MQTT_PROP_SHARED_SUB_AVAILABLE);
  138. }
  139. static void TEST_add_bad_varint(void)
  140. {
  141. bad_add_varint_helper(MQTT_PROP_PAYLOAD_FORMAT_INDICATOR);
  142. bad_add_varint_helper(MQTT_PROP_MESSAGE_EXPIRY_INTERVAL);
  143. bad_add_varint_helper(MQTT_PROP_CONTENT_TYPE);
  144. bad_add_varint_helper(MQTT_PROP_RESPONSE_TOPIC);
  145. bad_add_varint_helper(MQTT_PROP_CORRELATION_DATA);
  146. bad_add_varint_helper(MQTT_PROP_SESSION_EXPIRY_INTERVAL);
  147. bad_add_varint_helper(MQTT_PROP_ASSIGNED_CLIENT_IDENTIFIER);
  148. bad_add_varint_helper(MQTT_PROP_SERVER_KEEP_ALIVE);
  149. bad_add_varint_helper(MQTT_PROP_AUTHENTICATION_METHOD);
  150. bad_add_varint_helper(MQTT_PROP_AUTHENTICATION_DATA);
  151. bad_add_varint_helper(MQTT_PROP_REQUEST_PROBLEM_INFORMATION);
  152. bad_add_varint_helper(MQTT_PROP_WILL_DELAY_INTERVAL);
  153. bad_add_varint_helper(MQTT_PROP_REQUEST_RESPONSE_INFORMATION);
  154. bad_add_varint_helper(MQTT_PROP_RESPONSE_INFORMATION);
  155. bad_add_varint_helper(MQTT_PROP_SERVER_REFERENCE);
  156. bad_add_varint_helper(MQTT_PROP_REASON_STRING);
  157. bad_add_varint_helper(MQTT_PROP_RECEIVE_MAXIMUM);
  158. bad_add_varint_helper(MQTT_PROP_TOPIC_ALIAS_MAXIMUM);
  159. bad_add_varint_helper(MQTT_PROP_TOPIC_ALIAS);
  160. bad_add_varint_helper(MQTT_PROP_MAXIMUM_QOS);
  161. bad_add_varint_helper(MQTT_PROP_RETAIN_AVAILABLE);
  162. bad_add_varint_helper(MQTT_PROP_USER_PROPERTY);
  163. bad_add_varint_helper(MQTT_PROP_MAXIMUM_PACKET_SIZE);
  164. bad_add_varint_helper(MQTT_PROP_WILDCARD_SUB_AVAILABLE);
  165. bad_add_varint_helper(MQTT_PROP_SUBSCRIPTION_ID_AVAILABLE);
  166. bad_add_varint_helper(MQTT_PROP_SHARED_SUB_AVAILABLE);
  167. }
  168. static void TEST_add_bad_binary(void)
  169. {
  170. bad_add_binary_helper(MQTT_PROP_PAYLOAD_FORMAT_INDICATOR);
  171. bad_add_binary_helper(MQTT_PROP_MESSAGE_EXPIRY_INTERVAL);
  172. bad_add_binary_helper(MQTT_PROP_CONTENT_TYPE);
  173. bad_add_binary_helper(MQTT_PROP_RESPONSE_TOPIC);
  174. bad_add_binary_helper(MQTT_PROP_SUBSCRIPTION_IDENTIFIER);
  175. bad_add_binary_helper(MQTT_PROP_SESSION_EXPIRY_INTERVAL);
  176. bad_add_binary_helper(MQTT_PROP_ASSIGNED_CLIENT_IDENTIFIER);
  177. bad_add_binary_helper(MQTT_PROP_SERVER_KEEP_ALIVE);
  178. bad_add_binary_helper(MQTT_PROP_AUTHENTICATION_METHOD);
  179. bad_add_binary_helper(MQTT_PROP_REQUEST_PROBLEM_INFORMATION);
  180. bad_add_binary_helper(MQTT_PROP_WILL_DELAY_INTERVAL);
  181. bad_add_binary_helper(MQTT_PROP_REQUEST_RESPONSE_INFORMATION);
  182. bad_add_binary_helper(MQTT_PROP_RESPONSE_INFORMATION);
  183. bad_add_binary_helper(MQTT_PROP_SERVER_REFERENCE);
  184. bad_add_binary_helper(MQTT_PROP_REASON_STRING);
  185. bad_add_binary_helper(MQTT_PROP_RECEIVE_MAXIMUM);
  186. bad_add_binary_helper(MQTT_PROP_TOPIC_ALIAS_MAXIMUM);
  187. bad_add_binary_helper(MQTT_PROP_TOPIC_ALIAS);
  188. bad_add_binary_helper(MQTT_PROP_MAXIMUM_QOS);
  189. bad_add_binary_helper(MQTT_PROP_RETAIN_AVAILABLE);
  190. bad_add_binary_helper(MQTT_PROP_USER_PROPERTY);
  191. bad_add_binary_helper(MQTT_PROP_MAXIMUM_PACKET_SIZE);
  192. bad_add_binary_helper(MQTT_PROP_WILDCARD_SUB_AVAILABLE);
  193. bad_add_binary_helper(MQTT_PROP_SUBSCRIPTION_ID_AVAILABLE);
  194. bad_add_binary_helper(MQTT_PROP_SHARED_SUB_AVAILABLE);
  195. }
  196. static void TEST_add_bad_string(void)
  197. {
  198. bad_add_string_helper(MQTT_PROP_PAYLOAD_FORMAT_INDICATOR);
  199. bad_add_string_helper(MQTT_PROP_MESSAGE_EXPIRY_INTERVAL);
  200. bad_add_string_helper(MQTT_PROP_CORRELATION_DATA);
  201. bad_add_string_helper(MQTT_PROP_SUBSCRIPTION_IDENTIFIER);
  202. bad_add_string_helper(MQTT_PROP_SESSION_EXPIRY_INTERVAL);
  203. bad_add_string_helper(MQTT_PROP_SERVER_KEEP_ALIVE);
  204. bad_add_string_helper(MQTT_PROP_AUTHENTICATION_DATA);
  205. bad_add_string_helper(MQTT_PROP_REQUEST_PROBLEM_INFORMATION);
  206. bad_add_string_helper(MQTT_PROP_WILL_DELAY_INTERVAL);
  207. bad_add_string_helper(MQTT_PROP_REQUEST_RESPONSE_INFORMATION);
  208. bad_add_string_helper(MQTT_PROP_RECEIVE_MAXIMUM);
  209. bad_add_string_helper(MQTT_PROP_TOPIC_ALIAS_MAXIMUM);
  210. bad_add_string_helper(MQTT_PROP_TOPIC_ALIAS);
  211. bad_add_string_helper(MQTT_PROP_MAXIMUM_QOS);
  212. bad_add_string_helper(MQTT_PROP_RETAIN_AVAILABLE);
  213. bad_add_string_helper(MQTT_PROP_USER_PROPERTY);
  214. bad_add_string_helper(MQTT_PROP_MAXIMUM_PACKET_SIZE);
  215. bad_add_string_helper(MQTT_PROP_WILDCARD_SUB_AVAILABLE);
  216. bad_add_string_helper(MQTT_PROP_SUBSCRIPTION_ID_AVAILABLE);
  217. bad_add_string_helper(MQTT_PROP_SHARED_SUB_AVAILABLE);
  218. }
  219. static void TEST_add_bad_string_pair(void)
  220. {
  221. bad_add_string_pair_helper(MQTT_PROP_PAYLOAD_FORMAT_INDICATOR);
  222. bad_add_string_pair_helper(MQTT_PROP_MESSAGE_EXPIRY_INTERVAL);
  223. bad_add_string_pair_helper(MQTT_PROP_CONTENT_TYPE);
  224. bad_add_string_pair_helper(MQTT_PROP_RESPONSE_TOPIC);
  225. bad_add_string_pair_helper(MQTT_PROP_CORRELATION_DATA);
  226. bad_add_string_pair_helper(MQTT_PROP_SUBSCRIPTION_IDENTIFIER);
  227. bad_add_string_pair_helper(MQTT_PROP_SESSION_EXPIRY_INTERVAL);
  228. bad_add_string_pair_helper(MQTT_PROP_ASSIGNED_CLIENT_IDENTIFIER);
  229. bad_add_string_pair_helper(MQTT_PROP_SERVER_KEEP_ALIVE);
  230. bad_add_string_pair_helper(MQTT_PROP_AUTHENTICATION_METHOD);
  231. bad_add_string_pair_helper(MQTT_PROP_AUTHENTICATION_DATA);
  232. bad_add_string_pair_helper(MQTT_PROP_REQUEST_PROBLEM_INFORMATION);
  233. bad_add_string_pair_helper(MQTT_PROP_WILL_DELAY_INTERVAL);
  234. bad_add_string_pair_helper(MQTT_PROP_REQUEST_RESPONSE_INFORMATION);
  235. bad_add_string_pair_helper(MQTT_PROP_RESPONSE_INFORMATION);
  236. bad_add_string_pair_helper(MQTT_PROP_SERVER_REFERENCE);
  237. bad_add_string_pair_helper(MQTT_PROP_REASON_STRING);
  238. bad_add_string_pair_helper(MQTT_PROP_RECEIVE_MAXIMUM);
  239. bad_add_string_pair_helper(MQTT_PROP_TOPIC_ALIAS_MAXIMUM);
  240. bad_add_string_pair_helper(MQTT_PROP_TOPIC_ALIAS);
  241. bad_add_string_pair_helper(MQTT_PROP_MAXIMUM_QOS);
  242. bad_add_string_pair_helper(MQTT_PROP_RETAIN_AVAILABLE);
  243. bad_add_string_pair_helper(MQTT_PROP_MAXIMUM_PACKET_SIZE);
  244. bad_add_string_pair_helper(MQTT_PROP_WILDCARD_SUB_AVAILABLE);
  245. bad_add_string_pair_helper(MQTT_PROP_SUBSCRIPTION_ID_AVAILABLE);
  246. bad_add_string_pair_helper(MQTT_PROP_SHARED_SUB_AVAILABLE);
  247. }
  248. /* ========================================================================
  249. * SINGLE ADD
  250. * ======================================================================== */
  251. static void single_add_byte_helper(int identifier)
  252. {
  253. mosquitto_property *proplist = NULL;
  254. int rc;
  255. rc = mosquitto_property_add_byte(&proplist, identifier, 1);
  256. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  257. CU_ASSERT_PTR_NOT_NULL(proplist);
  258. if(proplist){
  259. CU_ASSERT_EQUAL(proplist->identifier, identifier);
  260. CU_ASSERT_EQUAL(proplist->value.i8, 1);
  261. CU_ASSERT_PTR_NULL(proplist->next);
  262. mosquitto_property_free_all(&proplist);
  263. }
  264. }
  265. static void single_add_int16_helper(int identifier)
  266. {
  267. mosquitto_property *proplist = NULL;
  268. int rc;
  269. rc = mosquitto_property_add_int16(&proplist, identifier, 11234);
  270. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  271. CU_ASSERT_PTR_NOT_NULL(proplist);
  272. if(proplist){
  273. CU_ASSERT_EQUAL(proplist->identifier, identifier);
  274. CU_ASSERT_EQUAL(proplist->value.i16, 11234);
  275. CU_ASSERT_PTR_NULL(proplist->next);
  276. mosquitto_property_free_all(&proplist);
  277. }
  278. }
  279. static void single_add_int32_helper(int identifier)
  280. {
  281. mosquitto_property *proplist = NULL;
  282. int rc;
  283. rc = mosquitto_property_add_int32(&proplist, identifier, 765432);
  284. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  285. CU_ASSERT_PTR_NOT_NULL(proplist);
  286. if(proplist){
  287. CU_ASSERT_EQUAL(proplist->identifier, identifier);
  288. CU_ASSERT_EQUAL(proplist->value.i32, 765432);
  289. CU_ASSERT_PTR_NULL(proplist->next);
  290. mosquitto_property_free_all(&proplist);
  291. }
  292. }
  293. static void single_add_varint_helper(int identifier)
  294. {
  295. mosquitto_property *proplist = NULL;
  296. int rc;
  297. rc = mosquitto_property_add_varint(&proplist, identifier, 139123999);
  298. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  299. CU_ASSERT_PTR_NOT_NULL(proplist);
  300. if(proplist){
  301. CU_ASSERT_EQUAL(proplist->identifier, identifier);
  302. CU_ASSERT_EQUAL(proplist->value.varint, 139123999);
  303. CU_ASSERT_PTR_NULL(proplist->next);
  304. mosquitto_property_free_all(&proplist);
  305. }
  306. }
  307. static void single_add_binary_helper(int identifier)
  308. {
  309. mosquitto_property *proplist = NULL;
  310. int rc;
  311. rc = mosquitto_property_add_binary(&proplist, identifier, "test", 4);
  312. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  313. CU_ASSERT_PTR_NOT_NULL(proplist);
  314. if(proplist){
  315. CU_ASSERT_EQUAL(proplist->identifier, identifier);
  316. CU_ASSERT_EQUAL(proplist->value.bin.len, 4);
  317. CU_ASSERT_NSTRING_EQUAL(proplist->value.bin.v, "test", 4);
  318. CU_ASSERT_PTR_NULL(proplist->next);
  319. mosquitto_property_free_all(&proplist);
  320. }
  321. }
  322. static void single_add_string_helper(int identifier)
  323. {
  324. mosquitto_property *proplist = NULL;
  325. int rc;
  326. rc = mosquitto_property_add_string(&proplist, identifier, "string");
  327. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  328. CU_ASSERT_PTR_NOT_NULL(proplist);
  329. if(proplist){
  330. CU_ASSERT_EQUAL(proplist->identifier, identifier);
  331. CU_ASSERT_STRING_EQUAL(proplist->value.s.v, "string");
  332. CU_ASSERT_EQUAL(proplist->value.s.len, strlen("string"));
  333. CU_ASSERT_PTR_NULL(proplist->next);
  334. mosquitto_property_free_all(&proplist);
  335. }
  336. }
  337. static void single_add_string_pair_helper(int identifier)
  338. {
  339. mosquitto_property *proplist = NULL;
  340. int rc;
  341. rc = mosquitto_property_add_string_pair(&proplist, identifier, "key", "value");
  342. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  343. CU_ASSERT_PTR_NOT_NULL(proplist);
  344. if(proplist){
  345. CU_ASSERT_EQUAL(proplist->identifier, identifier);
  346. CU_ASSERT_STRING_EQUAL(proplist->name.v, "key");
  347. CU_ASSERT_EQUAL(proplist->name.len, strlen("key"));
  348. CU_ASSERT_STRING_EQUAL(proplist->value.s.v, "value");
  349. CU_ASSERT_EQUAL(proplist->value.s.len, strlen("value"));
  350. CU_ASSERT_PTR_NULL(proplist->next);
  351. mosquitto_property_free_all(&proplist);
  352. }
  353. }
  354. static void TEST_add_single_byte(void)
  355. {
  356. single_add_byte_helper(MQTT_PROP_PAYLOAD_FORMAT_INDICATOR);
  357. single_add_byte_helper(MQTT_PROP_REQUEST_PROBLEM_INFORMATION);
  358. single_add_byte_helper(MQTT_PROP_REQUEST_RESPONSE_INFORMATION);
  359. single_add_byte_helper(MQTT_PROP_MAXIMUM_QOS);
  360. single_add_byte_helper(MQTT_PROP_RETAIN_AVAILABLE);
  361. single_add_byte_helper(MQTT_PROP_WILDCARD_SUB_AVAILABLE);
  362. single_add_byte_helper(MQTT_PROP_SUBSCRIPTION_ID_AVAILABLE);
  363. single_add_byte_helper(MQTT_PROP_SHARED_SUB_AVAILABLE);
  364. }
  365. static void TEST_add_single_int16(void)
  366. {
  367. single_add_int16_helper(MQTT_PROP_SERVER_KEEP_ALIVE);
  368. single_add_int16_helper(MQTT_PROP_RECEIVE_MAXIMUM);
  369. single_add_int16_helper(MQTT_PROP_TOPIC_ALIAS_MAXIMUM);
  370. single_add_int16_helper(MQTT_PROP_TOPIC_ALIAS);
  371. }
  372. static void TEST_add_single_int32(void)
  373. {
  374. single_add_int32_helper(MQTT_PROP_MESSAGE_EXPIRY_INTERVAL);
  375. single_add_int32_helper(MQTT_PROP_SESSION_EXPIRY_INTERVAL);
  376. single_add_int32_helper(MQTT_PROP_WILL_DELAY_INTERVAL);
  377. single_add_int32_helper(MQTT_PROP_MAXIMUM_PACKET_SIZE);
  378. }
  379. static void TEST_add_single_varint(void)
  380. {
  381. single_add_varint_helper(MQTT_PROP_SUBSCRIPTION_IDENTIFIER);
  382. }
  383. static void TEST_add_single_binary(void)
  384. {
  385. single_add_binary_helper(MQTT_PROP_CORRELATION_DATA);
  386. single_add_binary_helper(MQTT_PROP_AUTHENTICATION_DATA);
  387. }
  388. static void TEST_add_single_string(void)
  389. {
  390. single_add_string_helper(MQTT_PROP_CONTENT_TYPE);
  391. single_add_string_helper(MQTT_PROP_RESPONSE_TOPIC);
  392. single_add_string_helper(MQTT_PROP_ASSIGNED_CLIENT_IDENTIFIER);
  393. single_add_string_helper(MQTT_PROP_AUTHENTICATION_METHOD);
  394. single_add_string_helper(MQTT_PROP_RESPONSE_INFORMATION);
  395. single_add_string_helper(MQTT_PROP_SERVER_REFERENCE);
  396. single_add_string_helper(MQTT_PROP_REASON_STRING);
  397. }
  398. static void TEST_add_single_string_pair(void)
  399. {
  400. single_add_string_pair_helper(MQTT_PROP_USER_PROPERTY);
  401. }
  402. /* ========================================================================
  403. * ADD ALL PROPERTIES FOR A COMMAND
  404. * ======================================================================== */
  405. static void TEST_add_all_connect(void)
  406. {
  407. mosquitto_property *proplist = NULL;
  408. mosquitto_property *p;
  409. int count;
  410. int rc;
  411. rc = mosquitto_property_add_int32(&proplist, MQTT_PROP_SESSION_EXPIRY_INTERVAL, 86400);
  412. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  413. CU_ASSERT_PTR_NOT_NULL(proplist);
  414. rc = mosquitto_property_add_string(&proplist, MQTT_PROP_AUTHENTICATION_METHOD, "basic");
  415. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  416. CU_ASSERT_PTR_NOT_NULL(proplist);
  417. rc = mosquitto_property_add_binary(&proplist, MQTT_PROP_AUTHENTICATION_DATA, "password", strlen("password"));
  418. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  419. CU_ASSERT_PTR_NOT_NULL(proplist);
  420. rc = mosquitto_property_add_byte(&proplist, MQTT_PROP_REQUEST_PROBLEM_INFORMATION, 1);
  421. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  422. CU_ASSERT_PTR_NOT_NULL(proplist);
  423. rc = mosquitto_property_add_byte(&proplist, MQTT_PROP_REQUEST_RESPONSE_INFORMATION, 1);
  424. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  425. CU_ASSERT_PTR_NOT_NULL(proplist);
  426. rc = mosquitto_property_add_int16(&proplist, MQTT_PROP_RECEIVE_MAXIMUM, 1024);
  427. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  428. CU_ASSERT_PTR_NOT_NULL(proplist);
  429. rc = mosquitto_property_add_int16(&proplist, MQTT_PROP_TOPIC_ALIAS_MAXIMUM, 64);
  430. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  431. CU_ASSERT_PTR_NOT_NULL(proplist);
  432. rc = mosquitto_property_add_string_pair(&proplist, MQTT_PROP_USER_PROPERTY, "user-agent", "mosquitto/test");
  433. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  434. CU_ASSERT_PTR_NOT_NULL(proplist);
  435. rc = mosquitto_property_add_int32(&proplist, MQTT_PROP_MAXIMUM_PACKET_SIZE, 200000000);
  436. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  437. CU_ASSERT_PTR_NOT_NULL(proplist);
  438. p = proplist;
  439. count = 0;
  440. while(p){
  441. count++;
  442. p = p->next;
  443. }
  444. CU_ASSERT_EQUAL(count, 9);
  445. mosquitto_property_free_all(&proplist);
  446. }
  447. static void TEST_add_all_connack(void)
  448. {
  449. mosquitto_property *proplist = NULL;
  450. mosquitto_property *p;
  451. int count;
  452. int rc;
  453. rc = mosquitto_property_add_int32(&proplist, MQTT_PROP_SESSION_EXPIRY_INTERVAL, 86400);
  454. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  455. CU_ASSERT_PTR_NOT_NULL(proplist);
  456. rc = mosquitto_property_add_string(&proplist, MQTT_PROP_ASSIGNED_CLIENT_IDENTIFIER, "clientid");
  457. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  458. CU_ASSERT_PTR_NOT_NULL(proplist);
  459. rc = mosquitto_property_add_int16(&proplist, MQTT_PROP_SERVER_KEEP_ALIVE, 900);
  460. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  461. CU_ASSERT_PTR_NOT_NULL(proplist);
  462. rc = mosquitto_property_add_string(&proplist, MQTT_PROP_AUTHENTICATION_METHOD, "basic");
  463. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  464. CU_ASSERT_PTR_NOT_NULL(proplist);
  465. rc = mosquitto_property_add_binary(&proplist, MQTT_PROP_AUTHENTICATION_DATA, "password", strlen("password"));
  466. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  467. CU_ASSERT_PTR_NOT_NULL(proplist);
  468. rc = mosquitto_property_add_string(&proplist, MQTT_PROP_RESPONSE_INFORMATION, "response");
  469. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  470. CU_ASSERT_PTR_NOT_NULL(proplist);
  471. rc = mosquitto_property_add_string(&proplist, MQTT_PROP_SERVER_REFERENCE, "localhost");
  472. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  473. CU_ASSERT_PTR_NOT_NULL(proplist);
  474. rc = mosquitto_property_add_string(&proplist, MQTT_PROP_REASON_STRING, "reason");
  475. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  476. CU_ASSERT_PTR_NOT_NULL(proplist);
  477. rc = mosquitto_property_add_int16(&proplist, MQTT_PROP_RECEIVE_MAXIMUM, 1024);
  478. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  479. CU_ASSERT_PTR_NOT_NULL(proplist);
  480. rc = mosquitto_property_add_int16(&proplist, MQTT_PROP_TOPIC_ALIAS_MAXIMUM, 64);
  481. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  482. CU_ASSERT_PTR_NOT_NULL(proplist);
  483. rc = mosquitto_property_add_byte(&proplist, MQTT_PROP_MAXIMUM_QOS, 1);
  484. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  485. CU_ASSERT_PTR_NOT_NULL(proplist);
  486. rc = mosquitto_property_add_byte(&proplist, MQTT_PROP_RETAIN_AVAILABLE, 0);
  487. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  488. CU_ASSERT_PTR_NOT_NULL(proplist);
  489. rc = mosquitto_property_add_string_pair(&proplist, MQTT_PROP_USER_PROPERTY, "user-agent", "mosquitto/test");
  490. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  491. CU_ASSERT_PTR_NOT_NULL(proplist);
  492. rc = mosquitto_property_add_int32(&proplist, MQTT_PROP_MAXIMUM_PACKET_SIZE, 200000000);
  493. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  494. CU_ASSERT_PTR_NOT_NULL(proplist);
  495. rc = mosquitto_property_add_byte(&proplist, MQTT_PROP_WILDCARD_SUB_AVAILABLE, 0);
  496. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  497. CU_ASSERT_PTR_NOT_NULL(proplist);
  498. rc = mosquitto_property_add_byte(&proplist, MQTT_PROP_SUBSCRIPTION_ID_AVAILABLE, 0);
  499. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  500. CU_ASSERT_PTR_NOT_NULL(proplist);
  501. rc = mosquitto_property_add_byte(&proplist, MQTT_PROP_SHARED_SUB_AVAILABLE, 0);
  502. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  503. CU_ASSERT_PTR_NOT_NULL(proplist);
  504. p = proplist;
  505. count = 0;
  506. while(p){
  507. count++;
  508. p = p->next;
  509. }
  510. CU_ASSERT_EQUAL(count, 17);
  511. mosquitto_property_free_all(&proplist);
  512. }
  513. static void TEST_check_length(void)
  514. {
  515. mosquitto_property *proplist = NULL;
  516. int rc;
  517. unsigned int len;
  518. int varbytes;
  519. int i;
  520. len = property__get_remaining_length(proplist);
  521. CU_ASSERT_EQUAL(len, 1);
  522. for(i=1; i<10000; i++){
  523. rc = mosquitto_property_add_byte(&proplist, MQTT_PROP_SHARED_SUB_AVAILABLE, 0);
  524. CU_ASSERT_EQUAL(rc, MOSQ_ERR_SUCCESS);
  525. CU_ASSERT_PTR_NOT_NULL(proplist);
  526. if(proplist){
  527. len = property__get_remaining_length(proplist);
  528. if(i < 64){
  529. varbytes = 1;
  530. }else if(i < 8192){
  531. varbytes = 2;
  532. }else{
  533. varbytes = 3;
  534. }
  535. CU_ASSERT_EQUAL(len, varbytes+2*i);
  536. }else{
  537. break;
  538. }
  539. }
  540. mosquitto_property_free_all(&proplist);
  541. }
  542. /* ========================================================================
  543. * TEST SUITE SETUP
  544. * ======================================================================== */
  545. int init_property_add_tests(void)
  546. {
  547. CU_pSuite test_suite = NULL;
  548. test_suite = CU_add_suite("Property add", NULL, NULL);
  549. if(!test_suite){
  550. printf("Error adding CUnit Property add test suite.\n");
  551. return 1;
  552. }
  553. if(0
  554. || !CU_add_test(test_suite, "Add nothing, check length", TEST_check_length)
  555. || !CU_add_test(test_suite, "Add bad byte", TEST_add_bad_byte)
  556. || !CU_add_test(test_suite, "Add bad int16", TEST_add_bad_int16)
  557. || !CU_add_test(test_suite, "Add bad int32", TEST_add_bad_int32)
  558. || !CU_add_test(test_suite, "Add bad varint", TEST_add_bad_varint)
  559. || !CU_add_test(test_suite, "Add bad binary", TEST_add_bad_binary)
  560. || !CU_add_test(test_suite, "Add bad string", TEST_add_bad_string)
  561. || !CU_add_test(test_suite, "Add bad string pair", TEST_add_bad_string_pair)
  562. || !CU_add_test(test_suite, "Add single byte", TEST_add_single_byte)
  563. || !CU_add_test(test_suite, "Add single int16", TEST_add_single_int16)
  564. || !CU_add_test(test_suite, "Add single int32", TEST_add_single_int32)
  565. || !CU_add_test(test_suite, "Add single varint", TEST_add_single_varint)
  566. || !CU_add_test(test_suite, "Add single binary", TEST_add_single_binary)
  567. || !CU_add_test(test_suite, "Add single string", TEST_add_single_string)
  568. || !CU_add_test(test_suite, "Add single string pair", TEST_add_single_string_pair)
  569. || !CU_add_test(test_suite, "Add all CONNECT", TEST_add_all_connect)
  570. || !CU_add_test(test_suite, "Add all CONNACK", TEST_add_all_connack)
  571. ){
  572. printf("Error adding Property Add CUnit tests.\n");
  573. return 1;
  574. }
  575. return 0;
  576. }