test_cmrdr.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  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 Integration testing of CMRDR.
  18. *
  19. * Using for example:
  20. * pnet_application_ready()
  21. * pnet_output_get_data_and_iops()
  22. * pnet_input_get_iocs()
  23. * pnet_input_set_data_and_iops()
  24. * pnet_output_set_iocs()
  25. * pnet_create_log_book_entry()
  26. * pnet_diag_add()
  27. *
  28. */
  29. #include "utils_for_testing.h"
  30. #include "mocks.h"
  31. #include "pf_includes.h"
  32. #include <gtest/gtest.h>
  33. // clang-format off
  34. static uint8_t connect_req[] =
  35. {
  36. 0x04, 0x00, 0x28, 0x00, 0x10, 0x00,
  37. 0x00, 0x00, 0x00, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0x01, 0xbe, 0xef,
  38. 0xfe, 0xed, 0x01, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0xa0, 0x24, 0x42,
  39. 0xdf, 0x7d, 0xbb, 0xac, 0x97, 0xe2, 0x76, 0x54, 0x9f, 0x47, 0xa5, 0xbd, 0xa5, 0xe3, 0x7d, 0x98,
  40. 0xe5, 0xda, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  41. 0xff, 0xff, 0xff, 0xff, 0x86, 0x01, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x00, 0x00, 0x72, 0x01,
  42. 0x00, 0x00, 0x24, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x01, 0x00, 0x00, 0x01, 0x01,
  43. 0x00, 0x42, 0x01, 0x00, 0x00, 0x01, 0x30, 0xab, 0xa9, 0xa3, 0xf7, 0x64, 0xb7, 0x44, 0xb3, 0xb6,
  44. 0x7e, 0xe2, 0x8a, 0x1a, 0x02, 0xcb, 0x00, 0x02, 0xc8, 0x5b, 0x76, 0xe6, 0x89, 0xdf, 0xde, 0xa0,
  45. 0x00, 0x00, 0x6c, 0x97, 0x11, 0xd1, 0x82, 0x71, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x01, 0x40, 0x00,
  46. 0x00, 0x11, 0x02, 0x58, 0x88, 0x92, 0x00, 0x0c, 0x72, 0x74, 0x2d, 0x6c, 0x61, 0x62, 0x73, 0x2d,
  47. 0x64, 0x65, 0x6d, 0x6f, 0x01, 0x02, 0x00, 0x50, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x88, 0x92,
  48. 0x00, 0x00, 0x00, 0x02, 0x00, 0x28, 0x80, 0x01, 0x00, 0x20, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
  49. 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  50. 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
  51. 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03,
  52. 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x05, 0x01, 0x02, 0x00, 0x50, 0x01, 0x00, 0x00, 0x02,
  53. 0x00, 0x02, 0x88, 0x92, 0x00, 0x00, 0x00, 0x02, 0x00, 0x28, 0x80, 0x00, 0x00, 0x20, 0x00, 0x01,
  54. 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00,
  55. 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
  56. 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01,
  57. 0x00, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03, 0x01, 0x04, 0x00, 0x3c,
  58. 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
  59. 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01,
  60. 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x80, 0x01,
  61. 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x04, 0x00, 0x26,
  62. 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00,
  63. 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01,
  64. 0x00, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x03, 0x00, 0x16, 0x01, 0x00, 0x00, 0x01, 0x88, 0x92,
  65. 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0xc8, 0xc0, 0x00, 0xa0, 0x00
  66. };
  67. static uint8_t release_req[] =
  68. {
  69. 0x04, 0x00, 0x28, 0x00, 0x10, 0x00,
  70. 0x00, 0x00, 0x00, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0x01, 0xbe, 0xef,
  71. 0xfe, 0xed, 0x01, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0xa0, 0x24, 0x42,
  72. 0xdf, 0x7d, 0xbb, 0xac, 0x97, 0xe2, 0x76, 0x54, 0x9f, 0x47, 0xa5, 0xbd, 0xa5, 0xe3, 0x7d, 0x98,
  73. 0xe5, 0xda, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00,
  74. 0xff, 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x20, 0x00,
  75. 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x14,
  76. 0x00, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x30, 0xab, 0xa9, 0xa3, 0xf7, 0x64, 0xb7, 0x44, 0xb3, 0xb6,
  77. 0x7e, 0xe2, 0x8a, 0x1a, 0x02, 0xcb, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00
  78. };
  79. static uint8_t prm_end_req[] =
  80. {
  81. 0x04, 0x00, 0x28, 0x00, 0x10, 0x00,
  82. 0x00, 0x00, 0x00, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0x01, 0xbe, 0xef,
  83. 0xfe, 0xed, 0x01, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0xa0, 0x24, 0x42,
  84. 0xdf, 0x7d, 0xbb, 0xac, 0x97, 0xe2, 0x76, 0x54, 0x9f, 0x47, 0xa5, 0xbd, 0xa5, 0xe3, 0x7d, 0x98,
  85. 0xe5, 0xda, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00,
  86. 0xff, 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x20, 0x00,
  87. 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x10,
  88. 0x00, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x30, 0xab, 0xa9, 0xa3, 0xf7, 0x64, 0xb7, 0x44, 0xb3, 0xb6,
  89. 0x7e, 0xe2, 0x8a, 0x1a, 0x02, 0xcb, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00
  90. };
  91. static uint8_t appl_rdy_rsp[] =
  92. {
  93. 0x04, 0x02, 0x0a, 0x00, 0x10, 0x00,
  94. 0x00, 0x00, 0x00, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0x00, 0xbe, 0xef,
  95. 0xfe, 0xed, 0x01, 0x00, 0xa0, 0xde, 0x97, 0x6c, 0xd1, 0x11, 0x82, 0x71, 0x00, 0xa0, 0x24, 0x42,
  96. 0xdf, 0x7d, 0x79, 0x56, 0x34, 0x12, 0x34, 0x12, 0x78, 0x56, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
  97. 0x07, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,
  98. 0xff, 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
  99. 0x00, 0x00, 0xdc, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x81, 0x12,
  100. 0x00, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x30, 0xab, 0xa9, 0xa3, 0xf7, 0x64, 0xb7, 0x44, 0xb3, 0xb6,
  101. 0x7e, 0xe2, 0x8a, 0x1a, 0x02, 0xcb, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00
  102. };
  103. static uint8_t data_packet_good_iops_good_iocs[] =
  104. {
  105. 0x1e, 0x30, 0x6c, 0xa2, 0x45, 0x5e, 0xc8, 0x5b, 0x76, 0xe6, 0x89, 0xdf, 0x88, 0x92, 0x80, 0x00,
  106. 0x80, 0x80, 0x80, 0x80, 0x23, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  107. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  108. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0x35, 0x00
  109. };
  110. static uint16_t test_mod_diff[] =
  111. {
  112. 0xe002
  113. };
  114. static uint16_t test_reads[] =
  115. {
  116. 0x8000, 0x8001,
  117. 0x800a, 0x800b, 0x800c,
  118. 0x8010, 0x8011, 0x8012, 0x8013,
  119. 0x801e,
  120. 0x8020,
  121. 0x8027, 0x8028, 0x8029,
  122. 0x802a, 0x802b,
  123. 0x802c, 0x802d,
  124. 0x802f,
  125. 0x8030, 0x8031,
  126. 0x8050, 0x8051, 0x8052, 0x8053, 0x8054, 0x8055, 0x8056, 0x8057,
  127. 0x8060, 0x8061, 0x8062,
  128. 0x8070, 0x8071, 0x8072,
  129. 0x8080,
  130. 0x8090,
  131. 0x80af,
  132. 0x80b0,
  133. 0x80cf,
  134. 0xaff0, 0xaff1, 0xaff2, 0xaff3, 0xaff4, 0xaff5, 0xaff6, 0xaff7, 0xaff8, 0xaff9, 0xaffa, 0xaffb, 0xaffc, 0xaffd, 0xaffe, 0xafff,
  135. 0xc000, 0xc001,
  136. 0xc00a, 0xc00b, 0xc00c,
  137. 0xc010, 0xc011, 0xc012, 0xc013,
  138. 0xe000, 0xe001, 0xe002,
  139. 0xe00a, 0xe00b, 0xe00c,
  140. 0xe010, 0xe011, 0xe012, 0xe013,
  141. 0xe030, 0xe031,
  142. 0xe040,
  143. 0xe050,
  144. 0xe060, 0xe061,
  145. 0xf000,
  146. 0xf00a, 0xf00b, 0xf00c,
  147. 0xf010, 0xf011, 0xf012, 0xf013,
  148. 0xf020,
  149. 0xf80c,
  150. 0xf820, 0xf821,
  151. 0xf830, 0xf831,
  152. 0xf840, 0xf841, 0xf842,
  153. 0xf850,
  154. 0xf860,
  155. 0xf870, 0xf871,
  156. 0xf880, 0xf881, 0xf882, 0xf883, 0xf884, 0xf885, 0xf886, 0xf887, 0xf888, 0xf889,
  157. 0xfbff,
  158. };
  159. // clang-format on
  160. static pf_iod_read_request_t read_request;
  161. static pnet_result_t read_status;
  162. static uint16_t seq_nbr = 0;
  163. class CmrdrTest : public PnetIntegrationTest
  164. {
  165. protected:
  166. void test_read (uint16_t idx)
  167. {
  168. pf_ar_t * p_ar;
  169. uint8_t buffer[PF_FRAME_BUFFER_SIZE];
  170. uint16_t pos = 0;
  171. /* Send data to prevent timeout */
  172. send_data (
  173. data_packet_good_iops_good_iocs,
  174. sizeof (data_packet_good_iops_good_iocs));
  175. run_stack (TEST_DATA_DELAY);
  176. memset (&read_status, 0, sizeof (read_status));
  177. memset (&read_request, 0, sizeof (read_request));
  178. pf_ar_find_by_arep (net, appdata.main_arep, &p_ar);
  179. read_request.sequence_number = seq_nbr++;
  180. /* read_request.ar_uuid = NIL */
  181. read_request.api = 0;
  182. read_request.slot_number = 1;
  183. read_request.subslot_number = 1;
  184. read_request.index = idx;
  185. read_request.record_data_length = 0;
  186. // read_request.target_ar_uuid; /* Only used if implicit AR */
  187. pf_cmrdr_rm_read_ind (
  188. net,
  189. p_ar,
  190. &read_request,
  191. &read_status,
  192. sizeof (buffer),
  193. buffer,
  194. &pos);
  195. if (read_status.pnio_status.error_code != PNET_ERROR_CODE_NOERROR)
  196. {
  197. TEST_TRACE ("Read failed for idx %#x\n", (unsigned)idx);
  198. appdata.read_fails++;
  199. }
  200. }
  201. };
  202. TEST_F (CmrdrTest, CmrdrRunTest)
  203. {
  204. int ret;
  205. pnet_pnio_status_t pnio_status = {1, 2, 3, 4};
  206. bool new_flag = false;
  207. uint8_t in_data[10];
  208. uint16_t in_len = sizeof (in_data);
  209. uint8_t out_data[] = {
  210. 0x33, /* Slot 1, subslot 1 Data */
  211. };
  212. uint8_t iops = PNET_IOXS_BAD;
  213. uint8_t iocs = PNET_IOXS_BAD;
  214. uint32_t ix;
  215. pnet_diag_source_t diag_source = {
  216. .api = TEST_API_IDENT,
  217. .slot = TEST_SLOT_IDENT,
  218. .subslot = TEST_SUBSLOT_IDENT,
  219. .ch = TEST_CHANNEL_IDENT,
  220. .ch_grouping = PNET_DIAG_CH_INDIVIDUAL_CHANNEL,
  221. .ch_direction = TEST_CHANNEL_DIRECTION};
  222. TEST_TRACE ("\nGenerating mock connection request\n");
  223. mock_set_pnal_udp_recvfrom_buffer (connect_req, sizeof (connect_req));
  224. run_stack (TEST_UDP_DELAY);
  225. EXPECT_EQ (appdata.call_counters.state_calls, 1);
  226. EXPECT_EQ (appdata.call_counters.connect_calls, 1);
  227. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_STARTUP);
  228. EXPECT_GT (mock_os_data.eth_send_count, 0);
  229. TEST_TRACE ("\nGenerating mock parameter end request\n");
  230. mock_set_pnal_udp_recvfrom_buffer (prm_end_req, sizeof (prm_end_req));
  231. run_stack (TEST_UDP_DELAY);
  232. EXPECT_EQ (appdata.call_counters.state_calls, 2);
  233. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_PRMEND);
  234. EXPECT_EQ (appdata.call_counters.connect_calls, 1);
  235. TEST_TRACE ("\nSimulate application calling APPL_RDY\n");
  236. TEST_TRACE ("Line %d\n", __LINE__);
  237. ret = pnet_application_ready (net, appdata.main_arep);
  238. EXPECT_EQ (ret, 0);
  239. EXPECT_EQ (appdata.call_counters.state_calls, 3);
  240. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_APPLRDY);
  241. TEST_TRACE ("\nGenerating mock application ready response\n");
  242. mock_set_pnal_udp_recvfrom_buffer (appl_rdy_rsp, sizeof (appl_rdy_rsp));
  243. run_stack (TEST_UDP_DELAY);
  244. EXPECT_EQ (appdata.call_counters.state_calls, 3);
  245. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_APPLRDY);
  246. TEST_TRACE ("\nSend a couple of data packets and verify reception\n");
  247. for (ix = 0; ix < 100; ix++)
  248. {
  249. send_data (
  250. data_packet_good_iops_good_iocs,
  251. sizeof (data_packet_good_iops_good_iocs));
  252. run_stack (TEST_DATA_DELAY);
  253. }
  254. iops = 88; /* Something non-valid */
  255. in_len = sizeof (in_data);
  256. ret = pnet_output_get_data_and_iops (
  257. net,
  258. TEST_API_IDENT,
  259. TEST_SLOT_IDENT,
  260. TEST_SUBSLOT_IDENT,
  261. &new_flag,
  262. in_data,
  263. &in_len,
  264. &iops);
  265. EXPECT_EQ (ret, 0);
  266. EXPECT_EQ (new_flag, true);
  267. EXPECT_EQ (in_len, 1);
  268. EXPECT_EQ (in_data[0], 0x23);
  269. EXPECT_EQ (iops, PNET_IOXS_GOOD);
  270. iocs = 77; /* Something non-valid */
  271. ret = pnet_input_get_iocs (
  272. net,
  273. TEST_API_IDENT,
  274. TEST_SLOT_IDENT,
  275. TEST_SUBSLOT_IDENT,
  276. &iocs);
  277. EXPECT_EQ (ret, 0);
  278. EXPECT_EQ (new_flag, true);
  279. EXPECT_EQ (in_len, 1);
  280. EXPECT_EQ (iocs, PNET_IOXS_GOOD);
  281. EXPECT_EQ (appdata.call_counters.state_calls, 4);
  282. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_DATA);
  283. TEST_TRACE ("\nSend some data to the controller\n");
  284. ret = pnet_input_set_data_and_iops (
  285. net,
  286. TEST_API_IDENT,
  287. TEST_SLOT_IDENT,
  288. TEST_SUBSLOT_IDENT,
  289. out_data,
  290. sizeof (out_data),
  291. PNET_IOXS_GOOD);
  292. EXPECT_EQ (ret, 0);
  293. TEST_TRACE ("\nAcknowledge the reception of controller data\n");
  294. ret = pnet_output_set_iocs (
  295. net,
  296. TEST_API_IDENT,
  297. TEST_SLOT_IDENT,
  298. TEST_SUBSLOT_IDENT,
  299. PNET_IOXS_GOOD);
  300. EXPECT_EQ (ret, 0);
  301. EXPECT_EQ (appdata.call_counters.state_calls, 4);
  302. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_DATA);
  303. /* Send data to avoid timeout */
  304. send_data (
  305. data_packet_good_iops_good_iocs,
  306. sizeof (data_packet_good_iops_good_iocs));
  307. run_stack (TEST_DATA_DELAY);
  308. TEST_TRACE ("\nCreate a logbook entry\n");
  309. pnet_create_log_book_entry (net, appdata.main_arep, &pnio_status, 0x13245768);
  310. TEST_TRACE ("\nCreate a diag and an alarm.\n");
  311. pnet_diag_std_add (
  312. net,
  313. &diag_source,
  314. TEST_CHANNEL_NUMBER_OF_BITS,
  315. PNET_DIAG_CH_PROP_MAINT_FAULT,
  316. TEST_CHANNEL_ERRORTYPE,
  317. TEST_DIAG_EXT_ERRTYPE,
  318. TEST_DIAG_EXT_ADDVALUE,
  319. TEST_DIAG_QUALIFIER_NOTSET);
  320. TEST_TRACE ("Number of tests: %u\n", (unsigned)NELEMENTS (test_reads));
  321. TEST_TRACE ("\nNow read all the records\n");
  322. for (ix = 0; ix < NELEMENTS (test_reads); ix++)
  323. {
  324. test_read (test_reads[ix]);
  325. }
  326. EXPECT_EQ (appdata.read_fails, 61); // Currently expected number of fails.
  327. TEST_TRACE ("\nGenerating mock release request\n");
  328. mock_set_pnal_udp_recvfrom_buffer (release_req, sizeof (release_req));
  329. run_stack (TEST_UDP_DELAY);
  330. EXPECT_EQ (appdata.call_counters.release_calls, 1);
  331. EXPECT_EQ (appdata.call_counters.state_calls, 5);
  332. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_ABORT);
  333. }
  334. TEST_F (CmrdrTest, CmrdrModDiffTest)
  335. {
  336. int ret;
  337. pnet_pnio_status_t pnio_status = {1, 2, 3, 4};
  338. bool new_flag = false;
  339. uint8_t in_data[10];
  340. uint16_t in_len = sizeof (in_data);
  341. uint8_t out_data[] = {
  342. 0x33, /* Slot 1, subslot 1 Data */
  343. };
  344. uint8_t iops = PNET_IOXS_BAD;
  345. uint8_t iocs = PNET_IOXS_BAD;
  346. uint32_t ix;
  347. const uint16_t slot = 1;
  348. const uint16_t subslot = 1;
  349. // TODO This test used to have an offset for the submodule identifier value
  350. // in the on_submodule callback. However it does not make any difference
  351. // for the test result
  352. TEST_TRACE ("\nGenerating mock connection request\n");
  353. mock_set_pnal_udp_recvfrom_buffer (connect_req, sizeof (connect_req));
  354. run_stack (TEST_UDP_DELAY);
  355. EXPECT_EQ (appdata.call_counters.state_calls, 1);
  356. EXPECT_EQ (appdata.call_counters.connect_calls, 1);
  357. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_STARTUP);
  358. EXPECT_GT (mock_os_data.eth_send_count, 0);
  359. TEST_TRACE ("\nGenerating mock parameter end request\n");
  360. mock_set_pnal_udp_recvfrom_buffer (prm_end_req, sizeof (prm_end_req));
  361. run_stack (TEST_UDP_DELAY);
  362. EXPECT_EQ (appdata.call_counters.state_calls, 2);
  363. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_PRMEND);
  364. EXPECT_EQ (appdata.call_counters.connect_calls, 1);
  365. TEST_TRACE ("\nSimulate application calling APPL_RDY\n");
  366. ret = pnet_application_ready (net, appdata.main_arep);
  367. EXPECT_EQ (ret, 0);
  368. EXPECT_EQ (appdata.call_counters.state_calls, 3);
  369. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_APPLRDY);
  370. TEST_TRACE ("\nGenerating mock application ready response\n");
  371. mock_set_pnal_udp_recvfrom_buffer (appl_rdy_rsp, sizeof (appl_rdy_rsp));
  372. run_stack (TEST_UDP_DELAY);
  373. EXPECT_EQ (appdata.call_counters.state_calls, 3);
  374. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_APPLRDY);
  375. TEST_TRACE ("\nSend a couple of data packets and verify reception\n");
  376. for (ix = 0; ix < 100; ix++)
  377. {
  378. send_data (
  379. data_packet_good_iops_good_iocs,
  380. sizeof (data_packet_good_iops_good_iocs));
  381. run_stack (TEST_DATA_DELAY);
  382. }
  383. iops = 88; /* Something non-valid */
  384. in_len = sizeof (in_data);
  385. ret = pnet_output_get_data_and_iops (
  386. net,
  387. TEST_API_IDENT,
  388. slot,
  389. subslot,
  390. &new_flag,
  391. in_data,
  392. &in_len,
  393. &iops);
  394. EXPECT_EQ (ret, 0);
  395. EXPECT_EQ (new_flag, true);
  396. EXPECT_EQ (in_len, 1);
  397. EXPECT_EQ (in_data[0], 0x23);
  398. EXPECT_EQ (iops, PNET_IOXS_GOOD);
  399. iocs = 77; /* Something non-valid */
  400. ret = pnet_input_get_iocs (net, TEST_API_IDENT, slot, subslot, &iocs);
  401. EXPECT_EQ (ret, 0);
  402. EXPECT_EQ (new_flag, true);
  403. EXPECT_EQ (in_len, 1);
  404. EXPECT_EQ (iocs, PNET_IOXS_GOOD);
  405. EXPECT_EQ (appdata.call_counters.state_calls, 4);
  406. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_DATA);
  407. /* Send some data to the controller */
  408. TEST_TRACE ("Line %d\n", __LINE__);
  409. ret = pnet_input_set_data_and_iops (
  410. net,
  411. TEST_API_IDENT,
  412. slot,
  413. subslot,
  414. out_data,
  415. sizeof (out_data),
  416. PNET_IOXS_GOOD);
  417. EXPECT_EQ (ret, 0);
  418. /* Acknowledge the reception of controller data */
  419. ret =
  420. pnet_output_set_iocs (net, TEST_API_IDENT, slot, subslot, PNET_IOXS_GOOD);
  421. EXPECT_EQ (ret, 0);
  422. EXPECT_EQ (appdata.call_counters.state_calls, 4);
  423. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_DATA);
  424. /* Setup some record for the reader */
  425. TEST_TRACE ("Line %d\n", __LINE__);
  426. /* Create a logbook entry */
  427. pnet_create_log_book_entry (net, appdata.main_arep, &pnio_status, 0x13245768);
  428. TEST_TRACE ("Number of tests: %u\n", (unsigned)NELEMENTS (test_mod_diff));
  429. /* Now read all the mod diff record */
  430. for (ix = 0; ix < NELEMENTS (test_mod_diff); ix++)
  431. {
  432. test_read (test_mod_diff[ix]);
  433. }
  434. EXPECT_EQ (appdata.read_fails, 0);
  435. TEST_TRACE ("\nGenerating mock release request\n");
  436. mock_set_pnal_udp_recvfrom_buffer (release_req, sizeof (release_req));
  437. run_stack (TEST_UDP_DELAY);
  438. EXPECT_EQ (appdata.call_counters.release_calls, 1);
  439. EXPECT_EQ (appdata.call_counters.state_calls, 5);
  440. EXPECT_EQ (appdata.cmdev_state, PNET_EVENT_ABORT);
  441. }