test_cmdev.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. /*********************************************************************
  2. * _ _ _
  3. * _ __ | |_ _ | | __ _ | |__ ___
  4. * | '__|| __|(_)| | / _` || '_ \ / __|
  5. * | | | |_ _ | || (_| || |_) |\__ \
  6. * |_| \__|(_)|_| \__,_||_.__/ |___/
  7. *
  8. * www.rt-labs.com
  9. * Copyright 2018 rt-labs AB, Sweden.
  10. *
  11. * This software is dual-licensed under GPLv3 and a commercial
  12. * license. See the file LICENSE.md distributed with this software for
  13. * full license information.
  14. ********************************************************************/
  15. /**
  16. * @file
  17. * @brief Unit tests of features from the CMDEV state machine.
  18. *
  19. */
  20. #include "utils_for_testing.h"
  21. #include "mocks.h"
  22. #include "pf_includes.h"
  23. #include <gtest/gtest.h>
  24. class CmdevUnitTest : public PnetUnitTest
  25. {
  26. };
  27. TEST_F (CmdevUnitTest, CmdevCalculateDatadirectionInDescriptor)
  28. {
  29. pf_data_direction_values_t resulting_direction;
  30. int ret;
  31. /* Module with no cyclic data */
  32. ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
  33. PNET_DIR_NO_IO,
  34. PF_DIRECTION_INPUT,
  35. PF_DEV_STATUS_TYPE_IOCS,
  36. &resulting_direction);
  37. EXPECT_EQ (-1, ret);
  38. ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
  39. PNET_DIR_NO_IO,
  40. PF_DIRECTION_INPUT,
  41. PF_DEV_STATUS_TYPE_IOPS,
  42. &resulting_direction);
  43. EXPECT_EQ (0, ret);
  44. EXPECT_EQ (PF_DIRECTION_INPUT, resulting_direction);
  45. ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
  46. PNET_DIR_NO_IO,
  47. PF_DIRECTION_OUTPUT,
  48. PF_DEV_STATUS_TYPE_IOCS,
  49. &resulting_direction);
  50. EXPECT_EQ (0, ret);
  51. EXPECT_EQ (PF_DIRECTION_INPUT, resulting_direction);
  52. ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
  53. PNET_DIR_NO_IO,
  54. PF_DIRECTION_OUTPUT,
  55. PF_DEV_STATUS_TYPE_IOPS,
  56. &resulting_direction);
  57. EXPECT_EQ (-1, ret);
  58. /* Input module */
  59. ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
  60. PNET_DIR_INPUT,
  61. PF_DIRECTION_INPUT,
  62. PF_DEV_STATUS_TYPE_IOCS,
  63. &resulting_direction);
  64. EXPECT_EQ (-1, ret);
  65. ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
  66. PNET_DIR_INPUT,
  67. PF_DIRECTION_INPUT,
  68. PF_DEV_STATUS_TYPE_IOPS,
  69. &resulting_direction);
  70. EXPECT_EQ (0, ret);
  71. EXPECT_EQ (PF_DIRECTION_INPUT, resulting_direction);
  72. ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
  73. PNET_DIR_INPUT,
  74. PF_DIRECTION_OUTPUT,
  75. PF_DEV_STATUS_TYPE_IOCS,
  76. &resulting_direction);
  77. EXPECT_EQ (0, ret);
  78. EXPECT_EQ (PF_DIRECTION_INPUT, resulting_direction);
  79. ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
  80. PNET_DIR_INPUT,
  81. PF_DIRECTION_OUTPUT,
  82. PF_DEV_STATUS_TYPE_IOPS,
  83. &resulting_direction);
  84. EXPECT_EQ (-1, ret);
  85. /* Output module */
  86. ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
  87. PNET_DIR_OUTPUT,
  88. PF_DIRECTION_INPUT,
  89. PF_DEV_STATUS_TYPE_IOCS,
  90. &resulting_direction);
  91. EXPECT_EQ (0, ret);
  92. EXPECT_EQ (PF_DIRECTION_OUTPUT, resulting_direction);
  93. ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
  94. PNET_DIR_OUTPUT,
  95. PF_DIRECTION_INPUT,
  96. PF_DEV_STATUS_TYPE_IOPS,
  97. &resulting_direction);
  98. EXPECT_EQ (-1, ret);
  99. ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
  100. PNET_DIR_OUTPUT,
  101. PF_DIRECTION_OUTPUT,
  102. PF_DEV_STATUS_TYPE_IOCS,
  103. &resulting_direction);
  104. EXPECT_EQ (-1, ret);
  105. ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
  106. PNET_DIR_OUTPUT,
  107. PF_DIRECTION_OUTPUT,
  108. PF_DEV_STATUS_TYPE_IOPS,
  109. &resulting_direction);
  110. EXPECT_EQ (0, ret);
  111. EXPECT_EQ (PF_DIRECTION_OUTPUT, resulting_direction);
  112. /* Input and output module */
  113. ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
  114. PNET_DIR_IO,
  115. PF_DIRECTION_INPUT,
  116. PF_DEV_STATUS_TYPE_IOCS,
  117. &resulting_direction);
  118. EXPECT_EQ (0, ret);
  119. EXPECT_EQ (PF_DIRECTION_OUTPUT, resulting_direction);
  120. ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
  121. PNET_DIR_IO,
  122. PF_DIRECTION_INPUT,
  123. PF_DEV_STATUS_TYPE_IOPS,
  124. &resulting_direction);
  125. EXPECT_EQ (0, ret);
  126. EXPECT_EQ (PF_DIRECTION_INPUT, resulting_direction);
  127. ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
  128. PNET_DIR_IO,
  129. PF_DIRECTION_OUTPUT,
  130. PF_DEV_STATUS_TYPE_IOCS,
  131. &resulting_direction);
  132. EXPECT_EQ (0, ret);
  133. EXPECT_EQ (PF_DIRECTION_INPUT, resulting_direction);
  134. ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
  135. PNET_DIR_IO,
  136. PF_DIRECTION_OUTPUT,
  137. PF_DEV_STATUS_TYPE_IOPS,
  138. &resulting_direction);
  139. EXPECT_EQ (0, ret);
  140. EXPECT_EQ (PF_DIRECTION_OUTPUT, resulting_direction);
  141. }
  142. TEST_F (CmdevUnitTest, CmdevCheckZero)
  143. {
  144. int ret;
  145. int ix;
  146. /* Shortest buffer */
  147. uint8_t buffer_1[1] = {0};
  148. ret = pf_cmdev_check_zero (buffer_1, 1);
  149. EXPECT_EQ (0, ret);
  150. for (ix = 1; ix < 0x100; ix++)
  151. {
  152. buffer_1[0] = ix;
  153. ret = pf_cmdev_check_zero (buffer_1, 1);
  154. EXPECT_EQ (-1, ret);
  155. }
  156. /* Small buffer */
  157. uint8_t buffer_5[5] = {0};
  158. ret = pf_cmdev_check_zero (buffer_5, 5);
  159. EXPECT_EQ (0, ret);
  160. for (ix = 1; ix < 0x100; ix++)
  161. {
  162. buffer_5[3] = ix;
  163. ret = pf_cmdev_check_zero (buffer_5, 5);
  164. EXPECT_EQ (-1, ret);
  165. }
  166. /* Buffer size larger than uint8_t */
  167. uint8_t buffer_500[500] = {0};
  168. ret = pf_cmdev_check_zero (buffer_500, 500);
  169. EXPECT_EQ (0, ret);
  170. for (ix = 1; ix < 0x100; ix++)
  171. {
  172. buffer_500[260] = ix;
  173. ret = pf_cmdev_check_zero (buffer_500, 500);
  174. EXPECT_EQ (-1, ret);
  175. }
  176. memset (buffer_500, 0, sizeof (buffer_500));
  177. ret = pf_cmdev_check_zero (buffer_500, 500);
  178. EXPECT_EQ (0, ret);
  179. memset (buffer_500, 9, sizeof (buffer_500));
  180. ret = pf_cmdev_check_zero (buffer_500, 500);
  181. EXPECT_EQ (-1, ret);
  182. /* Pass in length zero */
  183. ret = pf_cmdev_check_zero (buffer_500, 0);
  184. EXPECT_EQ (0, ret);
  185. }
  186. TEST_F (CmdevUnitTest, CmdevCheckVisibleString)
  187. {
  188. int ix;
  189. int ret;
  190. ret = pf_cmdev_check_visible_string ("");
  191. EXPECT_EQ (-1, ret);
  192. ret = pf_cmdev_check_visible_string ("abc");
  193. EXPECT_EQ (0, ret);
  194. /* Short string */
  195. char buffer_20[20] = {0};
  196. ret = pf_cmdev_check_visible_string (buffer_20);
  197. EXPECT_EQ (-1, ret);
  198. buffer_20[0] = "A"[0];
  199. ret = pf_cmdev_check_visible_string (buffer_20);
  200. EXPECT_EQ (0, ret);
  201. memset (buffer_20, "A"[0], sizeof (buffer_20) - 1);
  202. ret = pf_cmdev_check_visible_string (buffer_20);
  203. EXPECT_EQ (0, ret);
  204. /* Test all character values */
  205. for (ix = 0x01; ix <= 0x1F; ix++)
  206. {
  207. buffer_20[10] = ix;
  208. ret = pf_cmdev_check_visible_string (buffer_20);
  209. EXPECT_EQ (-1, ret);
  210. }
  211. for (ix = 0x20; ix <= 0x7E; ix++)
  212. {
  213. buffer_20[10] = ix;
  214. ret = pf_cmdev_check_visible_string (buffer_20);
  215. EXPECT_EQ (0, ret);
  216. }
  217. for (ix = 0x7F; ix <= 0xFF; ix++)
  218. {
  219. buffer_20[10] = ix;
  220. ret = pf_cmdev_check_visible_string (buffer_20);
  221. EXPECT_EQ (-1, ret);
  222. }
  223. /* String length larger than uint8_t */
  224. char buffer_500[500] = {0};
  225. memset (buffer_500, "A"[0], sizeof (buffer_500) - 1);
  226. ret = pf_cmdev_check_visible_string (buffer_500);
  227. EXPECT_EQ (0, ret);
  228. buffer_500[300] = 0x07;
  229. ret = pf_cmdev_check_visible_string (buffer_500);
  230. EXPECT_EQ (-1, ret);
  231. }
  232. TEST_F (CmdevUnitTest, CmdevCheckNoStraddle)
  233. {
  234. uint16_t start_a;
  235. uint16_t length_a;
  236. uint16_t start_b;
  237. uint16_t length_b;
  238. /* x Area A */
  239. /* 0 1 2 3 4 5 6 7 8 9 */
  240. /* x Area B, initial position */
  241. start_a = 0;
  242. length_a = 1;
  243. length_b = 1;
  244. EXPECT_EQ (-1, pf_cmdev_check_no_straddle (start_a, length_a, 0, length_b));
  245. EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 1, length_b));
  246. EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 2, length_b));
  247. /* Area A */
  248. /* 0 1 2 3 4 5 6 7 8 9 */
  249. /* x Area B, initial position */
  250. start_a = 0;
  251. length_a = 0;
  252. length_b = 1;
  253. EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 0, length_b));
  254. EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 1, length_b));
  255. EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 2, length_b));
  256. /* Area A */
  257. /* 0 1 2 3 4 5 6 7 8 9 */
  258. /* Area B, initial position */
  259. start_a = 0;
  260. length_a = 0;
  261. length_b = 0;
  262. EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 0, length_b));
  263. EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 1, length_b));
  264. EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 2, length_b));
  265. /* x Area A */
  266. /* 0 1 2 3 4 5 6 7 8 9 */
  267. /* x Area B, initial position */
  268. start_a = 2;
  269. length_a = 1;
  270. length_b = 1;
  271. EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 0, length_b));
  272. EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 1, length_b));
  273. EXPECT_EQ (-1, pf_cmdev_check_no_straddle (start_a, length_a, 2, length_b));
  274. EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 3, length_b));
  275. EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 4, length_b));
  276. /* x x Area A */
  277. /* 0 1 2 3 4 5 6 7 8 9 */
  278. /* x Area B, initial position */
  279. start_a = 2;
  280. length_a = 2;
  281. length_b = 1;
  282. EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 0, length_b));
  283. EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 1, length_b));
  284. EXPECT_EQ (-1, pf_cmdev_check_no_straddle (start_a, length_a, 2, length_b));
  285. EXPECT_EQ (-1, pf_cmdev_check_no_straddle (start_a, length_a, 3, length_b));
  286. EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 4, length_b));
  287. EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 5, length_b));
  288. /* x x x Area A */
  289. /* 0 1 2 3 4 5 6 7 8 9 */
  290. /* x x Area B, initial position */
  291. start_a = 4;
  292. length_a = 3;
  293. length_b = 2;
  294. EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 0, length_b));
  295. EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 1, length_b));
  296. EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 2, length_b));
  297. EXPECT_EQ (-1, pf_cmdev_check_no_straddle (start_a, length_a, 3, length_b));
  298. EXPECT_EQ (-1, pf_cmdev_check_no_straddle (start_a, length_a, 4, length_b));
  299. EXPECT_EQ (-1, pf_cmdev_check_no_straddle (start_a, length_a, 5, length_b));
  300. EXPECT_EQ (-1, pf_cmdev_check_no_straddle (start_a, length_a, 6, length_b));
  301. EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 7, length_b));
  302. EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 8, length_b));
  303. EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 9, length_b));
  304. /* Values larger than uint8_t */
  305. start_a = 1000;
  306. length_a = 500;
  307. length_b = 300;
  308. for (start_b = 0; start_b <= 700; start_b++)
  309. {
  310. EXPECT_EQ (
  311. 0,
  312. pf_cmdev_check_no_straddle (start_a, length_a, start_b, length_b));
  313. EXPECT_EQ (
  314. 0,
  315. pf_cmdev_check_no_straddle (start_b, length_b, start_a, length_a));
  316. }
  317. for (start_b = 701; start_b <= 1499; start_b++)
  318. {
  319. EXPECT_EQ (
  320. -1,
  321. pf_cmdev_check_no_straddle (start_a, length_a, start_b, length_b));
  322. EXPECT_EQ (
  323. -1,
  324. pf_cmdev_check_no_straddle (start_b, length_b, start_a, length_a));
  325. }
  326. for (start_b = 1500; start_b < 0xFFFF; start_b++)
  327. {
  328. EXPECT_EQ (
  329. 0,
  330. pf_cmdev_check_no_straddle (start_a, length_a, start_b, length_b));
  331. EXPECT_EQ (
  332. 0,
  333. pf_cmdev_check_no_straddle (start_b, length_b, start_a, length_a));
  334. }
  335. EXPECT_EQ (
  336. 0,
  337. pf_cmdev_check_no_straddle (start_a, length_a, 0xFFFF, length_b));
  338. EXPECT_EQ (
  339. 0,
  340. pf_cmdev_check_no_straddle (0xFFFF, length_b, start_a, length_a));
  341. }
  342. TEST_F (CmdevUnitTest, CmdevCheckArType)
  343. {
  344. int ret;
  345. for (uint16_t ar_type = 0; ar_type < 0xFF; ar_type++)
  346. {
  347. ret = pf_cmdev_check_ar_type (ar_type);
  348. if (ar_type == PF_ART_IOCAR_SINGLE)
  349. {
  350. EXPECT_EQ (0, ret);
  351. }
  352. else
  353. {
  354. EXPECT_EQ (-1, ret);
  355. }
  356. }
  357. ret = pf_cmdev_check_ar_type (0xFFFF);
  358. EXPECT_EQ (-1, ret);
  359. }