| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2018-05-29 20:07:08 +08:00
										 |  |  |  * Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-12-06 20:05:25 +08:00
										 |  |  |  * Licensed under the Apache License 2.0 (the "License").  You may not use | 
					
						
							| 
									
										
										
										
											2016-05-18 02:20:24 +08:00
										 |  |  |  * this file except in compliance with the License.  You can obtain a copy | 
					
						
							|  |  |  |  * in the file LICENSE in the source distribution or at | 
					
						
							|  |  |  |  * https://www.openssl.org/source/license.html
 | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-26 19:40:15 +08:00
										 |  |  | #ifdef _WIN32
 | 
					
						
							|  |  |  | # include <windows.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include <openssl/async.h>
 | 
					
						
							|  |  |  | #include <openssl/crypto.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int ctr = 0; | 
					
						
							|  |  |  | static ASYNC_JOB *currjob = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int only_pause(void *args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ASYNC_pause_job(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int add_two(void *args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ctr++; | 
					
						
							|  |  |  |     ASYNC_pause_job(); | 
					
						
							|  |  |  |     ctr++; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 2; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int save_current(void *args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     currjob = ASYNC_get_current_job(); | 
					
						
							|  |  |  |     ASYNC_pause_job(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  | #define MAGIC_WAIT_FD   ((OSSL_ASYNC_FD)99)
 | 
					
						
							|  |  |  | static int waitfd(void *args) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |     ASYNC_JOB *job; | 
					
						
							|  |  |  |     ASYNC_WAIT_CTX *waitctx; | 
					
						
							|  |  |  |     job = ASYNC_get_current_job(); | 
					
						
							|  |  |  |     if (job == NULL) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     waitctx = ASYNC_get_wait_ctx(job); | 
					
						
							|  |  |  |     if (waitctx == NULL) | 
					
						
							|  |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2017-01-26 11:17:54 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* First case: no fd added or removed */ | 
					
						
							|  |  |  |     ASYNC_pause_job(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Second case: one fd added */ | 
					
						
							| 
									
										
										
										
											2016-06-29 06:18:50 +08:00
										 |  |  |     if (!ASYNC_WAIT_CTX_set_wait_fd(waitctx, waitctx, MAGIC_WAIT_FD, NULL, NULL)) | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |     ASYNC_pause_job(); | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 11:17:54 +08:00
										 |  |  |     /* Third case: all fd removed */ | 
					
						
							|  |  |  |     if (!ASYNC_WAIT_CTX_clear_fd(waitctx, waitctx)) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     ASYNC_pause_job(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Last case: fd added and immediately removed */ | 
					
						
							|  |  |  |     if (!ASYNC_WAIT_CTX_set_wait_fd(waitctx, waitctx, MAGIC_WAIT_FD, NULL, NULL)) | 
					
						
							|  |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |     if (!ASYNC_WAIT_CTX_clear_fd(waitctx, waitctx)) | 
					
						
							|  |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-12 18:42:08 +08:00
										 |  |  | static int blockpause(void *args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ASYNC_block_pause(); | 
					
						
							|  |  |  |     ASYNC_pause_job(); | 
					
						
							|  |  |  |     ASYNC_unblock_pause(); | 
					
						
							|  |  |  |     ASYNC_pause_job(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 23:09:50 +08:00
										 |  |  | static int test_ASYNC_init_thread(void) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     ASYNC_JOB *job1 = NULL, *job2 = NULL, *job3 = NULL; | 
					
						
							|  |  |  |     int funcret1, funcret2, funcret3; | 
					
						
							| 
									
										
										
										
											2016-02-29 21:07:28 +08:00
										 |  |  |     ASYNC_WAIT_CTX *waitctx = NULL; | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |     if (       !ASYNC_init_thread(2, 0) | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || (waitctx = ASYNC_WAIT_CTX_new()) == NULL | 
					
						
							|  |  |  |             || ASYNC_start_job(&job1, waitctx, &funcret1, only_pause, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |                 != ASYNC_PAUSE | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || ASYNC_start_job(&job2, waitctx, &funcret2, only_pause, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |                 != ASYNC_PAUSE | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || ASYNC_start_job(&job3, waitctx, &funcret3, only_pause, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |                 != ASYNC_NO_JOBS | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || ASYNC_start_job(&job1, waitctx, &funcret1, only_pause, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |                 != ASYNC_FINISH | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || ASYNC_start_job(&job3, waitctx, &funcret3, only_pause, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |                 != ASYNC_PAUSE | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || ASYNC_start_job(&job2, waitctx, &funcret2, only_pause, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |                 != ASYNC_FINISH | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || ASYNC_start_job(&job3, waitctx, &funcret3, only_pause, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |                 != ASYNC_FINISH | 
					
						
							|  |  |  |             || funcret1 != 1 | 
					
						
							|  |  |  |             || funcret2 != 1 | 
					
						
							|  |  |  |             || funcret3 != 1) { | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |         fprintf(stderr, "test_ASYNC_init_thread() failed\n"); | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |         ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |         ASYNC_cleanup_thread(); | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |     ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |     ASYNC_cleanup_thread(); | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-06 04:41:01 +08:00
										 |  |  | static int test_callback(void *arg) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     printf("callback test pass\n"); | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int test_ASYNC_callback_status(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ASYNC_WAIT_CTX *waitctx = NULL; | 
					
						
							|  |  |  |     int set_arg = 100; | 
					
						
							|  |  |  |     ASYNC_callback_fn get_callback; | 
					
						
							|  |  |  |     void *get_arg; | 
					
						
							|  |  |  |     int set_status = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (       !ASYNC_init_thread(1, 0) | 
					
						
							|  |  |  |             || (waitctx = ASYNC_WAIT_CTX_new()) == NULL | 
					
						
							|  |  |  |             || ASYNC_WAIT_CTX_set_callback(waitctx, test_callback, (void*)&set_arg) | 
					
						
							|  |  |  |                != 1 | 
					
						
							|  |  |  |             || ASYNC_WAIT_CTX_get_callback(waitctx, &get_callback, &get_arg) | 
					
						
							|  |  |  |                != 1 | 
					
						
							|  |  |  |             || test_callback != get_callback | 
					
						
							|  |  |  |             || get_arg != (void*)&set_arg | 
					
						
							|  |  |  |             || (*get_callback)(get_arg) != 1 | 
					
						
							|  |  |  |             || ASYNC_WAIT_CTX_set_status(waitctx, set_status) != 1 | 
					
						
							|  |  |  |             || set_status != ASYNC_WAIT_CTX_get_status(waitctx)) { | 
					
						
							|  |  |  |         fprintf(stderr, "test_ASYNC_callback_status() failed\n"); | 
					
						
							|  |  |  |         ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							|  |  |  |         ASYNC_cleanup_thread(); | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							|  |  |  |     ASYNC_cleanup_thread(); | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 23:09:50 +08:00
										 |  |  | static int test_ASYNC_start_job(void) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     ASYNC_JOB *job = NULL; | 
					
						
							|  |  |  |     int funcret; | 
					
						
							| 
									
										
										
										
											2016-02-29 21:07:28 +08:00
										 |  |  |     ASYNC_WAIT_CTX *waitctx = NULL; | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ctr = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |     if (       !ASYNC_init_thread(1, 0) | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || (waitctx = ASYNC_WAIT_CTX_new()) == NULL | 
					
						
							|  |  |  |             || ASYNC_start_job(&job, waitctx, &funcret, add_two, NULL, 0) | 
					
						
							|  |  |  |                != ASYNC_PAUSE | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |             || ctr != 1 | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || ASYNC_start_job(&job, waitctx, &funcret, add_two, NULL, 0) | 
					
						
							|  |  |  |                != ASYNC_FINISH | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |             || ctr != 2 | 
					
						
							|  |  |  |             || funcret != 2) { | 
					
						
							|  |  |  |         fprintf(stderr, "test_ASYNC_start_job() failed\n"); | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |         ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |         ASYNC_cleanup_thread(); | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |     ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |     ASYNC_cleanup_thread(); | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 23:09:50 +08:00
										 |  |  | static int test_ASYNC_get_current_job(void) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     ASYNC_JOB *job = NULL; | 
					
						
							|  |  |  |     int funcret; | 
					
						
							| 
									
										
										
										
											2016-02-29 21:07:28 +08:00
										 |  |  |     ASYNC_WAIT_CTX *waitctx = NULL; | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     currjob = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |     if (       !ASYNC_init_thread(1, 0) | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || (waitctx = ASYNC_WAIT_CTX_new()) == NULL | 
					
						
							|  |  |  |             || ASYNC_start_job(&job, waitctx, &funcret, save_current, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |                 != ASYNC_PAUSE | 
					
						
							|  |  |  |             || currjob != job | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || ASYNC_start_job(&job, waitctx, &funcret, save_current, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |                 != ASYNC_FINISH | 
					
						
							|  |  |  |             || funcret != 1) { | 
					
						
							|  |  |  |         fprintf(stderr, "test_ASYNC_get_current_job() failed\n"); | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |         ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |         ASYNC_cleanup_thread(); | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |     ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |     ASYNC_cleanup_thread(); | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 23:09:50 +08:00
										 |  |  | static int test_ASYNC_WAIT_CTX_get_all_fds(void) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     ASYNC_JOB *job = NULL; | 
					
						
							| 
									
										
										
										
											2015-11-13 19:22:21 +08:00
										 |  |  |     int funcret; | 
					
						
							| 
									
										
										
										
											2016-02-29 21:07:28 +08:00
										 |  |  |     ASYNC_WAIT_CTX *waitctx = NULL; | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |     OSSL_ASYNC_FD fd = OSSL_BAD_ASYNC_FD, delfd = OSSL_BAD_ASYNC_FD; | 
					
						
							|  |  |  |     size_t numfds, numdelfds; | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |     if (       !ASYNC_init_thread(1, 0) | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || (waitctx = ASYNC_WAIT_CTX_new()) == NULL | 
					
						
							|  |  |  |                /* On first run we're not expecting any wait fds */ | 
					
						
							|  |  |  |             || ASYNC_start_job(&job, waitctx, &funcret, waitfd, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |                 != ASYNC_PAUSE | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || !ASYNC_WAIT_CTX_get_all_fds(waitctx, NULL, &numfds) | 
					
						
							|  |  |  |             || numfds != 0 | 
					
						
							|  |  |  |             || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, NULL, | 
					
						
							|  |  |  |                                                &numdelfds) | 
					
						
							|  |  |  |             || numfds != 0 | 
					
						
							|  |  |  |             || numdelfds != 0 | 
					
						
							|  |  |  |                /* On second run we're expecting one added fd */ | 
					
						
							|  |  |  |             || ASYNC_start_job(&job, waitctx, &funcret, waitfd, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |                 != ASYNC_PAUSE | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || !ASYNC_WAIT_CTX_get_all_fds(waitctx, NULL, &numfds) | 
					
						
							|  |  |  |             || numfds != 1 | 
					
						
							|  |  |  |             || !ASYNC_WAIT_CTX_get_all_fds(waitctx, &fd, &numfds) | 
					
						
							|  |  |  |             || fd != MAGIC_WAIT_FD | 
					
						
							|  |  |  |             || (fd = OSSL_BAD_ASYNC_FD, 0) /* Assign to something else */ | 
					
						
							|  |  |  |             || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, NULL, | 
					
						
							| 
									
										
										
										
											2017-01-26 11:17:54 +08:00
										 |  |  |                                                &numdelfds) | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || numfds != 1 | 
					
						
							|  |  |  |             || numdelfds != 0 | 
					
						
							|  |  |  |             || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, &fd, &numfds, NULL, | 
					
						
							|  |  |  |                                                &numdelfds) | 
					
						
							|  |  |  |             || fd != MAGIC_WAIT_FD | 
					
						
							| 
									
										
										
										
											2017-01-26 11:17:54 +08:00
										 |  |  |                /* On third run we expect one deleted fd */ | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || ASYNC_start_job(&job, waitctx, &funcret, waitfd, NULL, 0) | 
					
						
							| 
									
										
										
										
											2017-01-26 11:17:54 +08:00
										 |  |  |                 != ASYNC_PAUSE | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || !ASYNC_WAIT_CTX_get_all_fds(waitctx, NULL, &numfds) | 
					
						
							|  |  |  |             || numfds != 0 | 
					
						
							|  |  |  |             || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, NULL, | 
					
						
							|  |  |  |                                                &numdelfds) | 
					
						
							|  |  |  |             || numfds != 0 | 
					
						
							|  |  |  |             || numdelfds != 1 | 
					
						
							|  |  |  |             || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, &delfd, | 
					
						
							|  |  |  |                                                &numdelfds) | 
					
						
							|  |  |  |             || delfd != MAGIC_WAIT_FD | 
					
						
							| 
									
										
										
										
											2017-01-26 11:17:54 +08:00
										 |  |  |             /* On last run we are not expecting any wait fd */ | 
					
						
							|  |  |  |             || ASYNC_start_job(&job, waitctx, &funcret, waitfd, NULL, 0) | 
					
						
							|  |  |  |                 != ASYNC_FINISH | 
					
						
							|  |  |  |             || !ASYNC_WAIT_CTX_get_all_fds(waitctx, NULL, &numfds) | 
					
						
							|  |  |  |             || numfds != 0 | 
					
						
							|  |  |  |             || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, NULL, | 
					
						
							|  |  |  |                                                &numdelfds) | 
					
						
							|  |  |  |             || numfds != 0 | 
					
						
							|  |  |  |             || numdelfds != 0 | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |             || funcret != 1) { | 
					
						
							|  |  |  |         fprintf(stderr, "test_ASYNC_get_wait_fd() failed\n"); | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |         ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |         ASYNC_cleanup_thread(); | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |     ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |     ASYNC_cleanup_thread(); | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-11-12 18:42:08 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 23:09:50 +08:00
										 |  |  | static int test_ASYNC_block_pause(void) | 
					
						
							| 
									
										
										
										
											2015-11-12 18:42:08 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     ASYNC_JOB *job = NULL; | 
					
						
							|  |  |  |     int funcret; | 
					
						
							| 
									
										
										
										
											2016-02-29 21:07:28 +08:00
										 |  |  |     ASYNC_WAIT_CTX *waitctx = NULL; | 
					
						
							| 
									
										
										
										
											2015-11-12 18:42:08 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |     if (       !ASYNC_init_thread(1, 0) | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || (waitctx = ASYNC_WAIT_CTX_new()) == NULL | 
					
						
							|  |  |  |             || ASYNC_start_job(&job, waitctx, &funcret, blockpause, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-11-12 18:42:08 +08:00
										 |  |  |                 != ASYNC_PAUSE | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || ASYNC_start_job(&job, waitctx, &funcret, blockpause, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-11-12 18:42:08 +08:00
										 |  |  |                 != ASYNC_FINISH | 
					
						
							|  |  |  |             || funcret != 1) { | 
					
						
							|  |  |  |         fprintf(stderr, "test_ASYNC_block_pause() failed\n"); | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |         ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |         ASYNC_cleanup_thread(); | 
					
						
							| 
									
										
										
										
											2015-11-12 18:42:08 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |     ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |     ASYNC_cleanup_thread(); | 
					
						
							| 
									
										
										
										
											2015-11-12 18:42:08 +08:00
										 |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | int main(int argc, char **argv) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-03-16 18:38:39 +08:00
										 |  |  |     if (!ASYNC_is_capable()) { | 
					
						
							|  |  |  |         fprintf(stderr, | 
					
						
							|  |  |  |                 "OpenSSL build is not ASYNC capable - skipping async tests\n"); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         CRYPTO_set_mem_debug(1); | 
					
						
							|  |  |  |         CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (       !test_ASYNC_init_thread() | 
					
						
							| 
									
										
										
										
											2018-11-06 04:41:01 +08:00
										 |  |  |                 || !test_ASYNC_callback_status() | 
					
						
							| 
									
										
										
										
											2016-03-16 18:38:39 +08:00
										 |  |  |                 || !test_ASYNC_start_job() | 
					
						
							|  |  |  |                 || !test_ASYNC_get_current_job() | 
					
						
							|  |  |  |                 || !test_ASYNC_WAIT_CTX_get_all_fds() | 
					
						
							|  |  |  |                 || !test_ASYNC_block_pause()) { | 
					
						
							|  |  |  |             return 1; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |     } | 
					
						
							|  |  |  |     printf("PASS\n"); | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } |