test-pr-poll-loop.c 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255
  1. /*
  2. * Copyright (c) 2015-2020 Red Hat, Inc.
  3. *
  4. * All rights reserved.
  5. *
  6. * Author: Jan Friesse (jfriesse@redhat.com)
  7. *
  8. * This software licensed under BSD license, the text of which follows:
  9. *
  10. * Redistribution and use in source and binary forms, with or without
  11. * modification, are permitted provided that the following conditions are met:
  12. *
  13. * - Redistributions of source code must retain the above copyright notice,
  14. * this list of conditions and the following disclaimer.
  15. * - Redistributions in binary form must reproduce the above copyright notice,
  16. * this list of conditions and the following disclaimer in the documentation
  17. * and/or other materials provided with the distribution.
  18. * - Neither the name of the Red Hat, Inc. nor the names of its
  19. * contributors may be used to endorse or promote products derived from this
  20. * software without specific prior written permission.
  21. *
  22. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  23. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  26. * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  27. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  28. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  29. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  30. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  31. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
  32. * THE POSSIBILITY OF SUCH DAMAGE.
  33. */
  34. #include <stdio.h>
  35. #include <assert.h>
  36. #include <string.h>
  37. #include <errno.h>
  38. #include <unistd.h>
  39. #include "pr-poll-loop.h"
  40. /*
  41. * Needed for creating nspr handle from unix fd
  42. */
  43. #include <private/pprio.h>
  44. #define BUF_SIZE 256
  45. #define TIMER_TIMEOUT 10000
  46. #define TIMER_TEST_TIMEOUT 100
  47. /*
  48. * Must be smaller than BUF_SIZE
  49. */
  50. #define READ_STR "test"
  51. static int fd_set_events_cb1_return_called = -1;
  52. static int fd_set_events_cb2_return_called = -1;
  53. static int fd_read_cb1_called = -1;
  54. static int fd_read_cb2_called = -1;
  55. static int fd_write_cb1_called = -1;
  56. static int fd_err_cb1_called = -1;
  57. static int timeout_cb_called = -1;
  58. static int prfd_set_events_cb1_return_called = -1;
  59. static int prfd_set_events_cb2_return_called = -1;
  60. static int prfd_read_cb1_called = -1;
  61. static int prfd_read_cb2_called = -1;
  62. static int prfd_write_cb1_called = -1;
  63. static int prfd_err_cb1_called = -1;
  64. static int test_complex_state = -1;
  65. static int test_complex_set_events_pipe1_read_called = -1;
  66. static int test_complex_read_pipe1_read_called = -1;
  67. static int test_complex_set_events_pipe1_write_called = -1;
  68. static int test_complex_write_pipe1_write_called = -1;
  69. static int test_complex_set_events_pipe2_read_called = -1;
  70. static int test_complex_read_pipe2_read_called = -1;
  71. static int test_complex_set_events_pipe2_write_called = -1;
  72. static int test_complex_write_pipe2_write_called = -1;
  73. static int test_complex_read_pipe1_fd = -1;
  74. static int pre_poll_cb1_called = -1;
  75. static int pre_poll_cb2_called = -1;
  76. static int pre_poll_cb_return_called = -1;
  77. static int
  78. timeout_cb(void *data1, void *data2)
  79. {
  80. timeout_cb_called = 1;
  81. return (0);
  82. }
  83. static int
  84. fd_set_events_cb1_return(int fd, short *events, void *user_data1, void *user_data2)
  85. {
  86. fd_set_events_cb1_return_called++;
  87. assert(user_data1 == &fd_set_events_cb1_return_called);
  88. assert(user_data2 == NULL);
  89. return (-2);
  90. }
  91. static int
  92. fd_set_events_cb2_return(int fd, short *events, void *user_data1, void *user_data2)
  93. {
  94. fd_set_events_cb2_return_called++;
  95. assert(user_data1 == NULL);
  96. assert(user_data2 == &fd_set_events_cb2_return_called);
  97. return (-2);
  98. }
  99. static int
  100. fd_read_cb1(int fd, void *user_data1, void *user_data2)
  101. {
  102. char buf[BUF_SIZE];
  103. assert(user_data1 == &fd_read_cb1_called);
  104. assert(user_data2 == fd_read_cb1);
  105. fd_read_cb1_called++;
  106. assert(read(fd, buf, BUF_SIZE) == strlen(READ_STR) + 1);
  107. assert(memcmp(buf, READ_STR, strlen(READ_STR) + 1) == 0);
  108. return (0);
  109. }
  110. static int
  111. fd_read_cb2(int fd, void *user_data1, void *user_data2)
  112. {
  113. char buf[BUF_SIZE];
  114. assert(user_data1 == &fd_read_cb2_called);
  115. assert(user_data2 == fd_read_cb2);
  116. fd_read_cb2_called++;
  117. assert(read(fd, buf, BUF_SIZE) == strlen(READ_STR) + 1);
  118. assert(memcmp(buf, READ_STR, strlen(READ_STR) + 1) == 0);
  119. return (-1);
  120. }
  121. static int
  122. fd_write_cb1(int fd, void *user_data1, void *user_data2)
  123. {
  124. assert(user_data1 == &fd_write_cb1_called);
  125. assert(user_data2 == fd_write_cb1);
  126. fd_write_cb1_called++;
  127. return (0);
  128. }
  129. static int
  130. fd_err_cb1(int fd, short revents, void *user_data1, void *user_data2)
  131. {
  132. assert(user_data1 == &fd_err_cb1_called);
  133. assert(user_data2 == fd_err_cb1);
  134. fd_err_cb1_called++;
  135. return (0);
  136. }
  137. static int
  138. prfd_set_events_cb1_return(PRFileDesc *prfd, short *events, void *user_data1, void *user_data2)
  139. {
  140. prfd_set_events_cb1_return_called++;
  141. assert(user_data1 == &prfd_set_events_cb1_return_called);
  142. assert(user_data2 == NULL);
  143. return (-2);
  144. }
  145. static int
  146. prfd_set_events_cb2_return(PRFileDesc *prfd, short *events, void *user_data1, void *user_data2)
  147. {
  148. prfd_set_events_cb2_return_called++;
  149. assert(user_data1 == NULL);
  150. assert(user_data2 == &prfd_set_events_cb2_return_called);
  151. return (-2);
  152. }
  153. static int
  154. prfd_read_cb1(PRFileDesc *prfd, const PRPollDesc *pd, void *user_data1, void *user_data2)
  155. {
  156. char buf[BUF_SIZE];
  157. assert(user_data1 == &prfd_read_cb1_called);
  158. assert(user_data2 == prfd_read_cb1);
  159. prfd_read_cb1_called++;
  160. assert(PR_Read(prfd, buf, BUF_SIZE) == strlen(READ_STR) + 1);
  161. assert(memcmp(buf, READ_STR, strlen(READ_STR) + 1) == 0);
  162. return (0);
  163. }
  164. static int
  165. prfd_read_cb2(PRFileDesc *prfd, const PRPollDesc *pd, void *user_data1, void *user_data2)
  166. {
  167. char buf[BUF_SIZE];
  168. assert(user_data1 == &prfd_read_cb2_called);
  169. assert(user_data2 == prfd_read_cb2);
  170. prfd_read_cb2_called++;
  171. assert(PR_Read(prfd, buf, BUF_SIZE) == strlen(READ_STR) + 1);
  172. assert(memcmp(buf, READ_STR, strlen(READ_STR) + 1) == 0);
  173. return (-1);
  174. }
  175. static int
  176. prfd_write_cb1(PRFileDesc *prfd, const PRPollDesc *pd, void *user_data1, void *user_data2)
  177. {
  178. assert(user_data1 == &prfd_write_cb1_called);
  179. assert(user_data2 == prfd_write_cb1);
  180. prfd_write_cb1_called++;
  181. return (0);
  182. }
  183. static int
  184. prfd_err_cb1(PRFileDesc *prfd, short revents, const PRPollDesc *pd, void *user_data1, void *user_data2)
  185. {
  186. assert(user_data1 == &prfd_err_cb1_called);
  187. assert(user_data2 == prfd_err_cb1);
  188. prfd_err_cb1_called++;
  189. return (0);
  190. }
  191. static int
  192. test_complex_set_events_pipe1_read_cb(PRFileDesc *prfd, short *events, void *user_data1, void *user_data2)
  193. {
  194. test_complex_set_events_pipe1_read_called++;
  195. assert(user_data1 == &test_complex_set_events_pipe1_read_called);
  196. assert(user_data2 == test_complex_set_events_pipe1_read_cb);
  197. assert(*events == 0);
  198. if (test_complex_state == 2) {
  199. *events = POLLIN;
  200. }
  201. return (0);
  202. }
  203. static int
  204. test_complex_read_pipe1_read_cb(PRFileDesc *prfd, const PRPollDesc *pd, void *user_data1, void *user_data2)
  205. {
  206. char buf[BUF_SIZE];
  207. assert(user_data1 == &test_complex_set_events_pipe1_read_called);
  208. assert(user_data2 == test_complex_set_events_pipe1_read_cb);
  209. test_complex_read_pipe1_read_called++;
  210. /*
  211. * prfd for this case is just a wrapper, we need to use real fd
  212. */
  213. assert(read(test_complex_read_pipe1_fd, buf, BUF_SIZE) == strlen(READ_STR) + 1);
  214. assert(memcmp(buf, READ_STR, strlen(READ_STR) + 1) == 0);
  215. return (0);
  216. }
  217. static int
  218. test_complex_write_pipe1_read_cb(PRFileDesc *prfd, const PRPollDesc *pd, void *user_data1, void *user_data2)
  219. {
  220. assert(0);
  221. return (-1);
  222. }
  223. static int
  224. test_complex_set_events_pipe1_write_cb(int fd, short *events, void *user_data1, void *user_data2)
  225. {
  226. test_complex_set_events_pipe1_write_called++;
  227. assert(user_data1 == &test_complex_set_events_pipe1_write_called);
  228. assert(user_data2 == test_complex_set_events_pipe1_write_cb);
  229. assert(*events == 0);
  230. if (test_complex_state == 1) {
  231. *events = POLLOUT;
  232. }
  233. return (0);
  234. }
  235. static int
  236. test_complex_read_pipe1_write_cb(int fd, void *user_data1, void *user_data2)
  237. {
  238. assert(0);
  239. return (-1);
  240. }
  241. static int
  242. test_complex_write_pipe1_write_cb(int fd, void *user_data1, void *user_data2)
  243. {
  244. assert(user_data1 == &test_complex_set_events_pipe1_write_called);
  245. assert(user_data2 == test_complex_set_events_pipe1_write_cb);
  246. test_complex_write_pipe1_write_called++;
  247. return (0);
  248. }
  249. static int
  250. test_complex_set_events_pipe2_read_cb(int fd, short *events, void *user_data1, void *user_data2)
  251. {
  252. test_complex_set_events_pipe2_read_called++;
  253. assert(user_data1 == &test_complex_set_events_pipe2_read_called);
  254. assert(user_data2 == test_complex_set_events_pipe2_read_cb);
  255. assert(*events == POLLIN);
  256. return (0);
  257. }
  258. static int
  259. test_complex_read_pipe2_read_cb(int fd, void *user_data1, void *user_data2)
  260. {
  261. char buf[BUF_SIZE];
  262. assert(user_data1 == &test_complex_set_events_pipe2_read_called);
  263. assert(user_data2 == test_complex_set_events_pipe2_read_cb);
  264. test_complex_read_pipe2_read_called++;
  265. assert(read(fd, buf, BUF_SIZE) == strlen(READ_STR) + 1);
  266. assert(memcmp(buf, READ_STR, strlen(READ_STR) + 1) == 0);
  267. return (0);
  268. }
  269. static int
  270. test_complex_write_pipe2_read_cb(int fd, void *user_data1, void *user_data2)
  271. {
  272. assert(0);
  273. return (-1);
  274. }
  275. static int
  276. test_complex_set_events_pipe2_write_cb(PRFileDesc *prfd, short *events, void *user_data1, void *user_data2)
  277. {
  278. test_complex_set_events_pipe2_write_called++;
  279. assert(user_data1 == &test_complex_set_events_pipe2_write_called);
  280. assert(user_data2 == test_complex_set_events_pipe2_write_cb);
  281. assert(*events == POLLOUT);
  282. return (0);
  283. }
  284. static int
  285. test_complex_read_pipe2_write_cb(PRFileDesc *prfd, const PRPollDesc *pd, void *user_data1, void *user_data2)
  286. {
  287. assert(0);
  288. return (-1);
  289. }
  290. static int
  291. test_complex_write_pipe2_write_cb(PRFileDesc *prfd, const PRPollDesc *pd, void *user_data1, void *user_data2)
  292. {
  293. assert(user_data1 == &test_complex_set_events_pipe2_write_called);
  294. assert(user_data2 == test_complex_set_events_pipe2_write_cb);
  295. test_complex_write_pipe2_write_called++;
  296. return (0);
  297. }
  298. static int
  299. test_pre_poll_cb1(void *user_data1, void *user_data2)
  300. {
  301. assert(user_data1 == &pre_poll_cb1_called);
  302. assert(user_data2 == test_pre_poll_cb1);
  303. pre_poll_cb1_called++;
  304. return (0);
  305. }
  306. static int
  307. test_pre_poll_cb2(void *user_data1, void *user_data2)
  308. {
  309. assert(user_data1 == &pre_poll_cb2_called);
  310. assert(user_data2 == test_pre_poll_cb2);
  311. pre_poll_cb2_called++;
  312. return (0);
  313. }
  314. static int
  315. test_pre_poll_cb_return(void *user_data1, void *user_data2)
  316. {
  317. assert(user_data1 == &pre_poll_cb_return_called);
  318. assert(user_data2 == test_pre_poll_cb_return);
  319. pre_poll_cb_return_called++;
  320. return (-1);
  321. }
  322. static void
  323. init_global_vars(void)
  324. {
  325. fd_set_events_cb1_return_called = -1;
  326. fd_set_events_cb2_return_called = -1;
  327. fd_read_cb1_called = -1;
  328. fd_read_cb2_called = -1;
  329. fd_write_cb1_called = -1;
  330. fd_err_cb1_called = -1;
  331. timeout_cb_called = -1;
  332. prfd_set_events_cb1_return_called = -1;
  333. prfd_set_events_cb2_return_called = -1;
  334. prfd_read_cb1_called = -1;
  335. prfd_read_cb2_called = -1;
  336. prfd_write_cb1_called = -1;
  337. prfd_err_cb1_called = -1;
  338. test_complex_set_events_pipe1_read_called = -1;
  339. test_complex_read_pipe1_read_called = -1;
  340. test_complex_set_events_pipe1_write_called = -1;
  341. test_complex_write_pipe1_write_called = -1;
  342. test_complex_set_events_pipe2_read_called = -1;
  343. test_complex_read_pipe2_read_called = -1;
  344. test_complex_set_events_pipe2_write_called = -1;
  345. test_complex_write_pipe2_write_called = -1;
  346. test_complex_read_pipe1_fd = -1;
  347. }
  348. static void
  349. test_fd_basics(struct pr_poll_loop *poll_loop)
  350. {
  351. int pipe_fd1[2];
  352. struct timer_list_entry *timeout_timer;
  353. init_global_vars();
  354. assert(pipe(pipe_fd1) == 0);
  355. /*
  356. * Add POLLNVAL -> failure
  357. */
  358. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[0], POLLNVAL, NULL, NULL, NULL, NULL,
  359. NULL, NULL) == -1);
  360. /*
  361. * Del non-existing fdL -> failure
  362. */
  363. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == -1);
  364. /*
  365. * Add and delete fd twice
  366. */
  367. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[0], 0, NULL, NULL, NULL, NULL,
  368. NULL, NULL) == 0);
  369. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[0], 0, NULL, NULL, NULL, NULL,
  370. NULL, NULL) == -1);
  371. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == 0);
  372. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == -1);
  373. /*
  374. * Test timeout timer
  375. * with empty list
  376. */
  377. assert((timeout_timer = timer_list_add(
  378. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  379. timeout_cb_called = 0;
  380. assert(pr_poll_loop_exec(poll_loop) == 0);
  381. assert(timeout_cb_called == 1);
  382. /*
  383. * Test user_data passing
  384. */
  385. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[0], POLLIN, fd_set_events_cb1_return,
  386. NULL, NULL, NULL, (void *)&fd_set_events_cb1_return_called, NULL) == 0);
  387. fd_set_events_cb1_return_called = 0;
  388. assert((timeout_timer = timer_list_add(
  389. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  390. assert(pr_poll_loop_exec(poll_loop) == -1);
  391. assert(fd_set_events_cb1_return_called == 1);
  392. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  393. /*
  394. * Remove entry and try different cb
  395. */
  396. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == 0);
  397. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[1], POLLOUT, fd_set_events_cb2_return,
  398. NULL, NULL, NULL, NULL, (void *)&fd_set_events_cb2_return_called) == 0);
  399. fd_set_events_cb1_return_called = 0;
  400. fd_set_events_cb2_return_called = 0;
  401. assert((timeout_timer = timer_list_add(
  402. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  403. assert(pr_poll_loop_exec(poll_loop) == -1);
  404. assert(fd_set_events_cb1_return_called == 0);
  405. assert(fd_set_events_cb2_return_called == 1);
  406. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  407. /*
  408. * Delete entry and try timeout again
  409. */
  410. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == -1);
  411. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[1]) == 0);
  412. assert((timeout_timer = timer_list_add(
  413. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  414. timeout_cb_called = 0;
  415. assert(pr_poll_loop_exec(poll_loop) == 0);
  416. assert(timeout_cb_called == 1);
  417. /*
  418. * Try reading
  419. */
  420. assert(write(pipe_fd1[1], READ_STR, strlen(READ_STR) + 1) == strlen(READ_STR) + 1);
  421. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[0], POLLIN, NULL,
  422. fd_read_cb1, NULL, NULL,
  423. &fd_read_cb1_called, fd_read_cb1) == 0);
  424. fd_read_cb1_called = 0;
  425. timeout_cb_called = 0;
  426. assert((timeout_timer = timer_list_add(
  427. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  428. assert(pr_poll_loop_exec(poll_loop) == 0);
  429. assert(fd_read_cb1_called == 1);
  430. assert(timeout_cb_called == 0);
  431. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  432. /*
  433. * Try timeout with valid entry
  434. */
  435. assert((timeout_timer = timer_list_add(
  436. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  437. timeout_cb_called = 0;
  438. fd_read_cb1_called = 0;
  439. assert(pr_poll_loop_exec(poll_loop) == 0);
  440. assert(timeout_cb_called == 1);
  441. assert(fd_read_cb1_called == 0);
  442. /*
  443. * Try reading where cb returns err
  444. */
  445. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == 0);
  446. assert(write(pipe_fd1[1], READ_STR, strlen(READ_STR) + 1) == strlen(READ_STR) + 1);
  447. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[0], POLLIN, NULL,
  448. fd_read_cb2, NULL, NULL,
  449. &fd_read_cb2_called, fd_read_cb2) == 0);
  450. fd_read_cb1_called = 0;
  451. fd_read_cb2_called = 0;
  452. timeout_cb_called = 0;
  453. assert((timeout_timer = timer_list_add(
  454. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  455. assert(pr_poll_loop_exec(poll_loop) == -1);
  456. assert(fd_read_cb1_called == 0);
  457. assert(fd_read_cb2_called == 1);
  458. assert(timeout_cb_called == 0);
  459. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  460. /*
  461. * Try writing
  462. */
  463. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == 0);
  464. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[1], POLLOUT, NULL,
  465. NULL, fd_write_cb1, NULL,
  466. &fd_write_cb1_called, fd_write_cb1) == 0);
  467. fd_write_cb1_called = 0;
  468. timeout_cb_called = 0;
  469. assert((timeout_timer = timer_list_add(
  470. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  471. assert(pr_poll_loop_exec(poll_loop) == 0);
  472. assert(fd_write_cb1_called == 1);
  473. assert(timeout_cb_called == 0);
  474. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  475. /*
  476. * Try err cb
  477. */
  478. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[1]) == 0);
  479. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[0], POLLIN, NULL,
  480. NULL, NULL, fd_err_cb1,
  481. &fd_err_cb1_called, fd_err_cb1) == 0);
  482. assert(close(pipe_fd1[0]) == 0);
  483. assert(close(pipe_fd1[1]) == 0);
  484. fd_err_cb1_called = 0;
  485. timeout_cb_called = 0;
  486. fd_write_cb1_called = 0;
  487. assert((timeout_timer = timer_list_add(
  488. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  489. assert(pr_poll_loop_exec(poll_loop) == 0);
  490. assert(fd_err_cb1_called == 1);
  491. assert(fd_write_cb1_called == 0);
  492. assert(timeout_cb_called == 0);
  493. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[0]) == 0);
  494. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  495. }
  496. static void
  497. test_prfd_basics(struct pr_poll_loop *poll_loop)
  498. {
  499. PRFileDesc *read_pipe;
  500. PRFileDesc *write_pipe;
  501. struct timer_list_entry *timeout_timer;
  502. int pipe_fd1[2];
  503. init_global_vars();
  504. assert(PR_CreatePipe(&read_pipe, &write_pipe) == PR_SUCCESS);
  505. /*
  506. * Add POLLNVAL -> failure
  507. */
  508. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe, POLLNVAL, NULL, NULL, NULL, NULL,
  509. NULL, NULL) == -1);
  510. /*
  511. * Del non-existing fdL -> failure
  512. */
  513. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == -1);
  514. /*
  515. * Add and delete fd twice
  516. */
  517. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe, 0, NULL, NULL, NULL, NULL,
  518. NULL, NULL) == 0);
  519. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe, 0, NULL, NULL, NULL, NULL,
  520. NULL, NULL) == -1);
  521. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == 0);
  522. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == -1);
  523. /*
  524. * Test user_data passing
  525. */
  526. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe, POLLIN, prfd_set_events_cb1_return,
  527. NULL, NULL, NULL, (void *)&prfd_set_events_cb1_return_called, NULL) == 0);
  528. prfd_set_events_cb1_return_called = 0;
  529. assert((timeout_timer = timer_list_add(
  530. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  531. assert(pr_poll_loop_exec(poll_loop) == -1);
  532. assert(prfd_set_events_cb1_return_called == 1);
  533. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  534. /*
  535. * Remove entry and try different cb
  536. */
  537. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == 0);
  538. assert(pr_poll_loop_add_prfd(poll_loop, write_pipe, POLLOUT, prfd_set_events_cb2_return,
  539. NULL, NULL, NULL, NULL, (void *)&prfd_set_events_cb2_return_called) == 0);
  540. prfd_set_events_cb1_return_called = 0;
  541. prfd_set_events_cb2_return_called = 0;
  542. assert((timeout_timer = timer_list_add(
  543. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  544. assert(pr_poll_loop_exec(poll_loop) == -1);
  545. assert(prfd_set_events_cb1_return_called == 0);
  546. assert(prfd_set_events_cb2_return_called == 1);
  547. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  548. /*
  549. * Delete entry and try timeout again
  550. */
  551. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == -1);
  552. assert(pr_poll_loop_del_prfd(poll_loop, write_pipe) == 0);
  553. assert((timeout_timer = timer_list_add(
  554. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  555. timeout_cb_called = 0;
  556. assert(pr_poll_loop_exec(poll_loop) == 0);
  557. assert(timeout_cb_called == 1);
  558. /*
  559. * Try reading
  560. */
  561. assert(PR_Write(write_pipe, READ_STR, strlen(READ_STR) + 1) == strlen(READ_STR) + 1);
  562. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe, POLLIN, NULL,
  563. prfd_read_cb1, NULL, NULL,
  564. &prfd_read_cb1_called, prfd_read_cb1) == 0);
  565. prfd_read_cb1_called = 0;
  566. timeout_cb_called = 0;
  567. assert((timeout_timer = timer_list_add(
  568. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  569. assert(pr_poll_loop_exec(poll_loop) == 0);
  570. assert(prfd_read_cb1_called == 1);
  571. assert(timeout_cb_called == 0);
  572. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  573. /*
  574. * Try timeout with valid entry
  575. */
  576. assert((timeout_timer = timer_list_add(
  577. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  578. timeout_cb_called = 0;
  579. prfd_read_cb1_called = 0;
  580. assert(pr_poll_loop_exec(poll_loop) == 0);
  581. assert(timeout_cb_called == 1);
  582. assert(prfd_read_cb1_called == 0);
  583. /*
  584. * Try reading where cb returns err
  585. */
  586. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == 0);
  587. assert(PR_Write(write_pipe, READ_STR, strlen(READ_STR) + 1) == strlen(READ_STR) + 1);
  588. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe, POLLIN, NULL,
  589. prfd_read_cb2, NULL, NULL,
  590. &prfd_read_cb2_called, prfd_read_cb2) == 0);
  591. prfd_read_cb1_called = 0;
  592. prfd_read_cb2_called = 0;
  593. timeout_cb_called = 0;
  594. assert((timeout_timer = timer_list_add(
  595. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  596. assert(pr_poll_loop_exec(poll_loop) == -1);
  597. assert(prfd_read_cb1_called == 0);
  598. assert(prfd_read_cb2_called == 1);
  599. assert(timeout_cb_called == 0);
  600. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  601. /*
  602. * Try writing
  603. */
  604. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == 0);
  605. assert(pr_poll_loop_add_prfd(poll_loop, write_pipe, POLLOUT, NULL,
  606. NULL, prfd_write_cb1, NULL,
  607. &prfd_write_cb1_called, prfd_write_cb1) == 0);
  608. prfd_write_cb1_called = 0;
  609. timeout_cb_called = 0;
  610. assert((timeout_timer = timer_list_add(
  611. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  612. assert(pr_poll_loop_exec(poll_loop) == 0);
  613. assert(prfd_write_cb1_called == 1);
  614. assert(timeout_cb_called == 0);
  615. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  616. assert(PR_Close(read_pipe) == 0);
  617. assert(PR_Close(write_pipe) == 0);
  618. /*
  619. * Try err cb
  620. */
  621. assert(pr_poll_loop_del_prfd(poll_loop, write_pipe) == 0);
  622. /*
  623. * Must use native pipe, because PR_Close deallocate PRFileDesc completelly
  624. */
  625. assert(pipe(pipe_fd1) == 0);
  626. assert((read_pipe = PR_CreateSocketPollFd(pipe_fd1[0])) != NULL);
  627. assert(close(pipe_fd1[0]) == 0);
  628. assert(close(pipe_fd1[1]) == 0);
  629. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe, POLLIN, NULL,
  630. NULL, NULL, prfd_err_cb1,
  631. &prfd_err_cb1_called, prfd_err_cb1) == 0);
  632. prfd_err_cb1_called = 0;
  633. timeout_cb_called = 0;
  634. prfd_write_cb1_called = 0;
  635. assert((timeout_timer = timer_list_add(
  636. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  637. assert(pr_poll_loop_exec(poll_loop) == 0);
  638. assert(prfd_err_cb1_called == 1);
  639. assert(prfd_write_cb1_called == 0);
  640. assert(timeout_cb_called == 0);
  641. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe) == 0);
  642. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  643. assert(PR_DestroySocketPollFd(read_pipe) == PR_SUCCESS);
  644. }
  645. static void
  646. test_complex(struct pr_poll_loop *poll_loop)
  647. {
  648. int pipe_fd1[2], pipe_fd2[2];
  649. PRFileDesc *read_pipe1;
  650. PRFileDesc *write_pipe2;
  651. struct timer_list_entry *timeout_timer;
  652. init_global_vars();
  653. assert(pipe(pipe_fd1) == 0);
  654. assert(pipe(pipe_fd2) == 0);
  655. test_complex_read_pipe1_fd = pipe_fd1[0];
  656. /*
  657. * Add pre poll cb1
  658. */
  659. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb1,
  660. &pre_poll_cb1_called, test_pre_poll_cb1) == 0);
  661. assert((read_pipe1 = PR_CreateSocketPollFd(pipe_fd1[0])) != NULL);
  662. assert((write_pipe2 = PR_CreateSocketPollFd(pipe_fd2[1])) != NULL);
  663. assert(pr_poll_loop_add_prfd(poll_loop, read_pipe1, 0, test_complex_set_events_pipe1_read_cb,
  664. test_complex_read_pipe1_read_cb, test_complex_write_pipe1_read_cb, NULL,
  665. &test_complex_set_events_pipe1_read_called, test_complex_set_events_pipe1_read_cb) == 0);
  666. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd1[1], 0, test_complex_set_events_pipe1_write_cb,
  667. test_complex_read_pipe1_write_cb, test_complex_write_pipe1_write_cb, NULL,
  668. &test_complex_set_events_pipe1_write_called, test_complex_set_events_pipe1_write_cb) == 0);
  669. assert(pr_poll_loop_add_fd(poll_loop, pipe_fd2[0], POLLIN, test_complex_set_events_pipe2_read_cb,
  670. test_complex_read_pipe2_read_cb, test_complex_write_pipe2_read_cb, NULL,
  671. &test_complex_set_events_pipe2_read_called, test_complex_set_events_pipe2_read_cb) == 0);
  672. assert(pr_poll_loop_add_prfd(poll_loop, write_pipe2, POLLOUT, test_complex_set_events_pipe2_write_cb,
  673. test_complex_read_pipe2_write_cb, test_complex_write_pipe2_write_cb, NULL,
  674. &test_complex_set_events_pipe2_write_called, test_complex_set_events_pipe2_write_cb) == 0);
  675. timeout_cb_called = 0;
  676. test_complex_set_events_pipe1_read_called = 0;
  677. test_complex_read_pipe1_read_called = 0;
  678. test_complex_set_events_pipe1_write_called = 0;
  679. test_complex_write_pipe1_write_called = 0;
  680. test_complex_set_events_pipe2_read_called = 0;
  681. test_complex_read_pipe2_read_called = 0;
  682. test_complex_set_events_pipe2_write_called = 0;
  683. test_complex_write_pipe2_write_called = 0;
  684. pre_poll_cb1_called = 0;
  685. pre_poll_cb2_called = 0;
  686. /*
  687. * Call for first time -> all set_events should be called and pipe2_write should be called
  688. */
  689. assert((timeout_timer = timer_list_add(
  690. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  691. assert(pr_poll_loop_exec(poll_loop) == 0);
  692. assert(pre_poll_cb1_called == 1);
  693. assert(pre_poll_cb2_called == 0);
  694. assert(test_complex_set_events_pipe1_read_called == 1);
  695. assert(test_complex_read_pipe1_read_called == 0);
  696. assert(test_complex_set_events_pipe1_write_called == 1);
  697. assert(test_complex_write_pipe1_write_called == 0);
  698. assert(test_complex_set_events_pipe2_read_called == 1);
  699. assert(test_complex_read_pipe2_read_called == 0);
  700. assert(test_complex_set_events_pipe2_write_called == 1);
  701. assert(test_complex_write_pipe2_write_called == 1);
  702. assert(timeout_cb_called == 0);
  703. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  704. /*
  705. * Call for second time -> same as first time
  706. */
  707. assert((timeout_timer = timer_list_add(
  708. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  709. assert(pr_poll_loop_exec(poll_loop) == 0);
  710. assert(pre_poll_cb1_called == 2);
  711. assert(pre_poll_cb2_called == 0);
  712. assert(test_complex_set_events_pipe1_read_called == 2);
  713. assert(test_complex_read_pipe1_read_called == 0);
  714. assert(test_complex_set_events_pipe1_write_called == 2);
  715. assert(test_complex_write_pipe1_write_called == 0);
  716. assert(test_complex_set_events_pipe2_read_called == 2);
  717. assert(test_complex_read_pipe2_read_called == 0);
  718. assert(test_complex_set_events_pipe2_write_called == 2);
  719. assert(test_complex_write_pipe2_write_called == 2);
  720. assert(timeout_cb_called == 0);
  721. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  722. /*
  723. * Change state to prepare for writing
  724. */
  725. test_complex_state = 1;
  726. assert((timeout_timer = timer_list_add(
  727. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  728. assert(pr_poll_loop_exec(poll_loop) == 0);
  729. assert(pre_poll_cb1_called == 3);
  730. assert(pre_poll_cb2_called == 0);
  731. assert(test_complex_set_events_pipe1_read_called == 3);
  732. assert(test_complex_read_pipe1_read_called == 0);
  733. assert(test_complex_set_events_pipe1_write_called == 3);
  734. assert(test_complex_write_pipe1_write_called == 1);
  735. assert(test_complex_set_events_pipe2_read_called == 3);
  736. assert(test_complex_read_pipe2_read_called == 0);
  737. assert(test_complex_set_events_pipe2_write_called == 3);
  738. assert(test_complex_write_pipe2_write_called == 3);
  739. assert(timeout_cb_called == 0);
  740. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  741. /*
  742. * Write to first pipe
  743. */
  744. assert(write(pipe_fd1[1], READ_STR, strlen(READ_STR) + 1) == strlen(READ_STR) + 1);
  745. assert((timeout_timer = timer_list_add(
  746. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  747. assert(pr_poll_loop_exec(poll_loop) == 0);
  748. assert(pre_poll_cb1_called == 4);
  749. assert(pre_poll_cb2_called == 0);
  750. assert(test_complex_set_events_pipe1_read_called == 4);
  751. assert(test_complex_read_pipe1_read_called == 0);
  752. assert(test_complex_set_events_pipe1_write_called == 4);
  753. assert(test_complex_write_pipe1_write_called == 2);
  754. assert(test_complex_set_events_pipe2_read_called == 4);
  755. assert(test_complex_read_pipe2_read_called == 0);
  756. assert(test_complex_set_events_pipe2_write_called == 4);
  757. assert(test_complex_write_pipe2_write_called == 4);
  758. assert(timeout_cb_called == 0);
  759. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  760. /*
  761. * Delete pre poll cb
  762. */
  763. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb1) == 0);
  764. /*
  765. * Change state so write can propagate
  766. */
  767. test_complex_state = 2;
  768. assert((timeout_timer = timer_list_add(
  769. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  770. assert(pr_poll_loop_exec(poll_loop) == 0);
  771. assert(pre_poll_cb1_called == 4);
  772. assert(pre_poll_cb2_called == 0);
  773. assert(test_complex_set_events_pipe1_read_called == 5);
  774. assert(test_complex_read_pipe1_read_called == 1);
  775. assert(test_complex_set_events_pipe1_write_called == 5);
  776. assert(test_complex_write_pipe1_write_called == 2);
  777. assert(test_complex_set_events_pipe2_read_called == 5);
  778. assert(test_complex_read_pipe2_read_called == 0);
  779. assert(test_complex_set_events_pipe2_write_called == 5);
  780. assert(test_complex_write_pipe2_write_called == 5);
  781. assert(timeout_cb_called == 0);
  782. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  783. /*
  784. * Add pre poll cb 1 and 2
  785. */
  786. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb1,
  787. &pre_poll_cb1_called, test_pre_poll_cb1) == 0);
  788. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb2,
  789. &pre_poll_cb2_called, test_pre_poll_cb2) == 0);
  790. /*
  791. * Change state so pipe1 events are not called any longer
  792. */
  793. test_complex_state = 4;
  794. assert((timeout_timer = timer_list_add(
  795. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  796. assert(pr_poll_loop_exec(poll_loop) == 0);
  797. assert(pre_poll_cb1_called == 5);
  798. assert(pre_poll_cb2_called == 1);
  799. assert(test_complex_set_events_pipe1_read_called == 6);
  800. assert(test_complex_read_pipe1_read_called == 1);
  801. assert(test_complex_set_events_pipe1_write_called == 6);
  802. assert(test_complex_write_pipe1_write_called == 2);
  803. assert(test_complex_set_events_pipe2_read_called == 6);
  804. assert(test_complex_read_pipe2_read_called == 0);
  805. assert(test_complex_set_events_pipe2_write_called == 6);
  806. assert(test_complex_write_pipe2_write_called == 6);
  807. assert(timeout_cb_called == 0);
  808. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  809. /*
  810. * Write to second pipe
  811. */
  812. assert(write(pipe_fd2[1], READ_STR, strlen(READ_STR) + 1) == strlen(READ_STR) + 1);
  813. assert((timeout_timer = timer_list_add(
  814. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  815. assert(pr_poll_loop_exec(poll_loop) == 0);
  816. assert(pre_poll_cb1_called == 6);
  817. assert(pre_poll_cb2_called == 2);
  818. assert(test_complex_set_events_pipe1_read_called == 7);
  819. assert(test_complex_read_pipe1_read_called == 1);
  820. assert(test_complex_set_events_pipe1_write_called == 7);
  821. assert(test_complex_write_pipe1_write_called == 2);
  822. assert(test_complex_set_events_pipe2_read_called == 7);
  823. assert(test_complex_read_pipe2_read_called == 1);
  824. assert(test_complex_set_events_pipe2_write_called == 7);
  825. assert(test_complex_write_pipe2_write_called == 7);
  826. assert(timeout_cb_called == 0);
  827. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  828. /*
  829. * And call again
  830. */
  831. assert((timeout_timer = timer_list_add(
  832. pr_poll_loop_get_timer_list(poll_loop), TIMER_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  833. assert(pr_poll_loop_exec(poll_loop) == 0);
  834. assert(pre_poll_cb1_called == 7);
  835. assert(pre_poll_cb2_called == 3);
  836. assert(test_complex_set_events_pipe1_read_called == 8);
  837. assert(test_complex_read_pipe1_read_called == 1);
  838. assert(test_complex_set_events_pipe1_write_called == 8);
  839. assert(test_complex_write_pipe1_write_called == 2);
  840. assert(test_complex_set_events_pipe2_read_called == 8);
  841. assert(test_complex_read_pipe2_read_called == 1);
  842. assert(test_complex_set_events_pipe2_write_called == 8);
  843. assert(test_complex_write_pipe2_write_called == 8);
  844. assert(timeout_cb_called == 0);
  845. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  846. assert(PR_DestroySocketPollFd(read_pipe1) == PR_SUCCESS);
  847. assert(PR_DestroySocketPollFd(write_pipe2) == PR_SUCCESS);
  848. assert(close(pipe_fd1[0]) == 0);
  849. assert(close(pipe_fd1[1]) == 0);
  850. assert(close(pipe_fd2[0]) == 0);
  851. assert(close(pipe_fd2[1]) == 0);
  852. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb1) == 0);
  853. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb2) == 0);
  854. assert(pr_poll_loop_del_prfd(poll_loop, read_pipe1) == 0);
  855. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd1[1]) == 0);
  856. assert(pr_poll_loop_del_fd(poll_loop, pipe_fd2[0]) == 0);
  857. assert(pr_poll_loop_del_prfd(poll_loop, write_pipe2) == 0);
  858. }
  859. static void
  860. test_pre_poll_cb(struct pr_poll_loop *poll_loop)
  861. {
  862. struct timer_list_entry *timeout_timer;
  863. init_global_vars();
  864. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb1,
  865. &pre_poll_cb1_called, test_pre_poll_cb1) == 0);
  866. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb1,
  867. &pre_poll_cb1_called, test_pre_poll_cb1) == -1);
  868. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb1) == 0);
  869. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb1) == -1);
  870. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb2) == -1);
  871. /*
  872. * Just one pre poll cb
  873. */
  874. pre_poll_cb1_called = 0;
  875. pre_poll_cb2_called = 0;
  876. pre_poll_cb_return_called = 0;
  877. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb1,
  878. &pre_poll_cb1_called, test_pre_poll_cb1) == 0);
  879. assert((timeout_timer = timer_list_add(
  880. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  881. timeout_cb_called = 0;
  882. assert(pr_poll_loop_exec(poll_loop) == 0);
  883. assert(timeout_cb_called == 1);
  884. assert(pre_poll_cb1_called == 1);
  885. assert(pre_poll_cb2_called == 0);
  886. assert(pre_poll_cb_return_called == 0);
  887. /*
  888. * Test again
  889. */
  890. assert((timeout_timer = timer_list_add(
  891. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  892. timeout_cb_called = 0;
  893. assert(pr_poll_loop_exec(poll_loop) == 0);
  894. assert(timeout_cb_called == 1);
  895. assert(pre_poll_cb1_called == 2);
  896. assert(pre_poll_cb2_called == 0);
  897. assert(pre_poll_cb_return_called == 0);
  898. /*
  899. * Add second cb
  900. */
  901. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb2,
  902. &pre_poll_cb2_called, test_pre_poll_cb2) == 0);
  903. assert((timeout_timer = timer_list_add(
  904. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  905. timeout_cb_called = 0;
  906. assert(pr_poll_loop_exec(poll_loop) == 0);
  907. assert(timeout_cb_called == 1);
  908. assert(pre_poll_cb1_called == 3);
  909. assert(pre_poll_cb2_called == 1);
  910. assert(pre_poll_cb_return_called == 0);
  911. /*
  912. * Remove cb1
  913. */
  914. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb1) == 0);
  915. assert((timeout_timer = timer_list_add(
  916. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  917. timeout_cb_called = 0;
  918. assert(pr_poll_loop_exec(poll_loop) == 0);
  919. assert(timeout_cb_called == 1);
  920. assert(pre_poll_cb1_called == 3);
  921. assert(pre_poll_cb2_called == 2);
  922. assert(pre_poll_cb_return_called == 0);
  923. /*
  924. * Add cb1 and cb return
  925. */
  926. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb1,
  927. &pre_poll_cb1_called, test_pre_poll_cb1) == 0);
  928. assert(pr_poll_loop_add_pre_poll_cb(poll_loop, test_pre_poll_cb_return,
  929. &pre_poll_cb_return_called, test_pre_poll_cb_return) == 0);
  930. assert((timeout_timer = timer_list_add(
  931. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  932. timeout_cb_called = 0;
  933. assert(pr_poll_loop_exec(poll_loop) == -1);
  934. assert(timeout_cb_called == 0);
  935. assert(pre_poll_cb1_called == 4);
  936. assert(pre_poll_cb2_called == 3);
  937. assert(pre_poll_cb_return_called == 1);
  938. timer_list_delete(pr_poll_loop_get_timer_list(poll_loop), timeout_timer);
  939. /*
  940. * Remove cb_return
  941. */
  942. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb_return) == 0);
  943. assert((timeout_timer = timer_list_add(
  944. pr_poll_loop_get_timer_list(poll_loop), TIMER_TEST_TIMEOUT, timeout_cb, NULL, NULL)) != NULL);
  945. timeout_cb_called = 0;
  946. assert(pr_poll_loop_exec(poll_loop) == 0);
  947. assert(timeout_cb_called == 1);
  948. assert(pre_poll_cb1_called == 5);
  949. assert(pre_poll_cb2_called == 4);
  950. assert(pre_poll_cb_return_called == 1);
  951. /*
  952. * Cleanup
  953. */
  954. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb1) == 0);
  955. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb2) == 0);
  956. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb_return) == -1);
  957. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb1) == -1);
  958. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb2) == -1);
  959. assert(pr_poll_loop_del_pre_poll_cb(poll_loop, test_pre_poll_cb_return) == -1);
  960. }
  961. int
  962. main(void)
  963. {
  964. struct pr_poll_loop poll_loop;
  965. PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0);
  966. pr_poll_loop_init(&poll_loop);
  967. test_fd_basics(&poll_loop);
  968. test_prfd_basics(&poll_loop);
  969. test_pre_poll_cb(&poll_loop);
  970. test_complex(&poll_loop);
  971. pr_poll_loop_destroy(&poll_loop);
  972. assert(PR_Cleanup() == PR_SUCCESS);
  973. return (0);
  974. }