test_alarm.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  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. #include "utils_for_testing.h"
  16. #include "mocks.h"
  17. #include "pf_includes.h"
  18. #include <gtest/gtest.h>
  19. class AlarmTest : public PnetIntegrationTest
  20. {
  21. };
  22. class AlarmUnitTest : public PnetUnitTest
  23. {
  24. };
  25. TEST_F (AlarmUnitTest, AlarmCheckAddDiagItemToSummary)
  26. {
  27. pnet_alarm_spec_t alarm_specifier;
  28. uint32_t maint_status = 0;
  29. pf_diag_item_t diag_item;
  30. pf_subslot_t subslot;
  31. pf_ar_t ar;
  32. /* Prepare default input data */
  33. memset (&ar, 0, sizeof (ar));
  34. memset (&subslot, 0, sizeof (subslot));
  35. subslot.ownsm_state = PF_OWNSM_STATE_IOC;
  36. subslot.owner = &ar;
  37. memset (&diag_item, 0, sizeof (diag_item));
  38. diag_item.usi = PF_USI_EXTENDED_CHANNEL_DIAGNOSIS;
  39. PF_DIAG_CH_PROP_SPEC_SET (
  40. diag_item.fmt.std.ch_properties,
  41. PF_DIAG_CH_PROP_SPEC_APPEARS);
  42. PF_DIAG_CH_PROP_MAINT_SET (
  43. diag_item.fmt.std.ch_properties,
  44. PNET_DIAG_CH_PROP_MAINT_FAULT);
  45. /* Happy case */
  46. memset (&alarm_specifier, 0, sizeof (alarm_specifier));
  47. maint_status = 0;
  48. pf_alarm_add_diag_item_to_summary (
  49. &ar,
  50. &subslot,
  51. &diag_item,
  52. &alarm_specifier,
  53. &maint_status);
  54. EXPECT_TRUE ((bool)alarm_specifier.channel_diagnosis);
  55. EXPECT_FALSE ((bool)alarm_specifier.manufacturer_diagnosis);
  56. EXPECT_TRUE ((bool)alarm_specifier.submodule_diagnosis);
  57. EXPECT_TRUE ((bool)alarm_specifier.ar_diagnosis);
  58. EXPECT_EQ (maint_status, 0UL);
  59. /* Other AR */
  60. subslot.owner = NULL;
  61. memset (&alarm_specifier, 0, sizeof (alarm_specifier));
  62. maint_status = 0;
  63. pf_alarm_add_diag_item_to_summary (
  64. &ar,
  65. &subslot,
  66. &diag_item,
  67. &alarm_specifier,
  68. &maint_status);
  69. EXPECT_TRUE ((bool)alarm_specifier.channel_diagnosis);
  70. EXPECT_FALSE ((bool)alarm_specifier.manufacturer_diagnosis);
  71. EXPECT_TRUE ((bool)alarm_specifier.submodule_diagnosis);
  72. EXPECT_FALSE ((bool)alarm_specifier.ar_diagnosis);
  73. EXPECT_EQ (maint_status, 0UL);
  74. subslot.owner = &ar;
  75. /* Manufacturer specific (in USI format) */
  76. diag_item.usi = TEST_DIAG_USI_CUSTOM;
  77. memset (&alarm_specifier, 0, sizeof (alarm_specifier));
  78. maint_status = 0;
  79. pf_alarm_add_diag_item_to_summary (
  80. &ar,
  81. &subslot,
  82. &diag_item,
  83. &alarm_specifier,
  84. &maint_status);
  85. EXPECT_FALSE ((bool)alarm_specifier.channel_diagnosis);
  86. EXPECT_TRUE ((bool)alarm_specifier.manufacturer_diagnosis);
  87. EXPECT_TRUE ((bool)alarm_specifier.submodule_diagnosis);
  88. EXPECT_TRUE ((bool)alarm_specifier.ar_diagnosis);
  89. EXPECT_EQ (maint_status, 0UL);
  90. diag_item.usi = PF_USI_EXTENDED_CHANNEL_DIAGNOSIS;
  91. /* Disappearing diagnosis */
  92. PF_DIAG_CH_PROP_SPEC_SET (
  93. diag_item.fmt.std.ch_properties,
  94. PF_DIAG_CH_PROP_SPEC_DISAPPEARS);
  95. memset (&alarm_specifier, 0, sizeof (alarm_specifier));
  96. maint_status = 0;
  97. pf_alarm_add_diag_item_to_summary (
  98. &ar,
  99. &subslot,
  100. &diag_item,
  101. &alarm_specifier,
  102. &maint_status);
  103. EXPECT_FALSE ((bool)alarm_specifier.channel_diagnosis);
  104. EXPECT_FALSE ((bool)alarm_specifier.manufacturer_diagnosis);
  105. EXPECT_FALSE ((bool)alarm_specifier.submodule_diagnosis);
  106. EXPECT_FALSE ((bool)alarm_specifier.ar_diagnosis);
  107. EXPECT_EQ (maint_status, 0UL);
  108. PF_DIAG_CH_PROP_SPEC_SET (
  109. diag_item.fmt.std.ch_properties,
  110. PF_DIAG_CH_PROP_SPEC_APPEARS);
  111. /* Maintenance required */
  112. PF_DIAG_CH_PROP_MAINT_SET (
  113. diag_item.fmt.std.ch_properties,
  114. PNET_DIAG_CH_PROP_MAINT_REQUIRED);
  115. memset (&alarm_specifier, 0, sizeof (alarm_specifier));
  116. maint_status = 0;
  117. pf_alarm_add_diag_item_to_summary (
  118. &ar,
  119. &subslot,
  120. &diag_item,
  121. &alarm_specifier,
  122. &maint_status);
  123. EXPECT_TRUE ((bool)alarm_specifier.channel_diagnosis);
  124. EXPECT_FALSE ((bool)alarm_specifier.manufacturer_diagnosis);
  125. EXPECT_FALSE ((bool)alarm_specifier.submodule_diagnosis);
  126. EXPECT_FALSE ((bool)alarm_specifier.ar_diagnosis);
  127. EXPECT_EQ (maint_status, BIT (0));
  128. PF_DIAG_CH_PROP_MAINT_SET (
  129. diag_item.fmt.std.ch_properties,
  130. PNET_DIAG_CH_PROP_MAINT_FAULT);
  131. /* Maintenance required, via qualified channel diagnosis (qual 7..16) */
  132. diag_item.usi = PF_USI_QUALIFIED_CHANNEL_DIAGNOSIS;
  133. PF_DIAG_CH_PROP_MAINT_SET (
  134. diag_item.fmt.std.ch_properties,
  135. PNET_DIAG_CH_PROP_MAINT_QUALIFIED);
  136. diag_item.fmt.std.qual_ch_qualifier = BIT (7);
  137. memset (&alarm_specifier, 0, sizeof (alarm_specifier));
  138. maint_status = 0;
  139. pf_alarm_add_diag_item_to_summary (
  140. &ar,
  141. &subslot,
  142. &diag_item,
  143. &alarm_specifier,
  144. &maint_status);
  145. EXPECT_TRUE ((bool)alarm_specifier.channel_diagnosis);
  146. EXPECT_FALSE ((bool)alarm_specifier.manufacturer_diagnosis);
  147. EXPECT_FALSE ((bool)alarm_specifier.submodule_diagnosis);
  148. EXPECT_FALSE ((bool)alarm_specifier.ar_diagnosis);
  149. EXPECT_EQ (maint_status, (BIT (7) | BIT (0)));
  150. diag_item.fmt.std.qual_ch_qualifier = BIT (16);
  151. memset (&alarm_specifier, 0, sizeof (alarm_specifier));
  152. maint_status = 0;
  153. pf_alarm_add_diag_item_to_summary (
  154. &ar,
  155. &subslot,
  156. &diag_item,
  157. &alarm_specifier,
  158. &maint_status);
  159. EXPECT_TRUE ((bool)alarm_specifier.channel_diagnosis);
  160. EXPECT_FALSE ((bool)alarm_specifier.manufacturer_diagnosis);
  161. EXPECT_FALSE ((bool)alarm_specifier.submodule_diagnosis);
  162. EXPECT_FALSE ((bool)alarm_specifier.ar_diagnosis);
  163. EXPECT_EQ (maint_status, (BIT (16) | BIT (0)));
  164. diag_item.usi = PF_USI_EXTENDED_CHANNEL_DIAGNOSIS;
  165. diag_item.fmt.std.qual_ch_qualifier = 0;
  166. PF_DIAG_CH_PROP_MAINT_SET (
  167. diag_item.fmt.std.ch_properties,
  168. PNET_DIAG_CH_PROP_MAINT_FAULT);
  169. /* Maintenance demanded */
  170. PF_DIAG_CH_PROP_MAINT_SET (
  171. diag_item.fmt.std.ch_properties,
  172. PNET_DIAG_CH_PROP_MAINT_DEMANDED);
  173. memset (&alarm_specifier, 0, sizeof (alarm_specifier));
  174. maint_status = 0;
  175. pf_alarm_add_diag_item_to_summary (
  176. &ar,
  177. &subslot,
  178. &diag_item,
  179. &alarm_specifier,
  180. &maint_status);
  181. EXPECT_TRUE ((bool)alarm_specifier.channel_diagnosis);
  182. EXPECT_FALSE ((bool)alarm_specifier.manufacturer_diagnosis);
  183. EXPECT_FALSE ((bool)alarm_specifier.submodule_diagnosis);
  184. EXPECT_FALSE ((bool)alarm_specifier.ar_diagnosis);
  185. EXPECT_EQ (maint_status, BIT (1));
  186. PF_DIAG_CH_PROP_MAINT_SET (
  187. diag_item.fmt.std.ch_properties,
  188. PNET_DIAG_CH_PROP_MAINT_FAULT);
  189. /* Maintenance demanded, via qualified channel diagnosis (qual 17..26) */
  190. diag_item.usi = PF_USI_QUALIFIED_CHANNEL_DIAGNOSIS;
  191. PF_DIAG_CH_PROP_MAINT_SET (
  192. diag_item.fmt.std.ch_properties,
  193. PNET_DIAG_CH_PROP_MAINT_QUALIFIED);
  194. diag_item.fmt.std.qual_ch_qualifier = BIT (17);
  195. memset (&alarm_specifier, 0, sizeof (alarm_specifier));
  196. maint_status = 0;
  197. pf_alarm_add_diag_item_to_summary (
  198. &ar,
  199. &subslot,
  200. &diag_item,
  201. &alarm_specifier,
  202. &maint_status);
  203. EXPECT_TRUE ((bool)alarm_specifier.channel_diagnosis);
  204. EXPECT_FALSE ((bool)alarm_specifier.manufacturer_diagnosis);
  205. EXPECT_FALSE ((bool)alarm_specifier.submodule_diagnosis);
  206. EXPECT_FALSE ((bool)alarm_specifier.ar_diagnosis);
  207. EXPECT_EQ (maint_status, (BIT (17) | BIT (1)));
  208. diag_item.fmt.std.qual_ch_qualifier = BIT (26);
  209. memset (&alarm_specifier, 0, sizeof (alarm_specifier));
  210. maint_status = 0;
  211. pf_alarm_add_diag_item_to_summary (
  212. &ar,
  213. &subslot,
  214. &diag_item,
  215. &alarm_specifier,
  216. &maint_status);
  217. EXPECT_TRUE ((bool)alarm_specifier.channel_diagnosis);
  218. EXPECT_FALSE ((bool)alarm_specifier.manufacturer_diagnosis);
  219. EXPECT_FALSE ((bool)alarm_specifier.submodule_diagnosis);
  220. EXPECT_FALSE ((bool)alarm_specifier.ar_diagnosis);
  221. EXPECT_EQ (maint_status, (BIT (26) | BIT (1)));
  222. diag_item.usi = PF_USI_EXTENDED_CHANNEL_DIAGNOSIS;
  223. diag_item.fmt.std.qual_ch_qualifier = 0;
  224. PF_DIAG_CH_PROP_MAINT_SET (
  225. diag_item.fmt.std.ch_properties,
  226. PNET_DIAG_CH_PROP_MAINT_FAULT);
  227. /* Fault, via qualified channel diagnosis (qual 27..31) */
  228. diag_item.usi = PF_USI_QUALIFIED_CHANNEL_DIAGNOSIS;
  229. PF_DIAG_CH_PROP_MAINT_SET (
  230. diag_item.fmt.std.ch_properties,
  231. PNET_DIAG_CH_PROP_MAINT_QUALIFIED);
  232. diag_item.fmt.std.qual_ch_qualifier = BIT (27);
  233. memset (&alarm_specifier, 0, sizeof (alarm_specifier));
  234. maint_status = 0;
  235. pf_alarm_add_diag_item_to_summary (
  236. &ar,
  237. &subslot,
  238. &diag_item,
  239. &alarm_specifier,
  240. &maint_status);
  241. EXPECT_TRUE ((bool)alarm_specifier.channel_diagnosis);
  242. EXPECT_FALSE ((bool)alarm_specifier.manufacturer_diagnosis);
  243. EXPECT_TRUE ((bool)alarm_specifier.submodule_diagnosis);
  244. EXPECT_TRUE ((bool)alarm_specifier.ar_diagnosis);
  245. EXPECT_EQ (maint_status, BIT (27));
  246. diag_item.fmt.std.qual_ch_qualifier = BIT (31);
  247. memset (&alarm_specifier, 0, sizeof (alarm_specifier));
  248. maint_status = 0;
  249. pf_alarm_add_diag_item_to_summary (
  250. &ar,
  251. &subslot,
  252. &diag_item,
  253. &alarm_specifier,
  254. &maint_status);
  255. EXPECT_TRUE ((bool)alarm_specifier.channel_diagnosis);
  256. EXPECT_FALSE ((bool)alarm_specifier.manufacturer_diagnosis);
  257. EXPECT_TRUE ((bool)alarm_specifier.submodule_diagnosis);
  258. EXPECT_TRUE ((bool)alarm_specifier.ar_diagnosis);
  259. EXPECT_EQ (maint_status, BIT (31));
  260. diag_item.usi = PF_USI_EXTENDED_CHANNEL_DIAGNOSIS;
  261. diag_item.fmt.std.qual_ch_qualifier = 0;
  262. PF_DIAG_CH_PROP_MAINT_SET (
  263. diag_item.fmt.std.ch_properties,
  264. PNET_DIAG_CH_PROP_MAINT_FAULT);
  265. }
  266. TEST_F (AlarmUnitTest, AlarmCheckSendQueueHandling)
  267. {
  268. pf_alarm_send_queue_t queue;
  269. pf_alarm_data_t post_message;
  270. pf_alarm_data_t fetch_message;
  271. int ix = 0;
  272. int err = 0;
  273. const uint16_t SEQUENCE_START_NUMBER = 100;
  274. memset (&post_message, 0, sizeof (post_message));
  275. memset (&fetch_message, 0, sizeof (fetch_message));
  276. memset (&queue, 0, sizeof (queue));
  277. /* Set up queue */
  278. EXPECT_FALSE (pf_alarm_queue_is_available(&queue.accountant));
  279. pf_alarm_queue_mutex_create (&queue.accountant);
  280. pf_alarm_queue_mutex_create (&queue.accountant); /* No-op */
  281. EXPECT_TRUE (pf_alarm_queue_is_available(&queue.accountant));
  282. pf_alarm_send_queue_reset (&queue);
  283. EXPECT_EQ (queue.accountant.count, 0); /* Do not bother with mutex
  284. (this test runs in single thread) */
  285. /* Fill the queue */
  286. for (ix = 0; ix < PNET_MAX_ALARMS; ix++)
  287. {
  288. post_message.sequence_number = SEQUENCE_START_NUMBER + ix;
  289. err = pf_alarm_send_queue_post (&queue, &post_message);
  290. EXPECT_EQ (err, 0);
  291. }
  292. EXPECT_EQ (queue.accountant.count, PNET_MAX_ALARMS);
  293. /* Add to full queue */
  294. post_message.sequence_number += 1;
  295. err = pf_alarm_send_queue_post (&queue, &post_message);
  296. EXPECT_EQ (err, -1);
  297. EXPECT_EQ (queue.accountant.count, PNET_MAX_ALARMS);
  298. /* Fetch from the queue */
  299. for (ix = 0; ix < PNET_MAX_ALARMS; ix++)
  300. {
  301. err = pf_alarm_send_queue_fetch (&queue, &fetch_message);
  302. EXPECT_EQ (err, 0);
  303. EXPECT_EQ (fetch_message.sequence_number, SEQUENCE_START_NUMBER + ix);
  304. }
  305. EXPECT_EQ (queue.accountant.count, 0);
  306. /* Fetch from empty queue */
  307. err = pf_alarm_send_queue_fetch (&queue, &fetch_message);
  308. EXPECT_EQ (err, -1);
  309. EXPECT_EQ (queue.accountant.count, 0);
  310. /* Reset the queue */
  311. err = pf_alarm_send_queue_post (&queue, &post_message);
  312. EXPECT_EQ (err, 0);
  313. EXPECT_EQ (queue.accountant.count, 1);
  314. pf_alarm_send_queue_reset (&queue);
  315. EXPECT_EQ (queue.accountant.count, 0);
  316. /* Wrap read_index and write_index, by adding and fetching a lot */
  317. for (ix = 0; ix < PNET_MAX_ALARMS * 5; ix++)
  318. {
  319. post_message.sequence_number = SEQUENCE_START_NUMBER + ix;
  320. err = pf_alarm_send_queue_post (&queue, &post_message);
  321. EXPECT_EQ (err, 0);
  322. EXPECT_EQ (queue.accountant.count, 1);
  323. err = pf_alarm_send_queue_fetch (&queue, &fetch_message);
  324. EXPECT_EQ (err, 0);
  325. EXPECT_EQ (queue.accountant.count, 0);
  326. EXPECT_EQ (fetch_message.sequence_number, SEQUENCE_START_NUMBER + ix);
  327. }
  328. /* Close down queue */
  329. pf_alarm_send_queue_reset (&queue);
  330. EXPECT_EQ (queue.accountant.count, 0);
  331. EXPECT_TRUE (pf_alarm_queue_is_available(&queue.accountant));
  332. pf_alarm_queue_mutex_destroy (&queue.accountant);
  333. pf_alarm_queue_mutex_destroy (&queue.accountant); /* Should be safe */
  334. EXPECT_FALSE (pf_alarm_queue_is_available(&queue.accountant));
  335. /* Post to closed queue */
  336. post_message.sequence_number = SEQUENCE_START_NUMBER;
  337. err = pf_alarm_send_queue_post (&queue, &post_message);
  338. EXPECT_EQ (err, -1);
  339. /* Fetch from closed queue */
  340. err = pf_alarm_send_queue_fetch (&queue, &fetch_message);
  341. EXPECT_EQ (err, -1);
  342. }
  343. TEST_F (AlarmUnitTest, AlarmCheckReceiveQueueHandling)
  344. {
  345. pf_alarm_receive_queue_t queue;
  346. pf_apmr_msg_t post_frame;
  347. pf_apmr_msg_t fetch_frame;
  348. int ix = 0;
  349. int err = 0;
  350. const uint16_t POSITION_START_NUMBER = 100;
  351. const uintptr_t POINTER_START_NUMBER = 1000;
  352. memset (&post_frame, 0, sizeof (post_frame));
  353. memset (&fetch_frame, 0, sizeof (fetch_frame));
  354. memset (&queue, 0, sizeof (queue));
  355. /* Set up queue */
  356. EXPECT_FALSE (pf_alarm_queue_is_available(&queue.accountant));
  357. pf_alarm_queue_mutex_create (&queue.accountant);
  358. pf_alarm_queue_mutex_create (&queue.accountant); /* No-op */
  359. EXPECT_TRUE (pf_alarm_queue_is_available(&queue.accountant));
  360. pf_alarm_receive_queue_reset (&queue);
  361. EXPECT_EQ (queue.accountant.count, 0); /* Do not bother with mutex
  362. (this test runs in single thread) */
  363. /* Fill the queue */
  364. for (ix = 0; ix < PNET_MAX_ALARMS; ix++)
  365. {
  366. post_frame.frame_id_pos = POSITION_START_NUMBER + ix;
  367. post_frame.p_buf = (pnal_buf_t *)(POINTER_START_NUMBER + ix);
  368. err = pf_alarm_receive_queue_post (&queue, &post_frame);
  369. EXPECT_EQ (err, 0);
  370. EXPECT_EQ (queue.accountant.count, ix + 1);
  371. }
  372. EXPECT_EQ (queue.accountant.count, PNET_MAX_ALARMS);
  373. /* Add to full queue */
  374. post_frame.frame_id_pos += 1;
  375. post_frame.p_buf -= 1;
  376. err = pf_alarm_receive_queue_post (&queue, &post_frame);
  377. EXPECT_EQ (err, -1);
  378. EXPECT_EQ (queue.accountant.count, PNET_MAX_ALARMS);
  379. /* Fetch from the queue */
  380. for (ix = 0; ix < PNET_MAX_ALARMS; ix++)
  381. {
  382. err = pf_alarm_receive_queue_fetch (&queue, &fetch_frame);
  383. EXPECT_EQ (err, 0);
  384. EXPECT_EQ (queue.accountant.count, PNET_MAX_ALARMS - ix - 1);
  385. EXPECT_EQ (fetch_frame.frame_id_pos, POSITION_START_NUMBER + ix);
  386. EXPECT_EQ ((uintptr_t)fetch_frame.p_buf, POINTER_START_NUMBER + ix);
  387. }
  388. EXPECT_EQ (queue.accountant.count, 0);
  389. /* Fetch from empty queue */
  390. err = pf_alarm_receive_queue_fetch (&queue, &fetch_frame);
  391. EXPECT_EQ (err, -1);
  392. EXPECT_EQ (queue.accountant.count, 0);
  393. /* Reset the queue (will free allocated buffers) */
  394. post_frame.frame_id_pos = 42;
  395. post_frame.p_buf = pnal_buf_alloc (PNAL_BUF_MAX_SIZE);
  396. err = pf_alarm_receive_queue_post (&queue, &post_frame);
  397. EXPECT_EQ (err, 0);
  398. EXPECT_EQ (queue.accountant.count, 1);
  399. pf_alarm_receive_queue_reset (&queue);
  400. EXPECT_EQ (queue.accountant.count, 0);
  401. /* Wrap read_index and write_index, by adding and fetching a lot */
  402. for (ix = 0; ix < PNET_MAX_ALARMS * 5; ix++)
  403. {
  404. post_frame.frame_id_pos = POSITION_START_NUMBER + ix;
  405. post_frame.p_buf = (pnal_buf_t *)(POINTER_START_NUMBER + ix);
  406. err = pf_alarm_receive_queue_post (&queue, &post_frame);
  407. EXPECT_EQ (err, 0);
  408. EXPECT_EQ (queue.accountant.count, 1);
  409. err = pf_alarm_receive_queue_fetch (&queue, &fetch_frame);
  410. EXPECT_EQ (err, 0);
  411. EXPECT_EQ (queue.accountant.count, 0);
  412. EXPECT_EQ (fetch_frame.frame_id_pos, POSITION_START_NUMBER + ix);
  413. EXPECT_EQ ((uintptr_t)fetch_frame.p_buf, POINTER_START_NUMBER + ix);
  414. }
  415. /* Close down queue */
  416. pf_alarm_receive_queue_reset (&queue);
  417. EXPECT_EQ (queue.accountant.count, 0);
  418. EXPECT_TRUE (pf_alarm_queue_is_available(&queue.accountant));
  419. pf_alarm_queue_mutex_destroy (&queue.accountant);
  420. pf_alarm_queue_mutex_destroy (&queue.accountant); /* Should be safe */
  421. EXPECT_FALSE (pf_alarm_queue_is_available(&queue.accountant));
  422. /* Post to closed queue */
  423. post_frame.frame_id_pos = POSITION_START_NUMBER;
  424. post_frame.p_buf = (pnal_buf_t *)(POINTER_START_NUMBER);
  425. err = pf_alarm_receive_queue_post (&queue, &post_frame);
  426. EXPECT_EQ (err, -1);
  427. /* Fetch from closed queue */
  428. err = pf_alarm_receive_queue_fetch (&queue, &fetch_frame);
  429. EXPECT_EQ (err, -1);
  430. }