2 * Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the OpenSSL license (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
16 #include <openssl/async.h>
17 #include <openssl/crypto.h>
18 #include <../apps/apps.h>
21 static ASYNC_JOB *currjob = NULL;
23 static int only_pause(void *args)
30 static int add_two(void *args)
39 static int save_current(void *args)
41 currjob = ASYNC_get_current_job();
47 #define MAGIC_WAIT_FD ((OSSL_ASYNC_FD)99)
48 static int waitfd(void *args)
51 ASYNC_WAIT_CTX *waitctx;
53 job = ASYNC_get_current_job();
56 waitctx = ASYNC_get_wait_ctx(job);
59 if (!ASYNC_WAIT_CTX_set_wait_fd(waitctx, waitctx, MAGIC_WAIT_FD, NULL, NULL))
63 if (!ASYNC_WAIT_CTX_clear_fd(waitctx, waitctx))
69 static int blockpause(void *args)
73 ASYNC_unblock_pause();
79 static int test_ASYNC_init_thread()
81 ASYNC_JOB *job1 = NULL, *job2 = NULL, *job3 = NULL;
82 int funcret1, funcret2, funcret3;
83 ASYNC_WAIT_CTX *waitctx = NULL;
85 if ( !ASYNC_init_thread(2, 0)
86 || (waitctx = ASYNC_WAIT_CTX_new()) == NULL
87 || ASYNC_start_job(&job1, waitctx, &funcret1, only_pause, NULL, 0)
89 || ASYNC_start_job(&job2, waitctx, &funcret2, only_pause, NULL, 0)
91 || ASYNC_start_job(&job3, waitctx, &funcret3, only_pause, NULL, 0)
93 || ASYNC_start_job(&job1, waitctx, &funcret1, only_pause, NULL, 0)
95 || ASYNC_start_job(&job3, waitctx, &funcret3, only_pause, NULL, 0)
97 || ASYNC_start_job(&job2, waitctx, &funcret2, only_pause, NULL, 0)
99 || ASYNC_start_job(&job3, waitctx, &funcret3, only_pause, NULL, 0)
104 fprintf(stderr, "test_ASYNC_init_thread() failed\n");
105 ASYNC_WAIT_CTX_free(waitctx);
106 ASYNC_cleanup_thread();
110 ASYNC_WAIT_CTX_free(waitctx);
111 ASYNC_cleanup_thread();
115 static int test_ASYNC_start_job()
117 ASYNC_JOB *job = NULL;
119 ASYNC_WAIT_CTX *waitctx = NULL;
123 if ( !ASYNC_init_thread(1, 0)
124 || (waitctx = ASYNC_WAIT_CTX_new()) == NULL
125 || ASYNC_start_job(&job, waitctx, &funcret, add_two, NULL, 0)
128 || ASYNC_start_job(&job, waitctx, &funcret, add_two, NULL, 0)
132 fprintf(stderr, "test_ASYNC_start_job() failed\n");
133 ASYNC_WAIT_CTX_free(waitctx);
134 ASYNC_cleanup_thread();
138 ASYNC_WAIT_CTX_free(waitctx);
139 ASYNC_cleanup_thread();
143 static int test_ASYNC_get_current_job()
145 ASYNC_JOB *job = NULL;
147 ASYNC_WAIT_CTX *waitctx = NULL;
151 if ( !ASYNC_init_thread(1, 0)
152 || (waitctx = ASYNC_WAIT_CTX_new()) == NULL
153 || ASYNC_start_job(&job, waitctx, &funcret, save_current, NULL, 0)
156 || ASYNC_start_job(&job, waitctx, &funcret, save_current, NULL, 0)
159 fprintf(stderr, "test_ASYNC_get_current_job() failed\n");
160 ASYNC_WAIT_CTX_free(waitctx);
161 ASYNC_cleanup_thread();
165 ASYNC_WAIT_CTX_free(waitctx);
166 ASYNC_cleanup_thread();
170 static int test_ASYNC_WAIT_CTX_get_all_fds()
172 ASYNC_JOB *job = NULL;
174 ASYNC_WAIT_CTX *waitctx = NULL;
175 OSSL_ASYNC_FD fd = OSSL_BAD_ASYNC_FD, delfd = OSSL_BAD_ASYNC_FD;
176 size_t numfds, numdelfds;
178 if ( !ASYNC_init_thread(1, 0)
179 || (waitctx = ASYNC_WAIT_CTX_new()) == NULL
180 /* On first run we're not expecting any wait fds */
181 || ASYNC_start_job(&job, waitctx, &funcret, waitfd, NULL, 0)
183 || !ASYNC_WAIT_CTX_get_all_fds(waitctx, NULL, &numfds)
185 || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, NULL,
189 /* On second run we're expecting one added fd */
190 || ASYNC_start_job(&job, waitctx, &funcret, waitfd, NULL, 0)
192 || !ASYNC_WAIT_CTX_get_all_fds(waitctx, NULL, &numfds)
194 || !ASYNC_WAIT_CTX_get_all_fds(waitctx, &fd, &numfds)
195 || fd != MAGIC_WAIT_FD
196 || (fd = OSSL_BAD_ASYNC_FD, 0) /* Assign to something else */
197 || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, NULL,
201 || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, &fd, &numfds, NULL,
203 || fd != MAGIC_WAIT_FD
204 /* On final run we expect one deleted fd */
205 || ASYNC_start_job(&job, waitctx, &funcret, waitfd, NULL, 0)
207 || !ASYNC_WAIT_CTX_get_all_fds(waitctx, NULL, &numfds)
209 || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, NULL,
213 || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, &delfd,
215 || delfd != MAGIC_WAIT_FD
217 fprintf(stderr, "test_ASYNC_get_wait_fd() failed\n");
218 ASYNC_WAIT_CTX_free(waitctx);
219 ASYNC_cleanup_thread();
223 ASYNC_WAIT_CTX_free(waitctx);
224 ASYNC_cleanup_thread();
228 static int test_ASYNC_block_pause()
230 ASYNC_JOB *job = NULL;
232 ASYNC_WAIT_CTX *waitctx = NULL;
234 if ( !ASYNC_init_thread(1, 0)
235 || (waitctx = ASYNC_WAIT_CTX_new()) == NULL
236 || ASYNC_start_job(&job, waitctx, &funcret, blockpause, NULL, 0)
238 || ASYNC_start_job(&job, waitctx, &funcret, blockpause, NULL, 0)
241 fprintf(stderr, "test_ASYNC_block_pause() failed\n");
242 ASYNC_WAIT_CTX_free(waitctx);
243 ASYNC_cleanup_thread();
247 ASYNC_WAIT_CTX_free(waitctx);
248 ASYNC_cleanup_thread();
252 int main(int argc, char **argv)
254 if (!ASYNC_is_capable()) {
256 "OpenSSL build is not ASYNC capable - skipping async tests\n");
258 CRYPTO_set_mem_debug(1);
259 CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
261 if ( !test_ASYNC_init_thread()
262 || !test_ASYNC_start_job()
263 || !test_ASYNC_get_current_job()
264 || !test_ASYNC_WAIT_CTX_get_all_fds()
265 || !test_ASYNC_block_pause()) {