]>
git.ipfire.org Git - thirdparty/openssl.git/blob - test/asynctest.c
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()) {